| |
| """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()) |
|
|