Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 88cbaec

Browse files
committedMar 19, 2025·
Have DESIGN_MATRIX not require design_sheet and default_sheet
This commit makes the DESIGN_MATRIX keyword not require arguments for design and default sheet. Now DESIGN_SHEET defaults to `DesignSheet` and `DEFAULT_SHEET` defaults to "DefaultSheet". This is the same defaults that are used in design2params.
1 parent a03308a commit 88cbaec

File tree

8 files changed

+107
-62
lines changed

8 files changed

+107
-62
lines changed
 

‎src/ert/config/design_matrix.py

+2-10
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ def __post_init__(self) -> None:
4444
def from_config_list(cls, config_list: list[str]) -> DesignMatrix:
4545
filename = Path(config_list[0])
4646
options = option_dict(config_list, 1)
47-
design_sheet = options.get("DESIGN_SHEET")
48-
default_sheet = options.get("DEFAULT_SHEET")
47+
design_sheet = options.get("DESIGN_SHEET", "DesignSheet")
48+
default_sheet = options.get("DEFAULT_SHEET", "DefaultSheet")
4949
errors = []
5050
if filename.suffix not in {
5151
".xlsx",
@@ -56,14 +56,6 @@ def from_config_list(cls, config_list: list[str]) -> DesignMatrix:
5656
f"DESIGN_MATRIX must be of format .xls or .xlsx; is '{filename}'"
5757
).set_context(config_list)
5858
)
59-
if design_sheet is None:
60-
errors.append(
61-
ErrorInfo("Missing required DESIGN_SHEET").set_context(config_list)
62-
)
63-
if default_sheet is None:
64-
errors.append(
65-
ErrorInfo("Missing required DEFAULT_SHEET").set_context(config_list)
66-
)
6759
if design_sheet is not None and design_sheet == default_sheet:
6860
errors.append(
6961
ErrorInfo(

‎src/ert/config/parsing/config_schema.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ def install_job_directory_keyword() -> SchemaItem:
257257
def design_matrix_keyword() -> SchemaItem:
258258
return SchemaItem(
259259
kw=ConfigKeys.DESIGN_MATRIX,
260-
argc_min=3,
260+
argc_min=1,
261261
argc_max=3,
262262
type_map=[
263263
SchemaItemType.EXISTING_PATH,

‎tests/ert/ui_tests/cli/analysis/test_design_matrix.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
def _create_design_matrix(filename, design_sheet_df, default_sheet_df=None):
2424
with pd.ExcelWriter(filename) as xl_write:
25-
design_sheet_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
25+
design_sheet_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
2626
if default_sheet_df is not None:
2727
default_sheet_df.to_excel(
2828
xl_write, index=False, sheet_name="DefaultSheet", header=False
@@ -54,7 +54,7 @@ def test_run_poly_example_with_design_matrix():
5454
NUM_REALIZATIONS 10
5555
MIN_REALIZATIONS 1
5656
GEN_DATA POLY_RES RESULT_FILE:poly.out
57-
DESIGN_MATRIX poly_design.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
57+
DESIGN_MATRIX poly_design.xlsx
5858
INSTALL_JOB poly_eval POLY_EVAL
5959
FORWARD_MODEL poly_eval
6060
"""
@@ -156,7 +156,7 @@ def test_run_poly_example_with_design_matrix_and_genkw_merge(default_values, err
156156
MIN_REALIZATIONS 1
157157
GEN_DATA POLY_RES RESULT_FILE:poly.out
158158
GEN_KW COEFFS my_template my_output coeff_priors
159-
DESIGN_MATRIX poly_design.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
159+
DESIGN_MATRIX poly_design.xlsx
160160
INSTALL_JOB poly_eval POLY_EVAL
161161
FORWARD_MODEL poly_eval
162162
"""
@@ -268,8 +268,8 @@ def test_run_poly_example_with_multiple_design_matrix_instances():
268268
NUM_REALIZATIONS 10
269269
MIN_REALIZATIONS 1
270270
GEN_DATA POLY_RES RESULT_FILE:poly.out
271-
DESIGN_MATRIX poly_design_1.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
272-
DESIGN_MATRIX poly_design_2.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
271+
DESIGN_MATRIX poly_design_1.xlsx
272+
DESIGN_MATRIX poly_design_2.xlsx
273273
INSTALL_JOB poly_eval POLY_EVAL
274274
FORWARD_MODEL poly_eval
275275
"""
@@ -358,7 +358,7 @@ def test_design_matrix_on_esmda(experiment_mode, ensemble_name, iterations):
358358
GEN_KW COEFFS_B coeff_priors_b
359359
GEN_KW COEFFS_C coeff_priors_c
360360
GEN_DATA POLY_RES RESULT_FILE:poly.out
361-
DESIGN_MATRIX design_matrix.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
361+
DESIGN_MATRIX design_matrix.xlsx
362362
INSTALL_JOB poly_eval POLY_EVAL
363363
FORWARD_MODEL poly_eval
364364
"""

‎tests/ert/unit_tests/config/test_analysis_config.py

+44-11
Original file line numberDiff line numberDiff line change
@@ -122,30 +122,63 @@ def test_invalid_design_matrix_format_raises_validation_error():
122122
)
123123

124124

125-
def test_design_matrix_without_design_sheet_raises_validation_error():
126-
with pytest.raises(ConfigValidationError, match="Missing required DESIGN_SHEET"):
125+
def test_design_matrix_with_unknown_argument_uses_default(tmp_path, monkeypatch):
126+
monkeypatch.chdir(tmp_path)
127+
with pd.ExcelWriter("my_design_matrix.xlsx") as xl_write:
128+
design_matrix_df = pd.DataFrame(
129+
{
130+
"REAL": [0, 1, 2],
131+
"a": [1, 2, 3],
132+
"b": [0, 2, 0],
133+
}
134+
)
135+
default_sheet_df = pd.DataFrame([["a", 1], ["b", 4]])
136+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
137+
default_sheet_df.to_excel(
138+
xl_write, index=False, sheet_name="my_default_sheet", header=False
139+
)
140+
assert (
127141
AnalysisConfig.from_dict(
128142
{
143+
ConfigKeys.NUM_REALIZATIONS: 3,
129144
ConfigKeys.DESIGN_MATRIX: [
130145
[
131-
"my_matrix.xlsx",
132-
"DESIGN_:design",
133-
"DEFAULT_SHEET:default",
146+
os.path.abspath("my_design_matrix.xlsx"),
147+
"foo_argument:bar",
148+
"DEFAULT_SHEET:my_default_sheet",
134149
]
135150
],
136151
}
137-
)
152+
).design_matrix.design_sheet
153+
== "DesignSheet"
154+
)
138155

139156

140-
def test_design_matrix_without_default_sheet_raises_validation_error():
141-
with pytest.raises(ConfigValidationError, match="Missing required DEFAULT_SHEET"):
157+
def test_design_matrix_with_too_many_arguments_fails(tmp_path, monkeypatch):
158+
monkeypatch.chdir(tmp_path)
159+
with pd.ExcelWriter("my_design_matrix.xlsx") as xl_write:
160+
design_matrix_df = pd.DataFrame(
161+
{
162+
"REAL": [0, 1, 2],
163+
"a": [1, 2, 3],
164+
"b": [0, 2, 0],
165+
}
166+
)
167+
default_sheet_df = pd.DataFrame([["a", 1], ["b", 4]])
168+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
169+
default_sheet_df.to_excel(
170+
xl_write, index=False, sheet_name="my_default_sheet", header=False
171+
)
172+
with pytest.raises(ConfigValidationError, match="Invalid argument 'too'"):
142173
AnalysisConfig.from_dict(
143174
{
175+
ConfigKeys.NUM_REALIZATIONS: 3,
144176
ConfigKeys.DESIGN_MATRIX: [
145177
[
146-
"my_matrix.xlsx",
147-
"DESIGN_SHEET:design",
148-
"DEFAULT_:default",
178+
os.path.abspath("my_design_matrix.xlsx"),
179+
"too",
180+
"many",
181+
"arguments",
149182
]
150183
],
151184
}

‎tests/ert/unit_tests/config/test_ert_config.py

+25-3
Original file line numberDiff line numberDiff line change
@@ -2020,7 +2020,7 @@ def test_design2params_also_validates_design_matrix(tmp_path, caplog, monkeypatc
20202020
{"DESIGN2PARAMS": mock_design2params},
20212021
)
20222022
ErtConfig.from_file_contents(
2023-
f"NUM_REALIZATIONS 1\nFORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet01,<defaultssheet>=DefaultSheet)"
2023+
f"NUM_REALIZATIONS 1\nFORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet,<defaultssheet>=DefaultSheet)"
20242024
)
20252025
assert "DESIGN_MATRIX validation of DESIGN2PARAMS" in caplog.text
20262026

@@ -2058,11 +2058,33 @@ def test_multiple_design2params_also_validates_design_matrix_merging(
20582058
ErtConfig.from_file_contents(
20592059
f"""\
20602060
NUM_REALIZATIONS 1
2061-
FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet01,<defaultssheet>=DefaultSheet)
2062-
FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file2}, <designsheet>=DesignSheet01,<defaultssheet>=DefaultSheet)
2061+
FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet,<defaultssheet>=DefaultSheet)
2062+
FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file2}, <designsheet>=DesignSheet,<defaultssheet>=DefaultSheet)
20632063
"""
20642064
)
20652065
assert (
20662066
"Design matrix merging would have failed due to: Design Matrices don't have the same active realizations"
20672067
in caplog.text
20682068
)
2069+
2070+
2071+
def test_design_matrix_default_argument(tmp_path):
2072+
design_matrix_file = tmp_path / "my_design_matrix.xlsx"
2073+
_create_design_matrix(
2074+
design_matrix_file,
2075+
pd.DataFrame(
2076+
{
2077+
"REAL": [1],
2078+
"a": [1],
2079+
"category": ["cat1"],
2080+
}
2081+
),
2082+
pd.DataFrame([["b", 1], ["c", 2]]),
2083+
)
2084+
2085+
config = ErtConfig.from_file_contents(
2086+
f"NUM_REALIZATIONS 1\nDESIGN_MATRIX {design_matrix_file}"
2087+
)
2088+
assert config.analysis_config.design_matrix
2089+
assert config.analysis_config.design_matrix.design_sheet == "DesignSheet"
2090+
assert config.analysis_config.design_matrix.default_sheet == "DefaultSheet"

‎tests/ert/unit_tests/gui/simulation/test_run_dialog.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,7 @@ def test_that_design_matrix_show_parameters_button_is_visible(
681681
)
682682
default_sheet_df = pd.DataFrame([["b", 1], ["c", 2]])
683683
with pd.ExcelWriter(xls_filename) as xl_write:
684-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
684+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
685685
default_sheet_df.to_excel(
686686
xl_write, index=False, sheet_name="DefaultSheet", header=False
687687
)
@@ -690,9 +690,7 @@ def test_that_design_matrix_show_parameters_button_is_visible(
690690
with open(config_file, "w", encoding="utf-8") as f:
691691
f.write("NUM_REALIZATIONS 1")
692692
if design_matrix_entry:
693-
f.write(
694-
f"\nDESIGN_MATRIX {xls_filename} DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet"
695-
)
693+
f.write(f"\nDESIGN_MATRIX {xls_filename}")
696694

697695
args_mock = Mock()
698696
args_mock.config = config_file

‎tests/ert/unit_tests/sensitivity_analysis/test_design_matrix.py

+24-24
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212

1313
def _create_design_matrix(xls_path, design_matrix_df, default_sheet_df) -> DesignMatrix:
1414
with pd.ExcelWriter(xls_path) as xl_write:
15-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
15+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
1616
default_sheet_df.to_excel(
17-
xl_write, index=False, sheet_name="DefaultValues", header=False
17+
xl_write, index=False, sheet_name="DefaultSheet", header=False
1818
)
19-
return DesignMatrix(xls_path, "DesignSheet01", "DefaultValues")
19+
return DesignMatrix(xls_path, "DesignSheet", "DefaultSheet")
2020

2121

2222
@pytest.mark.parametrize(
@@ -145,11 +145,11 @@ def test_read_and_merge_with_existing_parameters(tmp_path, parameters, error_msg
145145
)
146146
default_sheet_df = pd.DataFrame([["a", 1], ["b", 4]])
147147
with pd.ExcelWriter(design_path) as xl_write:
148-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
148+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
149149
default_sheet_df.to_excel(
150-
xl_write, index=False, sheet_name="DefaultValues", header=False
150+
xl_write, index=False, sheet_name="DefaultSheet", header=False
151151
)
152-
design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
152+
design_matrix = DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
153153
if error_msg:
154154
with pytest.raises(ValueError, match=error_msg):
155155
design_matrix.merge_with_existing_parameters(extra_genkw_config)
@@ -180,11 +180,11 @@ def test_reading_design_matrix(tmp_path):
180180
)
181181
default_sheet_df = pd.DataFrame([["one", 1], ["b", 4], ["d", "case_name"]])
182182
with pd.ExcelWriter(design_path) as xl_write:
183-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
183+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
184184
default_sheet_df.to_excel(
185-
xl_write, index=False, sheet_name="DefaultValues", header=False
185+
xl_write, index=False, sheet_name="DefaultSheet", header=False
186186
)
187-
design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
187+
design_matrix = DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
188188
design_params = design_matrix.parameter_configuration
189189
assert all(param in design_params for param in ("a", "b", "c", "one", "d"))
190190
assert design_matrix.active_realizations == [True, True, False, False, True]
@@ -218,13 +218,13 @@ def test_reading_design_matrix_validate_reals(tmp_path, real_column, error_msg):
218218
)
219219
default_sheet_df = pd.DataFrame()
220220
with pd.ExcelWriter(design_path) as xl_write:
221-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
221+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
222222
default_sheet_df.to_excel(
223-
xl_write, index=False, sheet_name="DefaultValues", header=False
223+
xl_write, index=False, sheet_name="DefaultSheet", header=False
224224
)
225225

226226
with pytest.raises(ValueError, match=error_msg):
227-
DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
227+
DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
228228

229229

230230
@pytest.mark.parametrize(
@@ -270,13 +270,13 @@ def test_reading_design_matrix_validate_headers(tmp_path, column_names, error_ms
270270
)
271271
default_sheet_df = pd.DataFrame([["one", 1], ["b", 4], ["d", 6]])
272272
with pd.ExcelWriter(design_path) as xl_write:
273-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
273+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
274274
default_sheet_df.to_excel(
275-
xl_write, index=False, sheet_name="DefaultValues", header=False
275+
xl_write, index=False, sheet_name="DefaultSheet", header=False
276276
)
277277

278278
with pytest.raises(ValueError, match=error_msg):
279-
DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
279+
DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
280280

281281

282282
@pytest.mark.parametrize(
@@ -306,13 +306,13 @@ def test_reading_design_matrix_validate_cells(tmp_path, values, error_msg):
306306
)
307307
default_sheet_df = pd.DataFrame()
308308
with pd.ExcelWriter(design_path) as xl_write:
309-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
309+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
310310
default_sheet_df.to_excel(
311-
xl_write, index=False, sheet_name="DefaultValues", header=False
311+
xl_write, index=False, sheet_name="DefaultSheet", header=False
312312
)
313313

314314
with pytest.raises(ValueError, match=error_msg):
315-
DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
315+
DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
316316

317317

318318
@pytest.mark.parametrize(
@@ -352,13 +352,13 @@ def test_reading_default_sheet_validation(tmp_path, data, error_msg):
352352
)
353353
default_sheet_df = pd.DataFrame(data)
354354
with pd.ExcelWriter(design_path) as xl_write:
355-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
355+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
356356
default_sheet_df.to_excel(
357-
xl_write, index=False, sheet_name="DefaultValues", header=False
357+
xl_write, index=False, sheet_name="DefaultSheet", header=False
358358
)
359359

360360
with pytest.raises(ValueError, match=error_msg):
361-
DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
361+
DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
362362

363363

364364
def test_default_values_used(tmp_path):
@@ -373,11 +373,11 @@ def test_default_values_used(tmp_path):
373373
)
374374
default_sheet_df = pd.DataFrame([["one", 1], ["b", 4], ["d", "case_name"]])
375375
with pd.ExcelWriter(design_path) as xl_write:
376-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
376+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
377377
default_sheet_df.to_excel(
378-
xl_write, index=False, sheet_name="DefaultValues", header=False
378+
xl_write, index=False, sheet_name="DefaultSheet", header=False
379379
)
380-
design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
380+
design_matrix = DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
381381
df = design_matrix.design_matrix_df
382382
np.testing.assert_equal(df["one"], np.array([1, 1, 1, 1]))
383383
np.testing.assert_equal(df["b"], np.array([0, 2, 0, 1]))

‎tests/ert/unit_tests/test_libres_facade.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -276,11 +276,11 @@ def test_save_parameters_to_storage_from_design_dataframe(
276276
c_values = np.random.default_rng().uniform(-5, 5, 10)
277277
design_matrix_df = DataFrame({"a": a_values, "b": b_values, "c": c_values})
278278
with ExcelWriter(design_path) as xl_write:
279-
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
279+
design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
280280
DataFrame().to_excel(
281-
xl_write, index=False, sheet_name="DefaultValues", header=False
281+
xl_write, index=False, sheet_name="DefaultSheet", header=False
282282
)
283-
design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
283+
design_matrix = DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
284284
with open_storage(tmp_path / "storage", mode="w") as storage:
285285
experiment_id = storage.create_experiment(
286286
parameters=[design_matrix.parameter_configuration]

0 commit comments

Comments
 (0)
Please sign in to comment.