#!/usr/bin/env python3 """Apply one exhaustive registered reducer to accepted complete numeric inputs.""" from __future__ import annotations import argparse import dataclasses import json import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) from repro_control.reducers import ( reduce_c1, reduce_c2, reduce_c3, reduce_c4_maze, reduce_c4_sudoku, reduce_c5, ) from repro_control.hashing import atomic_write_json def plain(value): if dataclasses.is_dataclass(value): return {field.name: plain(getattr(value, field.name)) for field in dataclasses.fields(value)} if isinstance(value, dict): return {str(key): plain(item) for key, item in value.items()} if isinstance(value, (list, tuple)): return [plain(item) for item in value] return value def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("--claim", choices=("c1", "c2", "c3", "c4-sudoku", "c4-maze", "c5"), required=True) parser.add_argument("--input", type=Path, required=True) parser.add_argument("--output", type=Path, required=True) args = parser.parse_args() value = json.loads(args.input.read_text()) reducers = { "c1": reduce_c1, "c2": reduce_c2, "c3": reduce_c3, "c4-sudoku": reduce_c4_sudoku, "c4-maze": reduce_c4_maze, "c5": reduce_c5, } result = reducers[args.claim](**value) atomic_write_json(args.output, plain(result)) return 0 if __name__ == "__main__": raise SystemExit(main())