Skip to content
Snippets Groups Projects
Dataset.py 2.55 KiB
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
class ConstraintInfo:
    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
    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
    numberOfTimePoints: 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]