"""Shared Fraction serialization helpers for standard-model hardware probes.""" from __future__ import annotations import json from fractions import Fraction from pathlib import Path from typing import Any def fraction_str(value: Fraction) -> str: return str(value.numerator) if value.denominator == 1 else f"{value.numerator}/{value.denominator}" def fraction_json(value: Fraction) -> dict[str, Any]: return { "fraction": fraction_str(value), "numerator": value.numerator, "denominator": value.denominator, "decimal": float(value), } def parse_fraction_json(item: dict[str, Any]) -> Fraction: return Fraction(int(item["numerator"]), int(item["denominator"])) def vector_from_json(items: dict[str, dict[str, Any]]) -> dict[str, Fraction]: return {key: parse_fraction_json(value) for key, value in items.items()} def vector_json(vector: dict[str, Fraction]) -> dict[str, dict[str, Any]]: return {key: fraction_json(value) for key, value in sorted(vector.items())} def projection_from_json( items: dict[str, dict[str, dict[str, Any]]], ) -> dict[str, dict[str, Fraction]]: return { axis: { col: parse_fraction_json(cell) for col, cell in row.items() } for axis, row in items.items() }