From 71e7ac173456036e91bac8dd50fae75d4dbaaef2 Mon Sep 17 00:00:00 2001
From: Jonathan Karlsen <JONAK@equinor.com>
Date: Wed, 12 Mar 2025 12:24:14 +0100
Subject: [PATCH] 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.
---
 src/ert/config/design_matrix.py               | 12 +----
 src/ert/config/parsing/config_schema.py       |  4 +-
 .../cli/analysis/test_design_matrix.py        | 12 ++---
 .../unit_tests/config/test_analysis_config.py | 34 -------------
 .../ert/unit_tests/config/test_ert_config.py  | 34 ++++++++++---
 .../gui/simulation/test_run_dialog.py         |  6 +--
 .../test_design_matrix.py                     | 48 +++++++++----------
 tests/ert/unit_tests/test_libres_facade.py    |  6 +--
 8 files changed, 67 insertions(+), 89 deletions(-)

diff --git a/src/ert/config/design_matrix.py b/src/ert/config/design_matrix.py
index 859324bc4a4..72a6126065f 100644
--- a/src/ert/config/design_matrix.py
+++ b/src/ert/config/design_matrix.py
@@ -43,8 +43,8 @@ def __post_init__(self) -> None:
     def from_config_list(cls, config_list: list[str | dict[str, str]]) -> DesignMatrix:
         filename = Path(cast(str, config_list[0]))
         options = cast(dict[str, str], config_list[1])
-        design_sheet = options.get("DESIGN_SHEET")
-        default_sheet = options.get("DEFAULT_SHEET")
+        design_sheet = options.get("DESIGN_SHEET", "DesignSheet")
+        default_sheet = options.get("DEFAULT_SHEET", "DefaultSheet")
         errors = []
         if filename.suffix not in {
             ".xlsx",
@@ -55,14 +55,6 @@ def from_config_list(cls, config_list: list[str | dict[str, str]]) -> DesignMatr
                     f"DESIGN_MATRIX must be of format .xls or .xlsx; is '{filename}'"
                 ).set_context(config_list)
             )
