Newer
Older
from dataclasses import dataclass, field
from enum import Enum, unique, auto
from typing import Optional, List
@unique
class ModelType(Enum):
Unknown = 0
ExplicitModelFunction = 1
SteadyStateSystem = 2
LaplaceFormulation = 3
OrdinaryDifferentialEquations = 4
DifferentialAlgebraicEquations = 5
PartialDifferentialEquations = 6
PartialDifferentialAlgebraicEquations = 7
@unique
class MeasurementType(Enum):
Unknown = 0
SimulationUniformError_0 = auto()
SimulationUniformError_0_5 = auto()
SimulationUniformError_1 = auto()
SimulationUniformError_5 = auto()
SimulationUniformError_10 = auto()
SimulationUniformError_50 = auto()
SimulationNormalError_1 = auto()
SimulationNormalError_5 = auto()
Experimental = auto()
Exact = auto()
ExperimentalDesign = auto()
@dataclass
constraintTime: float = 0.0
constraintConcentration: float = 0.0
@dataclass
class ModelParameterInfo:
name: str = ""
initialGuess: float = 0.0
lowerBound: float = 0.0
upperBound: float = 0.0
exactValue: Optional[float] = None
@dataclass
class Measurements:
concentrationValue: Optional[float] = None
timePoints: List[float] = field(default_factory=list)
measurements: List[List[float]] = field(default_factory=list)
weights: List[List[float]] = field(default_factory=list)
@dataclass
class Dataset:
name: str = ""
description: str = ""
modelType: ModelType = ModelType(0)
measurementType: MeasurementType = MeasurementType(0)
numberOfModelParameters: int = 0
numberOfOdes: int = 0
dimensionOfFittingFunction: int = 0
totalNumberOfConstraints: int = 0
numberOfEqualityConstraints: int = 0
numberOfConcentrations: int = 0
numberOfDiscontinuities: int = 0
useLogarithmicScalingOfXAxis: bool = False
scalingInformation: int = 0
modelParameterInfos: List[ModelParameterInfo] = field(default_factory=list)
constraintsInfos: List[ConstraintInfo] = field(default_factory=list)
measurements: List[Measurements] = field(default_factory=list)
discontinuities: List[float] = field(default_factory=list)
def get_time_range(self) -> tuple[float, float]:
minTime = min([min(m.timePoints) for m in self.measurements])
maxTime = max([max(m.timePoints) for m in self.measurements])
return (minTime, maxTime)
def get_concentration_values(self) -> list[float]:
return [m.concentrationValue for m in self.measurements if m.concentrationValue is not None]