Source: src/mcss/dynamic/config.py · Plain text

src/mcss/dynamic/config.py

"""Small immutable configuration contracts for the first dynamic carrier."""

from dataclasses import dataclass
from math import isfinite, prod


@dataclass(frozen=True)
class CarrierConfig:
    feature_dim: int = 8
    hidden_dim: int = 8
    expansion_dim: int = 16
    grid_size: tuple[int, int, int] = (8, 8, 8)
    local_bounds_m: tuple[tuple[float, float, float], tuple[float, float, float]] = (
        (-6.0, -4.0, 0.05),
        (6.0, 4.0, 12.05),
    )
    token_count: int = 128

    def __post_init__(self):
        if any(
            value <= 0
            for value in (self.feature_dim, self.hidden_dim, self.expansion_dim, self.token_count)
        ):
            raise ValueError("Carrier widths and token_count must be positive")
        if len(self.grid_size) != 3 or min(self.grid_size) < 2:
            raise ValueError("grid_size must have three dimensions of at least two")
        if self.token_count > prod(self.grid_size):
            raise ValueError("token_count cannot exceed voxel count")
        if len(self.local_bounds_m) != 2 or any(len(v) != 3 for v in self.local_bounds_m):
            raise ValueError("local_bounds_m must be [2,3]")
        for lower, upper in zip(*self.local_bounds_m, strict=True):
            if not isfinite(lower) or not isfinite(upper) or upper <= lower:
                raise ValueError("Invalid metric bounds")

    @property
    def statistics_dim(self):
        return 2 * self.feature_dim + 7


@dataclass(frozen=True)
class WriteConfig:
    learning_rate: float = 0.01
    max_update_norm: float = 0.05

    def __post_init__(self):
        if not all(isfinite(v) and v > 0 for v in (self.learning_rate, self.max_update_norm)):
            raise ValueError("Write rate and norm limit must be finite and positive")