Repository: equinor/ert
Issue category: Feature Request

Issue:
Make control naming consistent
**Is your feature request related to a problem? Please describe.**
The variables that are optimized (controls in Everest nomenclature) are specified in a nested fashion: We have controls, which defines groups of variables, which in turn can have multiple components labeled with an integer index. For example (from `config_advanced.yml`):

```yml
controls:
  - name: point
    max: 1.0
    min: -1.0
    initial_guess: 0.25
    perturbation_magnitude: 0.005
    type: generic_control
    variables:
      - name: x
        index: 0
      - name: x
        index: 1
      - name: x
        index: 2
```
 This defines three controls, with the following `control`, `variable`, and `index` fields:

- `point`, `x`, `0`
- `point`, `x`, `1`
- `point`, `x`, `2`

When reporting results, control names are constructed from the three fields as follows `control_variable-index`, so we get:
- `point_x-0`
- `point_x-1`
- `point_x-2`

When specifying input constraints, weights need to be set for a sub-set of controls, so controls are needed, but in this case they follow the form `control.variable-index`. For instance (from `config_advanced.yml`):

```yml
input_constraints:
  - weights:
      point.x-0: 0
      point.x-1: 0
      point.x-2: 1
    upper_bound: 0.4
```

This is inconsistent and potentially confusing for the user.

**Describe the solution you'd like**
When a string representation of controls is shown, or required as an input, it should always have the same form. There should be a singe function/method responsible for formatting the string from `control`, `variable`, `index` fields. Preferably this transformation should be invertible, although we should not rely on that in code. If possible, the delimiters used should not be allowed in control and variable names. We should discuss the delimiters to use, but using `.` and `-` would be backwards compatible for specifying input constraints and it would leave the underscore available for control and variable naming. 



Hints:

Patch:
diff --git a/src/everest/bin/config_branch_script.py b/src/everest/bin/config_branch_script.py
index 5df90cb9010..d8ad052e66f 100644
--- a/src/everest/bin/config_branch_script.py
+++ b/src/everest/bin/config_branch_script.py
@@ -66,7 +66,7 @@ def _updated_initial_guess(conf_controls, opt_controls):
     conf_controls = copy(conf_controls)
 
     for control in conf_controls:
