From d12e3a969dc42248d9cfafc6eba0a985983aed39 Mon Sep 17 00:00:00 2001 From: jascal Date: Thu, 21 May 2026 11:06:35 -0400 Subject: [PATCH] release(0.14.0): bump version + Phase 2 changelog entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tags the polygram release that ships add-encoding-partition Phase 2 (#109): the actual per-block dispatch + stitching logic that Phase 1 (v0.13.0) deferred behind a NotImplementedError. What's new in 0.14.0 Compressor.apply now runs per-block compression when encoding_partition is set: - Per-block W_dec/W_enc/b_enc slicing - Cross-block clusters dropped (semantically invalid) - CompressionReport.blocks populated end-to-end - Coverage validation fires before any I/O After this tag publishes, sae-forge can begin add-block-structured-sae Phase 2 — the --encoding-partition CLI flag, AutoMaterialiseSpec.encoding_partition field, and per-row partition_label in ParetoFrontierRow — against a now-functional polygram partition surface. Phase 2 v1 caveats (already documented in PR #109's body and the CHANGELOG entry): per-block rank_ratio/post_A/forge_mse deferred to a separate enhancement; merge strategy works implicitly through the existing dispatch_strategy call. Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++++ polygram/__init__.py | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e371740..5e4e75b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,42 @@ (nothing yet) +## 0.14.0 — 2026-05-21 + +### Added + +- **`add-encoding-partition` Phase 2** — wires the per-block compress + + stitch logic that Phase 1 (v0.13.0) deferred. `Compressor.apply` + now actually runs per-block dispatch when an `encoding_partition` + is supplied, instead of refusing with `NotImplementedError`. + - **Per-block dispatch**: each block's features get sliced from the + SAE state, compressed with the block's encoding family via the + existing `dispatch_strategy` pipeline, and stitched back into a + single output safetensors. + - **Cross-block clusters are dropped**: a confirmed pair whose + members span two blocks is semantically invalid (the two + encodings can't merge a cluster across the boundary) — the + cluster gets dropped and both features survive as singletons. + Coverage validation fires before any I/O so under- or + over-specified partitions fail fast. + - **`CompressionReport.blocks` populated**: each `BlockReport` + carries per-block n_features_kept (= number of cluster + representatives in block), n_features_zeroed, n_clusters, + per-feature `cluster_assignments` (local cluster ids, + `-1` for unclustered features), and `scale_compression_ratio`. + - **Per-block diagnostic floats** (`rank_ratio` / `post_A` / + `forge_mse`) deferred to a separate enhancement; the v1 + BlockReport serialises these as `None`. Top-level diagnostics + still compute (across the post-drop plan). + - **Defensive empty-plan handling**: when a partition drops all + clusters as cross-block, the downstream rebuilt-Dictionary + debugging artifact seeds from the lowest-fid features rather + than crashing. + - 9 new tests covering: single-block partition, multi-block + stitch, cross-block-drop semantics, coverage validation, local + cluster_assignments, v3 report round-trip with blocks, and the + no-partition regression guard. Suite: 1070 → 1079. + ## 0.13.0 — 2026-05-21 ### Added diff --git a/polygram/__init__.py b/polygram/__init__.py index 40e7032..fc40882 100644 --- a/polygram/__init__.py +++ b/polygram/__init__.py @@ -96,7 +96,7 @@ load_toy_sae, ) -__version__ = "0.13.0" +__version__ = "0.14.0" __all__ = [ "BatchExperiment",