| from __future__ import annotations |
| from dataclasses import dataclass |
| from enum import Enum |
| from typing import List, Optional |
|
|
| class Implementation(Enum): |
| VECT = "Vectorised" |
|
|
| class MatchSpace(Enum): |
| LAB = "Lab (perceptual)" |
| RGB = "RGB (euclidean)" |
|
|
| @dataclass |
| class Config: |
| """Runtime configuration for the Lab 5 mosaic generator pipeline.""" |
|
|
| |
| grid: int = 32 |
| out_w: int = 768 |
| out_h: int = 768 |
| tile_size: int = 32 |
|
|
| |
| hf_dataset: str = "Kratos-AI/KAI_car-images" |
| hf_split: str = "train" |
| hf_limit: int = 200 |
| hf_cache_dir: Optional[str] = None |
|
|
| |
| impl: Implementation = Implementation.VECT |
| match_space: MatchSpace = MatchSpace.LAB |
|
|
| |
| use_uniform_q: bool = False |
| q_levels: int = 8 |
| use_kmeans_q: bool = False |
| k_colors: int = 8 |
|
|
| |
| tile_norm_brightness: bool = False |
| allow_rotations: bool = False |
|
|
| |
| tiles_cache_dir: Optional[str] = None |
|
|
| |
| do_bench: bool = False |
| bench_grids: Optional[List[int]] = None |
|
|
| def __post_init__(self) -> None: |
| self._validate() |
|
|
| def validate(self) -> None: |
| """Public wrapper that re-validates the current configuration.""" |
| self._validate() |
|
|
| def _validate(self) -> None: |
| """Validate numeric parameters so incorrect grids fail fast.""" |
| if self.grid <= 0: |
| raise ValueError("grid must be a positive integer") |
| if self.tile_size <= 0: |
| raise ValueError("tile_size must be a positive integer") |
| if self.out_w <= 0 or self.out_h <= 0: |
| raise ValueError("out_w and out_h must be positive integers") |
| if self.out_w % self.grid != 0 or self.out_h % self.grid != 0: |
| raise ValueError("out_w and out_h must be divisible by grid to maintain whole tiles") |
| if self.hf_limit <= 0: |
| raise ValueError("hf_limit must be positive") |
|
|