-        control_name = f"{control['name']}_"
+        control_name = f"{control['name']}."
         control.pop("initial_guess", None)
         batch_controls = {
             key.split(control_name)[-1]: val
@@ -78,7 +78,7 @@ def _updated_initial_guess(conf_controls, opt_controls):
             var_index = variable.get("index", None)
 
             if var_index is not None:
-                opt_control_name = f"{variable['name']}-{var_index}"
+                opt_control_name = f"{variable['name']}.{var_index}"
             else:
                 opt_control_name = variable["name"]
 
diff --git a/src/everest/config/everest_config.py b/src/everest/config/everest_config.py
index 4f0df35f9af..6fa24869066 100644
--- a/src/everest/config/everest_config.py
+++ b/src/everest/config/everest_config.py
@@ -45,6 +45,7 @@
 from ..config_file_loader import yaml_file_to_substituted_config_dict
 from ..strings import (
     DEFAULT_OUTPUT_DIR,
+    EVEREST,
     OPTIMIZATION_LOG_DIR,
     OPTIMIZATION_OUTPUT_DIR,
     STORAGE_DIR,
@@ -419,27 +420,26 @@ def validate_input_constraints_weight_definition(self) -> Self:
         controls = self.controls
         if controls is None:
             return self
-        control_full_name = []
+        control_names = self.formatted_control_names
+        control_names_deprecated = self.formatted_control_names_dotdash
         errors = []
-        for c in controls:
-            for v in c.variables:
-                if isinstance(v, ControlVariableGuessListConfig):
-                    control_full_name.extend(
-                        f"{c.name}.{v.name}-{index}"
-                        for index, _ in enumerate(v.initial_guess, start=1)
-                    )
-                elif v.index is not None:
-                    control_full_name.append(f"{c.name}.{v.name}-{v.index}")
-                else:
-                    control_full_name.append(f"{c.name}.{v.name}")
 
         for input_const in input_constraints:
             for key in input_const.weights:
-                if key not in control_full_name:
+                if key in control_names_deprecated and key not in control_names:
+                    logging.getLogger(EVEREST).warning(
+                        f"Deprecated reference to control: {key} in input constraint."
+                    )
+                    print(
+                        f"Deprecated input control name: {key} "
+                        f"reference in input constraint. This format is deprecated, "
+                        f"please use only '.' as delimiters: {key.replace('-', '.')}"
+                    )
+                elif key not in control_names and key not in control_names_deprecated:
                     errors.append(
                         f"Input control weight name {key} "
                         f"does not match any instance of "
-                        f"control_name.variable_name-variable_index"
+                        f"control_name.variable_name.variable_index"
                     )
 
         if len(errors) > 0:  # Note: python3.11 ExceptionGroup will solve this nicely
@@ -628,11 +628,27 @@ def formatted_control_names(self) -> list[str]:
             for variable in control.variables:
                 if isinstance(variable, ControlVariableGuessListConfig):
                     for index in range(1, len(variable.initial_guess) + 1):
-                        names.append(f"{control.name}_{variable.name}-{index}")
+                        names.append(f"{control.name}.{variable.name}.{index}")
+                elif variable.index is not None:
+                    names.append(f"{control.name}.{variable.name}.{variable.index}")
+                else:
+                    names.append(f"{control.name}.{variable.name}")
+        return names
+
+    @property
+    def formatted_control_names_dotdash(self) -> list[str]:
+        # Note: Should be removed as the .- way of referencing controls
+        # from input constraints is removed
+        names = []
+        for control in self.controls:
+            for variable in control.variables:
+                if isinstance(variable, ControlVariableGuessListConfig):
+                    for index in range(1, len(variable.initial_guess) + 1):
+                        names.append(f"{control.name}.{variable.name}-{index}")
                 elif variable.index is not None:
-                    names.append(f"{control.name}_{variable.name}-{variable.index}")
+                    names.append(f"{control.name}.{variable.name}-{variable.index}")
                 else:
-                    names.append(f"{control.name}_{variable.name}")
+                    names.append(f"{control.name}.{variable.name}")
         return names
 
     @property
diff --git a/src/everest/config/input_constraint_config.py b/src/everest/config/input_constraint_config.py
index 1bf9dc1fa38..564444ad5c4 100644
--- a/src/everest/config/input_constraint_config.py
+++ b/src/everest/config/input_constraint_config.py
@@ -7,9 +7,9 @@ class InputConstraintConfig(BaseModel, extra="forbid"):  # type: ignore
 If we are trying to constrain only one control (i.e the z control) value:
 | input_constraints:
 | - weights:
-|   point_3D.x-0: 0
-|   point_3D.y-1: 0
-|   point_3D.z-2: 1
+|   point_3D.x.0: 0
+|   point_3D.y.1: 0
+|   point_3D.z.2: 1
 | upper_bound: 0.2
 
 Only control values (x, y, z) that satisfy the following equation will be allowed:
@@ -21,9 +21,9 @@ class InputConstraintConfig(BaseModel, extra="forbid"):  # type: ignore
         description="""**Example**
 | input_constraints:
 | - weights:
-|   point_3D.x-0: 1
-|   point_3D.y-1: 2
-|   point_3D.z-2: 3
+|   point_3D.x.0: 1
+|   point_3D.y.1: 2
+|   point_3D.z.2: 3
 | target: 4
 
 Only control values (x, y, z) that satisfy the following equation will be allowed:
@@ -35,9 +35,9 @@ class InputConstraintConfig(BaseModel, extra="forbid"):  # type: ignore
         description="""**Example**
 | input_constraints:
 | - weights:
-|   point_3D.x-0: 1
-|   point_3D.y-1: 2
-|   point_3D.z-2: 3
+|   point_3D.x.0: 1
+|   point_3D.y.1: 2
+|   point_3D.z.2: 3
 | lower_bound: 4
 
 Only control values (x, y, z) that satisfy the following
@@ -50,9 +50,9 @@ class InputConstraintConfig(BaseModel, extra="forbid"):  # type: ignore
         description="""**Example**
 | input_constraints:
 | - weights:
-|   point_3D.x-0: 1
-|   point_3D.y-1: 2
-|   point_3D.z-2: 3
+|   point_3D.x.0: 1
+|   point_3D.y.1: 2
+|   point_3D.z.2: 3
 | upper_bound: 4
 
 Only control values (x, y, z) that satisfy the following equation will be allowed:
diff --git a/src/everest/optimizer/everest2ropt.py b/src/everest/optimizer/everest2ropt.py
index 20930704170..e6bd5742067 100644
--- a/src/everest/optimizer/everest2ropt.py
+++ b/src/everest/optimizer/everest2ropt.py
@@ -107,22 +107,23 @@ def _parse_objectives(objective_functions: list[ObjectiveFunctionConfig], ropt_c
 def _parse_input_constraints(
     controls: FlattenedControls,
     input_constraints: list[InputConstraintConfig] | None,
+    formatted_control_names: list[str],
+    formatted_control_names_dotdash: list[str],
     ropt_config,
 ):
     if not input_constraints:
         return
 
-    # TODO: Issue #9816 is intended to address the need for a more general
-    # naming scheme. This code should be revisited once that issue is resolved.
-    # Ideally the formatted_control_names property of the config is used.
-    formatted_names = [
-        (
-            f"{control_name[0]}.{control_name[1]}-{control_name[2]}"
-            if len(control_name) > 2
-            else f"{control_name[0]}.{control_name[1]}"
-        )
-        for control_name in controls.names
-    ]
+    def _get_control_index(name: str):
+        try:
+            matching_index = formatted_control_names.index(name.replace("-", "."))
+            return matching_index
+        except ValueError:
+            pass
+
+        # Dash is deprecated, should eventually be removed
+        # along with formatted_control_names_dotdash
+        return formatted_control_names_dotdash.index(name)
 
     coefficients_matrix = []
     rhs_values = []
@@ -135,9 +136,11 @@ def _add_input_constraint(rhs_value, coefficients, constraint_type):
             types.append(constraint_type)
 
     for constr in input_constraints:
-        coefficients = [0.0] * len(formatted_names)
+        coefficients = [0.0] * len(formatted_control_names)
         for name, value in constr.weights.items():
-            coefficients[formatted_names.index(name)] = value
+            index = _get_control_index(name)
+            coefficients[index] = value
+
         target = constr.target
         upper_bound = constr.upper_bound
         lower_bound = constr.lower_bound
@@ -358,7 +361,11 @@ def everest2ropt(
     _parse_controls(flattened_controls, ropt_config)
     _parse_objectives(ever_config.objective_functions, ropt_config)
     _parse_input_constraints(
-        flattened_controls, ever_config.input_constraints, ropt_config
+        flattened_controls,
+        ever_config.input_constraints,
+        ever_config.formatted_control_names,
+        ever_config.formatted_control_names_dotdash,
+        ropt_config,
     )
     _parse_output_constraints(ever_config.output_constraints, ropt_config)
     _parse_optimization(


Test patch:
diff --git a/test-data/everest/math_func/config_advanced.yml b/test-data/everest/math_func/config_advanced.yml
index b9952f51557..96a7b24015f 100644
--- a/test-data/everest/math_func/config_advanced.yml
+++ b/test-data/everest/math_func/config_advanced.yml
@@ -20,9 +20,9 @@ objective_functions:
 
 input_constraints:
   - weights:
-      point.x-0: 0
-      point.x-1: 0
-      point.x-2: 1
+      point.x.0: 0
+      point.x.1: 0
+      point.x.2: 1
     upper_bound: 0.4
 
 output_constraints:
diff --git a/tests/everest/functional/test_main_everest_entry.py b/tests/everest/functional/test_main_everest_entry.py
index 6ab44d1c795..414503af368 100644
--- a/tests/everest/functional/test_main_everest_entry.py
+++ b/tests/everest/functional/test_main_everest_entry.py
@@ -59,9 +59,9 @@ def test_everest_entry_run(cached_example):
     storage.read_from_output_dir()
     optimal = storage.get_optimal_result()
 
-    assert optimal.controls["point_x"] == pytest.approx(0.5, abs=0.05)
-    assert optimal.controls["point_y"] == pytest.approx(0.5, abs=0.05)
-    assert optimal.controls["point_z"] == pytest.approx(0.5, abs=0.05)
+    assert optimal.controls["point.x"] == pytest.approx(0.5, abs=0.05)
+    assert optimal.controls["point.y"] == pytest.approx(0.5, abs=0.05)
+    assert optimal.controls["point.z"] == pytest.approx(0.5, abs=0.05)
 
     assert optimal.total_objective == pytest.approx(0.0, abs=0.0005)
 
diff --git a/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_advanced.yml/snapshot.json b/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_advanced.yml/snapshot.json
index f333faaf641..c5f8cd79c3b 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_advanced.yml/snapshot.json
+++ b/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_advanced.yml/snapshot.json
@@ -16,298 +16,298 @@
     5
   ],
   "control_names": [
-    "point_x-0",
-    "point_x-1",
-    "point_x-2"
+    "point.x.0",
+    "point.x.1",
+    "point.x.2"
   ],
   "control_values": [
     {
       "batch": 0,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.25
     },
     {
       "batch": 0,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.25
     },
     {
       "batch": 0,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.25
     },
     {
       "batch": 0,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.25
     },
     {
       "batch": 0,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.25
     },
     {
       "batch": 0,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.25
     },
     {
       "batch": 1,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.25904478
     },
     {
       "batch": 1,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.13792475
     },
     {
       "batch": 1,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.17336687
     },
     {
       "batch": 1,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.25904478
     },
     {
       "batch": 1,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.13792475
     },
     {
       "batch": 1,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.17336687
     },
     {
       "batch": 2,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.31863568
     },
     {
       "batch": 2,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.00504358
     },
     {
       "batch": 2,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.13385209
     },
     {
       "batch": 2,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.31863568
     },
     {
       "batch": 2,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.00504358
     },
     {
       "batch": 2,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.13385209
     },
     {
       "batch": 3,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.24117771
     },
     {
       "batch": 3,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.03015417
     },
     {
       "batch": 3,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.24583776
     },
     {
       "batch": 3,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.24117771
     },
     {
       "batch": 3,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.03015417
     },
     {
       "batch": 3,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.24583776
     },
     {
       "batch": 4,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.15091481
     },
     {
       "batch": 4,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": -0.00394611
     },
     {
       "batch": 4,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.36960914
     },
     {
       "batch": 4,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.15091481
     },
     {
       "batch": 4,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": -0.00394611
     },
     {
       "batch": 4,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.36960914
     },
     {
       "batch": 5,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.1145273
     },
     {
       "batch": 5,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.00635029
     },
     {
       "batch": 5,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.38836369
     },
     {
       "batch": 5,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "value": 0.1145273
     },
     {
       "batch": 5,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "value": 0.00635029
     },
     {
       "batch": 5,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "value": 0.38836369
     }
   ],
   "gradient_values": [
     {
       "batch": 0,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "function": "distance",
       "value": -0.49076627
     },
     {
       "batch": 0,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "function": "distance",
       "value": -0.50191014
     },
     {
       "batch": 0,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "function": "distance",
       "value": 0.50424549
     },
     {
       "batch": 1,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "function": "distance",
       "value": -0.52209326
     },
     {
       "batch": 1,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "function": "distance",
       "value": -0.28579331
     },
     {
       "batch": 1,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "function": "distance",
       "value": 0.64869691
     },
     {
       "batch": 2,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "function": "distance",
       "value": -0.64281291
     },
     {
       "batch": 2,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "function": "distance",
       "value": -0.00521952
     },
     {
       "batch": 2,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "function": "distance",
       "value": 0.73152662
     },
     {
       "batch": 3,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "function": "distance",
       "value": -0.47276201
     },
     {
       "batch": 3,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "function": "distance",
       "value": -0.0785477
     },
     {
       "batch": 3,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "function": "distance",
       "value": 0.51539765
     },
     {
       "batch": 4,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "function": "distance",
       "value": -0.30369426
     },
     {
       "batch": 4,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "function": "distance",
       "value": 0.02314375
     },
     {
       "batch": 4,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "function": "distance",
       "value": 0.25834193
     },
     {
       "batch": 5,
-      "control": "point_x-0",
+      "control": "point.x.0",
       "function": "distance",
       "value": -0.21656122
     },
     {
       "batch": 5,
-      "control": "point_x-1",
+      "control": "point.x.1",
       "function": "distance",
       "value": -0.00578828
     },
     {
       "batch": 5,
-      "control": "point_x-2",
+      "control": "point.x.2",
       "function": "distance",
       "value": 0.2172204
     }
@@ -428,9 +428,9 @@
   "optimal_result_json": {
     "batch": 5,
     "controls": {
-      "point_x-0": 0.1145273,
-      "point_x-1": 0.00635029,
-      "point_x-2": 0.38836369
+      "point.x.0": 0.1145273,
+      "point.x.1": 0.00635029,
+      "point.x.2": 0.38836369
     },
     "total_objective": -1.52561897
   },
diff --git a/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_minimal.yml/snapshot.json b/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_minimal.yml/snapshot.json
index 0523d94c811..20789d4f099 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_minimal.yml/snapshot.json
+++ b/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_minimal.yml/snapshot.json
@@ -9,73 +9,73 @@
     2
   ],
   "control_names": [
-    "point_x",
-    "point_y",
-    "point_z"
+    "point.x",
+    "point.y",
+    "point.z"
   ],
   "control_values": [
     {
       "batch": 0,
-      "control": "point_x",
+      "control": "point.x",
       "value": 0.1
     },
     {
       "batch": 0,
-      "control": "point_y",
+      "control": "point.y",
       "value": 0.1
     },
     {
       "batch": 0,
-      "control": "point_z",
+      "control": "point.z",
       "value": 0.1
     },
     {
       "batch": 1,
-      "control": "point_x",
+      "control": "point.x",
       "value": 0.90038639
     },
     {
       "batch": 1,
-      "control": "point_y",
+      "control": "point.y",
       "value": 0.90054756
     },
     {
       "batch": 1,
-      "control": "point_z",
+      "control": "point.z",
       "value": 0.89933796
     },
     {
       "batch": 2,
-      "control": "point_x",
+      "control": "point.x",
       "value": 0.50014777
     },
     {
       "batch": 2,
-      "control": "point_y",
+      "control": "point.y",
       "value": 0.50022835
     },
     {
       "batch": 2,
-      "control": "point_z",
+      "control": "point.z",
       "value": 0.49962361
     }
   ],
   "gradient_values": [
     {
       "batch": 0,
-      "control": "point_x",
+      "control": "point.x",
       "function": "distance",
       "value": 0.80038641
     },
     {
       "batch": 0,
-      "control": "point_y",
+      "control": "point.y",
       "function": "distance",
       "value": 0.80054758
     },
     {
       "batch": 0,
-      "control": "point_z",
+      "control": "point.z",
       "function": "distance",
       "value": 0.79933798
     }
@@ -115,9 +115,9 @@
   "optimal_result_json": {
     "batch": 2,
     "controls": {
-      "point_x": 0.50014777,
-      "point_y": 0.50022835,
-      "point_z": 0.49962361
+      "point.x": 0.50014777,
+      "point.y": 0.50022835,
+      "point.z": 0.49962361
     },
     "total_objective": -2.2e-7
   },
diff --git a/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_multiobj.yml/snapshot.json b/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_multiobj.yml/snapshot.json
index 7f2c9e71518..005584974fd 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_multiobj.yml/snapshot.json
+++ b/tests/everest/snapshots/test_api_snapshots/test_api_snapshots/config_multiobj.yml/snapshot.json
@@ -9,91 +9,91 @@
     2
   ],
   "control_names": [
-    "point_x",
-    "point_y",
-    "point_z"
+    "point.x",
+    "point.y",
+    "point.z"
   ],
   "control_values": [
     {
       "batch": 0,
-      "control": "point_x",
+      "control": "point.x",
       "value": 0.0
     },
     {
       "batch": 0,
-      "control": "point_y",
+      "control": "point.y",
       "value": 0.0
     },
     {
       "batch": 0,
-      "control": "point_z",
+      "control": "point.z",
       "value": 0.0
     },
     {
       "batch": 1,
-      "control": "point_x",
+      "control": "point.x",
       "value": -0.00420218
     },
     {
       "batch": 1,
-      "control": "point_y",
+      "control": "point.y",
       "value": -0.0112982
     },
     {
       "batch": 1,
-      "control": "point_z",
+      "control": "point.z",
       "value": 1.0
     },
     {
       "batch": 2,
-      "control": "point_x",
+      "control": "point.x",
       "value": -0.00210079
     },
     {
       "batch": 2,
-      "control": "point_y",
+      "control": "point.y",
       "value": -0.00564829
     },
     {
       "batch": 2,
-      "control": "point_z",
+      "control": "point.z",
       "value": 0.49992811
     }
   ],
   "gradient_values": [
     {
       "batch": 0,
-      "control": "point_x",
+      "control": "point.x",
       "function": "distance_p",
       "value": 0.99589284
     },
     {
       "batch": 0,
-      "control": "point_x",
+      "control": "point.x",
       "function": "distance_q",
       "value": -3.00456477
     },
     {
       "batch": 0,
-      "control": "point_y",
+      "control": "point.y",
       "function": "distance_p",
       "value": 0.98866227
     },
     {
       "batch": 0,
-      "control": "point_y",
+      "control": "point.y",
       "function": "distance_q",
       "value": -3.011388
     },
     {
       "batch": 0,
-      "control": "point_z",
+      "control": "point.z",
       "function": "distance_p",
       "value": 1.00465235
     },
     {
       "batch": 0,
-      "control": "point_z",
+      "control": "point.z",
       "function": "distance_q",
       "value": 1.0044895
     }
@@ -161,9 +161,9 @@
   "optimal_result_json": {
     "batch": 2,
     "controls": {
-      "point_x": -0.00210079,
-      "point_y": -0.00564829,
-      "point_z": 0.49992811
+      "point.x": -0.00210079,
+      "point.y": -0.00564829,
+      "point.z": 0.49992811
     },
     "total_objective": -2.00004834
   },
diff --git a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/batch_df.csv b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/batch_df.csv
index ebeed50de39..7434e3160de 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/batch_df.csv
+++ b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/batch_df.csv
@@ -1,4 +1,4 @@
-batch_id,total_objective_value,distance,grad(distance wrt point_x-0),grad(distance wrt point_x-1),grad(distance wrt point_x-2),grad(distance.total wrt point_x-0),grad(distance.total wrt point_x-1),grad(distance.total wrt point_x-2),merit_value,point_x-0,point_x-1,point_x-2,x-0_coord
+batch_id,total_objective_value,distance,grad(distance wrt point.x.0),grad(distance wrt point.x.1),grad(distance wrt point.x.2),grad(distance.total wrt point.x.0),grad(distance.total wrt point.x.1),grad(distance.total wrt point.x.2),merit_value,point.x.0,point.x.1,point.x.2,x-0_coord
 0,-1.6875,-1.6875,-0.4908,-0.5019,0.5042,-0.4908,-0.5019,0.5042,,1.0,-0.0,-0.0,0.25
 1,-1.6928,-1.6928,-0.5221,-0.2858,0.6487,-0.5221,-0.2858,0.6487,389.8557,1.0,0.0,0.0001,0.259
 2,-1.7356,-1.7356,-0.6428,-0.0052,0.7315,-0.6428,-0.0052,0.7315,381.4612,1.0,0.0,0.0,0.3186
diff --git a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/combined_df.csv b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/combined_df.csv
index 0eb87738e1f..6fe35f89fa3 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/combined_df.csv
+++ b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/combined_df.csv
@@ -1,4 +1,4 @@
-batch_id,realization,simulation_id,perturbation,batch_distance,batch_merit_value,batch_point_x-0,batch_point_x-1,batch_point_x-2,batch_total_objective_value,batch_x-0_coord,distance,grad(distance wrt point_x-0),grad(distance wrt point_x-1),grad(distance wrt point_x-2),grad(distance.total wrt point_x-0),grad(distance.total wrt point_x-1),grad(distance.total wrt point_x-2),point_x-0,point_x-1,point_x-2,x-0_coord
+batch_id,realization,simulation_id,perturbation,batch_distance,batch_merit_value,batch_point.x.0,batch_point.x.1,batch_point.x.2,batch_total_objective_value,batch_x-0_coord,distance,grad(distance wrt point.x.0),grad(distance wrt point.x.1),grad(distance wrt point.x.2),grad(distance.total wrt point.x.0),grad(distance.total wrt point.x.1),grad(distance.total wrt point.x.2),point.x.0,point.x.1,point.x.2,x-0_coord
 0,0,,0,-1.6875,,1.0,-0.0,-0.0,-1.6875,0.25,-6.1975,-0.4908,-0.5019,0.5042,-0.4908,-0.5019,0.5042,0.2538,0.2475,0.2397,0.2538
 0,0,,1,-1.6875,,1.0,-0.0,-0.0,-1.6875,0.25,-6.1979,-0.4908,-0.5019,0.5042,-0.4908,-0.5019,0.5042,0.25,0.2526,0.2474,0.25
 0,0,,2,-1.6875,,1.0,-0.0,-0.0,-1.6875,0.25,-6.169,-0.4908,-0.5019,0.5042,-0.4908,-0.5019,0.5042,0.2485,0.2465,0.2523,0.2485
diff --git a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/pert_real_df.csv b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/pert_real_df.csv
index 7177555072f..33185ce8441 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/pert_real_df.csv
+++ b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_advanced.yml/pert_real_df.csv
@@ -1,4 +1,4 @@
-batch_id,realization,perturbation,simulation_id,distance,point_x-0,point_x-1,point_x-2,x-0_coord
+batch_id,realization,perturbation,simulation_id,distance,point.x.0,point.x.1,point.x.2,x-0_coord
 0,0,,0,-6.1875,0.25,0.25,0.25,0.25
 0,0,0,,-6.1975,0.2538,0.2475,0.2397,0.2538
 0,0,1,,-6.1979,0.25,0.2526,0.2474,0.25
diff --git a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/batch_df.csv b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/batch_df.csv
index ea7608bc92c..efb053bfc1e 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/batch_df.csv
+++ b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/batch_df.csv
@@ -1,4 +1,4 @@
-batch_id,total_objective_value,distance,grad(distance wrt point_x),grad(distance wrt point_y),grad(distance wrt point_z),grad(distance.total wrt point_x),grad(distance.total wrt point_y),grad(distance.total wrt point_z)
+batch_id,total_objective_value,distance,grad(distance wrt point.x),grad(distance wrt point.y),grad(distance wrt point.z),grad(distance.total wrt point.x),grad(distance.total wrt point.y),grad(distance.total wrt point.z)
 0,-0.48,-0.48,0.8004,0.8005,0.7993,0.8004,0.8005,0.7993
 1,-0.4802,-0.4802,,,,,,
 2,-0.0,-0.0,,,,,,
diff --git a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/combined_df.csv b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/combined_df.csv
index 8b6acfeecb0..e77dd34b2d0 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/combined_df.csv
+++ b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/combined_df.csv
@@ -1,4 +1,4 @@
-batch_id,realization,simulation_id,perturbation,batch_distance,batch_total_objective_value,distance,grad(distance wrt point_x),grad(distance wrt point_y),grad(distance wrt point_z),grad(distance.total wrt point_x),grad(distance.total wrt point_y),grad(distance.total wrt point_z),point_x,point_y,point_z
+batch_id,realization,simulation_id,perturbation,batch_distance,batch_total_objective_value,distance,grad(distance wrt point.x),grad(distance wrt point.y),grad(distance wrt point.z),grad(distance.total wrt point.x),grad(distance.total wrt point.y),grad(distance.total wrt point.z),point.x,point.y,point.z
 0,0,,0,-0.48,-0.48,-0.4801,0.8004,0.8005,0.7993,0.8004,0.8005,0.7993,0.099,0.0996,0.1013
 0,0,,1,-0.48,-0.48,-0.4786,0.8004,0.8005,0.7993,0.8004,0.8005,0.7993,0.1002,0.1009,0.1006
 0,0,,2,-0.48,-0.48,-0.4803,0.8004,0.8005,0.7993,0.8004,0.8005,0.7993,0.0994,0.1005,0.0997
diff --git a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/pert_real_df.csv b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/pert_real_df.csv
index b3519c25ef3..d3ecd5d5187 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/pert_real_df.csv
+++ b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_minimal.yml/pert_real_df.csv
@@ -1,4 +1,4 @@
-batch_id,realization,perturbation,simulation_id,distance,point_x,point_y,point_z
+batch_id,realization,perturbation,simulation_id,distance,point.x,point.y,point.z
 0,0,,0,-0.48,0.1,0.1,0.1
 0,0,0,,-0.4801,0.099,0.0996,0.1013
 0,0,1,,-0.4786,0.1002,0.1009,0.1006
diff --git a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/batch_df.csv b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/batch_df.csv
index 37c64f69046..41cef3ed4d7 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/batch_df.csv
+++ b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/batch_df.csv
@@ -1,4 +1,4 @@
-batch_id,total_objective_value,distance_p,distance_q,grad(distance_p wrt point_x),grad(distance_p wrt point_y),grad(distance_p wrt point_z),grad(distance_p.total wrt point_x),grad(distance_p.total wrt point_y),grad(distance_p.total wrt point_z),grad(distance_q wrt point_x),grad(distance_q wrt point_y),grad(distance_q wrt point_z),grad(distance_q.total wrt point_x),grad(distance_q.total wrt point_y),grad(distance_q.total wrt point_z)
+batch_id,total_objective_value,distance_p,distance_q,grad(distance_p wrt point.x),grad(distance_p wrt point.y),grad(distance_p wrt point.z),grad(distance_p.total wrt point.x),grad(distance_p.total wrt point.y),grad(distance_p.total wrt point.z),grad(distance_q wrt point.x),grad(distance_q wrt point.y),grad(distance_q wrt point.z),grad(distance_q.total wrt point.x),grad(distance_q.total wrt point.y),grad(distance_q.total wrt point.z)
 0,-2.3333,-0.75,-4.75,0.9959,0.9887,1.0047,-0.0056,-0.0151,1.3395,-3.0046,-3.0114,1.0045,-0.0056,-0.0151,1.3395
 1,-2.3335,-0.7656,-4.7036,,,,,,,,,,,,
 2,-2.0,-0.5078,-4.4768,,,,,,,,,,,,
diff --git a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/combined_df.csv b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/combined_df.csv
index 90cdffc6e57..fbaa46ebc5e 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/combined_df.csv
+++ b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/combined_df.csv
@@ -1,4 +1,4 @@
-batch_id,realization,simulation_id,perturbation,batch_distance_p,batch_distance_q,batch_total_objective_value,distance_p,distance_q,grad(distance_p wrt point_x),grad(distance_p wrt point_y),grad(distance_p wrt point_z),grad(distance_p.total wrt point_x),grad(distance_p.total wrt point_y),grad(distance_p.total wrt point_z),grad(distance_q wrt point_x),grad(distance_q wrt point_y),grad(distance_q wrt point_z),grad(distance_q.total wrt point_x),grad(distance_q.total wrt point_y),grad(distance_q.total wrt point_z),point_x,point_y,point_z
+batch_id,realization,simulation_id,perturbation,batch_distance_p,batch_distance_q,batch_total_objective_value,distance_p,distance_q,grad(distance_p wrt point.x),grad(distance_p wrt point.y),grad(distance_p wrt point.z),grad(distance_p.total wrt point.x),grad(distance_p.total wrt point.y),grad(distance_p.total wrt point.z),grad(distance_q wrt point.x),grad(distance_q wrt point.y),grad(distance_q wrt point.z),grad(distance_q.total wrt point.x),grad(distance_q.total wrt point.y),grad(distance_q.total wrt point.z),point.x,point.y,point.z
 0,0,,0,-0.75,-4.75,-2.3333,-0.7683,-4.7791,0.9959,0.9887,1.0047,-0.0056,-0.0151,1.3395,-3.0046,-3.0114,1.0045,-0.0056,-0.0151,1.3395,0.0077,-0.005,-0.0205
 0,0,,1,-0.75,-4.75,-2.3333,-0.75,-4.7708,0.9959,0.9887,1.0047,-0.0056,-0.0151,1.3395,-3.0046,-3.0114,1.0045,-0.0056,-0.0151,1.3395,-0.0001,0.0053,-0.0051
 0,0,,2,-0.75,-4.75,-2.3333,-0.7553,-4.7157,0.9959,0.9887,1.0047,-0.0056,-0.0151,1.3395,-3.0046,-3.0114,1.0045,-0.0056,-0.0151,1.3395,-0.0029,-0.007,0.0047
diff --git a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/pert_real_df.csv b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/pert_real_df.csv
index 7ff7373a50a..22c7b72d571 100644
--- a/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/pert_real_df.csv
+++ b/tests/everest/snapshots/test_api_snapshots/test_csv_export/config_multiobj.yml/pert_real_df.csv
@@ -1,4 +1,4 @@
-batch_id,realization,perturbation,simulation_id,distance_p,distance_q,point_x,point_y,point_z
+batch_id,realization,perturbation,simulation_id,distance_p,distance_q,point.x,point.y,point.z
 0,0,,0,-0.75,-4.75,0.0,0.0,0.0
 0,0,0,,-0.7683,-4.7791,0.0077,-0.005,-0.0205
 0,0,1,,-0.75,-4.7708,-0.0001,0.0053,-0.0051
diff --git a/tests/everest/test_config_branch.py b/tests/everest/test_config_branch.py
index 9b1c6f3a2e3..841b41a5437 100644
--- a/tests/everest/test_config_branch.py
+++ b/tests/everest/test_config_branch.py
@@ -25,7 +25,7 @@ def test_get_controls_for_batch(cached_example):
         Path(path) / "everest_output" / "optimization_output", 1
     )
     control_names = set(opt_controls.keys())
-    expected_control_names = {"point_x-0", "point_x-1", "point_x-2"}
+    expected_control_names = {"point.x.0", "point.x.1", "point.x.2"}
 
     assert control_names == expected_control_names
 
diff --git a/tests/everest/test_controls.py b/tests/everest/test_controls.py
index 7cbaab07d42..5358b7a932d 100644
--- a/tests/everest/test_controls.py
+++ b/tests/everest/test_controls.py
@@ -119,7 +119,7 @@ def test_variable_name_index_validation(copy_test_data_to_tmp):
     # Not valid equal names
     config.controls[0].variables[1].name = "w00"
     with pytest.raises(
-        ValidationError, match=r"Subfield\(s\) `name-index` must be unique"
+        ValidationError, match=r"Subfield\(s\) `name.index` must be unique"
     ):
         EverestConfig.model_validate(config.model_dump(exclude_none=True))
     # Not valid index inconsistency
@@ -135,7 +135,7 @@ def test_variable_name_index_validation(copy_test_data_to_tmp):
     for v in config.controls[0].variables:
         v.index = 0
     with pytest.raises(
-        ValidationError, match=r"Subfield\(s\) `name-index` must be unique"
+        ValidationError, match=r"Subfield\(s\) `name.index` must be unique"
     ):
         EverestConfig.model_validate(config.model_dump(exclude_none=True))
 
@@ -153,7 +153,7 @@ def test_variable_name_index_validation(copy_test_data_to_tmp):
     with pytest.raises(
         ValidationError,
         match="does not match any instance of "
-        "control_name\\.variable_name-variable_index",
+        "control_name\\.variable_name\\.variable_index",
     ):
         EverestConfig.model_validate(config_dict)
 
diff --git a/tests/everest/test_cvar.py b/tests/everest/test_cvar.py
index bdcb0f607ee..2c687f91c52 100644
--- a/tests/everest/test_cvar.py
+++ b/tests/everest/test_cvar.py
@@ -31,7 +31,7 @@ def test_mathfunc_cvar(
     run_model.run_experiment(evaluator_server_config)
 
     # Assert
-    x0, x1, x2 = (run_model.result.controls["point_" + p] for p in ["x", "y", "z"])
+    x0, x1, x2 = (run_model.result.controls["point." + p] for p in ["x", "y", "z"])
 
     assert x0 == pytest.approx(0.5, 0.05)
     assert x1 == pytest.approx(0.5, 0.05)
diff --git a/tests/everest/test_detached.py b/tests/everest/test_detached.py
index 464f58038ac..0e8da76d500 100644
--- a/tests/everest/test_detached.py
+++ b/tests/everest/test_detached.py
@@ -346,17 +346,17 @@ def test_get_opt_status(cached_example):
     )
 
     assert np.allclose(
-        opts["control_history"]["point_x"],
+        opts["control_history"]["point.x"],
         [0.0, -0.004202181916184627, -0.0021007888698514315],
         atol=1e-4,
     )
     assert np.allclose(
-        opts["control_history"]["point_y"],
+        opts["control_history"]["point.y"],
         [0.0, -0.011298196942730383, -0.0056482862617779715],
         atol=1e-4,
     )
     assert np.allclose(
-        opts["control_history"]["point_z"], [0.0, 1.0, 0.4999281115746754], atol=1e-4
+        opts["control_history"]["point.z"], [0.0, 1.0, 0.4999281115746754], atol=1e-4
     )
 
     assert np.allclose(
@@ -375,24 +375,24 @@ def test_get_opt_status(cached_example):
     cmond = opts["cli_monitor_data"]
 
     assert cmond["batches"] == [0, 1, 2]
-    assert cmond["controls"][0]["point_x"] == 0.0
-    assert cmond["controls"][0]["point_y"] == 0.0
-    assert cmond["controls"][0]["point_z"] == 0.0
+    assert cmond["controls"][0]["point.x"] == 0.0
+    assert cmond["controls"][0]["point.y"] == 0.0
+    assert cmond["controls"][0]["point.z"] == 0.0
 
     assert np.allclose(
-        cmond["controls"][1]["point_x"], -0.004202181916184627, atol=1e-4
+        cmond["controls"][1]["point.x"], -0.004202181916184627, atol=1e-4
     )
     assert np.allclose(
-        cmond["controls"][1]["point_y"], -0.011298196942730383, atol=1e-4
+        cmond["controls"][1]["point.y"], -0.011298196942730383, atol=1e-4
     )
-    assert np.allclose(cmond["controls"][1]["point_z"], 1.0, atol=1e-4)
+    assert np.allclose(cmond["controls"][1]["point.z"], 1.0, atol=1e-4)
     assert np.allclose(
-        cmond["controls"][2]["point_x"], -0.0021007888698514315, atol=1e-4
+        cmond["controls"][2]["point.x"], -0.0021007888698514315, atol=1e-4
     )
     assert np.allclose(
-        cmond["controls"][2]["point_y"], -0.0056482862617779715, atol=1e-4
+        cmond["controls"][2]["point.y"], -0.0056482862617779715, atol=1e-4
     )
-    assert np.allclose(cmond["controls"][2]["point_z"], 0.4999281115746754, atol=1e-4)
+    assert np.allclose(cmond["controls"][2]["point.z"], 0.4999281115746754, atol=1e-4)
 
     assert np.allclose(
         cmond["objective_value"],
diff --git a/tests/everest/test_discrete.py b/tests/everest/test_discrete.py
index a293f523716..486cfb65077 100644
--- a/tests/everest/test_discrete.py
+++ b/tests/everest/test_discrete.py
@@ -45,5 +45,5 @@ def test_discrete_optimizer(
     run_model.run_experiment(evaluator_server_config)
 
     # Assert
-    assert run_model.result.controls["point_x"] == 3
-    assert run_model.result.controls["point_y"] == 7
+    assert run_model.result.controls["point.x"] == 3
+    assert run_model.result.controls["point.y"] == 7
diff --git a/tests/everest/test_fix_control.py b/tests/everest/test_fix_control.py
index 9c8d902e5c1..90c5f775d9e 100644
--- a/tests/everest/test_fix_control.py
+++ b/tests/everest/test_fix_control.py
@@ -19,4 +19,4 @@ def test_fix_control(
     run_model.run_experiment(evaluator_server_config)
 
     # Check that the first variable remains fixed:
-    assert run_model.result.controls["point_x-0"] == config.controls[0].initial_guess
+    assert run_model.result.controls["point.x.0"] == config.controls[0].initial_guess
diff --git a/tests/everest/test_input_constraints_config.py b/tests/everest/test_input_constraints_config.py
index 84b2a9462a3..5996915be5c 100644
--- a/tests/everest/test_input_constraints_config.py
+++ b/tests/everest/test_input_constraints_config.py
@@ -1,3 +1,7 @@
+import os
+
+from ruamel.yaml import YAML
+
 from everest.config import EverestConfig
 from tests.everest.utils import relpath
 
@@ -31,3 +35,82 @@ def test_input_constraint_initialization():
     # Check the weights
     exp_weights = [0.1, 0.2, 0.3]
     assert exp_weights == [input_constraint.weights[v] for v in exp_vars]
+
+
+def test_input_constraint_control_references(tmp_path, capsys):
+    os.chdir(tmp_path)
+    controls_config = [
+        {
+            "name": "dummy",
+            "type": "generic_control",
+            "min": 0,
+            "max": 1,
+            "initial_guess": 0,
+            "variables": [
+                {"name": "x", "index": "0"},
+                {"name": "x", "index": "1"},
+                {"name": "x", "index": "2"},
+                {"name": "y", "index": "0"},
+            ],
+        }
+    ]
+
+    input_constraints_config_new = [
+        {
+            "weights": {
+                "dummy.x.0": 1.0,
+                "dummy.x.1": 1.0,
+                "dummy.x.2": 1.0,
+                "dummy.y.0": 1.0,
+            }
+        }
+    ]
+
+    input_constraints_config_deprecated = [
+        {
+            "weights": {
+                "dummy.x-0": 1.0,
+                "dummy.x-1": 1.0,
+                "dummy.x-2": 1.0,
+                "dummy.y-0": 1.0,
+            }
+        }
+    ]
+
+    yaml = YAML(typ="safe", pure=True)
+
+    with open("config_nowarns.yml", "w+", encoding="utf-8") as f:
+        yaml.dump(
+            {
+                "model": {"realizations": ["0", "2", "4"]},
+                "controls": controls_config,
+                "objective_functions": [{"name": "dummyobj"}],
+                "input_constraints": input_constraints_config_new,
+            },
+            f,
+        )
+
+    with open("config_warns.yml", "w+", encoding="utf-8") as f:
+        yaml.dump(
+            {
+                "model": {"realizations": ["0", "2", "4"]},
+                "controls": controls_config,
+                "objective_functions": [{"name": "dummyobj"}],
+                "input_constraints": input_constraints_config_deprecated,
+            },
+            f,
+        )
+
+    # Expect no errors/warnings
+    EverestConfig.load_file("config_nowarns.yml")
+    out1 = capsys.readouterr().out
+    assert "Deprecated input control name" not in out1
+
+    EverestConfig.load_file("config_warns.yml")
+    out2 = capsys.readouterr().out
+
+    assert all(
+        f"Deprecated input control name: {control_ref} reference in input constraint."
+        in out2
+        for control_ref in input_constraints_config_deprecated[0]["weights"]
+    )
diff --git a/tests/everest/test_math_func.py b/tests/everest/test_math_func.py
index 082ceebe201..076ba204fc3 100644
--- a/tests/everest/test_math_func.py
+++ b/tests/everest/test_math_func.py
@@ -23,7 +23,7 @@ def test_math_func_multiobj(cached_example):
     storage.read_from_output_dir()
     result = storage.get_optimal_result()
     # Check resulting points
-    x, y, z = (result.controls["point_" + p] for p in ("x", "y", "z"))
+    x, y, z = (result.controls["point." + p] for p in ("x", "y", "z"))
     assert x == pytest.approx(0.0, abs=0.05)
     assert y == pytest.approx(0.0, abs=0.05)
     assert z == pytest.approx(0.5, abs=0.05)
@@ -43,9 +43,9 @@ def test_math_func_advanced(cached_example):
     storage.read_from_output_dir()
     result = storage.get_optimal_result()
 
-    point_names = ["x-0", "x-1", "x-2"]
+    point_names = ["x.0", "x.1", "x.2"]
     # Check resulting points
-    x0, x1, x2 = (result.controls["point_" + p] for p in point_names)
+    x0, x1, x2 = (result.controls["point." + p] for p in point_names)
     assert x0 == pytest.approx(0.1, abs=0.05)
     assert x1 == pytest.approx(0.0, abs=0.05)
     assert x2 == pytest.approx(0.4, abs=0.05)
@@ -148,7 +148,7 @@ def test_math_func_auto_scaled_controls(
     run_model.run_experiment(evaluator_server_config)
 
     # Assert
-    x, y, z = (run_model.result.controls["point_" + p] for p in ("x", "y", "z"))
+    x, y, z = (run_model.result.controls["point." + p] for p in ("x", "y", "z"))
 
     assert x == pytest.approx(0.25, abs=0.05)
     assert y == pytest.approx(0.25, abs=0.05)
diff --git a/tests/everest/test_objective_type.py b/tests/everest/test_objective_type.py
index d4623ba15cd..538014f5f1b 100644
--- a/tests/everest/test_objective_type.py
+++ b/tests/everest/test_objective_type.py
@@ -30,7 +30,7 @@ def test_objective_type(
     run_model.run_experiment(evaluator_server_config)
 
     # Assert
-    x0, x1, x2 = (run_model.result.controls["point_" + p] for p in ["x", "y", "z"])
+    x0, x1, x2 = (run_model.result.controls["point." + p] for p in ["x", "y", "z"])
     assert x0 == pytest.approx(0.5, abs=0.025)
     assert x1 == pytest.approx(0.5, abs=0.025)
     assert x2 == pytest.approx(0.5, abs=0.025)