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