13
13
from typing import TYPE_CHECKING
14
14
15
15
import pandas as pd
16
+ import sympy as sp
16
17
from pydantic import AnyUrl , BaseModel , Field
17
18
18
19
from ..v1 import (
@@ -883,7 +884,7 @@ def validate(
883
884
return validation_results
884
885
885
886
def add_condition (
886
- self , id_ : str , name : str = None , ** kwargs : tuple [ str , Number | str ]
887
+ self , id_ : str , name : str = None , ** kwargs : Number | str | sp . Expr
887
888
):
888
889
"""Add a simulation condition to the problem.
889
890
@@ -895,27 +896,20 @@ def add_condition(
895
896
"""
896
897
if not kwargs :
897
898
return
898
- records = [
899
- {
900
- CONDITION_ID : id_ ,
901
- TARGET_ID : target_id ,
902
- OPERATION_TYPE : "setCurrentValue" ,
903
- TARGET_VALUE : target_value
904
- if not isinstance (target_value , tuple )
905
- else target_value [1 ],
906
- }
899
+ changes = [
900
+ core .Change (target_id = target_id , target_value = target_value )
907
901
for target_id , target_value in kwargs .items ()
908
902
]
909
- # TODO: is the condition name supported in v2?
910
- if name is not None :
911
- for record in records :
912
- record [CONDITION_NAME ] = [name ]
913
- tmp_df = pd .DataFrame (records )
914
- self .condition_df = (
915
- pd .concat ([self .condition_df , tmp_df ], ignore_index = True )
916
- if self .condition_df is not None
917
- else tmp_df
903
+ self .conditions_table .conditions .append (
904
+ core .Condition (id = id_ , changes = changes )
918
905
)
906
+ if name is not None :
907
+ self .mapping_table .mappings .append (
908
+ core .Mapping (
909
+ petab_id = id_ ,
910
+ model_id = name ,
911
+ )
912
+ )
919
913
920
914
def add_observable (
921
915
self ,
@@ -1023,8 +1017,8 @@ def add_measurement(
1023
1017
experiment_id : str ,
1024
1018
time : float ,
1025
1019
measurement : float ,
1026
- observable_parameters : Sequence [str | float ] = None ,
1027
- noise_parameters : Sequence [str | float ] = None ,
1020
+ observable_parameters : Sequence [str | float ] | str | float = None ,
1021
+ noise_parameters : Sequence [str | float ] | str | float = None ,
1028
1022
):
1029
1023
"""Add a measurement to the problem.
1030
1024
@@ -1036,27 +1030,25 @@ def add_measurement(
1036
1030
observable_parameters: The observable parameters
1037
1031
noise_parameters: The noise parameters
1038
1032
"""
1039
- record = {
1040
- OBSERVABLE_ID : [obs_id ],
1041
- EXPERIMENT_ID : [experiment_id ],
1042
- TIME : [time ],
1043
- MEASUREMENT : [measurement ],
1044
- }
1045
- if observable_parameters is not None :
1046
- record [OBSERVABLE_PARAMETERS ] = [
1047
- PARAMETER_SEPARATOR .join (map (str , observable_parameters ))
1048
- ]
1049
- if noise_parameters is not None :
1050
- record [NOISE_PARAMETERS ] = [
1051
- PARAMETER_SEPARATOR .join (map (str , noise_parameters ))
1052
- ]
1053
-
1054
- tmp_df = pd .DataFrame (record )
1055
- self .measurement_df = (
1056
- pd .concat ([self .measurement_df , tmp_df ])
1057
- if self .measurement_df is not None
1058
- else tmp_df
1059
- ).reset_index (drop = True )
1033
+ if observable_parameters is not None and not isinstance (
1034
+ observable_parameters , Sequence
1035
+ ):
1036
+ observable_parameters = [observable_parameters ]
1037
+ if noise_parameters is not None and not isinstance (
1038
+ noise_parameters , Sequence
1039
+ ):
1040
+ noise_parameters = [noise_parameters ]
1041
+
1042
+ self .measurement_table .measurements .append (
1043
+ core .Measurement (
1044
+ observable_id = obs_id ,
1045
+ experiment_id = experiment_id ,
1046
+ time = time ,
1047
+ measurement = measurement ,
1048
+ observable_parameters = observable_parameters ,
1049
+ noise_parameters = noise_parameters ,
1050
+ )
1051
+ )
1060
1052
1061
1053
def add_mapping (self , petab_id : str , model_id : str ):
1062
1054
"""Add a mapping table entry to the problem.
0 commit comments