Source code for djura.slf.models
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (C) 2025-2026 Djura | Risk - Data - Engineering S.r.l.
import numpy as np
from pydantic import field_validator, ConfigDict, BaseModel, Field, \
RootModel
from typing import Optional, Dict, Union, List
[docs]
class ComponentDataModel(BaseModel):
id: int
name: str
EDP: str
Component: str
Group: Optional[int] = None
Quantity: float
damage_states: int = Field(alias="damage-states")
median_demand: List[float] = Field(alias="median-demand")
total_dispesion: List[float] = Field(alias="total-dispersion")
repair_cost: List[float] = Field(alias="repair-cost")
cost_dispersion: List[float] = Field(alias="cost-dispersion")
best_fit: List[Optional[str]] = Field(alias="best-fit", default=None)
[docs]
@field_validator('Group', mode="before")
@classmethod
def allow_none(cls, v):
if v is None or v == "":
return None
else:
return v
[docs]
class CorrelationTreeModel(BaseModel):
id: int
dependent_on_item: str = Field(alias="DEPENDANT ON ITEM")
min_ds: List[str] = Field(alias="MIN DS")
[docs]
class ItemBase(RootModel):
root: Dict[str, np.ndarray]
model_config = ConfigDict(arbitrary_types_allowed=True)
[docs]
class ItemsModel(RootModel):
root: Dict[int, ItemBase]
[docs]
class FragilityModel(BaseModel):
EDP: np.ndarray
ITEMs: ItemsModel
model_config = ConfigDict(arbitrary_types_allowed=True)
[docs]
class DamageStateModel(RootModel):
root: Dict[int, Dict[int, np.ndarray]]
model_config = ConfigDict(arbitrary_types_allowed=True)
[docs]
class CostModel(RootModel):
root: Dict[int, np.ndarray]
model_config = ConfigDict(arbitrary_types_allowed=True)
[docs]
class SimulationModel(RootModel):
root: Dict[int, CostModel]
model_config = ConfigDict(arbitrary_types_allowed=True)
[docs]
class FittingModelBase(BaseModel):
popt: Union[np.ndarray, List]
pcov: Union[np.ndarray, List]
multiplier: Optional[float] = None
model_config = ConfigDict(arbitrary_types_allowed=True)
[docs]
class FittingParametersModel(RootModel):
root: Dict[str, FittingModelBase]
[docs]
class FittedLossModel(RootModel):
root: Dict[str, np.ndarray]
model_config = ConfigDict(arbitrary_types_allowed=True)
[docs]
class LossModel(BaseModel):
loss: Dict[int, Dict[Union[int, str], float]]
loss_ratio: Dict[int, Dict[Union[int, str], float]]
[docs]
class SLFModel(BaseModel):
directionality: Optional[int] = Field(None, alias="Directionality")
component_type: str = Field(alias="Component-type")
storey: Optional[Union[int, List[int]]] = Field(None, alias="Storey")
edp: str
edp_range: List[float]
slf: List[float]
fitting_parameters: Optional[Dict[str, FittingModelBase]] = None
[docs]
class SLFPGModel(RootModel):
root: Dict[str, SLFModel]
model_config = ConfigDict(arbitrary_types_allowed=True)