@@ -41,11 +41,23 @@ def test_scenario_from_mapping_loads_direct_univariate_distribution() -> None:
4141 "plans" : {
4242 "baseline" : {
4343 "state" : {"type" : "baseline" },
44- "distribution" : {"kind" : "normal" , "mean" : 0.0 , "std" : 1.0 },
44+ "distribution" : {
45+ "kind" : "univariate" ,
46+ "family" : "Normal" ,
47+ "parametrization_name" : "meanStd" ,
48+ "mu" : 0.0 ,
49+ "sigma" : 1.0 ,
50+ },
4551 },
4652 "shifted" : {
4753 "state" : {"type" : "shifted" },
48- "distribution" : {"kind" : "normal" , "mean" : 2.0 , "std" : 1.0 },
54+ "distribution" : {
55+ "kind" : "univariate" ,
56+ "family" : "Normal" ,
57+ "parametrization_name" : "meanStd" ,
58+ "mu" : 2.0 ,
59+ "sigma" : 1.0 ,
60+ },
4961 },
5062 },
5163 }
@@ -69,8 +81,20 @@ def test_scenario_from_mapping_loads_independent_columns_distribution() -> None:
6981 "distribution" : {
7082 "kind" : "independent_columns" ,
7183 "columns" : {
72- "x" : {"kind" : "normal" , "mean" : 0.0 , "std" : 1.0 },
73- "y" : {"kind" : "uniform" , "low" : - 1.0 , "high" : 1.0 },
84+ "x" : {
85+ "kind" : "univariate" ,
86+ "family" : "Normal" ,
87+ "parametrization_name" : "meanStd" ,
88+ "mu" : 0.0 ,
89+ "sigma" : 1.0 ,
90+ },
91+ "y" : {
92+ "kind" : "univariate" ,
93+ "family" : "ContinuousUniform" ,
94+ "parametrization_name" : "standard" ,
95+ "lower_bound" : - 1.0 ,
96+ "upper_bound" : 1.0 ,
97+ },
7498 },
7599 }
76100 }
@@ -116,9 +140,11 @@ def test_scenario_from_yaml_loads_single_scenario(tmp_path) -> None: # type: ig
116140plans:
117141 baseline:
118142 distribution:
119- kind: normal
120- mean: 0.0
121- std: 1.0
143+ kind: univariate
144+ family: Normal
145+ parametrization_name: meanStd
146+ mu: 0.0
147+ sigma: 1.0
122148""" ,
123149 encoding = "utf-8" ,
124150 )
@@ -142,7 +168,11 @@ def test_scenarios_from_yaml_loads_mapping(tmp_path) -> None: # type: ignore[no
142168 plans:
143169 baseline:
144170 distribution:
145- kind: normal
171+ kind: univariate
172+ family: Normal
173+ parametrization_name: meanStd
174+ mu: 0.0
175+ sigma: 1.0
146176""" ,
147177 encoding = "utf-8" ,
148178 )
@@ -164,7 +194,11 @@ def test_scenarios_from_yaml_loads_single_scenario_mapping(tmp_path) -> None: #
164194plans:
165195 baseline:
166196 distribution:
167- kind: normal
197+ kind: univariate
198+ family: Normal
199+ parametrization_name: meanStd
200+ mu: 0.0
201+ sigma: 1.0
168202""" ,
169203 encoding = "utf-8" ,
170204 )
@@ -175,6 +209,31 @@ def test_scenarios_from_yaml_loads_single_scenario_mapping(tmp_path) -> None: #
175209 assert scenarios ["fallback" ].name == "fallback"
176210
177211
212+ def test_scenario_from_yaml_loads_custom_parametrization_name (tmp_path ) -> None : # type: ignore[no-untyped-def]
213+ path = tmp_path / "scenario.yaml"
214+ path .write_text (
215+ """
216+ name: yaml_scenario
217+ segments:
218+ - plan_name: baseline
219+ length: 3
220+ plans:
221+ baseline:
222+ distribution:
223+ kind: univariate
224+ family: Normal
225+ parametrization_name: meanStd
226+ mu: 0.0
227+ sigma: 1.0
228+ """ ,
229+ encoding = "utf-8" ,
230+ )
231+
232+ scenario = scenario_from_yaml (path )
233+
234+ assert scenario .plans ["baseline" ].distribution == UnivariateDistributionSpec ("Normal" , "meanStd" , mu = 0.0 , sigma = 1.0 )
235+
236+
178237def test_scenario_from_mapping_rejects_unknown_distribution_kind () -> None :
179238 with pytest .raises (ValueError , match = "Unsupported distribution kind" ):
180239 scenario_from_mapping (
@@ -222,7 +281,9 @@ def test_scenarios_from_yaml_rejects_non_mapping_single_scenario(tmp_path) -> No
222281
223282
224283def test_parse_distribution_spec_loads_exponential_distribution () -> None :
225- distribution = parse_distribution_spec ({"kind" : "exponential" , "scale" : 2.5 })
284+ distribution = parse_distribution_spec (
285+ {"kind" : "univariate" , "family" : "Exponential" , "parametrization_name" : "scale" , "beta" : 2.5 }
286+ )
226287
227288 assert distribution == UnivariateDistributionSpec ("Exponential" , "scale" , beta = 2.5 )
228289
@@ -246,8 +307,19 @@ def test_parse_distribution_spec_loads_independent_columns_univariate_variants()
246307 {
247308 "kind" : "independent_columns" ,
248309 "columns" : {
249- "exp" : {"kind" : "exponential" , "scale" : 3.0 },
250- "uniform" : {"kind" : "uniform" , "low" : - 2.0 , "high" : 2.0 },
310+ "exp" : {
311+ "kind" : "univariate" ,
312+ "family" : "Exponential" ,
313+ "parametrization_name" : "scale" ,
314+ "beta" : 3.0 ,
315+ },
316+ "uniform" : {
317+ "kind" : "univariate" ,
318+ "family" : "ContinuousUniform" ,
319+ "parametrization_name" : "standard" ,
320+ "lower_bound" : - 2.0 ,
321+ "upper_bound" : 2.0 ,
322+ },
251323 },
252324 }
253325 )
@@ -264,6 +336,12 @@ def test_parse_distribution_spec_rejects_student_t_distribution() -> None:
264336 parse_distribution_spec ({"kind" : "student_t" , "df" : 7.0 })
265337
266338
339+ @pytest .mark .parametrize ("kind" , ["normal" , "uniform" , "exponential" ])
340+ def test_parse_distribution_spec_rejects_removed_legacy_univariate_kinds (kind : str ) -> None :
341+ with pytest .raises (ValueError , match = rf"Unsupported distribution kind '{ kind } '" ):
342+ parse_distribution_spec ({"kind" : kind })
343+
344+
267345def test_parse_hashable_mapping_rejects_non_hashable_value () -> None :
268346 with pytest .raises (ValueError , match = "metadata.bad must be hashable" ):
269347 _parse_hashable_mapping ({"bad" : []}, "metadata" )
@@ -324,7 +402,7 @@ def test_scenario_from_mapping_rejects_non_scalar_state_value() -> None:
324402 "plans" : {
325403 "baseline" : {
326404 "state" : {"bad" : []},
327- "distribution" : {"kind" : "normal" },
405+ "distribution" : {"kind" : "univariate" , "family" : "Normal" , "mu" : 0.0 , "sigma" : 1.0 },
328406 }
329407 },
330408 }
0 commit comments