From 6191ceeb755df08427720957bf3b6b85e78a0776 Mon Sep 17 00:00:00 2001 From: Manuel Magnabosco Date: Tue, 1 Sep 2026 03:25:02 +0200 Subject: [PATCH] Add generalized tile presentation --- README.md | 3 +- ...026-08-31-narrative-migration-checklist.md | 2 +- renderer/README.md | 74 ++- .../pipeline_sat_atomic_semantic_legend.png | Bin 0 -> 66998 bytes .../pipeline_sat_generalized_overlay.png | Bin 0 -> 42638 bytes .../pipeline_sat_generalized_sheet.png | Bin 0 -> 50488 bytes renderer/test_wang_generalized.py | 369 ++++++++++++ renderer/wang_generalized.py | 393 ++++++++++++ renderer/wang_generalized_render.py | 557 ++++++++++++++++++ renderer/wang_square.py | 47 +- 10 files changed, 1430 insertions(+), 15 deletions(-) create mode 100644 renderer/test_data/pipeline_sat_atomic_semantic_legend.png create mode 100644 renderer/test_data/pipeline_sat_generalized_overlay.png create mode 100644 renderer/test_data/pipeline_sat_generalized_sheet.png create mode 100644 renderer/test_wang_generalized.py create mode 100644 renderer/wang_generalized.py create mode 100644 renderer/wang_generalized_render.py diff --git a/README.md b/README.md index 6f8e1d0..34bb8aa 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ solving remains future work. | Wang diagnostic renderer | Implemented as one presentation-only CLI with byte-stable square default and explicit `--hex` mode in the isolated `renderer/` project | | Square-to-hex presentation port | Implemented as a pure in-memory Basire/Culik mapping with a raster-independent checker; no hex solver, schema, or core model | | Static explainability snapshots | Implemented for parsed formula, canonical tile sheet, and unassigned region, with hash-bound JSON contracts and square/hex diagnostic views | +| Generalized tile presentation | Implemented as an exact presentation-only 14-to-23 mapping with a pure recognizer, semantic sheet, labelled atomic legend, and square-witness overlay | | Reduction construction provenance | Implemented as a separate opt-in native-owned result with exact signal orders, swap-bound gadget spans, manifest v2, and a square overlay view; the compact standard ABI does not allocate it | | Native solver event trace | Implemented as separate opt-in reference/optimized entry points with bounded observed events, full initial state, checkpoints, manifest v3, independent offline replay, and deterministic PNG/GIF views | | Reproducible Z3 summaries | Implemented for fixed seed/thread settings and explicit Boolean/Wang encoding order, result/model, and stable project-owned counts; no internal Z3 trace claim | @@ -185,7 +186,7 @@ make check The imported renderer remains a separate locked Python project. Its Pillow and NumPy dependencies are not installed by the root project or exercised by -`make check`. Run its 262-test combined suite independently: +`make check`. Run its 283-test combined suite independently: ```sh cd renderer diff --git a/docs/plans/2026-08-31-narrative-migration-checklist.md b/docs/plans/2026-08-31-narrative-migration-checklist.md index f007949..8c682e8 100644 --- a/docs/plans/2026-08-31-narrative-migration-checklist.md +++ b/docs/plans/2026-08-31-narrative-migration-checklist.md @@ -171,7 +171,7 @@ checks prove the old files are unreferenced before deletion. ## 8. Shared-asset migration order -1. [ ] Freeze and test the exact generalized 14-to-23 mapping without changing +1. [x] Freeze and test the exact generalized 14-to-23 mapping without changing the atomic tileset or standard square/hex output. 2. [ ] Capture the explicit v2 multi-engine fields once per engine and bind all component identities by SHA-256. diff --git a/renderer/README.md b/renderer/README.md index 88f1e98..10a237e 100644 --- a/renderer/README.md +++ b/renderer/README.md @@ -134,6 +134,69 @@ Reduction spans describe the square construction itself, so this view rejects the signal permutation, and gadget bounds without importing native code or reconstructing builder geometry. +### Generalized Yang--Zhang presentation + +Three explicit square-only views interpret the fixed 23 positional atomic IDs +as the 14 generalized tiles from the Yang--Zhang construction. The semantic +module `wang_generalized.py` contains the exact table and performs no raster, +solver, native, or root-project import. It first guards every canonical +`(N,E,S,W)` tuple, then recognizes only complete, correctly oriented, +adjacent, and non-overlapping compositions. + +Render the 14-tile sheet and the separately labelled 23-tile atomic legend +from an existing hash-bound tileset snapshot: + +```bash +uv run --locked python wang_square.py \ + ../tests/fixtures/pipeline_sat_explain/manifest.json \ + output/generalized-sheet.png \ + --view generalized-sheet + +uv run --locked python wang_square.py \ + ../tests/fixtures/pipeline_sat_explain/manifest.json \ + output/atomic-legend.png \ + --view atomic-legend +``` + +Render an exact generalized overlay on the canonical verified square witness: + +```bash +uv run --locked python wang_square.py \ + ../tests/fixtures/pipeline_sat_solver_trace/solution-2273f58cda026dca73c0dfa25c960e01296ac1e34ae6accbddf5be29034d156a.json \ + output/generalized-overlay.png \ + --view generalized-overlay +``` + +The fixed decomposition is: + +| Generalized tile | Atomic IDs and orientation | +|---|---| +| `V0` | `0` above `1` above `2` | +| `V1` | one copy of `3` | +| `C0` | `4` | +| `C1` | `5` above `6` | +| `F0`, `F1` | `7`, `8` | +| `L0`, `L1` | `9`, `10` | +| `R0`, `R1` | `11|12`, `13|14` from left to right | +| `X00`, `X01`, `X10`, `X11` | `15/16`, `17/18`, `19/20`, `21/22` from top to bottom | + +The symbolic palette keeps the paper colors `b`, `v`, `0`, `1`, `0′` +(rendered as the font-safe label `0-prime`), `l`, and `r` separate from +internal glues `V0:a`, `V0:b`, `C1`, `R0`, `R1`, +`X00`, `X01`, `X10`, and `X11`; numeric color IDs remain visible as secondary +transport labels. Multi-cell shapes receive one outer contour and a muted +internal seam. Every atomic tile keeps its numeric ID. In particular, three +adjacent cells carrying atomic tile `3` are three `V1` occurrences, never one +three-cell `V1`. + +All three generalized views reject `--hex`: the checked Basire/Culik port is a +one-to-one presentation of atomic tiles and does not invent generalized hex +semantics. Generalized recognition checks only the exact atomic composition; +Wang adjacency, boundary, and SAT verification remain explicit upstream +preconditions, just as for the other renderer views. Without one of the new +`--view` values, default square, `--hex`, and `--explain` output remain +byte-for-byte unchanged. + ### Offline trace and algorithm animations The animation modules keep state interpretation separate from image encoding. @@ -339,6 +402,8 @@ Raises `RenderingException` on pipeline errors. ├── wang_trace.py # Strict observed-trace loader and offline replay ├── wang_trace_render.py # Trace frame selection and composition CLI ├── wang_z3_summary.py # Encoding-order summary consumer and compositor +├── wang_generalized.py # Pure exact 14-to-23 mapping and recognizer +├── wang_generalized_render.py # Sheet, atomic legend, and square overlay ├── wang_animation.py # Deterministic PNG/contact-sheet/GIF encoder ├── wang_algorithm_animation.py # Canonical and didactic algorithm views ├── test_wang_square.py # Square loader, raster, isolation, CLI, and failures @@ -346,6 +411,7 @@ Raises `RenderingException` on pipeline errors. ├── test_wang_snapshot.py # Snapshot contracts, views, isolation, and goldens ├── test_wang_trace.py # Hash-bound replay, isolation, and byte stability ├── test_wang_z3_summary.py # Fixed encoding summaries and byte stability +├── test_wang_generalized.py # Exact mapping, rejection, isolation, and goldens ├── test_wang_algorithm_animation.py # Source checks and animation goldens ├── input/ # Example input files (palette, scene, tiles, sprites) ├── output/ # Rendered PNG output goes here @@ -353,6 +419,9 @@ Raises `RenderingException` on pipeline errors. │ ├── wang_solution_v1_square_sat.png # Square golden for the Wang fixture │ ├── wang_solution_v1_hex_sat.png # Pointy-top hex golden for the same fixture │ ├── pipeline_sat_reduction.png # Native reduction-provenance golden +│ ├── pipeline_sat_generalized_sheet.png # Fixed 14-tile semantic sheet +│ ├── pipeline_sat_atomic_semantic_legend.png # Labelled 23-tile legend +│ ├── pipeline_sat_generalized_overlay.png # Canonical witness grouping │ ├── palette_ok.json # Valid 16-color palette │ ├── palette_wrong_count.json # Only 3 colors (invalid) │ ├── palette_wrong_value.json # Component > 255 (invalid) @@ -368,9 +437,10 @@ Raises `RenderingException` on pipeline errors. uv run --locked pytest -q ``` -The complete isolated suite has 262 tests: the 144 preserved legacy tests +The complete isolated suite has 283 tests: the 144 preserved legacy tests below, 45 Wang square tests, 24 square-to-hex/hex-raster tests, 29 static -snapshot/explainability tests, and 20 trace/Z3/algorithm-animation tests. +snapshot/explainability tests, 21 generalized-presentation tests, and 20 +trace/Z3/algorithm-animation tests. To run only the original upstream suite: ```bash diff --git a/renderer/test_data/pipeline_sat_atomic_semantic_legend.png b/renderer/test_data/pipeline_sat_atomic_semantic_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..c23650cb20da0bc3f655cb652e3882fd7b53ae8b GIT binary patch literal 66998 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 literal 0 HcmV?d00001 diff --git a/renderer/test_data/pipeline_sat_generalized_overlay.png b/renderer/test_data/pipeline_sat_generalized_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ba59684c011c206906ebb626841ac31ee11783 GIT binary patch literal 42638 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 MXg43%a#U!_pBEZ@F8}}l literal 0 HcmV?d00001 diff --git a/renderer/test_data/pipeline_sat_generalized_sheet.png b/renderer/test_data/pipeline_sat_generalized_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..11eb7a71265f3fbacc572550ed065004d57de67f GIT binary patch literal 50488 zcma&O2UJsCv^5&brwA%2AR+>SH0d4bN+J<}y@Lvf^cs4H0HF#qAnrqIv5~Qps{RsC3E(ipABr78U0fFv>f*Zqqw+&bn$^WWNu&`UYtke%z+Mjr*k;l#R_rrV!ybdLnX_J!^B>${-g{l)CgJf(C( zv6GGYM04O*!zEx4ljZn$Z)D2t2;QAt=s+r zUVZI7G4FNC3g_0T^=K5!oNRPF#xGS?XB=B&nb{saW8BzTRLeO>HWe$S3uE0Y*55Y+ zJ1&M~r)A5Pajq6R?+#5M_eJbrd;eL@ohS2Y46?UwRUl2X&LpQbU)T!@3%tVx&PCl|MJftlGg7JyM)Ah zYT{2}V&bBT={$DZRjCm2)VsAps16K9Nh&Ng(j$5O{d=(=={->NVsj$T`b0oTJde$A zzSa8UQUk<=&BYe)Zk_d1O`Q~~Acr2wVq_puUnqv3N7b<0sXn2D~gE>h&quC)!N z@Tn3^%S*R`K#VR1GdY3UD8ojZFilrm@pyI+p`tlqa+TI2_5%$8K_R1yuYEb#2eI3~ z_pUFF;qkF7s&z*3X?P@T*)sop>0_(3J9FI~E>ouJRJY<4df-){|CE5B#-g{X0Jw6c zn$jc8+$YNk_Ax!01)Cd?B8SR4yl1TH3`9xNW77D3-wYl;7s@(OQcn#gDxJyLOl!P~ z5t>N9kB{A%nVzbYcyh+6;H_=Y-~^M}{chkf>eE*v%VyA&By1F1;h5Rhn=XvM#rOFG z7>UX5NFPwg2)Rx6=0Pj09^_HCd+YqF|9p6)8Onm9*qc2pRIe^87LTf_so}m8EwPl{ zy2+2ChBoJupC3ooeJzyMN?)@n)vu2NKRlkQzk44sD1=%U2fsOjN4!_aR4&r5FEdS* z3cw{{Q?GJ}n7_kq=YO)I?vciTf?r(2yx$ZGxmVff*Sohe($ja2>Vzk=qkw6LN74rt zo__yELQobr2%FxxrN5MSJKUBQthqH`h%KJM(#R&O<{`%qt(SnoQLAM<_SMURz)SQH zQ#BTjz)8r(mT=o%$4*X88cQFYb&uc%WT^&LCDD!*XmIjy)Fy8z`v4O)51GbSWT2#) ziAyzFxml=bH+gdB-CF!~^_8?I9LrzyTkt(Um^tDJN=HkFiKZ6HCv%u}mqS;3prnExZem_7YsG@vzxHZ;`i}%E zt#TZ#Elvq2Nfrth{@gxw*`28z9vf3odIyPKx%&_WCkfC?8NoWx$)`0rjMcRnZjNWC z>ryGLl1hiA9$?Uc#z?e`Mv~EB0=M&8!Pxe;=lJeOq0aA^yk5<6=CvC5CKmqB z)yY;GTYCRU9+KC3)??$KEa2G8Vm^(7gTtspVQa9dGN|mZfQM|YPvShiI>GPB52MRCqu86K^buLfmQ> z3NGKg|AqM-G)}`taAuM}UC4P2ShaXv23|`?C|z%4wo2RVq>!*;6ukL3IeVHitX8+2 zc^+BsqyTU0RPE&}GmOgFVjVj>25N2na<}R`l~R6{Iob}@`RTH1vZ*i->D8U7l;(re ztEs3YL*fhd3*XDj%P*~NDNZ}@hcF@ywjc`>tow9rEw6P@(mJ=7`IcY90cSg|mYOt!+OlEgtHedEln21f`j>QNi zxyi_Wk6(NKlu7s3uMjKQ{-af>9r4R9YFPds5%0An?cqFk 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 int: + return max(part.dx for part in self.parts) + 1 + + @property + def height(self) -> int: + return max(part.dy for part in self.parts) + 1 + + +@dataclass(frozen=True, slots=True) +class GeneralizedInstance: + kind: str + origin_x: int + origin_y: int + + +PAPER_COLOR_NAMES: Final[tuple[str, ...]] = ( + "b", + "v", + "0", + "1", + "0-prime", + "l", + "r", +) +INTERNAL_COLOR_NAMES: Final[tuple[str, ...]] = ( + "V0:a", + "V0:b", + "C1", + "R0", + "R1", + "X00", + "X01", + "X10", + "X11", +) +COLOR_NAMES: Final[tuple[str, ...]] = PAPER_COLOR_NAMES + INTERNAL_COLOR_NAMES + +# Tuple position is the immutable atomic tile ID; edges are N, E, S, W. +CANONICAL_ATOMIC_TILE_EDGES: Final[ + tuple[tuple[int, int, int, int], ...] +] = ( + (0, 2, 7, 1), + (7, 2, 8, 1), + (8, 2, 0, 1), + (0, 3, 0, 1), + (0, 4, 0, 2), + (0, 4, 9, 3), + (9, 3, 0, 2), + (0, 2, 0, 2), + (0, 3, 0, 3), + (5, 2, 5, 2), + (5, 3, 5, 3), + (0, 10, 6, 2), + (6, 2, 0, 10), + (0, 11, 6, 3), + (6, 3, 0, 11), + (6, 2, 12, 2), + (12, 2, 5, 2), + (6, 2, 13, 3), + (13, 3, 5, 2), + (6, 3, 14, 2), + (14, 2, 5, 3), + (6, 3, 15, 3), + (15, 3, 5, 3), +) + +GENERALIZED_TILES: Final[tuple[GeneralizedTile, ...]] = ( + GeneralizedTile( + "V0", + ( + AtomicPart(0, 0, 0, "top"), + AtomicPart(1, 0, 1, "middle"), + AtomicPart(2, 0, 2, "bottom"), + ), + ), + GeneralizedTile("V1", (AtomicPart(3, 0, 0, "copy"),)), + GeneralizedTile("C0", (AtomicPart(4, 0, 0, "single"),)), + GeneralizedTile( + "C1", + (AtomicPart(5, 0, 0, "top"), AtomicPart(6, 0, 1, "bottom")), + ), + GeneralizedTile("F0", (AtomicPart(7, 0, 0, "single"),)), + GeneralizedTile("F1", (AtomicPart(8, 0, 0, "single"),)), + GeneralizedTile("L0", (AtomicPart(9, 0, 0, "single"),)), + GeneralizedTile("L1", (AtomicPart(10, 0, 0, "single"),)), + GeneralizedTile( + "R0", + (AtomicPart(11, 0, 0, "left"), AtomicPart(12, 1, 0, "right")), + ), + GeneralizedTile( + "R1", + (AtomicPart(13, 0, 0, "left"), AtomicPart(14, 1, 0, "right")), + ), + GeneralizedTile( + "X00", + (AtomicPart(15, 0, 0, "top"), AtomicPart(16, 0, 1, "bottom")), + ), + GeneralizedTile( + "X01", + (AtomicPart(17, 0, 0, "top"), AtomicPart(18, 0, 1, "bottom")), + ), + GeneralizedTile( + "X10", + (AtomicPart(19, 0, 0, "top"), AtomicPart(20, 0, 1, "bottom")), + ), + GeneralizedTile( + "X11", + (AtomicPart(21, 0, 0, "top"), AtomicPart(22, 0, 1, "bottom")), + ), +) + +_GENERALIZED_BY_NAME: Final = {tile.name: tile for tile in GENERALIZED_TILES} +_GENERALIZED_ORDER: Final = { + tile.name: index for index, tile in enumerate(GENERALIZED_TILES) +} +_PART_BY_TILE_ID: Final = { + part.tile_id: (tile, part) + for tile in GENERALIZED_TILES + for part in tile.parts +} + + +def _validate_fixed_specification() -> None: + if len(GENERALIZED_TILES) != 14: + raise RuntimeError("generalized table must contain exactly 14 tiles") + if len(CANONICAL_ATOMIC_TILE_EDGES) != 23: + raise RuntimeError("atomic table must contain exactly 23 tiles") + if len(COLOR_NAMES) != 16: + raise RuntimeError("color vocabulary must contain exactly 16 colors") + if len(_GENERALIZED_BY_NAME) != len(GENERALIZED_TILES): + raise RuntimeError("generalized names must be unique") + if set(_PART_BY_TILE_ID) != set(range(23)): + raise RuntimeError("generalized parts must partition atomic IDs 0..22") + for tile in GENERALIZED_TILES: + coordinates = {(part.dx, part.dy) for part in tile.parts} + if len(coordinates) != len(tile.parts): + raise RuntimeError(f"{tile.name} contains duplicate part coordinates") + + +_validate_fixed_specification() + + +def color_label(color_id: int) -> str: + """Return the symbolic paper/glue name with the numeric ID secondary.""" + if type(color_id) is not int or not 0 <= color_id < len(COLOR_NAMES): + raise GeneralizedTileError(f"invalid canonical color ID {color_id!r}") + return f"{COLOR_NAMES[color_id]} [{color_id}]" + + +def atomic_semantic_label(tile_id: int) -> str: + """Return the generalized name and part role for one positional ID.""" + if type(tile_id) is not int or tile_id not in _PART_BY_TILE_ID: + raise GeneralizedTileError(f"invalid canonical atomic tile ID {tile_id!r}") + tile, part = _PART_BY_TILE_ID[tile_id] + if len(tile.parts) == 1: + return tile.name + return f"{tile.name} {part.label}" + + +def check_canonical_atomic_tileset( + tile_edges: Sequence[Sequence[int]], +) -> None: + """Require the exact positional 23-tile table, including orientation.""" + if isinstance(tile_edges, (str, bytes)): + raise GeneralizedTileError("atomic tile table must be a sequence") + if len(tile_edges) != len(CANONICAL_ATOMIC_TILE_EDGES): + raise GeneralizedTileError( + "atomic tile table must contain exactly 23 positional entries" + ) + for tile_id, (actual, expected) in enumerate( + zip(tile_edges, CANONICAL_ATOMIC_TILE_EDGES, strict=True) + ): + if isinstance(actual, (str, bytes)) or len(actual) != 4: + raise GeneralizedTileError( + f"atomic tile {tile_id} must contain four N/E/S/W edges" + ) + checked = tuple(actual) + if any(type(color) is not int for color in checked): + raise GeneralizedTileError( + f"atomic tile {tile_id} edges must be integer color IDs" + ) + if checked != expected: + raise GeneralizedTileError( + f"atomic tile {tile_id} does not match the canonical " + f"N/E/S/W orientation: expected {expected}, got {checked}" + ) + + +def _check_grid( + cells: Sequence[int | None], + min_x: int, + min_y: int, + max_x: int, + max_y: int, +) -> int: + for name, value in ( + ("min_x", min_x), + ("min_y", min_y), + ("max_x", max_x), + ("max_y", max_y), + ): + if type(value) is not int: + raise GeneralizedTileError(f"{name} must be an integer") + if max_x < min_x or max_y < min_y: + raise GeneralizedTileError("generalized grid bounds must be nonempty") + width = max_x - min_x + 1 + area = width * (max_y - min_y + 1) + if isinstance(cells, (str, bytes)) or len(cells) != area: + raise GeneralizedTileError( + f"generalized grid must contain exactly {area} dense cells" + ) + for index, tile_id in enumerate(cells): + if tile_id is None: + continue + if type(tile_id) is not int or tile_id not in _PART_BY_TILE_ID: + raise GeneralizedTileError( + f"generalized grid cell {index} has invalid tile ID {tile_id!r}" + ) + return width + + +def _cell_at( + cells: Sequence[int | None], + width: int, + min_x: int, + min_y: int, + max_x: int, + max_y: int, + x: int, + y: int, +) -> int | None: + if x < min_x or x > max_x or y < min_y or y > max_y: + return None + return cells[(y - min_y) * width + (x - min_x)] + + +def check_generalized_instances( + tile_edges: Sequence[Sequence[int]], + cells: Sequence[int | None], + *, + min_x: int, + min_y: int, + max_x: int, + max_y: int, + instances: Sequence[GeneralizedInstance], +) -> None: + """Check exact composition, non-overlap, and complete active coverage.""" + check_canonical_atomic_tileset(tile_edges) + width = _check_grid(cells, min_x, min_y, max_x, max_y) + if isinstance(instances, (str, bytes)): + raise GeneralizedTileError("generalized instances must be a sequence") + + covered: dict[tuple[int, int], int] = {} + for instance_index, instance in enumerate(instances): + if not isinstance(instance, GeneralizedInstance): + raise GeneralizedTileError( + f"generalized instance {instance_index} has an invalid type" + ) + tile = _GENERALIZED_BY_NAME.get(instance.kind) + if tile is None: + raise GeneralizedTileError( + f"generalized instance {instance_index} has unknown kind " + f"{instance.kind!r}" + ) + if type(instance.origin_x) is not int or type(instance.origin_y) is not int: + raise GeneralizedTileError( + f"generalized instance {instance_index} origin must be integral" + ) + for part in tile.parts: + x = instance.origin_x + part.dx + y = instance.origin_y + part.dy + actual = _cell_at( + cells, width, min_x, min_y, max_x, max_y, x, y + ) + if actual != part.tile_id: + raise GeneralizedTileError( + f"incomplete or misoriented {tile.name} at " + f"({instance.origin_x},{instance.origin_y}): expected " + f"atomic tile {part.tile_id} at ({x},{y}), got {actual!r}" + ) + coordinate = (x, y) + previous = covered.get(coordinate) + if previous is not None: + raise GeneralizedTileError( + f"generalized instances {previous} and {instance_index} " + f"overlap at ({x},{y})" + ) + covered[coordinate] = instance_index + + active = { + (min_x + index % width, min_y + index // width) + for index, tile_id in enumerate(cells) + if tile_id is not None + } + missing = sorted(active - set(covered), key=lambda item: (item[1], item[0])) + if missing: + x, y = missing[0] + raise GeneralizedTileError( + f"generalized recognition leaves active cell ({x},{y}) uncovered" + ) + extra = set(covered) - active + if extra: + x, y = min(extra, key=lambda item: (item[1], item[0])) + raise GeneralizedTileError( + f"generalized recognition covers inactive cell ({x},{y})" + ) + + +def recognize_generalized_tiles( + tile_edges: Sequence[Sequence[int]], + cells: Sequence[int | None], + *, + min_x: int, + min_y: int, + max_x: int, + max_y: int, +) -> tuple[GeneralizedInstance, ...]: + """Recognize the unique complete generalized partition of a square witness.""" + check_canonical_atomic_tileset(tile_edges) + width = _check_grid(cells, min_x, min_y, max_x, max_y) + candidates: set[tuple[str, int, int]] = set() + for index, tile_id in enumerate(cells): + if tile_id is None: + continue + tile, part = _PART_BY_TILE_ID[tile_id] + x = min_x + index % width + y = min_y + index // width + candidates.add((tile.name, x - part.dx, y - part.dy)) + + instances = tuple( + GeneralizedInstance(kind, origin_x, origin_y) + for kind, origin_x, origin_y in sorted( + candidates, + key=lambda item: ( + item[2], + item[1], + _GENERALIZED_ORDER[item[0]], + ), + ) + ) + check_generalized_instances( + tile_edges, + cells, + min_x=min_x, + min_y=min_y, + max_x=max_x, + max_y=max_y, + instances=instances, + ) + return instances + + +def generalized_tile(kind: str) -> GeneralizedTile: + """Return one immutable canonical generalized specification by name.""" + tile = _GENERALIZED_BY_NAME.get(kind) + if tile is None: + raise GeneralizedTileError(f"unknown generalized tile {kind!r}") + return tile diff --git a/renderer/wang_generalized_render.py b/renderer/wang_generalized_render.py new file mode 100644 index 0000000..b384f74 --- /dev/null +++ b/renderer/wang_generalized_render.py @@ -0,0 +1,557 @@ +"""Deterministic square-only rasters for generalized Wang presentation.""" + +from __future__ import annotations + +from collections import Counter +from pathlib import Path +from typing import Final + +import numpy as np +from PIL import Image, ImageDraw + +from wang_explain import ( + EXPLAIN_MUTED_RGB, + EXPLAIN_OUTLINE_RGB, + EXPLAIN_PANEL_RGB, + EXPLAIN_TEXT_RGB, + draw_explain_heading, + explain_font, + square_explain_tile, + square_inactive_tile, +) +from wang_generalized import ( + COLOR_NAMES, + GENERALIZED_TILES, + GeneralizedInstance, + GeneralizedTile, + GeneralizedTileError, + atomic_semantic_label, + check_canonical_atomic_tileset, + color_label, + generalized_tile, + recognize_generalized_tiles, +) +from wang_hex_port import WangPresentation, WangSquareRenderError +from wang_square import ( + DEFAULT_MARGIN, + DEFAULT_PIXELS_PER_CELL, + MAX_MARGIN, + MAX_PIXELS_PER_CELL, + MIN_PIXELS_PER_CELL, + _build_palette_from_edges, + _check_canvas_limits, + _render_integer, + _save_png_atomic, + load_wang_presentation, +) + + +_HEADER_HEIGHT: Final = 62 +_PANEL_GAP: Final = 18 +_INTERNAL_SEAM_RGB: Final = (184, 191, 202) +_GROUP_COLORS: Final[tuple[tuple[int, int, int], ...]] = ( + (31, 119, 180), + (255, 127, 14), + (44, 160, 44), + (214, 39, 40), + (148, 103, 189), + (140, 86, 75), + (227, 119, 194), + (99, 99, 99), + (188, 189, 34), + (23, 190, 207), + (57, 106, 177), + (218, 124, 48), + (62, 150, 81), + (204, 37, 41), +) +_GROUP_RGB: Final = { + tile.name: _GROUP_COLORS[index] + for index, tile in enumerate(GENERALIZED_TILES) +} + + +def _as_render_error(error: GeneralizedTileError) -> WangSquareRenderError: + return WangSquareRenderError(f"generalized Wang presentation: {error}") + + +def _checked_dimensions( + pixels_per_cell: int, + margin: int, +) -> tuple[int, int]: + ppc = _render_integer( + pixels_per_cell, + "pixels_per_cell", + minimum=MIN_PIXELS_PER_CELL, + maximum=MAX_PIXELS_PER_CELL, + ) + checked_margin = _render_integer( + margin, + "margin", + minimum=0, + maximum=MAX_MARGIN, + ) + return ppc, checked_margin + + +def _draw_group_outline( + draw: ImageDraw.ImageDraw, + tile: GeneralizedTile, + origin: tuple[int, int], + cell_size: int, + *, + color: tuple[int, int, int], +) -> None: + x, y = origin + width = max(2, cell_size // 16) + draw.rectangle( + ( + x, + y, + x + tile.width * cell_size - 1, + y + tile.height * cell_size - 1, + ), + outline=color, + width=width, + ) + + coordinates = {(part.dx, part.dy) for part in tile.parts} + seam_width = max(3, cell_size // 14) + for dx, dy in coordinates: + if (dx + 1, dy) in coordinates: + seam_x = x + (dx + 1) * cell_size + draw.line( + ( + seam_x, + y + dy * cell_size + width, + seam_x, + y + (dy + 1) * cell_size - width - 1, + ), + fill=_INTERNAL_SEAM_RGB, + width=seam_width, + ) + if (dx, dy + 1) in coordinates: + seam_y = y + (dy + 1) * cell_size + draw.line( + ( + x + dx * cell_size + width, + seam_y, + x + (dx + 1) * cell_size - width - 1, + seam_y, + ), + fill=_INTERNAL_SEAM_RGB, + width=seam_width, + ) + + +def _draw_color_vocabulary( + draw: ImageDraw.ImageDraw, + origin: tuple[int, int], + palette: dict[int, tuple[int, int, int]], +) -> int: + x, y = origin + draw.text( + (x, y), + "Paper colors", + font=explain_font(15), + fill=EXPLAIN_TEXT_RGB, + ) + y += 25 + font = explain_font(12) + for color_id in range(7): + draw.rectangle( + (x, y + 2, x + 16, y + 16), + fill=palette[color_id], + outline=EXPLAIN_OUTLINE_RGB, + ) + draw.text( + (x + 24, y), + color_label(color_id), + font=font, + fill=EXPLAIN_TEXT_RGB, + ) + y += 22 + y += 9 + draw.text( + (x, y), + "Internal glues", + font=explain_font(15), + fill=EXPLAIN_TEXT_RGB, + ) + y += 25 + for color_id in range(7, len(COLOR_NAMES)): + draw.rectangle( + (x, y + 2, x + 16, y + 16), + fill=palette[color_id], + outline=EXPLAIN_OUTLINE_RGB, + ) + draw.text( + (x + 24, y), + color_label(color_id), + font=font, + fill=EXPLAIN_TEXT_RGB, + ) + y += 22 + return y + + +def compose_generalized_sheet( + tile_edges: tuple[tuple[int, int, int, int], ...], + *, + pixels_per_cell: int = DEFAULT_PIXELS_PER_CELL, + margin: int = DEFAULT_MARGIN, +) -> np.ndarray: + """Compose the fixed 14-tile sheet from an exact canonical atomic table.""" + try: + check_canonical_atomic_tileset(tile_edges) + except GeneralizedTileError as error: + raise _as_render_error(error) from error + ppc, checked_margin = _checked_dimensions(pixels_per_cell, margin) + cell_size = max(58, ppc * 2) + columns = 4 + rows = (len(GENERALIZED_TILES) + columns - 1) // columns + card_width = 2 * cell_size + 34 + card_height = 3 * cell_size + 66 + gap = 12 + grid_width = columns * card_width + (columns - 1) * gap + grid_height = rows * card_height + (rows - 1) * gap + vocabulary_width = 190 + width = 2 * checked_margin + grid_width + _PANEL_GAP + vocabulary_width + height = 2 * checked_margin + _HEADER_HEIGHT + grid_height + _check_canvas_limits(width, height) + + canvas = Image.new("RGB", (width, height), EXPLAIN_PANEL_RGB) + draw = ImageDraw.Draw(canvas) + draw_explain_heading( + draw, + (checked_margin, checked_margin), + title="Yang-Zhang generalized tile sheet - 14 from 23", + subtitle=( + "outer contour is semantic; muted seams are forced internal glues; " + "center numbers are atomic IDs" + ), + ) + palette = _build_palette_from_edges(tile_edges) + grid_y = checked_margin + _HEADER_HEIGHT + for tile_index, tile in enumerate(GENERALIZED_TILES): + column = tile_index % columns + row = tile_index // columns + card_x = checked_margin + column * (card_width + gap) + card_y = grid_y + row * (card_height + gap) + draw.rounded_rectangle( + ( + card_x, + card_y, + card_x + card_width - 1, + card_y + card_height - 1, + ), + radius=8, + fill=(249, 250, 252), + outline=(214, 219, 227), + ) + draw.text( + (card_x + 10, card_y + 8), + tile.name, + font=explain_font(17), + fill=_GROUP_RGB[tile.name], + ) + shape_x = card_x + (card_width - tile.width * cell_size) // 2 + shape_y = card_y + 34 + for part in tile.parts: + asset = square_explain_tile( + tile_edges[part.tile_id], + palette, + cell_size, + tile_id=part.tile_id, + edge_labels=True, + ) + canvas.paste( + asset, + (shape_x + part.dx * cell_size, shape_y + part.dy * cell_size), + ) + _draw_group_outline( + draw, + tile, + (shape_x, shape_y), + cell_size, + color=_GROUP_RGB[tile.name], + ) + ids = "|".join(str(part.tile_id) for part in tile.parts) + draw.text( + (card_x + 10, card_y + card_height - 24), + f"atomic IDs {ids}", + font=explain_font(11), + fill=EXPLAIN_MUTED_RGB, + ) + _draw_color_vocabulary( + draw, + (checked_margin + grid_width + _PANEL_GAP, grid_y), + palette, + ) + return np.asarray(canvas, dtype=np.uint8) + + +def compose_atomic_semantic_legend( + tile_edges: tuple[tuple[int, int, int, int], ...], + *, + pixels_per_cell: int = DEFAULT_PIXELS_PER_CELL, + margin: int = DEFAULT_MARGIN, +) -> np.ndarray: + """Compose all 23 atomic IDs with generalized part and symbolic edges.""" + try: + check_canonical_atomic_tileset(tile_edges) + except GeneralizedTileError as error: + raise _as_render_error(error) from error + ppc, checked_margin = _checked_dimensions(pixels_per_cell, margin) + cell_size = max(58, ppc * 2) + columns = 3 + rows = (len(tile_edges) + columns - 1) // columns + card_width = 420 + card_height = cell_size + 24 + gap = 10 + width = 2 * checked_margin + columns * card_width + (columns - 1) * gap + height = 2 * checked_margin + _HEADER_HEIGHT + rows * card_height + _check_canvas_limits(width, height) + + canvas = Image.new("RGB", (width, height), EXPLAIN_PANEL_RGB) + draw = ImageDraw.Draw(canvas) + draw_explain_heading( + draw, + (checked_margin, checked_margin), + title="Atomic Wang legend - 23 positional IDs", + subtitle=( + "generalized role and symbolic color are primary; numeric IDs in " + "brackets preserve the transport vocabulary" + ), + ) + palette = _build_palette_from_edges(tile_edges) + grid_y = checked_margin + _HEADER_HEIGHT + for tile_id, edges in enumerate(tile_edges): + column = tile_id % columns + row = tile_id // columns + x = checked_margin + column * (card_width + gap) + y = grid_y + row * card_height + draw.rounded_rectangle( + (x, y, x + card_width - 1, y + card_height - 8), + radius=7, + fill=(249, 250, 252), + outline=(214, 219, 227), + ) + asset = square_explain_tile( + edges, + palette, + cell_size, + tile_id=tile_id, + edge_labels=False, + ) + canvas.paste(asset, (x + 8, y + 8)) + text_x = x + cell_size + 20 + draw.text( + (text_x, y + 9), + f"{atomic_semantic_label(tile_id)} - atomic #{tile_id}", + font=explain_font(14), + fill=EXPLAIN_TEXT_RGB, + ) + draw.text( + (text_x, y + 33), + f"N {color_label(edges[0])} E {color_label(edges[1])}", + font=explain_font(11), + fill=EXPLAIN_TEXT_RGB, + ) + draw.text( + (text_x, y + 53), + f"S {color_label(edges[2])} W {color_label(edges[3])}", + font=explain_font(11), + fill=EXPLAIN_TEXT_RGB, + ) + return np.asarray(canvas, dtype=np.uint8) + + +def _overlay_side_panel( + draw: ImageDraw.ImageDraw, + origin: tuple[int, int], + instances: tuple[GeneralizedInstance, ...], + active_count: int, +) -> None: + x, y = origin + counts = Counter(instance.kind for instance in instances) + draw.text( + (x, y), + "Exact recognized partition", + font=explain_font(15), + fill=EXPLAIN_TEXT_RGB, + ) + y += 27 + font = explain_font(11) + for index, tile in enumerate(GENERALIZED_TILES): + column = index // 7 + row = index % 7 + item_x = x + column * 126 + item_y = y + row * 25 + draw.rectangle( + (item_x, item_y + 2, item_x + 16, item_y + 16), + fill=_GROUP_RGB[tile.name], + outline=EXPLAIN_OUTLINE_RGB, + ) + draw.text( + (item_x + 23, item_y), + f"{tile.name}: {counts[tile.name]}", + font=font, + fill=EXPLAIN_TEXT_RGB, + ) + y += 7 * 25 + 12 + draw.text( + (x, y), + f"{len(instances)} generalized occurrences", + font=explain_font(12), + fill=EXPLAIN_TEXT_RGB, + ) + draw.text( + (x, y + 20), + f"{active_count} atomic cells, no overlap", + font=explain_font(12), + fill=EXPLAIN_TEXT_RGB, + ) + draw.text( + (x, y + 50), + "V1 remains one cell per occurrence.", + font=explain_font(11), + fill=EXPLAIN_MUTED_RGB, + ) + draw.text( + (x, y + 68), + "Adjacent V1 copies are never merged.", + font=explain_font(11), + fill=EXPLAIN_MUTED_RGB, + ) + + +def compose_generalized_overlay( + presentation: WangPresentation, + *, + pixels_per_cell: int = DEFAULT_PIXELS_PER_CELL, + margin: int = DEFAULT_MARGIN, +) -> np.ndarray: + """Overlay the exact generalized partition on one square atomic witness.""" + if not isinstance(presentation, WangPresentation): + raise TypeError("presentation must be a WangPresentation") + try: + instances = recognize_generalized_tiles( + presentation.tile_edges, + presentation.cells, + min_x=presentation.min_x, + min_y=presentation.min_y, + max_x=presentation.max_x, + max_y=presentation.max_y, + ) + except GeneralizedTileError as error: + raise _as_render_error(error) from error + ppc, checked_margin = _checked_dimensions(pixels_per_cell, margin) + grid_width = presentation.width * ppc + grid_height = presentation.height * ppc + side_width = 270 + width = 2 * checked_margin + grid_width + _PANEL_GAP + side_width + height = max( + 2 * checked_margin + _HEADER_HEIGHT + grid_height, + 2 * checked_margin + _HEADER_HEIGHT + 300, + ) + _check_canvas_limits(width, height) + + canvas = Image.new("RGB", (width, height), EXPLAIN_PANEL_RGB) + draw = ImageDraw.Draw(canvas) + draw_explain_heading( + draw, + (checked_margin, checked_margin), + title="Square solution presentation - generalized overlay", + subtitle=( + "upstream verification is a precondition; contours group exact " + "atomic compositions and IDs remain visible" + ), + ) + grid_x = checked_margin + grid_y = checked_margin + _HEADER_HEIGHT + palette = _build_palette_from_edges(presentation.tile_edges) + inactive = square_inactive_tile(ppc) + assets: dict[int, Image.Image] = {} + for index, tile_id in enumerate(presentation.cells): + x = grid_x + (index % presentation.width) * ppc + y = grid_y + (index // presentation.width) * ppc + if tile_id is None: + canvas.paste(inactive, (x, y)) + continue + asset = assets.get(tile_id) + if asset is None: + asset = square_explain_tile( + presentation.tile_edges[tile_id], + palette, + ppc, + tile_id=tile_id, + edge_labels=False, + ) + assets[tile_id] = asset + canvas.paste(asset, (x, y)) + + draw = ImageDraw.Draw(canvas) + for instance in instances: + tile = generalized_tile(instance.kind) + origin_x = grid_x + (instance.origin_x - presentation.min_x) * ppc + origin_y = grid_y + (instance.origin_y - presentation.min_y) * ppc + _draw_group_outline( + draw, + tile, + (origin_x, origin_y), + ppc, + color=_GROUP_RGB[tile.name], + ) + _overlay_side_panel( + draw, + (grid_x + grid_width + _PANEL_GAP, grid_y), + instances, + sum(tile_id is not None for tile_id in presentation.cells), + ) + return np.asarray(canvas, dtype=np.uint8) + + +def render_generalized_view( + input_path: str | Path, + output_path: str | Path, + *, + view: str, + pixels_per_cell: int = DEFAULT_PIXELS_PER_CELL, + margin: int = DEFAULT_MARGIN, + hex_mode: bool = False, +) -> None: + """Render one explicit generalized square view and atomically install it.""" + if hex_mode: + raise WangSquareRenderError( + "--hex is not meaningful for generalized square grouping" + ) + if view == "generalized-overlay": + presentation = load_wang_presentation(input_path) + canvas = compose_generalized_overlay( + presentation, + pixels_per_cell=pixels_per_cell, + margin=margin, + ) + elif view in {"generalized-sheet", "atomic-legend"}: + from wang_snapshot import load_explainability_bundle + + bundle = load_explainability_bundle(input_path) + if view == "generalized-sheet": + canvas = compose_generalized_sheet( + bundle.tileset.tile_edges, + pixels_per_cell=pixels_per_cell, + margin=margin, + ) + else: + canvas = compose_atomic_semantic_legend( + bundle.tileset.tile_edges, + pixels_per_cell=pixels_per_cell, + margin=margin, + ) + else: + raise WangSquareRenderError( + "generalized view must be generalized-sheet, atomic-legend, " + "or generalized-overlay" + ) + _save_png_atomic(canvas, output_path) diff --git a/renderer/wang_square.py b/renderer/wang_square.py index dda119a..f32e1b5 100644 --- a/renderer/wang_square.py +++ b/renderer/wang_square.py @@ -977,7 +977,16 @@ def _parser() -> argparse.ArgumentParser: ) parser.add_argument( "--view", - choices=("solution", "formula", "tileset", "region", "reduction"), + choices=( + "solution", + "formula", + "tileset", + "region", + "reduction", + "generalized-sheet", + "atomic-legend", + "generalized-overlay", + ), default="solution", help="input stage to render (default: solution)", ) @@ -1002,16 +1011,32 @@ def main(argv: list[str] | None = None) -> None: raise WangSquareRenderError( "snapshot views are already explainable; omit --explain" ) - from wang_snapshot import render_pipeline_snapshot - - render_pipeline_snapshot( - args.input, - args.output, - view=args.view, - pixels_per_cell=args.pixels_per_cell, - margin=args.margin, - hex_mode=args.hex, - ) + if args.view in { + "generalized-sheet", + "atomic-legend", + "generalized-overlay", + }: + from wang_generalized_render import render_generalized_view + + render_generalized_view( + args.input, + args.output, + view=args.view, + pixels_per_cell=args.pixels_per_cell, + margin=args.margin, + hex_mode=args.hex, + ) + else: + from wang_snapshot import render_pipeline_snapshot + + render_pipeline_snapshot( + args.input, + args.output, + view=args.view, + pixels_per_cell=args.pixels_per_cell, + margin=args.margin, + hex_mode=args.hex, + ) except (FileNotFoundError, WangSquareRenderError) as error: parser.error(str(error))