Skip to content

Commit

Permalink
Add validate_pre_experiment-method to DESIGN_KW forward model
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathan-eq committed Sep 24, 2024
1 parent d0df2f5 commit f7a4a31
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 5 deletions.
21 changes: 18 additions & 3 deletions src/semeio/forward_models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Optional
from typing import Callable, Optional

from ert import (
ForwardModelStepDocumentation,
Expand All @@ -8,6 +8,17 @@

from .scripts.design2params import description as design2params_description
from .scripts.design_kw import description as design_kw_description
from .scripts.design_kw import design_kw as DesignKWScript


def validation_enabled(validation_func: Callable) -> Callable[..., None]:
def wrapper(
self: ForwardModelStepPlugin, fm_step_json: ForwardModelStepJSON
) -> None:
if self.private_args.get("<VALIDATE>", "").lower() == "true":
validation_func(self, fm_step_json)

return wrapper


class Design2Params(ForwardModelStepPlugin):
Expand Down Expand Up @@ -45,16 +56,20 @@ class DesignKW(ForwardModelStepPlugin):
def __init__(self):
super().__init__(
name="DESIGN_KW",
command=["design_kw", "<template_file>", "<result_file>"],
command=["design_kw", "<template_file>", "<result_file>", "<VALIDATE>"],
default_mapping={"<VALIDATE>": "false"},
)

def validate_pre_realization_run(
self, fm_step_json: ForwardModelStepJSON
) -> ForwardModelStepJSON:
return fm_step_json

@validation_enabled
def validate_pre_experiment(self, fm_step_json: ForwardModelStepJSON) -> None:
pass
template_file_name = self.private_args["<template_file>"]
DesignKWScript.validate_configuration(template_file_name=template_file_name)
return fm_step_json

@staticmethod
def documentation() -> Optional[ForwardModelStepDocumentation]:
Expand Down
46 changes: 45 additions & 1 deletion src/semeio/forward_models/design_kw/design_kw.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import logging
import os
import re
import shlex
from typing import List

from ert.config.forward_model_step import ForwardModelStepWarning

_STATUS_FILE_NAME = "DESIGN_KW.OK"

_logger = logging.getLogger(__name__)
errors = []


def run(
Expand Down Expand Up @@ -65,7 +69,9 @@ def all_matched(line, template_file_name, template):
f"but this is probably an xml file"
)
else:
_logger.error(f"{unmatched} not found in design matrix")
error_msg = f"{unmatched} not found in design matrix"
_logger.error(error_msg)
errors.append(error_msg)
valid = False
return valid

Expand Down Expand Up @@ -178,3 +184,41 @@ def rm_genkw_prefix(paramsdict, ignoreprefixes="LOG10_"):
for keyvalue in keyvalues
if keys.count(keyvalue[0]) == 1
}


def validate_configuration(
template_file_name: str, parameters_file_name: str = "parameters.txt"
) -> None:
try:
if not os.path.exists(template_file_name):
raise ValueError(
f"Argument template_file: '{template_file_name}' is not an existing file"
)

if not os.path.exists(parameters_file_name):
raise ValueError(
f"Could not find required parameters file from DESIGN2PARAMS: '{parameters_file_name}'"
)
with open(parameters_file_name, encoding="utf-8") as parameters_file:
parameters = parameters_file.readlines()

key_vals = extract_key_value(parameters)

key_vals.update(rm_genkw_prefix(key_vals))

with open(template_file_name, encoding="utf-8") as template_file:
template = template_file.readlines()

for line in template:
if not is_comment(line):
for key, value in key_vals.items():
line = line.replace(f"<{key}>", str(value))

all_matched(line, template_file_name, template)

except ValueError as e:
errors.append(str(e))

if errors:
error_message = f"DESIGN_KW configuration validation failed:\n{errors}"
ForwardModelStepWarning.warn(error_message)
4 changes: 3 additions & 1 deletion src/semeio/forward_models/scripts/design_kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
Example: If ``parameters.txt`` has the line ``MULTFLT:FLT_A10_B18 0.001``, both
of the templates ``<MULTFLT:FLT_A10_B18>`` and ``<FLT_A10_B18>`` will expand to
``0.001``.
Configuration validation pre experiment can be disabled by explicitly setting ``<VALIDATION>=false``
"""


Expand All @@ -44,7 +46,7 @@ def create_parser():
default="WARNING",
type=logging.getLevelName,
)

parser.add_argument("--validate", required=False, type=bool, default=True)
return parser


Expand Down

0 comments on commit f7a4a31

Please sign in to comment.