nomos-specs/mixnet/v2/sim/config.py

48 lines
1.7 KiB
Python

from dataclasses import dataclass
from typing import Self
import dacite
import yaml
@dataclass
class Config:
running_time: int
num_nodes: int
num_mix_layers: int
# An interval of sending a new real/cover message
# A probability of actually sending a message depends on the following parameters.
message_interval: int
# A probability of sending a real message within one cycle
real_message_prob: float
# A weight of real message emission probability of some nodes
# The length of the list should be <= num_nodes.
real_message_prob_weights: list[float]
# A probability of sending a cover message within one cycle if not sending a real message
cover_message_prob: float
# A maximum preparation time (delay) before sending the message
max_message_prep_time: float
# A maximum network latency between nodes directly connected with each other
max_network_latency: float
@classmethod
def load(cls, yaml_path: str) -> Self:
with open(yaml_path, "r") as f:
data = yaml.safe_load(f)
config = dacite.from_dict(data_class=Config, data=data)
# Validations
assert config.running_time > 0
assert config.num_nodes > 0
assert 0 < config.num_mix_layers <= config.num_nodes
assert config.message_interval > 0
assert config.real_message_prob > 0
assert len(config.real_message_prob_weights) <= config.num_nodes
for weight in config.real_message_prob_weights:
assert weight >= 1
assert config.cover_message_prob >= 0
assert config.max_message_prep_time >= 0
assert config.max_network_latency >= 0
return config