@@ -353,36 +353,32 @@ def test_flatten_timepoint_specific_output_overrides():
353353 OBSERVABLE_FORMULA : [
354354 "observableParameter1_obs1 + observableParameter2_obs1"
355355 ],
356- NOISE_FORMULA : ["noiseParameter1_obs1" ],
356+ NOISE_FORMULA : [
357+ "(observableParameter1_obs1 + observableParameter2_obs1) * noiseParameter1_obs1"
358+ ],
357359 }
358360 )
359361 observable_df .set_index (OBSERVABLE_ID , inplace = True )
360362
363+ # new observable IDs (obs${i_obs}_${i_obsParOverride}_${i_noiseParOverride}_${i_condition})
364+ obs1_1_1_1 = "obs1__obsParOverride1_1_0__noiseParOverride1__condition1"
365+ obs1_2_1_1 = "obs1__obsParOverride2_1_0__noiseParOverride1__condition1"
366+ obs1_2_2_1 = "obs1__obsParOverride2_1_0__noiseParOverride2__condition1"
361367 observable_df_expected = pd .DataFrame (
362368 data = {
363- OBSERVABLE_ID : [
364- "obs1__obsParOverride1_1_0__noiseParOverride1__condition1" ,
365- "obs1__obsParOverride2_1_0__noiseParOverride1__condition1" ,
366- "obs1__obsParOverride2_1_0__noiseParOverride2__condition1" ,
367- ],
369+ OBSERVABLE_ID : [obs1_1_1_1 , obs1_2_1_1 , obs1_2_2_1 ],
368370 OBSERVABLE_FORMULA : [
369- "observableParameter1_obs1__obsParOverride1_1_0__"
370- "noiseParOverride1__condition1 + observableParameter2_obs1"
371- "__obsParOverride1_1_0__noiseParOverride1__condition1" ,
372- "observableParameter1_obs1__obsParOverride2_1_0__noiseParOverride1"
373- "__condition1 + observableParameter2_obs1__obsParOverride2_1_0"
374- "__noiseParOverride1__condition1" ,
375- "observableParameter1_obs1__obsParOverride2_1_0"
376- "__noiseParOverride2__condition1 + observableParameter2_obs1__"
377- "obsParOverride2_1_0__noiseParOverride2__condition1" ,
371+ f"observableParameter1_{ obs1_1_1_1 } + observableParameter2_{ obs1_1_1_1 } " ,
372+ f"observableParameter1_{ obs1_2_1_1 } + observableParameter2_{ obs1_2_1_1 } " ,
373+ f"observableParameter1_{ obs1_2_2_1 } + observableParameter2_{ obs1_2_2_1 } " ,
378374 ],
379375 NOISE_FORMULA : [
380- "noiseParameter1_obs1__obsParOverride1_1_0__ "
381- "noiseParOverride1__condition1 " ,
382- "noiseParameter1_obs1__obsParOverride2_1_0__ "
383- "noiseParOverride1__condition1 " ,
384- "noiseParameter1_obs1__obsParOverride2_1_0__ "
385- "noiseParOverride2__condition1 " ,
376+ f"(observableParameter1_ { obs1_1_1_1 } + observableParameter2_ { obs1_1_1_1 } ) "
377+ f" * noiseParameter1_ { obs1_1_1_1 } " ,
378+ f"(observableParameter1_ { obs1_2_1_1 } + observableParameter2_ { obs1_2_1_1 } ) "
379+ f" * noiseParameter1_ { obs1_2_1_1 } " ,
380+ f"(observableParameter1_ { obs1_2_2_1 } + observableParameter2_ { obs1_2_2_1 } ) "
381+ f" * noiseParameter1_ { obs1_2_2_1 } " ,
386382 ],
387383 }
388384 )
@@ -418,12 +414,7 @@ def test_flatten_timepoint_specific_output_overrides():
418414
419415 measurement_df_expected = pd .DataFrame (
420416 data = {
421- OBSERVABLE_ID : [
422- "obs1__obsParOverride1_1_0__noiseParOverride1__condition1" ,
423- "obs1__obsParOverride2_1_0__noiseParOverride1__condition1" ,
424- "obs1__obsParOverride2_1_0__noiseParOverride2__condition1" ,
425- "obs1__obsParOverride2_1_0__noiseParOverride2__condition1" ,
426- ],
417+ OBSERVABLE_ID : [obs1_1_1_1 , obs1_2_1_1 , obs1_2_2_1 , obs1_2_2_1 ],
427418 SIMULATION_CONDITION_ID : [
428419 "condition1" ,
429420 "condition1" ,
@@ -472,8 +463,12 @@ def test_flatten_timepoint_specific_output_overrides():
472463 is False
473464 )
474465
475- assert problem .observable_df .equals (observable_df_expected ) is True
476- assert problem .measurement_df .equals (measurement_df_expected ) is True
466+ pd .testing .assert_frame_equal (
467+ problem .observable_df , observable_df_expected
468+ )
469+ pd .testing .assert_frame_equal (
470+ problem .measurement_df , measurement_df_expected
471+ )
477472
478473 assert petab .lint_problem (problem ) is False
479474
@@ -591,8 +586,12 @@ def test_flatten_timepoint_specific_output_overrides_special_cases():
591586 is False
592587 )
593588
594- assert problem .observable_df .equals (observable_df_expected ) is True
595- assert problem .measurement_df .equals (measurement_df_expected ) is True
589+ pd .testing .assert_frame_equal (
590+ problem .observable_df , observable_df_expected
591+ )
592+ pd .testing .assert_frame_equal (
593+ problem .measurement_df , measurement_df_expected
594+ )
596595
597596 assert petab .lint_problem (problem ) is False
598597
@@ -842,13 +841,14 @@ def test_get_required_parameters_for_parameter_table(petab_problem):
842841 # as part of the proportional error model.
843842 assert "observableParameter1_obs1" in noise_placeholders
844843
845- required_parameters_for_parameter_table = \
844+ required_parameters_for_parameter_table = (
846845 petab .parameters .get_required_parameters_for_parameter_table (
847846 model = petab_problem .model ,
848847 condition_df = petab_problem .condition_df ,
849848 observable_df = petab_problem .observable_df ,
850849 measurement_df = petab_problem .measurement_df ,
851850 )
851+ )
852852 # The observable parameter is correctly recognized as a placeholder,
853853 # i.e. does not need to be in the parameter table.
854854 assert (
0 commit comments