Skip to content

Commit a3b1f66

Browse files
committed
..
1 parent 228a958 commit a3b1f66

File tree

2 files changed

+170
-171
lines changed

2 files changed

+170
-171
lines changed

petab/v2/core.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
field_validator,
2222
model_validator,
2323
)
24+
from typing_extensions import Self
2425

2526
from ..v1.lint import is_valid_identifier
2627
from ..v1.math import sympify_petab
@@ -872,13 +873,53 @@ def _validate_id(cls, v):
872873
raise ValueError(f"Invalid ID: {v}")
873874
return v
874875

876+
@field_validator("estimate", mode="before")
877+
@classmethod
878+
def _validate_estimate_before(cls, v):
879+
if isinstance(v, bool):
880+
return v
881+
882+
if isinstance(v, int) or isinstance(v, float) and v.is_integer():
883+
if v == 0:
884+
return False
885+
if v == 1:
886+
return True
887+
888+
if isinstance(v, str):
889+
if v == "0":
890+
return False
891+
if v == "1":
892+
return True
893+
894+
raise ValueError(f"Invalid value for estimate: {v}. Must be 0 or 1.")
895+
875896
@field_validator("lb", "ub", "nominal_value")
876897
@classmethod
877898
def _convert_nan_to_none(cls, v):
878899
if isinstance(v, float) and np.isnan(v):
879900
return None
880901
return v
881902

903+
@model_validator(mode="after")
904+
def _validate(self) -> Self:
905+
if not self.estimate and self.nominal_value is None:
906+
raise ValueError(
907+
"Non-estimated parameter must have a nominal value"
908+
)
909+
910+
if self.estimate and (self.lb is None or self.ub is None):
911+
raise ValueError(
912+
"Estimated parameter must have lower and upper bounds set"
913+
)
914+
915+
if self.lb is not None and self.ub is not None and self.lb >= self.ub:
916+
raise ValueError("Lower bound must be less than upper bound")
917+
918+
# TODO parameterScale?
919+
920+
# TODO priorType, priorParameters
921+
return self
922+
882923

883924
class ParameterTable(BaseModel):
884925
"""PEtab parameter table."""

0 commit comments

Comments
 (0)