File size: 1,290 Bytes
a3682cf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | from __future__ import annotations
import yaml
import numpy as np
from typing import Dict
from pydantic import BaseModel, Field, field_validator
class UserParams(BaseModel):
lambda_mean: float = Field(gt=0)
lambda_std: float = Field(gt=0)
mu_mean: float
mu_std: float = Field(gt=0)
sigma_mean: float = Field(gt=0)
sigma_std: float = Field(gt=0)
class UPILimits(BaseModel):
max_txn_amount: float = Field(gt=0)
daily_limit: float = Field(gt=0)
class RiskModel(BaseModel):
weights: Dict[str, float]
@field_validator("weights")
@classmethod
def check_weights(cls, v):
if not v:
raise ValueError("weights cannot be empty")
return v
class Config(BaseModel):
num_users: int = Field(gt=0)
simulation_days: int = Field(gt=0)
fraud_ratio: float = Field(ge=0, le=1)
benchmark_mode: str = "standard"
user_params: UserParams
upi_limits: UPILimits
risk_model: RiskModel
random_seed: int
@property
def simulation_seconds(self) -> int:
return self.simulation_days * 24 * 60 * 60
def load_config(path: str) -> Config:
with open(path, "r") as f:
raw = yaml.safe_load(f)
config = Config(**raw)
np.random.seed(config.random_seed)
return config
|