-        if design_sheet is None:
-            errors.append(
-                ErrorInfo("Missing required DESIGN_SHEET").set_context(config_list)
-            )
-        if default_sheet is None:
-            errors.append(
-                ErrorInfo("Missing required DEFAULT_SHEET").set_context(config_list)
-            )
         if design_sheet is not None and design_sheet == default_sheet:
             errors.append(
                 ErrorInfo(
diff --git a/src/ert/config/parsing/config_schema.py b/src/ert/config/parsing/config_schema.py
index 9a9d026982f..329841bf097 100644
--- a/src/ert/config/parsing/config_schema.py
+++ b/src/ert/config/parsing/config_schema.py
@@ -261,8 +261,8 @@ def install_job_directory_keyword() -> SchemaItem:
 def design_matrix_keyword() -> SchemaItem:
     return SchemaItem(
         kw=ConfigKeys.DESIGN_MATRIX,
-        argc_min=2,
-        argc_max=2,
+        argc_min=1,
+        argc_max=3,
         type_map=[
             SchemaItemType.EXISTING_PATH,
             SchemaItemType.STRING,
diff --git a/tests/ert/ui_tests/cli/analysis/test_design_matrix.py b/tests/ert/ui_tests/cli/analysis/test_design_matrix.py
index 7e52ef403d5..6eb284c4f3d 100644
--- a/tests/ert/ui_tests/cli/analysis/test_design_matrix.py
+++ b/tests/ert/ui_tests/cli/analysis/test_design_matrix.py
@@ -22,7 +22,7 @@
 
 def _create_design_matrix(filename, design_sheet_df, default_sheet_df=None):
     with pd.ExcelWriter(filename) as xl_write:
-        design_sheet_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_sheet_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         if default_sheet_df is not None:
             default_sheet_df.to_excel(
                 xl_write, index=False, sheet_name="DefaultSheet", header=False
@@ -54,7 +54,7 @@ def test_run_poly_example_with_design_matrix():
                 NUM_REALIZATIONS 10
                 MIN_REALIZATIONS 1
                 GEN_DATA POLY_RES RESULT_FILE:poly.out
-                DESIGN_MATRIX poly_design.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
+                DESIGN_MATRIX poly_design.xlsx
                 INSTALL_JOB poly_eval POLY_EVAL
                 FORWARD_MODEL poly_eval
                 """
@@ -156,7 +156,7 @@ def test_run_poly_example_with_design_matrix_and_genkw_merge(default_values, err
                 MIN_REALIZATIONS 1
                 GEN_DATA POLY_RES RESULT_FILE:poly.out
                 GEN_KW COEFFS my_template my_output coeff_priors
-                DESIGN_MATRIX poly_design.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
+                DESIGN_MATRIX poly_design.xlsx DESIGN_SHEET:DesignSheet DEFAULT_SHEET:DefaultSheet
                 INSTALL_JOB poly_eval POLY_EVAL
                 FORWARD_MODEL poly_eval
                 """
@@ -268,8 +268,8 @@ def test_run_poly_example_with_multiple_design_matrix_instances():
                 NUM_REALIZATIONS 10
                 MIN_REALIZATIONS 1
                 GEN_DATA POLY_RES RESULT_FILE:poly.out
-                DESIGN_MATRIX poly_design_1.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
-                DESIGN_MATRIX poly_design_2.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
+                DESIGN_MATRIX poly_design_1.xlsx
+                DESIGN_MATRIX poly_design_2.xlsx
                 INSTALL_JOB poly_eval POLY_EVAL
                 FORWARD_MODEL poly_eval
                 """
@@ -358,7 +358,7 @@ def test_design_matrix_on_esmda(experiment_mode, ensemble_name, iterations):
                 GEN_KW COEFFS_B coeff_priors_b
                 GEN_KW COEFFS_C coeff_priors_c
                 GEN_DATA POLY_RES RESULT_FILE:poly.out
-                DESIGN_MATRIX design_matrix.xlsx DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet
+                DESIGN_MATRIX design_matrix.xlsx
                 INSTALL_JOB poly_eval POLY_EVAL
                 FORWARD_MODEL poly_eval
                 """
diff --git a/tests/ert/unit_tests/config/test_analysis_config.py b/tests/ert/unit_tests/config/test_analysis_config.py
index 7abaf145a78..bc416ba4439 100644
--- a/tests/ert/unit_tests/config/test_analysis_config.py
+++ b/tests/ert/unit_tests/config/test_analysis_config.py
@@ -126,40 +126,6 @@ def test_invalid_design_matrix_format_raises_validation_error():
         )
 
 
-def test_design_matrix_without_design_sheet_raises_validation_error():
-    with pytest.raises(ConfigValidationError, match="Missing required DESIGN_SHEET"):
-        AnalysisConfig.from_dict(
-            {
-                ConfigKeys.DESIGN_MATRIX: [
-                    [
-                        "my_matrix.xlsx",
-                        {
-                            "DESIGN_": "design",
-                            "DEFAULT_SHEET": "default",
-                        },
-                    ]
-                ],
-            }
-        )
-
-
-def test_design_matrix_without_default_sheet_raises_validation_error():
-    with pytest.raises(ConfigValidationError, match="Missing required DEFAULT_SHEET"):
-        AnalysisConfig.from_dict(
-            {
-                ConfigKeys.DESIGN_MATRIX: [
-                    [
-                        "my_matrix.xlsx",
-                        {
-                            "DESIGN_SHEET": "design",
-                            "DEFAULT_": "default",
-                        },
-                    ]
-                ],
-            }
-        )
-
-
 def test_invalid_min_realization_percentage_raises_config_validation_error():
     with pytest.raises(
         ConfigValidationError,
diff --git a/tests/ert/unit_tests/config/test_ert_config.py b/tests/ert/unit_tests/config/test_ert_config.py
index ef27bae01a3..cfa75ee4eb8 100644
--- a/tests/ert/unit_tests/config/test_ert_config.py
+++ b/tests/ert/unit_tests/config/test_ert_config.py
@@ -2020,7 +2020,7 @@ def test_design2params_also_validates_design_matrix(tmp_path, caplog, monkeypatc
         {"DESIGN2PARAMS": mock_design2params},
     )
     ErtConfig.from_file_contents(
-        f"NUM_REALIZATIONS 1\nFORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet01,<defaultssheet>=DefaultSheet)"
+        f"NUM_REALIZATIONS 1\nFORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet,<defaultssheet>=DefaultSheet)"
     )
     assert "DESIGN_MATRIX validation of DESIGN2PARAMS" in caplog.text
 
@@ -2058,8 +2058,8 @@ def test_two_design2params_validates_design_matrix_merging(
     ErtConfig.from_file_contents(
         f"""\
             NUM_REALIZATIONS 1
-            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet01,<defaultssheet>=DefaultSheet)
-            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file2}, <designsheet>=DesignSheet01,<defaultssheet>=DefaultSheet)
+            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet,<defaultssheet>=DefaultSheet)
+            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file2}, <designsheet>=DesignSheet,<defaultssheet>=DefaultSheet)
             """
     )
     assert (
@@ -2112,12 +2112,34 @@ def test_three_design2params_validates_design_matrix_merging(
     ErtConfig.from_file_contents(
         f"""\
             NUM_REALIZATIONS 1
-            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet01,<defaultssheet>=DefaultSheet)
-            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file2}, <designsheet>=DesignSheet01,<defaultssheet>=DefaultSheet)
-            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file3}, <designsheet>=DesignSheet01,<defaultssheet>=DefaultSheet)
+            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file}, <designsheet>=DesignSheet,<defaultssheet>=DefaultSheet)
+            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file2}, <designsheet>=DesignSheet,<defaultssheet>=DefaultSheet)
+            FORWARD_MODEL DESIGN2PARAMS(<xls_filename>={design_matrix_file3}, <designsheet>=DesignSheet,<defaultssheet>=DefaultSheet)
             """
     )
     assert (
         "Design matrix merging would have failed due to: Design Matrices don't have the same active realizations"
         in caplog.text
     )
+
+
+def test_design_matrix_default_argument(tmp_path):
+    design_matrix_file = tmp_path / "my_design_matrix.xlsx"
+    _create_design_matrix(
+        design_matrix_file,
+        pd.DataFrame(
+            {
+                "REAL": [1],
+                "a": [1],
+                "category": ["cat1"],
+            }
+        ),
+        pd.DataFrame([["b", 1], ["c", 2]]),
+    )
+
+    config = ErtConfig.from_file_contents(
+        f"NUM_REALIZATIONS 1\nDESIGN_MATRIX {design_matrix_file}"
+    )
+    assert config.analysis_config.design_matrix
+    assert config.analysis_config.design_matrix.design_sheet == "DesignSheet"
+    assert config.analysis_config.design_matrix.default_sheet == "DefaultSheet"
diff --git a/tests/ert/unit_tests/gui/simulation/test_run_dialog.py b/tests/ert/unit_tests/gui/simulation/test_run_dialog.py
index 0301bf2ad87..3599de7f146 100644
--- a/tests/ert/unit_tests/gui/simulation/test_run_dialog.py
+++ b/tests/ert/unit_tests/gui/simulation/test_run_dialog.py
@@ -684,7 +684,7 @@ def test_that_design_matrix_show_parameters_button_is_visible(
     )
     default_sheet_df = pd.DataFrame([["b", 1], ["c", 2]])
     with pd.ExcelWriter(xls_filename) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         default_sheet_df.to_excel(
             xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
@@ -693,9 +693,7 @@ def test_that_design_matrix_show_parameters_button_is_visible(
     with open(config_file, "w", encoding="utf-8") as f:
         f.write("NUM_REALIZATIONS 1")
         if design_matrix_entry:
-            f.write(
-                f"\nDESIGN_MATRIX {xls_filename} DESIGN_SHEET:DesignSheet01 DEFAULT_SHEET:DefaultSheet"
-            )
+            f.write(f"\nDESIGN_MATRIX {xls_filename}")
 
     args_mock = Mock()
     args_mock.config = config_file
diff --git a/tests/ert/unit_tests/sensitivity_analysis/test_design_matrix.py b/tests/ert/unit_tests/sensitivity_analysis/test_design_matrix.py
index 68605b52833..37db2bc3885 100644
--- a/tests/ert/unit_tests/sensitivity_analysis/test_design_matrix.py
+++ b/tests/ert/unit_tests/sensitivity_analysis/test_design_matrix.py
@@ -12,11 +12,11 @@
 
 def _create_design_matrix(xls_path, design_matrix_df, default_sheet_df) -> DesignMatrix:
     with pd.ExcelWriter(xls_path) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         default_sheet_df.to_excel(
-            xl_write, index=False, sheet_name="DefaultValues", header=False
+            xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
-    return DesignMatrix(xls_path, "DesignSheet01", "DefaultValues")
+    return DesignMatrix(xls_path, "DesignSheet", "DefaultSheet")
 
 
 @pytest.mark.parametrize(
@@ -145,11 +145,11 @@ def test_read_and_merge_with_existing_parameters(tmp_path, parameters, error_msg
     )
     default_sheet_df = pd.DataFrame([["a", 1], ["b", 4]])
     with pd.ExcelWriter(design_path) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         default_sheet_df.to_excel(
-            xl_write, index=False, sheet_name="DefaultValues", header=False
+            xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
-    design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
+    design_matrix = DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
     if error_msg:
         with pytest.raises(ValueError, match=error_msg):
             design_matrix.merge_with_existing_parameters(extra_genkw_config)
@@ -180,11 +180,11 @@ def test_reading_design_matrix(tmp_path):
     )
     default_sheet_df = pd.DataFrame([["one", 1], ["b", 4], ["d", "case_name"]])
     with pd.ExcelWriter(design_path) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         default_sheet_df.to_excel(
-            xl_write, index=False, sheet_name="DefaultValues", header=False
+            xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
-    design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
+    design_matrix = DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
     design_params = design_matrix.parameter_configuration
     assert all(param in design_params for param in ("a", "b", "c", "one", "d"))
     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):
     )
     default_sheet_df = pd.DataFrame()
     with pd.ExcelWriter(design_path) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         default_sheet_df.to_excel(
-            xl_write, index=False, sheet_name="DefaultValues", header=False
+            xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
 
     with pytest.raises(ValueError, match=error_msg):
-        DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
+        DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
 
 
 @pytest.mark.parametrize(
@@ -270,13 +270,13 @@ def test_reading_design_matrix_validate_headers(tmp_path, column_names, error_ms
     )
     default_sheet_df = pd.DataFrame([["one", 1], ["b", 4], ["d", 6]])
     with pd.ExcelWriter(design_path) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         default_sheet_df.to_excel(
-            xl_write, index=False, sheet_name="DefaultValues", header=False
+            xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
 
     with pytest.raises(ValueError, match=error_msg):
-        DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
+        DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
 
 
 @pytest.mark.parametrize(
@@ -306,13 +306,13 @@ def test_reading_design_matrix_validate_cells(tmp_path, values, error_msg):
     )
     default_sheet_df = pd.DataFrame()
     with pd.ExcelWriter(design_path) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         default_sheet_df.to_excel(
-            xl_write, index=False, sheet_name="DefaultValues", header=False
+            xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
 
     with pytest.raises(ValueError, match=error_msg):
-        DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
+        DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
 
 
 @pytest.mark.parametrize(
@@ -352,13 +352,13 @@ def test_reading_default_sheet_validation(tmp_path, data, error_msg):
     )
     default_sheet_df = pd.DataFrame(data)
     with pd.ExcelWriter(design_path) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         default_sheet_df.to_excel(
-            xl_write, index=False, sheet_name="DefaultValues", header=False
+            xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
 
     with pytest.raises(ValueError, match=error_msg):
-        DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
+        DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
 
 
 def test_default_values_used(tmp_path):
@@ -373,11 +373,11 @@ def test_default_values_used(tmp_path):
     )
     default_sheet_df = pd.DataFrame([["one", 1], ["b", 4], ["d", "case_name"]])
     with pd.ExcelWriter(design_path) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         default_sheet_df.to_excel(
-            xl_write, index=False, sheet_name="DefaultValues", header=False
+            xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
-    design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
+    design_matrix = DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
     df = design_matrix.design_matrix_df
     np.testing.assert_equal(df["one"], np.array([1, 1, 1, 1]))
     np.testing.assert_equal(df["b"], np.array([0, 2, 0, 1]))
diff --git a/tests/ert/unit_tests/test_libres_facade.py b/tests/ert/unit_tests/test_libres_facade.py
index 1f8646a7ca4..4a8c45a021e 100644
--- a/tests/ert/unit_tests/test_libres_facade.py
+++ b/tests/ert/unit_tests/test_libres_facade.py
@@ -276,11 +276,11 @@ def test_save_parameters_to_storage_from_design_dataframe(
     c_values = np.random.default_rng().uniform(-5, 5, 10)
     design_matrix_df = DataFrame({"a": a_values, "b": b_values, "c": c_values})
     with ExcelWriter(design_path) as xl_write:
-        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet01")
+        design_matrix_df.to_excel(xl_write, index=False, sheet_name="DesignSheet")
         DataFrame().to_excel(
-            xl_write, index=False, sheet_name="DefaultValues", header=False
+            xl_write, index=False, sheet_name="DefaultSheet", header=False
         )
-    design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues")
+    design_matrix = DesignMatrix(design_path, "DesignSheet", "DefaultSheet")
     with open_storage(tmp_path / "storage", mode="w") as storage:
         experiment_id = storage.create_experiment(
             parameters=[design_matrix.parameter_configuration]