Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve error messages for invalid transform functions #10232

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
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
19 changes: 12 additions & 7 deletions src/ert/config/gen_kw_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -510,35 +510,40 @@ def _sample_value(
parameter_values.append(value[0])
return np.array(parameter_values)

@staticmethod
def _parse_transform_function_definition(
self,
t: TransformFunctionDefinition,
) -> TransformFunction:
if t.param_name is None and t.values is None:
raise ConfigValidationError(f"Too few instructions provided in: {t}")
raise ConfigValidationError.with_context(
f"Too few instructions provided in: {t}", self.name
)

if (
t.param_name not in DISTRIBUTION_PARAMETERS
or t.param_name not in PRIOR_FUNCTIONS
):
raise ConfigValidationError(
f"Unknown transform function provided: {t.param_name}"
f"Unknown distribution provided: {t.param_name}, for variable {t.name}",
self.name,
)

param_names = DISTRIBUTION_PARAMETERS[t.param_name]

if len(t.values) != len(param_names):
raise ConfigValidationError(
f"Incorrect number of values provided: {t.values} "
raise ConfigValidationError.with_context(
f"Incorrect number of values: {t.values}, provided for variable {t.name} with distribution {t.param_name}.",
self.name,
)

param_floats = []
for p in t.values:
try:
param_floats.append(float(p))
except ValueError as e:
raise ConfigValidationError(
f"Unable to convert float number: {p}"
raise ConfigValidationError.with_context(
f"Unable to convert {p} to float number for variable {t.name} with distribution {t.param_name}.",
self.name,
) from e

params = dict(zip(param_names, param_floats, strict=False))
Expand Down
49 changes: 40 additions & 9 deletions tests/ert/unit_tests/config/test_gen_kw_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,16 +301,25 @@ def test_gen_kw_distribution_errors(tmpdir, distribution, mean, std, error):
("MYNAME UNIFORM 0 1", None),
("MYNAME DUNIF 0 1 2", None),
("MYNAME ERRF 0 1 2 3", None),
("MYNAME DERRF 0 1 2 3 4", None),
("MYNAME DERRF 3 1 2 3 4", None),
("MYNAME LOGUNIF 0 1", None),
("MYNAME CONST 0", None),
("MYNAME RAW", None),
("MYNAME UNIFORM 0 1 2", "Incorrect number of values provided"),
(
"MYNAME UNIFORM 0 1 2",
"Incorrect number of values: \\['0', '1', '2'\\], provided for variable MYNAME with distribution UNIFORM.",
),
("MYNAME", "Too few instructions provided in"),
("MYNAME RANDOM 0 1", "Unknown transform function provided"),
("MYNAME DERRF -0 1.12345 -2.3 3.14 10E-5", None),
("MYNAME DERRF -0 -14 -2.544545 10E5 10E+5", None),
("MYNAME CONST no-number", "Unable to convert float number"),
(
"MYNAME RANDOM 0 1",
"Unknown distribution provided: RANDOM, for variable MYNAME",
),
("MYNAME DERRF 50 1.12345 2.3 3.14 10E-5", None),
("MYNAME DERRF 100 -14 -2.544545 10E5 10E+5", None),
(
"MYNAME CONST no-number",
"Unable to convert no-number to float number for variable MYNAME with distribution CONST.",
),
("MYNAME CONST 0", None), # spaces
("MYNAME\t\t\tCONST\t\t0", None), # tabs
],
Expand All @@ -332,9 +341,23 @@ def test_gen_kw_params_parsing(tmpdir, params, error):
)
if error:
with pytest.raises(ConfigValidationError, match=error):
GenKwConfig._parse_transform_function_definition(tfd)
GenKwConfig(
name="MY_PARAM",
forward_init=False,
update=False,
template_file=None,
output_file=None,
transform_function_definitions=[tfd],
)
else:
GenKwConfig._parse_transform_function_definition(tfd)
GenKwConfig(
name="MY_PARAM",
forward_init=False,
update=False,
template_file=None,
output_file=None,
transform_function_definitions=[tfd],
)


@pytest.mark.parametrize(
Expand Down Expand Up @@ -406,7 +429,15 @@ def test_gen_kw_trans_func(tmpdir, params, xinput, expected):
)

with tmpdir.as_cwd():
tf = GenKwConfig._parse_transform_function_definition(tfd)
gkw = GenKwConfig(
name="MY_PARAM",
forward_init=False,
update=False,
template_file=None,
output_file=None,
transform_function_definitions=[tfd],
)
tf = gkw.transform_functions[0]
assert abs(tf.calculate(xinput, float_args) - expected) < 10**-15


Expand Down