Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Dataset.py 2.55 KiB
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
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
    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]