Repository: great-expectations/great_expectations

Issue:
Use cleaner solution for non-truncating division in python 2
Prefer `from __future__ import division` to `1.*x/y`


Discussion:
Done inline during improve_partitions push.

Resolving patch:
diff --git a/great_expectations/rule_based_profiler/parameter_builder/metric_multi_batch_parameter_builder.py b/great_expectations/rule_based_profiler/parameter_builder/metric_multi_batch_parameter_builder.py
--- a/great_expectations/rule_based_profiler/parameter_builder/metric_multi_batch_parameter_builder.py
+++ b/great_expectations/rule_based_profiler/parameter_builder/metric_multi_batch_parameter_builder.py
@@ -28,7 +28,7 @@ class MetricMultiBatchParameterBuilder(ParameterBuilder):
     def __init__(
         self,
         name: str,
-        metric_name: Optional[str] = None,
+        metric_name: str,
         metric_domain_kwargs: Optional[Union[str, dict]] = None,
         metric_value_kwargs: Optional[Union[str, dict]] = None,
         enforce_numeric_metric: Union[str, bool] = False,
diff --git a/great_expectations/rule_based_profiler/parameter_builder/numeric_metric_range_multi_batch_parameter_builder.py b/great_expectations/rule_based_profiler/parameter_builder/numeric_metric_range_multi_batch_parameter_builder.py
--- a/great_expectations/rule_based_profiler/parameter_builder/numeric_metric_range_multi_batch_parameter_builder.py
+++ b/great_expectations/rule_based_profiler/parameter_builder/numeric_metric_range_multi_batch_parameter_builder.py
@@ -22,6 +22,7 @@
 from great_expectations.rule_based_profiler.types import (
     FULLY_QUALIFIED_PARAMETER_NAME_METADATA_KEY,
     FULLY_QUALIFIED_PARAMETER_NAME_VALUE_KEY,
+    RAW_PARAMETER_KEY,
     Domain,
     MetricValues,
     NumericRangeEstimationResult,
@@ -83,6 +84,7 @@ def __init__(
         self,
         name: str,
         metric_name: Optional[str] = None,
+        metric_multi_batch_parameter_builder_name: Optional[str] = None,
         metric_domain_kwargs: Optional[Union[str, dict]] = None,
         metric_value_kwargs: Optional[Union[str, dict]] = None,
         enforce_numeric_metric: Union[str, bool] = True,
@@ -110,6 +112,7 @@ def __init__(
                 the fully-qualified parameter name; a fully-qualified parameter name must start with "$parameter."
                 and may contain one or more subsequent parts (e.g., "$parameter.<my_param_from_config>.<metric_name>").
             metric_name: the name of a metric used in MetricConfiguration (must be a supported and registered metric)
+            metric_multi_batch_parameter_builder_name: name of parameter that computes "metric_name" (for every Batch).
             metric_domain_kwargs: used in MetricConfiguration
             metric_value_kwargs: used in MetricConfiguration
             enforce_numeric_metric: used in MetricConfiguration to insure that metric computations return numeric values
@@ -154,6 +157,10 @@ def __init__(
             data_context=data_context,
         )
 
+        self._metric_multi_batch_parameter_builder_name = (
+            metric_multi_batch_parameter_builder_name
+        )
+
         self._false_positive_rate = false_positive_rate
 
         self._quantile_statistic_interpolation_method = (
@@ -195,9 +202,9 @@ def __init__(
 
         self._truncate_values = truncate_values
 
-    """
-    Full getter/setter accessors for needed properties are for configuring MetricMultiBatchParameterBuilder dynamically.
-    """
+    @property
+    def metric_multi_batch_parameter_builder_name(self) -> str:
+        return self._metric_multi_batch_parameter_builder_name
 
     @property
     def false_positive_rate(self) -> Union[str, float]:
@@ -290,19 +297,36 @@ def _build_parameters(
             )
             false_positive_rate = np.float64(1.0 - NP_EPSILON)
 
-        # Compute metric value for each Batch object.
-        super().build_parameters(
-            domain=domain,
-            variables=variables,
-            parameters=parameters,
-            parameter_computation_impl=super()._build_parameters,
-            recompute_existing_parameter_values=recompute_existing_parameter_values,
-        )
+        parameter_reference: str
+        if self.metric_multi_batch_parameter_builder_name:
+            # Obtain metric_multi_batch_parameter_builder_name from "rule state" (i.e., variables and parameters); from instance variable otherwise.
+            metric_multi_batch_parameter_builder_name: str = (
+                get_parameter_value_and_validate_return_type(
+                    domain=domain,
+                    parameter_reference=self.metric_multi_batch_parameter_builder_name,
+                    expected_return_type=str,
+                    variables=variables,
+                    parameters=parameters,
+                )
+            )
+            parameter_reference = (
+                f"{RAW_PARAMETER_KEY}{metric_multi_batch_parameter_builder_name}"
+            )
+        else:
+            # Compute metric value for each Batch object.
+            super().build_parameters(
+                domain=domain,
+                variables=variables,
+                parameters=parameters,
+                parameter_computation_impl=super()._build_parameters,
+                recompute_existing_parameter_values=recompute_existing_parameter_values,
+            )
+            parameter_reference = self.raw_fully_qualified_parameter_name
 
         # Retrieve metric values for all Batch objects.
         parameter_node: ParameterNode = get_parameter_value_and_validate_return_type(
             domain=domain,
-            parameter_reference=self.raw_fully_qualified_parameter_name,
+            parameter_reference=parameter_reference,
             expected_return_type=None,
             variables=variables,
             parameters=parameters,


Test patch:
diff --git a/tests/rule_based_profiler/parameter_builder/test_numeric_metric_range_multi_batch_parameter_builder.py b/tests/rule_based_profiler/parameter_builder/test_numeric_metric_range_multi_batch_parameter_builder.py
--- a/tests/rule_based_profiler/parameter_builder/test_numeric_metric_range_multi_batch_parameter_builder.py
+++ b/tests/rule_based_profiler/parameter_builder/test_numeric_metric_range_multi_batch_parameter_builder.py
@@ -1,5 +1,5 @@
 import re
-from typing import Dict, Optional
+from typing import Dict, List, Optional
 
 import numpy as np
 import pytest
@@ -8,12 +8,14 @@
 import great_expectations.exceptions as ge_exceptions
 from great_expectations.data_context import DataContext
 from great_expectations.execution_engine.execution_engine import MetricDomainTypes
+from great_expectations.rule_based_profiler.config import ParameterBuilderConfig
 from great_expectations.rule_based_profiler.helpers.util import NP_EPSILON
 from great_expectations.rule_based_profiler.parameter_builder import (
     NumericMetricRangeMultiBatchParameterBuilder,
     ParameterBuilder,
 )
 from great_expectations.rule_based_profiler.types import (
+    DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
     Domain,
     ParameterContainer,
     ParameterNode,
@@ -39,10 +41,12 @@ def test_bootstrap_numeric_metric_range_multi_batch_parameter_builder_bobby(
         NumericMetricRangeMultiBatchParameterBuilder(
             name="row_count_range",
             metric_name="table.row_count",
+            metric_multi_batch_parameter_builder_name=None,
             estimator="bootstrap",
             include_estimator_samples_histogram_in_details=True,
             false_positive_rate=1.0e-2,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -73,7 +77,7 @@ def test_bootstrap_numeric_metric_range_multi_batch_parameter_builder_bobby(
     assert len(parameter_nodes) == 1
 
     fully_qualified_parameter_name_for_value: str = "$parameter.row_count_range"
-    expected_value_dict: dict = {
+    expected_value_dict: Dict[str, Optional[str]] = {
         "value": None,
         "details": {
             "metric_configuration": {
@@ -159,18 +163,17 @@ def test_oneshot_numeric_metric_range_multi_batch_parameter_builder_bobby(
 
     fully_qualified_parameter_name_for_value: str = "$parameter.column_min_range"
 
-    expected_value_dict: dict
-    actual_value_dict: dict
-
     numeric_metric_range_parameter_builder: ParameterBuilder = (
         NumericMetricRangeMultiBatchParameterBuilder(
             name="column_min_range",
             metric_name="column.min",
-            metric_domain_kwargs=metric_domain_kwargs,
+            metric_multi_batch_parameter_builder_name=None,
+            metric_domain_kwargs=DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
             estimator="oneshot",
             include_estimator_samples_histogram_in_details=True,
             false_positive_rate=1.0e-2,
             round_decimals=1,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -201,7 +204,7 @@ def test_oneshot_numeric_metric_range_multi_batch_parameter_builder_bobby(
     )
     assert len(parameter_nodes) == 1
 
-    expected_value_dict = {
+    expected_value_dict: Dict[str, Optional[str]] = {
         "value": None,
         "details": {
             "metric_configuration": {
@@ -265,11 +268,13 @@ def test_oneshot_numeric_metric_range_multi_batch_parameter_builder_bobby(
         NumericMetricRangeMultiBatchParameterBuilder(
             name="column_min_range",
             metric_name="column.min",
-            metric_domain_kwargs=metric_domain_kwargs,
+            metric_multi_batch_parameter_builder_name=None,
+            metric_domain_kwargs=DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
             estimator="oneshot",
             include_estimator_samples_histogram_in_details=True,
             false_positive_rate=5.0e-2,
             round_decimals=1,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -326,6 +331,140 @@ def test_oneshot_numeric_metric_range_multi_batch_parameter_builder_bobby(
         ]
     )
 
+    # Assert no significant difference between expected (null hypothesis) and actual estimation histograms.
+    ks_result = stats.ks_2samp(
+        data1=actual_estimation_histogram, data2=expected_estimation_histogram
+    )
+    p_value: float = ks_result[1]
+    assert p_value > 9.5e-1
+
+
+def test_oneshot_numeric_metric_range_multi_batch_parameter_builder_with_evaluation_dependency_bobby(
+    bobby_columnar_table_multi_batch_deterministic_data_context,
+):
+    data_context: DataContext = (
+        bobby_columnar_table_multi_batch_deterministic_data_context
+    )
+
+    batch_request: Dict[str, str] = {
+        "datasource_name": "taxi_pandas",
+        "data_connector_name": "monthly",
+        "data_asset_name": "my_reports",
+    }
+
+    metric_domain_kwargs: Dict[str, str] = {"column": "fare_amount"}
+
+    fully_qualified_parameter_name_for_value: str = "$parameter.column_min_range"
+
+    my_column_min_metric_multi_batch_parameter_builder_config: ParameterBuilderConfig = ParameterBuilderConfig(
+        module_name="great_expectations.rule_based_profiler.parameter_builder",
+        class_name="MetricMultiBatchParameterBuilder",
+        name="my_column_min",
+        metric_name="column.min",
+        metric_domain_kwargs=DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
+        metric_value_kwargs=None,
+        enforce_numeric_metric=True,
+        replace_nan_with_zero=True,
+        reduce_scalar_metric=True,
+        evaluation_parameter_builder_configs=None,
+    )
+    evaluation_parameter_builder_configs: Optional[List[ParameterBuilderConfig]] = [
+        my_column_min_metric_multi_batch_parameter_builder_config,
+    ]
+    numeric_metric_range_parameter_builder: ParameterBuilder = (
+        NumericMetricRangeMultiBatchParameterBuilder(
+            name="column_min_range",
+            metric_name=None,
+            metric_multi_batch_parameter_builder_name="my_column_min",
+            metric_domain_kwargs=DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
+            estimator="oneshot",
+            include_estimator_samples_histogram_in_details=True,
+            false_positive_rate=1.0e-2,
+            round_decimals=1,
+            evaluation_parameter_builder_configs=evaluation_parameter_builder_configs,
+            data_context=data_context,
+        )
+    )
+
+    variables: Optional[ParameterContainer] = None
+
+    domain: Domain = Domain(
+        domain_type=MetricDomainTypes.COLUMN,
+        domain_kwargs=metric_domain_kwargs,
+        rule_name="my_rule",
+    )
+    parameter_container: ParameterContainer = ParameterContainer(parameter_nodes=None)
+    parameters: Dict[str, ParameterContainer] = {
+        domain.id: parameter_container,
+    }
+
+    assert parameter_container.parameter_nodes is None
+
+    numeric_metric_range_parameter_builder.build_parameters(
+        domain=domain,
+        variables=variables,
+        parameters=parameters,
+        batch_request=batch_request,
+    )
+
+    parameter_nodes: Optional[Dict[str, ParameterNode]] = (
+        parameter_container.parameter_nodes or {}
+    )
+    assert len(parameter_nodes) == 1
+
+    expected_value_dict: Dict[str, Optional[str]] = {
+        "value": None,
+        "details": {
+            "metric_configuration": {
+                "domain_kwargs": {"column": "fare_amount"},
+                "metric_name": "column.min",
+                "metric_value_kwargs": None,
+                "metric_dependencies": None,
+            },
+            "num_batches": 3,
+        },
+    }
+
+    parameter_node: ParameterNode = (
+        get_parameter_value_by_fully_qualified_parameter_name(
+            fully_qualified_parameter_name=fully_qualified_parameter_name_for_value,
+            domain=domain,
+            parameters=parameters,
+        )
+    )
+
+    actual_values_01: np.ndarray = parameter_node.pop("value")
+    parameter_node["value"] = None
+
+    actual_estimation_histogram: np.ndarray = parameter_node.details.pop(
+        "estimation_histogram"
+    )
+
+    assert parameter_node == expected_value_dict
+
+    actual_value_01_lower: float = actual_values_01[0]
+    actual_value_01_upper: float = actual_values_01[1]
+    expected_value_01_lower: float = -51.7
+    expected_value_01_upper: float = -21.0
+
+    assert actual_value_01_lower == expected_value_01_lower
+    assert actual_value_01_upper == expected_value_01_upper
+
+    expected_estimation_histogram: np.ndarray = np.array(
+        [
+            1.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            2.0,
+        ]
+    )
+
     # Assert no significant difference between expected (null hypothesis) and actual estimation histograms.
     ks_result: tuple = stats.ks_2samp(
         data1=actual_estimation_histogram, data2=expected_estimation_histogram
@@ -333,6 +472,80 @@ def test_oneshot_numeric_metric_range_multi_batch_parameter_builder_bobby(
     p_value: float = ks_result[1]
     assert p_value > 9.5e-1
 
+    numeric_metric_range_parameter_builder = (
+        NumericMetricRangeMultiBatchParameterBuilder(
+            name="column_min_range",
+            metric_name="column.min",
+            metric_multi_batch_parameter_builder_name="my_column_min",
+            metric_domain_kwargs=DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
+            estimator="oneshot",
+            include_estimator_samples_histogram_in_details=True,
+            false_positive_rate=5.0e-2,
+            round_decimals=1,
+            evaluation_parameter_builder_configs=evaluation_parameter_builder_configs,
+            data_context=data_context,
+        )
+    )
+
+    numeric_metric_range_parameter_builder.build_parameters(
+        domain=domain,
+        variables=variables,
+        parameters=parameters,
+        recompute_existing_parameter_values=True,
+        batch_request=batch_request,
+    )
+
+    parameter_node: ParameterNode = (
+        get_parameter_value_by_fully_qualified_parameter_name(
+            fully_qualified_parameter_name=fully_qualified_parameter_name_for_value,
+            domain=domain,
+            parameters=parameters,
+        )
+    )
+
+    actual_values_05 = parameter_node.pop("value")
+    parameter_node["value"] = None
+
+    actual_estimation_histogram: np.ndarray = parameter_node.details.pop(
+        "estimation_histogram"
+    )
+
+    assert parameter_node == expected_value_dict
+
+    actual_value_05_lower: float = actual_values_05[0]
+    actual_value_05_upper: float = actual_values_05[1]
+    expected_value_05_lower: float = -50.5
+    expected_value_05_upper: float = -21.1
+
+    assert actual_value_05_lower == expected_value_05_lower
+    assert actual_value_05_upper == expected_value_05_upper
+
+    # if false positive rate is higher, our range should be more narrow
+    assert actual_value_01_lower < actual_value_05_lower
+    assert actual_value_01_upper > actual_value_05_upper
+
+    expected_estimation_histogram: np.ndarray = np.array(
+        [
+            1.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            0.0,
+            2.0,
+        ]
+    )
+
+    # Assert no significant difference between expected (null hypothesis) and actual estimation histograms.
+    ks_result = stats.ks_2samp(
+        data1=actual_estimation_histogram, data2=expected_estimation_histogram
+    )
+    p_value: float = ks_result[1]
+    assert p_value > 9.5e-1
+
 
 def test_bootstrap_numeric_metric_range_multi_batch_parameter_builder_bobby_false_positive_rate_one(
     bobby_columnar_table_multi_batch_deterministic_data_context,
@@ -352,9 +565,11 @@ def test_bootstrap_numeric_metric_range_multi_batch_parameter_builder_bobby_fals
         NumericMetricRangeMultiBatchParameterBuilder(
             name="row_count_range",
             metric_name="table.row_count",
+            metric_multi_batch_parameter_builder_name=None,
             estimator="bootstrap",
             false_positive_rate=1.0,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -404,9 +619,11 @@ def test_bootstrap_numeric_metric_range_multi_batch_parameter_builder_bobby_fals
         NumericMetricRangeMultiBatchParameterBuilder(
             name="row_count_range",
             metric_name="table.row_count",
+            metric_multi_batch_parameter_builder_name=None,
             estimator="bootstrap",
             false_positive_rate=-0.05,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -456,9 +673,11 @@ def test_bootstrap_numeric_metric_range_multi_batch_parameter_builder_bobby_fals
         NumericMetricRangeMultiBatchParameterBuilder(
             name="row_count_range",
             metric_name="table.row_count",
+            metric_multi_batch_parameter_builder_name=None,
             estimator="bootstrap",
             false_positive_rate=0.0,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -515,9 +734,11 @@ def test_bootstrap_numeric_metric_range_multi_batch_parameter_builder_bobby_fals
         NumericMetricRangeMultiBatchParameterBuilder(
             name="row_count_range",
             metric_name="table.row_count",
+            metric_multi_batch_parameter_builder_name=None,
             estimator="bootstrap",
             false_positive_rate=smaller_than_np_epsilon_false_positive_rate,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -567,10 +788,12 @@ def test_kde_numeric_metric_range_multi_batch_parameter_builder_bobby(
         NumericMetricRangeMultiBatchParameterBuilder(
             name="row_count_range",
             metric_name="table.row_count",
+            metric_multi_batch_parameter_builder_name=None,
             estimator="kde",
             include_estimator_samples_histogram_in_details=True,
             false_positive_rate=1.0e-2,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -601,7 +824,7 @@ def test_kde_numeric_metric_range_multi_batch_parameter_builder_bobby(
     assert len(parameter_nodes) == 1
 
     fully_qualified_parameter_name_for_value: str = "$parameter.row_count_range"
-    expected_value_dict: dict = {
+    expected_value_dict: Dict[str, Optional[str]] = {
         "value": None,
         "details": {
             "metric_configuration": {
@@ -694,10 +917,12 @@ def test_numeric_metric_range_multi_batch_parameter_builder_bobby_kde_vs_bootstr
         NumericMetricRangeMultiBatchParameterBuilder(
             name="column_max_range",
             metric_name="column.max",
-            metric_domain_kwargs=metric_domain_kwargs,
+            metric_multi_batch_parameter_builder_name=None,
+            metric_domain_kwargs=DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
             estimator="bootstrap",
             false_positive_rate=5.0e-2,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -705,8 +930,9 @@ def test_numeric_metric_range_multi_batch_parameter_builder_bobby_kde_vs_bootstr
     variables: Optional[ParameterContainer] = None
 
     domain: Domain = Domain(
+        domain_type=MetricDomainTypes.COLUMN,
+        domain_kwargs=metric_domain_kwargs,
         rule_name="my_rule",
-        domain_type=MetricDomainTypes.TABLE,
     )
     parameter_container: ParameterContainer = ParameterContainer(parameter_nodes=None)
     parameters: Dict[str, ParameterContainer] = {
@@ -743,20 +969,16 @@ def test_numeric_metric_range_multi_batch_parameter_builder_bobby_kde_vs_bootstr
         NumericMetricRangeMultiBatchParameterBuilder(
             name="column_max_range",
             metric_name="column.max",
-            metric_domain_kwargs=metric_domain_kwargs,
+            metric_multi_batch_parameter_builder_name=None,
+            metric_domain_kwargs=DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
             estimator="kde",
             false_positive_rate=5.0e-2,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
 
-    variables: Optional[ParameterContainer] = None
-
-    domain: Domain = Domain(
-        rule_name="my_rule",
-        domain_type=MetricDomainTypes.TABLE,
-    )
     parameter_container: ParameterContainer = ParameterContainer(parameter_nodes=None)
     parameters: Dict[str, ParameterContainer] = {
         domain.id: parameter_container,
@@ -815,10 +1037,12 @@ def test_numeric_metric_range_multi_batch_parameter_builder_bobby_kde_bw_method(
         NumericMetricRangeMultiBatchParameterBuilder(
             name="column_min_range",
             metric_name="column.min",
-            metric_domain_kwargs=metric_domain_kwargs,
+            metric_multi_batch_parameter_builder_name=None,
+            metric_domain_kwargs=DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
             estimator="kde",
             false_positive_rate=5.0e-2,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
@@ -826,8 +1050,9 @@ def test_numeric_metric_range_multi_batch_parameter_builder_bobby_kde_bw_method(
     variables: Optional[ParameterContainer] = None
 
     domain: Domain = Domain(
+        domain_type=MetricDomainTypes.COLUMN,
+        domain_kwargs=metric_domain_kwargs,
         rule_name="my_rule",
-        domain_type=MetricDomainTypes.TABLE,
     )
     parameter_container: ParameterContainer = ParameterContainer(parameter_nodes=None)
     parameters: Dict[str, ParameterContainer] = {
@@ -864,21 +1089,17 @@ def test_numeric_metric_range_multi_batch_parameter_builder_bobby_kde_bw_method(
         NumericMetricRangeMultiBatchParameterBuilder(
             name="column_min_range",
             metric_name="column.min",
-            metric_domain_kwargs=metric_domain_kwargs,
+            metric_multi_batch_parameter_builder_name=None,
+            metric_domain_kwargs=DOMAIN_KWARGS_PARAMETER_FULLY_QUALIFIED_NAME,
             estimator="kde",
             bw_method=0.5,
             false_positive_rate=5.0e-2,
             round_decimals=0,
+            evaluation_parameter_builder_configs=None,
             data_context=data_context,
         )
     )
 
-    variables: Optional[ParameterContainer] = None
-
-    domain: Domain = Domain(
-        rule_name="my_rule",
-        domain_type=MetricDomainTypes.TABLE,
-    )
     parameter_container: ParameterContainer = ParameterContainer(parameter_nodes=None)
     parameters: Dict[str, ParameterContainer] = {
         domain.id: parameter_container,