From 9a3b07806a76de718a0dfa7105a23097853e2fac Mon Sep 17 00:00:00 2001 From: Adam Page Date: Tue, 6 Oct 2026 07:15:44 -0500 Subject: [PATCH 1/4] release: record verified RVQ v1.1 bundles and preserve publish contracts --- README.md | 6 +- astro-site/src/content/docs/datasets.md | 2 +- astro-site/src/content/docs/deployment.md | 4 +- astro-site/src/content/docs/examples.md | 2 +- .../src/content/docs/getting-started.md | 6 +- astro-site/src/content/docs/huggingface.md | 21 +- astro-site/src/content/docs/models/ecg.md | 13 +- astro-site/src/content/docs/models/ppg.md | 13 +- .../src/content/docs/rvq-v11-release.md | 74 + astro-site/src/content/docs/signals/ecg.md | 2 +- astro-site/src/content/docs/signals/index.md | 4 +- .../src/content/docs/signals/ppg-workflow.md | 4 +- compressionkit/experiments/registry.py | 13 +- compressionkit/experiments/repackage.py | 1 + compressionkit/experiments/runner.py | 2 + compressionkit/export/model_card.py | 12 + releases/rvq-v1.1.json | 1317 +++++++++++++++++ scripts/publish_to_huggingface.py | 20 +- tests/test_huggingface.py | 41 + tests/test_rvq_repackage_samples.py | 13 +- tests/test_rvq_repackage_weights.py | 8 +- tests/test_two_stage_golden.py | 14 +- 22 files changed, 1542 insertions(+), 50 deletions(-) create mode 100644 astro-site/src/content/docs/rvq-v11-release.md create mode 100644 releases/rvq-v1.1.json diff --git a/README.md b/README.md index 10b50d1..a6554f6 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Load a published v1 codec and round-trip a frame. No training dataset is require import numpy as np from compressionkit.runtime import load_codec -codec = load_codec("Ambiq/compressionkit-ppg-4x-v1.0") +codec = load_codec("Ambiq/compressionkit-ppg-4x-v1.1") frame = np.zeros(codec.frame_size, dtype=np.float32) # replace with your signal frame encoded = codec.compress(frame) @@ -57,7 +57,7 @@ For RVQ-specific workflows that need raw token indices: ```python from compressionkit.runtime import RVQCodec -codec = RVQCodec.from_pretrained("Ambiq/compressionkit-ecg-4x-v1.0") +codec = RVQCodec.from_pretrained("Ambiq/compressionkit-ecg-4x-v1.1") indices = codec.encode(signal) reconstructed = codec.decode(indices) ``` @@ -96,7 +96,7 @@ Choose the lightest path that answers your question: | Goal | Command or API | Dataset required? | |------|----------------|-------------------| -| Try a published codec | `load_codec("Ambiq/compressionkit-ppg-4x-v1.0")` | No | +| Try a published codec | `load_codec("Ambiq/compressionkit-ppg-4x-v1.1")` | No | | Validate a local deploy package | `uv run compressionkit golden validate-deploy results/.../deploy` | No | | Stage a HuggingFace package | `uv run compressionkit golden run --skip-train --publish --dry-run` | No, if `deploy/` exists | | Reproduce a golden run | `uv run compressionkit golden run ` | Yes | diff --git a/astro-site/src/content/docs/datasets.md b/astro-site/src/content/docs/datasets.md index f95e37b..012f2fb 100644 --- a/astro-site/src/content/docs/datasets.md +++ b/astro-site/src/content/docs/datasets.md @@ -174,7 +174,7 @@ Load a one-dimensional waveform, resample it to the codec sample rate, and follo import numpy as np from compressionkit.runtime import load_codec -codec = load_codec("Ambiq/compressionkit-ppg-4x-v1.0") +codec = load_codec("Ambiq/compressionkit-ppg-4x-v1.1") fs, n = codec.sample_rate, codec.frame_size # PPG: 64 Hz # your_signal: 1-D float32 sampled at `fs` diff --git a/astro-site/src/content/docs/deployment.md b/astro-site/src/content/docs/deployment.md index 85534f0..64d62b5 100644 --- a/astro-site/src/content/docs/deployment.md +++ b/astro-site/src/content/docs/deployment.md @@ -181,7 +181,7 @@ This is useful when the encoder runs on-device and the decoder runs elsewhere. ## HuggingFace Quickstart -Published model repos follow the convention `Ambiq/compressionkit-{modality}-{cr}x-{version}`, for example `Ambiq/compressionkit-ppg-4x-v1.0` or `Ambiq/compressionkit-ecg-8x-v1.0`. +Published model repos follow the convention `Ambiq/compressionkit-{modality}-{cr}x-{version}`, for example `Ambiq/compressionkit-ppg-4x-v1.1` or `Ambiq/compressionkit-ecg-8x-v1.1`. Install the optional Hub dependency: @@ -207,7 +207,7 @@ def synthetic_ecg_frame(frame_size: int = 512, sample_rate: int = 256) -> np.nda return waveform.reshape(1, 1, frame_size, 1).astype(np.float32) -codec = RVQCodec.from_pretrained("Ambiq/compressionkit-ecg-4x-v1.0") +codec = RVQCodec.from_pretrained("Ambiq/compressionkit-ecg-4x-v1.1") signal = synthetic_ecg_frame() indices = codec.encode(signal) diff --git a/astro-site/src/content/docs/examples.md b/astro-site/src/content/docs/examples.md index a13b9da..b217bef 100644 --- a/astro-site/src/content/docs/examples.md +++ b/astro-site/src/content/docs/examples.md @@ -31,7 +31,7 @@ Each notebook exposes a single `CODEC_SOURCE` knob at the top: ```python # A published golden codec (downloads from HuggingFace) ... -CODEC_SOURCE = "Ambiq/compressionkit-ppg-4x-v1.0" +CODEC_SOURCE = "Ambiq/compressionkit-ppg-4x-v1.1" # ... or a local deploy package you built yourself (runs offline): # CODEC_SOURCE = "results/ppg_rvq_64hz_04x_golden/deploy" ``` diff --git a/astro-site/src/content/docs/getting-started.md b/astro-site/src/content/docs/getting-started.md index 6091b74..c4f56f3 100644 --- a/astro-site/src/content/docs/getting-started.md +++ b/astro-site/src/content/docs/getting-started.md @@ -31,15 +31,15 @@ Published v1 RVQ bundles are available for PPG and ECG: | Signal | HuggingFace repos | Frame | |--------|-------------------|-------| -| PPG | `Ambiq/compressionkit-ppg-{2,4,8,16,32}x-v1.0` | 5 s at 64 Hz | -| ECG | `Ambiq/compressionkit-ecg-{2,4,8,16,32,64}x-v1.0` | 2 s at 256 Hz | +| PPG | `Ambiq/compressionkit-ppg-{2,4,8,16,32}x-v1.1` | 5 s at 64 Hz | +| ECG | `Ambiq/compressionkit-ecg-{2,4,8,16,32,64}x-v1.1` | 2 s at 256 Hz | ```python import numpy as np from compressionkit.runtime import load_codec -codec = load_codec("Ambiq/compressionkit-ppg-4x-v1.0") +codec = load_codec("Ambiq/compressionkit-ppg-4x-v1.1") t = np.arange(codec.frame_size, dtype=np.float32) / codec.sample_rate frame = 0.6 * np.sin(2.0 * np.pi * 1.2 * t) diff --git a/astro-site/src/content/docs/huggingface.md b/astro-site/src/content/docs/huggingface.md index e0f65e8..dc177bc 100644 --- a/astro-site/src/content/docs/huggingface.md +++ b/astro-site/src/content/docs/huggingface.md @@ -4,7 +4,9 @@ description: "Download a codec bundle, run a sample frame, or load a local entro --- -Published v1 RVQ bundles live at `Ambiq/compressionkit-{modality}-{cr}x-{version}` (e.g. `-v1.0`). +Corrected single-stage RVQ bundles use `Ambiq/compressionkit-{modality}-{cr}x-v1.1`. +The original `v1.0` bundles remain available for historical results and packets. +See [release details](/compressionkit/rvq-v11-release/) for compatibility and validation. This page shows the minimum code to download one and run the encoder + decoder on a sample frame. SPIHT and hybrid package links are listed on their [experiment pages](/compressionkit/experiments/). The RVQ example below uses the RVQ-specific loader. @@ -22,7 +24,9 @@ for the `snapshot_download` / `from_pretrained` calls below. ## 2. Single-stage codec Single-stage repos contain `encoder_int8.tflite`, `encoder_float32.tflite`, `decoder_int8.tflite`, -`codebook.npz`, `sample_stimulus.npz`, and `demo_recordings.npz`. The float32 encoder supports browser and host LiteRT integrations with float32 I/O. [`RVQCodec.from_pretrained`](/compressionkit/reference/api/compressionkit/runtime/codec/#compressionkit.runtime.codec.RVQCodec.from_pretrained) downloads the bundle and wires +`codebook.npz`, normalized synthetic `sample_data.npz`, raw synthetic `sample_stimulus.npz`, +independent `reference_vectors.npz`, and `checksums.json`. Real demo recordings are optional. +The float32 encoder supports browser and host LiteRT integrations with float32 I/O. [`RVQCodec.from_pretrained`](/compressionkit/reference/api/compressionkit/runtime/codec/#compressionkit.runtime.codec.RVQCodec.from_pretrained) downloads the bundle and wires up the LiteRT interpreters. Use the full source-checkout installation above: package imports also require Keras and evaluation dependencies. ```python @@ -30,13 +34,13 @@ from huggingface_hub import snapshot_download from compressionkit.runtime import RVQCodec import numpy as np -repo = "Ambiq/compressionkit-ppg-4x-v1.0" +repo = "Ambiq/compressionkit-ppg-4x-v1.1" codec = RVQCodec.from_pretrained(repo) # Sanity check on the bundled license-safe sample (same cached files). -# Published bundles ship `inputs`, `targets`, and `reconstructions` arrays. +# sample_data carries normalized inputs, targets, and reconstructions. deploy_dir = snapshot_download(repo) -signal = np.load(f"{deploy_dir}/sample_stimulus.npz")["inputs"][:1] +signal = np.load(f"{deploy_dir}/sample_data.npz")["inputs"][:1] indices = codec.encode(signal) recon = codec.decode(indices) print("shape:", recon.shape) @@ -64,9 +68,10 @@ scripts/devcontainer.sh exec -- uv run python scripts/attach_rvq_demo_recordings :::note[Note] Use `RVQCodec.from_pretrained(repo_id)` rather than `RVQCodec(local_dir)` on a raw -`snapshot_download` directory. HuggingFace bundles store the manifest as `config.json` -(not `deploy_manifest.json`) and rename the TFLite files to `*_int8.tflite`; -`from_pretrained` reconciles those names so the constructor can find them. +`snapshot_download` directory. Older HuggingFace bundles use `config.json` and +`*_int8.tflite` aliases; `from_pretrained` reconciles those names. The v1.1 +releases retain the canonical deploy filenames as well as the aliases and can +be validated directly. ::: diff --git a/astro-site/src/content/docs/models/ecg.md b/astro-site/src/content/docs/models/ecg.md index 2e89f7f..f5c2ae1 100644 --- a/astro-site/src/content/docs/models/ecg.md +++ b/astro-site/src/content/docs/models/ecg.md @@ -1,5 +1,5 @@ --- -title: "ECG Models (v1.0)" +title: "ECG Models (v1.1 exports)" description: "ECG codec configurations, evaluation results and supporting resources." --- @@ -22,10 +22,11 @@ Two-stage variants: [`ecg-rvq-4x-prior`](/compressionkit/experiments/ecg-rvq-4x- ::: -## Published RVQ results +## Historical RVQ results -The table below summarizes the published RVQ bundles. These are the v1 packages -available through HuggingFace and the runtime loader. +The v1.1 bundles correct the exports of existing checkpoints without retraining. +The tables below are historical physiological evaluations, not new measurements of the corrected deployment bundles. +See [release details](/compressionkit/rvq-v11-release/) for measured export parity and packet sizes. These validation results and the noise-aware customer scorecards use different evaluation views. Keep the metric definitions and recording windows with the numbers when comparing results. @@ -207,7 +208,7 @@ For the full runtime guide, see [Deployment Guide](/compressionkit/deployment/). - Frame shape: `(1, 1, 512, 1)` float32 - Sample rate: `256 Hz` -- Default HuggingFace repo pattern: `Ambiq/compressionkit-ecg-{cr}x-v1.0` +- Default HuggingFace repo pattern: `Ambiq/compressionkit-ecg-{cr}x-v1.1` ### Quickstart @@ -219,7 +220,7 @@ from compressionkit.runtime import RVQCodec t = np.arange(512, dtype=np.float32) / 256.0 signal = (0.75 * np.sin(2.0 * np.pi * 1.1 * t) + 0.12 * np.sin(2.0 * np.pi * 9.0 * t)).reshape(1, 1, 512, 1) -codec = RVQCodec.from_pretrained("Ambiq/compressionkit-ecg-4x-v1.0") +codec = RVQCodec.from_pretrained("Ambiq/compressionkit-ecg-4x-v1.1") indices = codec.encode(signal.astype(np.float32)) reconstruction = codec.decode(indices) ``` diff --git a/astro-site/src/content/docs/models/ppg.md b/astro-site/src/content/docs/models/ppg.md index 7d74bad..52214ff 100644 --- a/astro-site/src/content/docs/models/ppg.md +++ b/astro-site/src/content/docs/models/ppg.md @@ -1,5 +1,5 @@ --- -title: "PPG Models (v1.0)" +title: "PPG Models (v1.1 exports)" description: "PPG codec configurations, evaluation results and supporting resources." --- @@ -22,10 +22,11 @@ Two-stage variants: [`ppg-rvq-4x-prior`](/compressionkit/experiments/ppg-rvq-4x- ::: -## Published RVQ results +## Historical RVQ results -The table below summarizes the published RVQ bundles. These are the v1 packages -available through HuggingFace and the runtime loader. +The v1.1 bundles correct the exports of existing checkpoints without retraining. +The tables below are historical physiological evaluations, not new measurements of the corrected deployment bundles. +See [release details](/compressionkit/rvq-v11-release/) for measured export parity and packet sizes. These validation results and the noise-aware customer scorecards use different evaluation views. Keep the metric definitions and recording windows with the numbers when comparing results. @@ -247,7 +248,7 @@ For the full runtime guide, see [Deployment Guide](/compressionkit/deployment/). - Frame shape: `(1, 1, 320, 1)` float32 - Sample rate: `64 Hz` -- Default HuggingFace repo pattern: `Ambiq/compressionkit-ppg-{cr}x-v1.0` +- Default HuggingFace repo pattern: `Ambiq/compressionkit-ppg-{cr}x-v1.1` ### Quickstart @@ -259,7 +260,7 @@ from compressionkit.runtime import RVQCodec t = np.arange(320, dtype=np.float32) / 64.0 signal = (0.6 * np.sin(2.0 * np.pi * 1.2 * t) + 0.1 * np.sin(2.0 * np.pi * 2.4 * t)).reshape(1, 1, 320, 1) -codec = RVQCodec.from_pretrained("Ambiq/compressionkit-ppg-4x-v1.0") +codec = RVQCodec.from_pretrained("Ambiq/compressionkit-ppg-4x-v1.1") indices = codec.encode(signal.astype(np.float32)) reconstruction = codec.decode(indices) ``` diff --git a/astro-site/src/content/docs/rvq-v11-release.md b/astro-site/src/content/docs/rvq-v11-release.md new file mode 100644 index 0000000..316d354 --- /dev/null +++ b/astro-site/src/content/docs/rvq-v11-release.md @@ -0,0 +1,74 @@ +--- +title: "RVQ v1.1 corrected exports" +description: "Pinned releases, export parity and packet compatibility for the corrected single-stage RVQ bundles." +--- + +The 2026-10-06 v1.1 release corrects the deployment exports of eleven existing +RVQ checkpoints. It removes EMA embedding-sum accumulators that were incorrectly +exported as extra codebooks. No models were retrained. + +The [release inventory](https://github.com/AmbiqAI/compressionkit/blob/issue-66-corrected-rvq-releases/releases/rvq-v1.1.json) +records every published repository, immutable revision, checksum-manifest hash, +checkpoint provenance, precision report and complete packet size. + +## Published bundles + +| Modality | Nominal ratios | Repository pattern | +|---|---|---| +| PPG | 2x, 4x, 8x, 16x, 32x | `Ambiq/compressionkit-ppg-{cr}x-v1.1` | +| ECG | 2x, 4x, 8x, 16x, 32x, 64x | `Ambiq/compressionkit-ecg-{cr}x-v1.1` | + +Download an exact revision from the inventory for reproducible evaluation: + +```python +from huggingface_hub import snapshot_download +from compressionkit.runtime import RVQCodec + +path = snapshot_download( + "Ambiq/compressionkit-ppg-8x-v1.1", + revision="24caa26b155a8173222620f4e5deb25a07d49879", +) +codec = RVQCodec(path) +``` + +These bundles preserve canonical deploy filenames alongside older Hugging Face +aliases. Each includes independent training reference vectors, synthetic sample +inputs, checksums, model cards, provenance and all four encoder precisions. + +## Validation + +All eleven local packages, staged upload packages and revision-pinned downloads +passed strict release validation with ten reference frames each. Complete packet +round trips passed for ten synthetic frames per bundle and encoder precision: +440 checks across FP32, INT8, FP16 and INT16x8. Downloaded files matched their +published checksum manifests. The original local artifacts and v1.0 repository +heads remained unchanged. + +Measured packet sizes include the four-byte float16 mean/scale header and +fixed-width RVQ tokens. ECG 8x uses 132 bytes per frame; PPG 8x uses 84 bytes. +The nominal ratio is an operating-point label; consult the inventory for the +actual ratio against 16-bit input, including the header. + +INT8 calibration and precision evaluation use content-disjoint real frames with +the saved training preprocessing. Their reports measure differences from the +FP32 deployed reconstruction. They do not measure physiological accuracy or +MCU kernel equivalence. ECG 64x INT8 has 13.64% P90 PRD and PPG 32x INT8 has +11.31%, above the 10% precision recommendation; their cards flag the higher +error. FP32 remains the default encoder. + +## Compatibility and evidence + +Bind stored packets to their exact repository and revision. Original v1.0 packets +require their original codebooks and decoder; the corrected level counts change +packet interpretation. The old bundles remain available. + +Physiological scorecards are historical results, explicitly labeled in each model +card and `release_provenance.json`. This release establishes export parity and +refreshes precision comparisons; it does not establish new physiological quality, +unseen-device generalization or encoder energy measurements. Saved configuration +sources and checkpoint hashes are recorded; complete pretraining ancestry was not +independently audited in this repair. + +The optional entropy priors remain on their historical v1.0 track and were not +included or requalified. Golden publication rejects a prior when its release +track differs from its parent's until that prior is requalified. diff --git a/astro-site/src/content/docs/signals/ecg.md b/astro-site/src/content/docs/signals/ecg.md index fc5b710..1ee04bb 100644 --- a/astro-site/src/content/docs/signals/ecg.md +++ b/astro-site/src/content/docs/signals/ecg.md @@ -40,7 +40,7 @@ DSP baseline, and hybrid AI+DSP runs help characterize artifact-heavy regimes. ### Golden Models -See **[ECG Models (v1.0)](/compressionkit/models/ecg/)** for the full results table, architecture breakdown, and training instructions. +See **[ECG Models (v1.1 exports)](/compressionkit/models/ecg/)** for the full results table, architecture breakdown, and training instructions. | Model | CR | PRD (%) | Cosine | |-------|----|---------|--------| diff --git a/astro-site/src/content/docs/signals/index.md b/astro-site/src/content/docs/signals/index.md index 71b4750..2ae5095 100644 --- a/astro-site/src/content/docs/signals/index.md +++ b/astro-site/src/content/docs/signals/index.md @@ -24,7 +24,7 @@ These pages cover the PPG signal path: 1. [PPG](/compressionkit/signals/ppg/) for signal context and preprocessing details. 2. [PPG Workflow](/compressionkit/signals/ppg-workflow/) for the end-to-end supported task. -3. [PPG Models (v1.0)](/compressionkit/models/ppg/) for the five golden reference operating points. +3. [PPG Models (v1.1 exports)](/compressionkit/models/ppg/) for the five golden reference operating points. 4. [PPG Codec Demo](/compressionkit/demo/ppg-codec/) for the browser and hardware evaluation experience. ## ECG Section @@ -32,7 +32,7 @@ These pages cover the PPG signal path: These pages cover the ECG signal path: 1. [ECG](/compressionkit/signals/ecg/) for signal context and preprocessing details. -2. [ECG Models (v1.0)](/compressionkit/models/ecg/) for the six golden reference operating points. +2. [ECG Models (v1.1 exports)](/compressionkit/models/ecg/) for the six golden reference operating points. ## Signal Properties Comparison diff --git a/astro-site/src/content/docs/signals/ppg-workflow.md b/astro-site/src/content/docs/signals/ppg-workflow.md index b695dd2..7166e79 100644 --- a/astro-site/src/content/docs/signals/ppg-workflow.md +++ b/astro-site/src/content/docs/signals/ppg-workflow.md @@ -13,7 +13,7 @@ golden lanes for deeper evaluation. The current supported task is: - Input: 64 Hz PPG windows from the open unified PPG v1 cache or from your own signal. -- Published runtime path: load `Ambiq/compressionkit-ppg-{2,4,8,16,32}x-v1.0` bundles. +- Published runtime path: load `Ambiq/compressionkit-ppg-{2,4,8,16,32}x-v1.1` bundles. - Golden comparison lanes: RVQ, SPIHT, and hybrid runs evaluated through the same scorecard shape. - Deployment path: export encoder/codebook artifacts plus manifests, checksums, and reference vectors. - Evaluation path: compare waveform metrics, HR/HRV preservation, noise buckets, and artifact sweeps. @@ -66,7 +66,7 @@ Use the published runtime path when you only need to try a codec: ```python from compressionkit.runtime import load_codec -codec = load_codec("Ambiq/compressionkit-ppg-8x-v1.0") +codec = load_codec("Ambiq/compressionkit-ppg-8x-v1.1") ``` ## Reference Operating Points diff --git a/compressionkit/experiments/registry.py b/compressionkit/experiments/registry.py index e0f95fd..8b9f0e0 100644 --- a/compressionkit/experiments/registry.py +++ b/compressionkit/experiments/registry.py @@ -22,8 +22,9 @@ * ``run_name`` — ``{modality}_{method}_{sample_rate}hz_{cr:02d}x_golden`` (matches AGENTS.md naming; ``method="rvq"`` preserves the historical infix). * ``hf_repo_id`` — the published HuggingFace repo id, including the release-track - suffix from ``hf_version`` (e.g. ``Ambiq/compressionkit-ppg-4x-v1.0``). Two-stage - entries share their parent codec's repo id (the prior is bundled alongside it). + suffix from ``hf_version`` (e.g. ``Ambiq/compressionkit-ppg-4x-v1.1``). Two-stage + entries retain their last qualified track until separately requalified after + a parent codec release change. * ``hf_version`` — release-track suffix (default ``"v1.0"``) that ``hf_repo_id`` must include. ``_check_naming`` only validates the two fields are consistent — moving an experiment to a new release track means updating both together. @@ -224,7 +225,8 @@ def _ppg_codec(cr: int) -> GoldenExperiment: run_name=f"ppg_rvq_64hz_{cr:02d}x_golden", sample_rate=64, compression_ratio=cr, - hf_repo_id=f"Ambiq/compressionkit-ppg-{cr}x-v1.0", + hf_repo_id=f"Ambiq/compressionkit-ppg-{cr}x-v1.1", + hf_version="v1.1", dataset_id="ppg-unified-strict-sanitize-v1", expected_metrics=_PPG_EXPECTED_METRICS.get(cr), ) @@ -240,12 +242,15 @@ def _ecg_codec(cr: int) -> GoldenExperiment: run_name=f"ecg_rvq_256hz_{cr:02d}x_golden", sample_rate=256, compression_ratio=cr, - hf_repo_id=f"Ambiq/compressionkit-ecg-{cr}x-v1.0", + hf_repo_id=f"Ambiq/compressionkit-ecg-{cr}x-v1.1", + hf_version="v1.1", dataset_id="ptb-xl", expected_metrics=_ECG_EXPECTED_METRICS.get(cr), ) +# Entropy priors remain on their historical v1.0 track; the v1.1 export +# repair releases only single-stage codecs and does not qualify those priors. def _ppg_two_stage(cr: int) -> GoldenExperiment: parent_id = f"ppg-rvq-{cr}x" return GoldenExperiment( diff --git a/compressionkit/experiments/repackage.py b/compressionkit/experiments/repackage.py index bcacea6..8853af8 100644 --- a/compressionkit/experiments/repackage.py +++ b/compressionkit/experiments/repackage.py @@ -218,6 +218,7 @@ def repackage_rvq_golden( sample_inputs=sample_inputs, sample_targets=sample_inputs, model_name=experiment.run_name, + model_version=experiment.hf_version.removeprefix("v"), export_decoder_float32=True, export_decoder_int8=export_decoder_int8, model_card_info=model_card_info, diff --git a/compressionkit/experiments/runner.py b/compressionkit/experiments/runner.py index 1464bb2..56d41bc 100644 --- a/compressionkit/experiments/runner.py +++ b/compressionkit/experiments/runner.py @@ -168,6 +168,8 @@ def _validate_release_package( def _publish(experiment: GoldenExperiment, run_dir: Path, dry_run: bool) -> int: + if experiment.parent and get_golden(experiment.parent).hf_version != experiment.hf_version: + raise ValueError("Requalify the entropy prior against its parent's release track before publication") deploy_dir = run_dir / "deploy" if not deploy_dir.is_dir(): raise FileNotFoundError(f"deploy directory missing for {experiment.experiment_id!r}: {deploy_dir}") diff --git a/compressionkit/export/model_card.py b/compressionkit/export/model_card.py index 84886b8..d3863dc 100644 --- a/compressionkit/export/model_card.py +++ b/compressionkit/export/model_card.py @@ -188,6 +188,18 @@ def generate_model_card( lines.append(f"- **Encoder Output:** `{output_shape}`") lines.append("") + provenance = model_card_info.get("release_provenance") + if isinstance(provenance, dict): + lines.extend(["## Release Provenance", ""]) + lines.append(f"Release kind: {provenance.get('release_kind', 'see release_provenance.json')}.") + lines.append(f"Export source commit: `{provenance.get('source_commit', 'unknown')}`.") + lines.append(f"Physiological scorecard: {provenance.get('physiological_scorecard_status', 'see provenance')}.") + lines.append(f"Packet compatibility: {provenance.get('packet_compatibility', 'see provenance')}.") + lines.append(f"Pretraining ancestry: {provenance.get('pretraining_ancestry', 'see provenance')}.") + lines.extend( + ["See `release_provenance.json` for checkpoint hashes, replaced revision, and sample provenance.", ""] + ) + # Quality metrics (if scorecard available) if scorecard: lines.append("## Quality Metrics") diff --git a/releases/rvq-v1.1.json b/releases/rvq-v1.1.json new file mode 100644 index 0000000..301c7e3 --- /dev/null +++ b/releases/rvq-v1.1.json @@ -0,0 +1,1317 @@ +{ + "release_id": "rvq-export-v1.1", + "date": "2026-10-06", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "scope": "11 single-stage corrected exports; no retraining or new physiological evaluation; no entropy priors", + "validation": { + "bundles": 11, + "reference_frames": 110, + "complete_packet_roundtrips": 440, + "source_tests_passed": 445, + "source_tests_optional_skips": 78 + }, + "releases": [ + { + "experiment_id": "ecg-rvq-16x", + "hf_repo_id": "Ambiq/compressionkit-ecg-16x-v1.1", + "hub_revision": "2917a156cfc9e8c2e23aacfd278ec10ce5bef298", + "previous_repo_id": "Ambiq/compressionkit-ecg-16x-v1.0", + "previous_revision": "e1c78d7227fec77887bd6a619d3463e238c3e01d", + "package_version": "1.1.0", + "sample_rate_hz": 256, + "frame_size": 512, + "nominal_compression_ratio": 16, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 2, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 32768, + "packet_bytes": 68, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 15.058823529411764, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "abd30475d02ed18a8fb5761e15235378b32621cba69cbcabaecafe010ea14d92", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "e1c78d7227fec77887bd6a619d3463e238c3e01d", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 256, + "frame_size": 512, + "input_shape": [ + 1, + 1, + 512, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.515625, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 5.32648551190221, + "reconstruction_prd_percent_max": 29.25094354381138, + "reconstruction_prd_percent_p90": 8.20972189220826 + }, + "fp16": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.03477722306192083, + "reconstruction_prd_percent_max": 6.084195739161758, + "reconstruction_prd_percent_p90": 0.8270459116324722 + }, + "int16x8": { + "code_index_match_fraction_median": 0.90625, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.8317500029081282, + "reconstruction_prd_percent_max": 17.76016577490633, + "reconstruction_prd_percent_p90": 4.440594093126392 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ecg-16x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ecg-16x-v1.0", + "revision": "e1c78d7227fec77887bd6a619d3463e238c3e01d" + }, + "checkpoint_sha256": { + "encoder.keras": "cbb6f44d3a78839010a725fcbf3e004b57d9205a8b94b1fafd19987c956968b4", + "decoder.keras": "44e220d2a8ca2489932877957d9bee28c0199a4390444ffc58e7ebb1451455ae", + "rvq_weights.npz": "1fe0dd479d9543042b33b2f599ae8817c7b86c18ee63c92e297d57447cff0457", + "config.json": "f40b6adcbbb940a69888fcd7df244feed2e10710e10b9a0bc0250c264f394063", + "quality_scorecard.json": "d0b8745ea4e6b4851bd7eb98ddad03d7f77600edaaf4e125e837ea0551862b18" + }, + "saved_config_dataset_sources": [ + "ptb-xl" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ecg-rvq-2x", + "hf_repo_id": "Ambiq/compressionkit-ecg-2x-v1.1", + "hub_revision": "5e7c5b7013939c34932f7766e0e6c967771d73e8", + "previous_repo_id": "Ambiq/compressionkit-ecg-2x-v1.0", + "previous_revision": "4d07900f24978ee3830ee2a6a4e2becaa0880645", + "package_version": "1.1.0", + "sample_rate_hz": 256, + "frame_size": 512, + "nominal_compression_ratio": 2, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 2, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 32768, + "packet_bytes": 516, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 1.9844961240310077, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "b0dcff52a5d52d6132223cb58ce40643e1b9bbfff3a985567a6e5d62f50ab1a3", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "4d07900f24978ee3830ee2a6a4e2becaa0880645", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 256, + "frame_size": 512, + "input_shape": [ + 1, + 1, + 512, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.27734375, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 7.231732308649096, + "reconstruction_prd_percent_max": 7.467517407691171, + "reconstruction_prd_percent_p90": 3.43325938079292 + }, + "fp16": { + "code_index_match_fraction_median": 0.998046875, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.03768657521060596, + "reconstruction_prd_percent_max": 1.649463433907677, + "reconstruction_prd_percent_p90": 0.213636473882605 + }, + "int16x8": { + "code_index_match_fraction_median": 0.939453125, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.6892535283964113, + "reconstruction_prd_percent_max": 2.933627178937992, + "reconstruction_prd_percent_p90": 0.9401819006598036 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ecg-2x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ecg-2x-v1.0", + "revision": "4d07900f24978ee3830ee2a6a4e2becaa0880645" + }, + "checkpoint_sha256": { + "encoder.keras": "ee9c0cca37a411c003c4685f6da9a3376cb242d14f2eafc3d82ca89c9e3b6c31", + "decoder.keras": "8161b7e3bae1f2a16e35b2cee7749196592e26af1ba58d74617119e68ff1dd5c", + "rvq_weights.npz": "9da1fe2ab3481103b2d8f191a60897acd47c2561d65bd906d9c40a99d02bbcc7", + "config.json": "aedcf0112a1f157d1b13f4c3f6d6bcf9c05046fd13ff4e4da8c098de6a53df0c", + "quality_scorecard.json": "01cdd61014d7517ce06b5c31bd54e415338d679eadeed853dbf9a5eae13982be" + }, + "saved_config_dataset_sources": [ + "ptb-xl" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ecg-rvq-32x", + "hf_repo_id": "Ambiq/compressionkit-ecg-32x-v1.1", + "hub_revision": "76230861156c2ed5d09a4fe297d2df628622b128", + "previous_repo_id": "Ambiq/compressionkit-ecg-32x-v1.0", + "previous_revision": "13c9be7e94b80191385f6be3aad32d2effb59e0b", + "package_version": "1.1.0", + "sample_rate_hz": 256, + "frame_size": 512, + "nominal_compression_ratio": 32, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 1, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 16384, + "packet_bytes": 36, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 28.444444444444443, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "88ecbfd74776d32f7646af444a46890519d13e2fc53e33027cc5decb792d2dab", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "13c9be7e94b80191385f6be3aad32d2effb59e0b", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 256, + "frame_size": 512, + "input_shape": [ + 1, + 1, + 512, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.78125, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 4.467638018756055, + "reconstruction_prd_percent_max": 27.19077027573804, + "reconstruction_prd_percent_p90": 9.669886963393884 + }, + "fp16": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.05672508929764873, + "reconstruction_prd_percent_max": 13.332575875589855, + "reconstruction_prd_percent_p90": 0.9275455502882823 + }, + "int16x8": { + "code_index_match_fraction_median": 0.96875, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.8508853950155761, + "reconstruction_prd_percent_max": 24.734961967743228, + "reconstruction_prd_percent_p90": 5.947017975451684 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ecg-32x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ecg-32x-v1.0", + "revision": "13c9be7e94b80191385f6be3aad32d2effb59e0b" + }, + "checkpoint_sha256": { + "encoder.keras": "624a52832f12cc2c9f7f10100906ca1c0ba1d4a67a781f856ae7c81b6393c239", + "decoder.keras": "87fe087a5e1494965e89756765cf671333f8bf6164bd288e0541cca5669868dc", + "rvq_weights.npz": "fc4362ff6e31cf01e36a5d20e408da9b8afb9859449e5b136ffcf0f28e300e40", + "config.json": "08f8d14fb7477ddb48be2886a15261064bdd25b5bdf77ccf925cd7049f57456b", + "quality_scorecard.json": "cacc98bc7692ecbcce103f79e896e7ce85b50b0da97dc22cd16645866ace2556" + }, + "saved_config_dataset_sources": [ + "ptb-xl" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ecg-rvq-4x", + "hf_repo_id": "Ambiq/compressionkit-ecg-4x-v1.1", + "hub_revision": "605710fdad8a59fc4df20026e02a3ea3efb46598", + "previous_repo_id": "Ambiq/compressionkit-ecg-4x-v1.0", + "previous_revision": "f8be1ba5454d0eb5c645393ec3261e74d0bf26a8", + "package_version": "1.1.0", + "sample_rate_hz": 256, + "frame_size": 512, + "nominal_compression_ratio": 4, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 2, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 32768, + "packet_bytes": 260, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 3.9384615384615387, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "a10f3c33ce96deb905ecf224f14036d7ffe8944c689b869aa5f451f1ba41fb42", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "f8be1ba5454d0eb5c645393ec3261e74d0bf26a8", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 256, + "frame_size": 512, + "input_shape": [ + 1, + 1, + 512, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.39453125, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 6.140229744960842, + "reconstruction_prd_percent_max": 12.808473662196842, + "reconstruction_prd_percent_p90": 5.267588204772099 + }, + "fp16": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.02294558028430689, + "reconstruction_prd_percent_max": 2.6307946045714523, + "reconstruction_prd_percent_p90": 0.23837874144596363 + }, + "int16x8": { + "code_index_match_fraction_median": 0.9453125, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.5951011642022491, + "reconstruction_prd_percent_max": 4.90118331410871, + "reconstruction_prd_percent_p90": 1.815759787613518 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ecg-4x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ecg-4x-v1.0", + "revision": "f8be1ba5454d0eb5c645393ec3261e74d0bf26a8" + }, + "checkpoint_sha256": { + "encoder.keras": "5c0584ec869d812746a6c8d6afe77e41d078434c49ad75ddf9d3002274ff8eed", + "decoder.keras": "cc752dacaf4ed2d95955d45b1b3a7cd94d39e2c88b2a3107b53b1dd878548758", + "rvq_weights.npz": "b7cf529c303d2a8a2c0bf0d41e98c1942167a0d6cd74ac7fa9c508699406ae7b", + "config.json": "f982ee1f2052326429ea15c7e18e0c82ccf707d67ebafd7cf764cf3c10938e3b", + "quality_scorecard.json": "aee254e9fcf0b1881325b9725c201846cdf327481f0b30408eef929d7f8cc7e9" + }, + "saved_config_dataset_sources": [ + "ptb-xl" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ecg-rvq-64x", + "hf_repo_id": "Ambiq/compressionkit-ecg-64x-v1.1", + "hub_revision": "e4b59faa963b7986286081db906b54db8b72f5b8", + "previous_repo_id": "Ambiq/compressionkit-ecg-64x-v1.0", + "previous_revision": "49c2dd0ddb04b23d6817e584c9865046ecd15424", + "package_version": "1.1.0", + "sample_rate_hz": 256, + "frame_size": 512, + "nominal_compression_ratio": 64, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 1, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 16384, + "packet_bytes": 20, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 51.2, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "7b098351e5c93f8b2ec1a9aa40a29d2389c2d8100456248769e393117c96e2aa", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "49c2dd0ddb04b23d6817e584c9865046ecd15424", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 256, + "frame_size": 512, + "input_shape": [ + 1, + 1, + 512, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.875, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 3.813841871216057, + "reconstruction_prd_percent_max": 31.436281783128244, + "reconstruction_prd_percent_p90": 13.637585898481623 + }, + "fp16": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.041841109143292664, + "reconstruction_prd_percent_max": 17.378431051524263, + "reconstruction_prd_percent_p90": 0.0 + }, + "int16x8": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.7727179991432114, + "reconstruction_prd_percent_max": 31.816809372271177, + "reconstruction_prd_percent_p90": 8.280915013423305 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ecg-64x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ecg-64x-v1.0", + "revision": "49c2dd0ddb04b23d6817e584c9865046ecd15424" + }, + "checkpoint_sha256": { + "encoder.keras": "f36fd1caac4455125a02ae95b45c95d3e551808dddb5982596a0e7caff291b9c", + "decoder.keras": "6177842322f65d5c0fffd9259ee41be09fd85b6908cb09f144f6f73d61ba2918", + "rvq_weights.npz": "ac6ac24c66ac86ffe72c914403809b6674d968b49b7250da59e40e4d218319aa", + "config.json": "9f18cc46dedebf954a2d01c082ca14201df4b74ef77c7d48841a966d2f72de8b", + "quality_scorecard.json": "2ead2557978695862e00506fcdc98e641d35f19e2bd7e723052d3e8864fec6d5" + }, + "saved_config_dataset_sources": [ + "ptb-xl" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ecg-rvq-8x", + "hf_repo_id": "Ambiq/compressionkit-ecg-8x-v1.1", + "hub_revision": "94008aacf80a70977edf410d02bec27a3589f71d", + "previous_repo_id": "Ambiq/compressionkit-ecg-8x-v1.0", + "previous_revision": "548a82529fc10075c31f19ab1ed8c09dfb2e58f4", + "package_version": "1.1.0", + "sample_rate_hz": 256, + "frame_size": 512, + "nominal_compression_ratio": 8, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 2, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 32768, + "packet_bytes": 132, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 7.757575757575758, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "fa595b1fd2ddf94770702659564bd2cfa736e46e0d07030fea4220bbb7d7efa1", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "548a82529fc10075c31f19ab1ed8c09dfb2e58f4", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 256, + "frame_size": 512, + "input_shape": [ + 1, + 1, + 512, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.3828125, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 6.487782146678019, + "reconstruction_prd_percent_max": 20.791750686143086, + "reconstruction_prd_percent_p90": 7.624651356385293 + }, + "fp16": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.02934907370403674, + "reconstruction_prd_percent_max": 5.288753467215186, + "reconstruction_prd_percent_p90": 0.6379682991449382 + }, + "int16x8": { + "code_index_match_fraction_median": 0.921875, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.6776941527071608, + "reconstruction_prd_percent_max": 19.97349756820578, + "reconstruction_prd_percent_p90": 2.965120876815057 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ecg-8x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ecg-8x-v1.0", + "revision": "548a82529fc10075c31f19ab1ed8c09dfb2e58f4" + }, + "checkpoint_sha256": { + "encoder.keras": "962ce597c2c15e912094ff86112e76342a987d3eb831fe7b3facee49671c390f", + "decoder.keras": "deb44a851658e2c3f2edd7fee95fc7366053950b13933d47ded0e6eee8767e92", + "rvq_weights.npz": "601028fd213502c9ce9b8b1c3fc0f27ec7513fd1997e0aafa61ffd5d29413ba5", + "config.json": "82c1eb0ebff7d516ed1f5eafa56c13bcc6103eddf5949eb5f7695ff0a5a27473", + "quality_scorecard.json": "85c49af3864652c495720afd04f9d6ce5f4351c8bb0035d33ced13c929e66a7c" + }, + "saved_config_dataset_sources": [ + "ptb-xl" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ppg-rvq-16x", + "hf_repo_id": "Ambiq/compressionkit-ppg-16x-v1.1", + "hub_revision": "dbe1744b1e5bdaafd150413ae36a3befb5b62bbf", + "previous_repo_id": "Ambiq/compressionkit-ppg-16x-v1.0", + "previous_revision": "928d302ac822712c4513488f6d4e0fef962bde37", + "package_version": "1.1.0", + "sample_rate_hz": 64, + "frame_size": 320, + "nominal_compression_ratio": 16, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 2, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 32768, + "packet_bytes": 44, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 14.545454545454545, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "594a0c9c179c7d151ffd41517d9b157faabae574faf45eb2ba5ae8c6a4ac0204", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "928d302ac822712c4513488f6d4e0fef962bde37", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 64, + "frame_size": 320, + "input_shape": [ + 1, + 1, + 320, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.7, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 3.872741895776422, + "reconstruction_prd_percent_max": 12.612366334873357, + "reconstruction_prd_percent_p90": 6.704610042332522 + }, + "fp16": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.030416584856261215, + "reconstruction_prd_percent_max": 4.630277169241111, + "reconstruction_prd_percent_p90": 0.0 + }, + "int16x8": { + "code_index_match_fraction_median": 0.975, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.6558023229147862, + "reconstruction_prd_percent_max": 8.093066900533758, + "reconstruction_prd_percent_p90": 3.0826103330604617 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ppg-16x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ppg-16x-v1.0", + "revision": "928d302ac822712c4513488f6d4e0fef962bde37" + }, + "checkpoint_sha256": { + "encoder.keras": "017c2672a4054c7b8e343f84d7b5688d8771059d457d095d63ba7b3c20b1ace9", + "decoder.keras": "0dcf7480e00bcace77462757229854cd18faf3b05ca7a67ab31038d17d1bf723", + "rvq_weights.npz": "ffcd030f474c5105df4db018730979fb7ad33b2bf3eff3dff66cdfe89534d0dd", + "config.json": "e60aa1e5fcc11a8d7cd0b805d3eea2fff84fcc2c4d43b8f43c67f90d52c803d6", + "quality_scorecard.json": "476b6dfe824e69b5e2b46d138d25b7e9ff418c2b4bd885e83e7d2eb281a6c3ce" + }, + "saved_config_dataset_sources": [ + "bidmc", + "butppg", + "ppg_dalia", + "wesad" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ppg-rvq-2x", + "hf_repo_id": "Ambiq/compressionkit-ppg-2x-v1.1", + "hub_revision": "419fc890d54798cc18a37e23f82064f395d1cdc7", + "previous_repo_id": "Ambiq/compressionkit-ppg-2x-v1.0", + "previous_revision": "af00d62fcdd8e8c12a2929bae9d22911ab518966", + "package_version": "1.1.0", + "sample_rate_hz": 64, + "frame_size": 320, + "nominal_compression_ratio": 2, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 2, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 32768, + "packet_bytes": 324, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 1.9753086419753085, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "37106cd6436b1fb92ea52247a581d47b446067301f57964bef117f5ded4df0a4", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "af00d62fcdd8e8c12a2929bae9d22911ab518966", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 64, + "frame_size": 320, + "input_shape": [ + 1, + 1, + 320, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.35, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 7.536643776030332, + "reconstruction_prd_percent_max": 6.125088839954151, + "reconstruction_prd_percent_p90": 3.05376936054176 + }, + "fp16": { + "code_index_match_fraction_median": 0.990625, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.0633389911946514, + "reconstruction_prd_percent_max": 0.5703117990895303, + "reconstruction_prd_percent_p90": 0.16679176939878168 + }, + "int16x8": { + "code_index_match_fraction_median": 0.846875, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 1.0352796329361273, + "reconstruction_prd_percent_max": 1.7476337240960216, + "reconstruction_prd_percent_p90": 0.6590170026021227 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ppg-2x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ppg-2x-v1.0", + "revision": "af00d62fcdd8e8c12a2929bae9d22911ab518966" + }, + "checkpoint_sha256": { + "encoder.keras": "49e252de9148fbdb0f6599055e1929dd6bd6467b9d1947fe149413c9442401c5", + "decoder.keras": "054ef27ba4c7d07a5f939e69da2144c3cc9930316f9c6d6875db2ba7e0d53768", + "rvq_weights.npz": "b7798ad44d5181a19b46dda4d14042a4a5de8c3bffb7f2ed5efbb48a10f6033c", + "config.json": "0bc6d6937ebc03b04065bf90510fab58b9fe340567511f08dbe1fde3a5c50da8", + "quality_scorecard.json": "81223e7c7e4ec5e7c248c06d39ca2331cfebd1539389e2740f36982622ce00eb" + }, + "saved_config_dataset_sources": [ + "bidmc", + "butppg", + "ppg_dalia", + "wesad" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ppg-rvq-32x", + "hf_repo_id": "Ambiq/compressionkit-ppg-32x-v1.1", + "hub_revision": "94cd44ff71dde747d73187a05357491a2e955f7d", + "previous_repo_id": "Ambiq/compressionkit-ppg-32x-v1.0", + "previous_revision": "bff7e89fbe3c6b35a2db829d7da6022eb26fcf34", + "package_version": "1.1.0", + "sample_rate_hz": 64, + "frame_size": 320, + "nominal_compression_ratio": 32, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 1, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 16384, + "packet_bytes": 24, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 26.666666666666668, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "a075c1ab5706aa56a6f59c3f2c17c88d07115ee31a3fe390d3908daeddcb32dd", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "bff7e89fbe3c6b35a2db829d7da6022eb26fcf34", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 64, + "frame_size": 320, + "input_shape": [ + 1, + 1, + 320, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.85, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 3.734960589655774, + "reconstruction_prd_percent_max": 20.874557395249976, + "reconstruction_prd_percent_p90": 11.31056659960422 + }, + "fp16": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.02462919144008737, + "reconstruction_prd_percent_max": 8.945128537885628, + "reconstruction_prd_percent_p90": 0.0 + }, + "int16x8": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.5581851404504072, + "reconstruction_prd_percent_max": 15.2585554698384, + "reconstruction_prd_percent_p90": 5.6344101530630635 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ppg-32x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ppg-32x-v1.0", + "revision": "bff7e89fbe3c6b35a2db829d7da6022eb26fcf34" + }, + "checkpoint_sha256": { + "encoder.keras": "2e70ad3e4a3c0aa546ceb9d4c9ef62920374c2215f37c8c4a05da05c297a7507", + "decoder.keras": "89ccddddf76da38de2d0ebbf6675b9ade6e6696f486392e0929ee1a8c36e6768", + "rvq_weights.npz": "9fa042579e4f2d0f4a25e605ee26aa256c83521d2dd1196084d8ece06ccb33f9", + "config.json": "994a4795741fb52e712d9223366ceb8a8320f18a818d16a5270f8aafe3ed87d8", + "quality_scorecard.json": "ecbc7ad2359ee0452f347e293f381b842f7081b7a946fe6b523dbab344754b04" + }, + "saved_config_dataset_sources": [ + "bidmc", + "butppg", + "ppg_dalia", + "wesad" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ppg-rvq-4x", + "hf_repo_id": "Ambiq/compressionkit-ppg-4x-v1.1", + "hub_revision": "b8d8e104a9e3cf42215a82bf14336efc66472bab", + "previous_repo_id": "Ambiq/compressionkit-ppg-4x-v1.0", + "previous_revision": "8e3b465983808d50d99799df6135aaffe68029ff", + "package_version": "1.1.0", + "sample_rate_hz": 64, + "frame_size": 320, + "nominal_compression_ratio": 4, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 2, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 32768, + "packet_bytes": 164, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 3.902439024390244, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "decccc2dbf9014b746d48ebedff93a6465050d1cca6f0abc5e441972774f903d", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "8e3b465983808d50d99799df6135aaffe68029ff", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 64, + "frame_size": 320, + "input_shape": [ + 1, + 1, + 320, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.38125, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 4.873773993198822, + "reconstruction_prd_percent_max": 4.64368215317287, + "reconstruction_prd_percent_p90": 2.810208908957968 + }, + "fp16": { + "code_index_match_fraction_median": 0.99375, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.03661526047261865, + "reconstruction_prd_percent_max": 0.6363130575288274, + "reconstruction_prd_percent_p90": 0.20304752913933233 + }, + "int16x8": { + "code_index_match_fraction_median": 0.8968750000000001, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.5836852859067797, + "reconstruction_prd_percent_max": 2.874972919860897, + "reconstruction_prd_percent_p90": 0.7264584090783407 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ppg-4x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ppg-4x-v1.0", + "revision": "8e3b465983808d50d99799df6135aaffe68029ff" + }, + "checkpoint_sha256": { + "encoder.keras": "4240d493c17e89b9db5711bb295065ce2aa5efcd4be64e06c69381eb2042defe", + "decoder.keras": "5050b11f19a9585c96d70fafe74648690c1603ffda493bd63aa1eec28a3159d2", + "rvq_weights.npz": "a684f9808d20ecf5006008ac16b9812ac3eaf33fbe7f45b40e3bf15f2de7c022", + "config.json": "826d6d1a95650b00ee6a184f014226458f12a6388aa9b05c75782071d827ccee", + "quality_scorecard.json": "9e3b800024964cc4414e4a023d2c4708e244e6eb3fffb21e5c8a30cf1a80855b" + }, + "saved_config_dataset_sources": [ + "bidmc", + "butppg", + "ppg_dalia", + "wesad" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + }, + { + "experiment_id": "ppg-rvq-8x", + "hf_repo_id": "Ambiq/compressionkit-ppg-8x-v1.1", + "hub_revision": "24caa26b155a8173222620f4e5deb25a07d49879", + "previous_repo_id": "Ambiq/compressionkit-ppg-8x-v1.0", + "previous_revision": "7e2b0cea808d1b1f168c4131ea5c00ffe50e9cce", + "package_version": "1.1.0", + "sample_rate_hz": 64, + "frame_size": 320, + "nominal_compression_ratio": 8, + "codebook": { + "npz": "codebook.npz", + "header": "codebook.h", + "num_levels": 2, + "num_embeddings": 256, + "embedding_dim": 16 + }, + "codebook_value_bytes": 32768, + "packet_bytes": 84, + "packet_header_bytes": 4, + "compression_ratio_pcm16_including_header": 7.619047619047619, + "reference_frames": 10, + "packet_roundtrips": 40, + "encoder_variants": [ + "float32", + "int8", + "fp16", + "int16x8" + ], + "published_checksums_sha256": "6dbd6fa243a873493008649b7743d7e26f88c3b7ac19e0c7aff8b1552d72125a", + "files_verified": 31, + "strict_local_validation": true, + "strict_staged_validation": true, + "strict_downloaded_validation": true, + "original_artifacts_unchanged": true, + "previous_head_unchanged": "7e2b0cea808d1b1f168c4131ea5c00ffe50e9cce", + "preprocessing_contract": { + "format_version": 1, + "sample_rate_hz": 64, + "frame_size": 320, + "input_shape": [ + 1, + 1, + 320, + 1 + ], + "normalization": { + "kind": "per_frame_layer_norm", + "mean": "mean over all samples in each frame", + "variance": "mean squared deviation over all samples in each frame", + "epsilon": 0.001, + "inverse_for_display": "raw = normalized * sqrt(variance + epsilon) + mean" + }, + "int8_quantization": { + "calibration_frames": 4096, + "validation_frames": 2048, + "sampling_pool_frames": 65536, + "sampling_method": "seeded reservoir sample; disjoint calibration and validation partitions" + } + }, + "encoder_precision_report": { + "int8": { + "code_index_match_fraction_median": 0.55, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 4.389877562740608, + "reconstruction_prd_percent_max": 7.991384284064365, + "reconstruction_prd_percent_p90": 4.357641338187402 + }, + "fp16": { + "code_index_match_fraction_median": 1.0, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.033742016676295075, + "reconstruction_prd_percent_max": 1.9677144163382787, + "reconstruction_prd_percent_p90": 0.5213478554658434 + }, + "int16x8": { + "code_index_match_fraction_median": 0.9375, + "encoder_input_saturation_fraction_max": 0.0, + "encoder_input_saturation_fraction_p90": 0.0, + "frames_checked": 2048, + "latent_prd_percent_p90": 0.783271725276413, + "reconstruction_prd_percent_max": 5.490851579379616, + "reconstruction_prd_percent_p90": 1.7842740509240795 + } + }, + "provenance": { + "release_version": "1.1.0", + "hf_repo_id": "Ambiq/compressionkit-ppg-8x-v1.1", + "source_commit": "7a5443834ec50e41f41d4ff2b1c2f27e73b1acf7", + "toolkit_version": "0.2.0", + "release_kind": "corrected_export_without_retraining", + "replaces": { + "repo_id": "Ambiq/compressionkit-ppg-8x-v1.0", + "revision": "7e2b0cea808d1b1f168c4131ea5c00ffe50e9cce" + }, + "checkpoint_sha256": { + "encoder.keras": "ed422141fbd84bb62d9a769a3724eabe91dcf96835e6fac21ad599b510f55e38", + "decoder.keras": "e5ff41a311660919f6b1a91c1ae7405fb330042e073f12bd9692918d07464e13", + "rvq_weights.npz": "114ed973446fcf88a4b4364caea768c741c8365d43bcca0a3f2e0c1d0df921a2", + "config.json": "04ca414d2b1bddb6f99e5b2d8468de00c0dc0bcea02b99b98bfba45553d007b7", + "quality_scorecard.json": "f3a03e774b8e50c365258c57f1a181ab92b81c958150e907c0222f1e2dd0dfb2" + }, + "saved_config_dataset_sources": [ + "bidmc", + "butppg", + "ppg_dalia", + "wesad" + ], + "pretraining_ancestry": "not independently audited during export repair", + "sample_source": "synthetic physiokit, seed 42; no real calibration frames exported", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "precision_report_status": "recomputed against corrected codebooks on content-disjoint real holdout", + "packet_compatibility": "corrected RVQ level counts; bind packets to exact repository and revision", + "entropy_prior_status": "not included or requalified" + } + } + ] +} \ No newline at end of file diff --git a/scripts/publish_to_huggingface.py b/scripts/publish_to_huggingface.py index 753794f..26a0555 100644 --- a/scripts/publish_to_huggingface.py +++ b/scripts/publish_to_huggingface.py @@ -5,18 +5,18 @@ # Publish from a golden deploy directory python scripts/publish_to_huggingface.py \\ --deploy-dir results/ppg_rvq_64hz_04x_golden/deploy \\ - --repo-id Ambiq/compressionkit-ppg-4x-v1.0 + --repo-id Ambiq/compressionkit-ppg-4x-v1.1 # With a quality scorecard python scripts/publish_to_huggingface.py \\ --deploy-dir results/ppg_rvq_64hz_04x_golden/deploy \\ - --repo-id Ambiq/compressionkit-ppg-4x-v1.0 \\ + --repo-id Ambiq/compressionkit-ppg-4x-v1.1 \\ --scorecard results/ppg_rvq_64hz_04x_golden/quality_scorecard.json # Dry run (generate model card only, don't upload) python scripts/publish_to_huggingface.py \\ --deploy-dir results/ppg_rvq_64hz_04x_golden/deploy \\ - --repo-id Ambiq/compressionkit-ppg-4x-v1.0 \\ + --repo-id Ambiq/compressionkit-ppg-4x-v1.1 \\ --dry-run Requires ``HF_TOKEN`` environment variable or ``huggingface-cli login``. @@ -35,6 +35,7 @@ from compressionkit.export.artifact_contract import ArtifactFile from compressionkit.export.family_registry import CodecFamilySpec, get_family_spec from compressionkit.export.quantization import require_rvq_encoder_quantization_report +from compressionkit.export.release import write_checksums logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") logger = logging.getLogger(__name__) @@ -59,7 +60,10 @@ def _stage_deploy_files( so RVQ/SPIHT/hybrid share one staging path instead of three independently maintained copies. """ - staged: list[str] = [] + # Preserve the self-validating canonical package, including independent + # references and provenance files. HF aliases supplement that contract. + shutil.copytree(deploy_dir, staging_dir, dirs_exist_ok=True) + staged = [p.relative_to(staging_dir).as_posix() for p in sorted(staging_dir.rglob("*")) if p.is_file()] for src_name, dst_name in spec.hf_file_renames: src = deploy_dir / src_name @@ -113,7 +117,7 @@ def publish( Args: deploy_dir: Path to deployment directory with ``deploy_manifest.json``. - repo_id: HuggingFace repo ID (e.g. ``Ambiq/compressionkit-ppg-4x-v1.0``). + repo_id: HuggingFace repo ID (e.g. ``Ambiq/compressionkit-ppg-4x-v1.1``). scorecard_path: Optional path to ``quality_scorecard.json``. license_id: SPDX license ID for the model card. private: Whether to create a private repo. @@ -176,6 +180,10 @@ def publish( readme_path.write_text(card_text) staged.append("README.md") logger.info("Generated README.md model card (%d chars)", len(card_text)) + # The model card and legacy aliases differ from the local package. + # Hash the actual uploaded files after all staging changes. + write_checksums(staging_dir) + staged = sorted({*staged, str(ArtifactFile.CHECKSUMS)}) except Exception: shutil.rmtree(staging_dir, ignore_errors=True) raise @@ -228,7 +236,7 @@ def main() -> None: "--repo-id", type=str, required=True, - help="HuggingFace repo ID (e.g. Ambiq/compressionkit-ppg-4x-v1.0).", + help="HuggingFace repo ID (e.g. Ambiq/compressionkit-ppg-4x-v1.1).", ) parser.add_argument( "--scorecard", diff --git a/tests/test_huggingface.py b/tests/test_huggingface.py index 24cfd51..9bfbcf4 100644 --- a/tests/test_huggingface.py +++ b/tests/test_huggingface.py @@ -172,6 +172,28 @@ def test_card_custom_license(self, mock_deploy): card = generate_model_card(mock_deploy, license_id="mit") assert "license: mit" in card + def test_corrected_export_labels_historical_scorecard(self, mock_deploy, mock_scorecard): + from compressionkit.export.model_card import generate_model_card + + (mock_deploy / "model_card.json").write_text( + json.dumps( + { + "release_provenance": { + "release_kind": "corrected_export_without_retraining", + "source_commit": "source-sha", + "physiological_scorecard_status": "historical; not reevaluated for this release", + "packet_compatibility": "bind packets to exact repository and revision", + "pretraining_ancestry": "not independently audited", + } + } + ) + ) + card = generate_model_card(mock_deploy, scorecard_path=mock_scorecard) + assert "historical; not reevaluated" in card + assert "bind packets to exact repository and revision" in card + assert "source-sha" in card + assert "release_provenance.json" in card + # ── Publish staging ──────────────────────────────────────────────── @@ -185,6 +207,10 @@ def test_dry_run_stages_files(self, mock_deploy, mock_scorecard): (mock_deploy / "encoder_float32.tflite").write_bytes(b"\x00" * 100) (mock_deploy / "codebook.npz").write_bytes(b"\x00" * 50) (mock_deploy / "encoder.h").write_text("// header") + (mock_deploy / "reference_vectors.npz").write_bytes(b"independent training references") + (mock_deploy / "scorecard.json").write_text('{"historical": true}') + (mock_deploy / "release_provenance.json").write_text('{"source_commit": "test"}') + (mock_deploy / "checksums.json").write_text("{}") from scripts.publish_to_huggingface import publish @@ -206,6 +232,21 @@ def test_dry_run_stages_files(self, mock_deploy, mock_scorecard): assert (staging_dir / "quality_scorecard.json").exists() assert (staging_dir / "quantization_report.json").exists() assert (staging_dir / "README.md").exists() + for name in ( + "deploy_manifest.json", + "encoder.tflite", + "reference_vectors.npz", + "scorecard.json", + "release_provenance.json", + ): + assert (staging_dir / name).read_bytes() == (mock_deploy / name).read_bytes() + from compressionkit.export.release import sha256_file + + checksums = json.loads((staging_dir / "checksums.json").read_text()) + assert set(checksums) == {p.name for p in staging_dir.iterdir() if p.name != "checksums.json"} + for name, entry in checksums.items(): + assert entry["sha256"] == sha256_file(staging_dir / name) + assert entry["bytes"] == (staging_dir / name).stat().st_size # README should be a proper model card readme = (staging_dir / "README.md").read_text() diff --git a/tests/test_rvq_repackage_samples.py b/tests/test_rvq_repackage_samples.py index 1e54d5e..eb6eacd 100644 --- a/tests/test_rvq_repackage_samples.py +++ b/tests/test_rvq_repackage_samples.py @@ -55,11 +55,18 @@ def export(**kw): monkeypatch.setattr(deploy, "export_for_deployment", export) experiment = SimpleNamespace( - method="rvq", experiment_id="test", run_name="test", modality="ppg", sample_rate=64, compression_ratio=8 + method="rvq", + experiment_id="test", + run_name="test", + modality="ppg", + sample_rate=64, + compression_ratio=8, + hf_version="v1.1", ) repackage.repackage_rvq_golden(experiment, run_dir=tmp_path, num_stimulus=2) assert calls[0]["rep_dataset"] is calibration assert calls[0]["quantization_validation_dataset"] is holdout + assert calls[0]["model_version"] == "1.1" samples = calls[0]["sample_inputs"] assert samples.shape == (2, 1, 16, 1) assert np.allclose(samples.mean(axis=(1, 2, 3)), 0, atol=1e-6) @@ -67,6 +74,8 @@ def export(**kw): staging = tmp_path / "staging" staging.mkdir() _stage_deploy_files(get_family_spec("rvq"), tmp_path / "deploy", staging, None) - with np.load(staging / "sample_stimulus.npz") as published: + with np.load(staging / "sample_data.npz") as published: np.testing.assert_array_equal(published["inputs"], samples) assert not np.any(np.isin(published["inputs"], [123.0, 124.0])) + with np.load(staging / "sample_stimulus.npz") as published: + assert not np.any(np.isin(published["stimulus"], [123.0, 124.0])) diff --git a/tests/test_rvq_repackage_weights.py b/tests/test_rvq_repackage_weights.py index d421ca5..32eda5a 100644 --- a/tests/test_rvq_repackage_weights.py +++ b/tests/test_rvq_repackage_weights.py @@ -72,7 +72,13 @@ def export(**kwargs): monkeypatch.setattr(deploy, "export_for_deployment", export) experiment = SimpleNamespace( - method="rvq", experiment_id="test", run_name="test", modality="ecg", sample_rate=256, compression_ratio=8 + method="rvq", + experiment_id="test", + run_name="test", + modality="ecg", + sample_rate=256, + compression_ratio=8, + hf_version="v1.1", ) if bad_config: with pytest.raises(ValueError, match=r"Expected .* RVQ weight arrays"): diff --git a/tests/test_two_stage_golden.py b/tests/test_two_stage_golden.py index 6416f33..ef1fa8c 100644 --- a/tests/test_two_stage_golden.py +++ b/tests/test_two_stage_golden.py @@ -29,8 +29,11 @@ def test_two_stage_entry_invariants(exp) -> None: assert parent.structure == "codec" assert parent.modality == exp.modality assert parent.compression_ratio == exp.compression_ratio - # Bundled HF repo: same as parent codec. - assert exp.hf_repo_id == parent.hf_repo_id + # Priors remain historical until separately requalified. A single-stage + # export repair must not promote an untested prior. + assert exp.hf_version == "v1.0" + assert parent.hf_version == "v1.1" + assert exp.hf_repo_id == parent.hf_repo_id.replace("-v1.1", "-v1.0") # Bundled run dir: same as parent codec. assert exp.run_name == parent.run_name # Recipe is registered. @@ -63,3 +66,10 @@ def test_prior_config_resolve_parent_run_dir_default(tmp_path: Path) -> None: assert cfg.parent_run_dir is None cfg2 = cfg.model_copy(update={"parent_run_dir": tmp_path / "ecg_rvq_256hz_04x_golden"}) assert cfg2.parent_run_dir.name == "ecg_rvq_256hz_04x_golden" + + +def test_unqualified_historical_prior_cannot_be_published(tmp_path: Path) -> None: + from compressionkit.experiments.runner import _publish + + with pytest.raises(ValueError, match="Requalify the entropy prior"): + _publish(get_golden("ecg-rvq-4x-prior"), tmp_path, dry_run=True) From 3ded48efb0e359e609015bd4ea5b6329ccf78e5f Mon Sep 17 00:00:00 2001 From: Adam Page Date: Tue, 6 Oct 2026 07:16:32 -0500 Subject: [PATCH 2/4] docs: pin the published RVQ inventory evidence --- astro-site/src/content/docs/rvq-v11-release.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astro-site/src/content/docs/rvq-v11-release.md b/astro-site/src/content/docs/rvq-v11-release.md index 316d354..8ee4e01 100644 --- a/astro-site/src/content/docs/rvq-v11-release.md +++ b/astro-site/src/content/docs/rvq-v11-release.md @@ -7,7 +7,7 @@ The 2026-10-06 v1.1 release corrects the deployment exports of eleven existing RVQ checkpoints. It removes EMA embedding-sum accumulators that were incorrectly exported as extra codebooks. No models were retrained. -The [release inventory](https://github.com/AmbiqAI/compressionkit/blob/issue-66-corrected-rvq-releases/releases/rvq-v1.1.json) +The [release inventory](https://github.com/AmbiqAI/compressionkit/blob/9a3b07806a76de718a0dfa7105a23097853e2fac/releases/rvq-v1.1.json) records every published repository, immutable revision, checksum-manifest hash, checkpoint provenance, precision report and complete packet size. From 2607a7b09cf5079142581add5fdc4e7833a28bef Mon Sep 17 00:00:00 2001 From: Adam Page Date: Tue, 6 Oct 2026 07:19:08 -0500 Subject: [PATCH 3/4] docs: acknowledge reviewed v1.1 registry facts in migration audit --- astro-site/migration-manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astro-site/migration-manifest.json b/astro-site/migration-manifest.json index faac247..3d3aa0e 100644 --- a/astro-site/migration-manifest.json +++ b/astro-site/migration-manifest.json @@ -953,7 +953,7 @@ } ], "watchedSources": { - "compressionkit/experiments/registry.py": "f5c1061d3ffbf395e7a59418e3c614f3a9e426a64543917f25cb193f03dd238f", + "compressionkit/experiments/registry.py": "352da197f1885fbf6c576e43a1ec0293d076b976639e8763f89f5adcaffc48bf", "scripts/build_customer_evidence_summary.py": "0b851664c750874d46ad0a4b8ddcda926f4bdd141fbc63d416bbe5e592d505e2", "scripts/build_cr_vs_fidelity.py": "191ad45d6e7a74a1380b7810a7a4fb0fff954a7487df88979e1588d5532d0bad", "configs/ecg_rvq_256hz_02x_golden.yaml": "1df9d1fec0bf94f754eb7dcf963c6244224381d5c77cf677c9f43f53ed76ccf0", From bc60ced55365c8617c07717819b33c7bb38c1d2a Mon Sep 17 00:00:00 2001 From: Adam Page Date: Tue, 6 Oct 2026 07:20:03 -0500 Subject: [PATCH 4/4] docs: align experiment links and prior status with corrected release --- .../src/content/docs/experiments/ecg-rvq-16x.mdx | 5 ++++- .../src/content/docs/experiments/ecg-rvq-2x.mdx | 5 ++++- .../src/content/docs/experiments/ecg-rvq-32x.mdx | 5 ++++- .../src/content/docs/experiments/ecg-rvq-4x-prior.mdx | 9 ++++++--- .../src/content/docs/experiments/ecg-rvq-4x.mdx | 5 ++++- .../src/content/docs/experiments/ecg-rvq-64x.mdx | 5 ++++- .../src/content/docs/experiments/ecg-rvq-8x-prior.mdx | 9 ++++++--- .../src/content/docs/experiments/ecg-rvq-8x.mdx | 5 ++++- .../src/content/docs/experiments/ppg-rvq-16x.mdx | 7 +++++-- .../src/content/docs/experiments/ppg-rvq-2x.mdx | 7 +++++-- .../src/content/docs/experiments/ppg-rvq-32x.mdx | 7 +++++-- .../src/content/docs/experiments/ppg-rvq-4x-prior.mdx | 11 +++++++---- .../src/content/docs/experiments/ppg-rvq-4x.mdx | 7 +++++-- .../src/content/docs/experiments/ppg-rvq-8x-prior.mdx | 11 +++++++---- .../src/content/docs/experiments/ppg-rvq-8x.mdx | 7 +++++-- 15 files changed, 75 insertions(+), 30 deletions(-) diff --git a/astro-site/src/content/docs/experiments/ecg-rvq-16x.mdx b/astro-site/src/content/docs/experiments/ecg-rvq-16x.mdx index be8268d..fc9f5b7 100644 --- a/astro-site/src/content/docs/experiments/ecg-rvq-16x.mdx +++ b/astro-site/src/content/docs/experiments/ecg-rvq-16x.mdx @@ -10,6 +10,9 @@ Reproduce the `ecg-rvq-16x` configuration. Prepare its dataset before running th ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -50,7 +53,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. ## Customization Notes diff --git a/astro-site/src/content/docs/experiments/ecg-rvq-2x.mdx b/astro-site/src/content/docs/experiments/ecg-rvq-2x.mdx index cca265f..3eb6090 100644 --- a/astro-site/src/content/docs/experiments/ecg-rvq-2x.mdx +++ b/astro-site/src/content/docs/experiments/ecg-rvq-2x.mdx @@ -10,6 +10,9 @@ Reproduce the `ecg-rvq-2x` configuration. Prepare its dataset before running the ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -50,7 +53,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. ## Customization Notes diff --git a/astro-site/src/content/docs/experiments/ecg-rvq-32x.mdx b/astro-site/src/content/docs/experiments/ecg-rvq-32x.mdx index 1f1dfca..7d2bb9c 100644 --- a/astro-site/src/content/docs/experiments/ecg-rvq-32x.mdx +++ b/astro-site/src/content/docs/experiments/ecg-rvq-32x.mdx @@ -10,6 +10,9 @@ Reproduce the `ecg-rvq-32x` configuration. Prepare its dataset before running th ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -50,7 +53,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. ## Customization Notes diff --git a/astro-site/src/content/docs/experiments/ecg-rvq-4x-prior.mdx b/astro-site/src/content/docs/experiments/ecg-rvq-4x-prior.mdx index 0f37c06..8600030 100644 --- a/astro-site/src/content/docs/experiments/ecg-rvq-4x-prior.mdx +++ b/astro-site/src/content/docs/experiments/ecg-rvq-4x-prior.mdx @@ -35,8 +35,11 @@ Results land under `results/ecg_rvq_256hz_04x_golden/`; deploy artifacts under ` ## Parent codec +The parent codec now uses corrected v1.1 exports. This prior remains on its +historical v1.0 track and has not been requalified for that release. + This entry is the entropy-prior stage paired with [`ecg-rvq-4x`](/compressionkit/experiments/ecg-rvq-4x/). -Codec and prior artifacts publish to the same HuggingFace repo +The historical codec and prior artifacts use the v1.0 HuggingFace repo ([`Ambiq/compressionkit-ecg-4x-v1.0`](https://huggingface.co/Ambiq/compressionkit-ecg-4x-v1.0)). ## Evaluation Metrics @@ -56,7 +59,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. - `prior_int8.tflite` / `prior_int8.h` / `prior_manifest.json` — entropy prior (two-stage only). @@ -64,4 +67,4 @@ The deploy package contains the following artifacts, depending on the export con - Tweak the YAML to explore neighbouring operating points; copy the file before editing. - For new recipes, prefer the `compressionkit/recipes/` package recipes as a starting point. -- To resume publishing without retraining, pass `--skip-train` to `compressionkit golden run ecg-rvq-4x-prior --publish`. +- Publication is blocked until the prior is requalified against its parent's corrected v1.1 release. diff --git a/astro-site/src/content/docs/experiments/ecg-rvq-4x.mdx b/astro-site/src/content/docs/experiments/ecg-rvq-4x.mdx index 0bcd12b..50dde01 100644 --- a/astro-site/src/content/docs/experiments/ecg-rvq-4x.mdx +++ b/astro-site/src/content/docs/experiments/ecg-rvq-4x.mdx @@ -10,6 +10,9 @@ Reproduce the `ecg-rvq-4x` configuration. Prepare its dataset before running the ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -55,7 +58,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. - `prior_int8.tflite` / `prior_int8.h` / `prior_manifest.json` — entropy prior (two-stage only). diff --git a/astro-site/src/content/docs/experiments/ecg-rvq-64x.mdx b/astro-site/src/content/docs/experiments/ecg-rvq-64x.mdx index 1cacadb..176cfd8 100644 --- a/astro-site/src/content/docs/experiments/ecg-rvq-64x.mdx +++ b/astro-site/src/content/docs/experiments/ecg-rvq-64x.mdx @@ -10,6 +10,9 @@ Reproduce the `ecg-rvq-64x` configuration. Prepare its dataset before running th ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -50,7 +53,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. ## Customization Notes diff --git a/astro-site/src/content/docs/experiments/ecg-rvq-8x-prior.mdx b/astro-site/src/content/docs/experiments/ecg-rvq-8x-prior.mdx index 67059e4..0c95601 100644 --- a/astro-site/src/content/docs/experiments/ecg-rvq-8x-prior.mdx +++ b/astro-site/src/content/docs/experiments/ecg-rvq-8x-prior.mdx @@ -35,8 +35,11 @@ Results land under `results/ecg_rvq_256hz_08x_golden/`; deploy artifacts under ` ## Parent codec +The parent codec now uses corrected v1.1 exports. This prior remains on its +historical v1.0 track and has not been requalified for that release. + This entry is the entropy-prior stage paired with [`ecg-rvq-8x`](/compressionkit/experiments/ecg-rvq-8x/). -Codec and prior artifacts publish to the same HuggingFace repo +The historical codec and prior artifacts use the v1.0 HuggingFace repo ([`Ambiq/compressionkit-ecg-8x-v1.0`](https://huggingface.co/Ambiq/compressionkit-ecg-8x-v1.0)). ## Evaluation Metrics @@ -56,7 +59,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. - `prior_int8.tflite` / `prior_int8.h` / `prior_manifest.json` — entropy prior (two-stage only). @@ -64,4 +67,4 @@ The deploy package contains the following artifacts, depending on the export con - Tweak the YAML to explore neighbouring operating points; copy the file before editing. - For new recipes, prefer the `compressionkit/recipes/` package recipes as a starting point. -- To resume publishing without retraining, pass `--skip-train` to `compressionkit golden run ecg-rvq-8x-prior --publish`. +- Publication is blocked until the prior is requalified against its parent's corrected v1.1 release. diff --git a/astro-site/src/content/docs/experiments/ecg-rvq-8x.mdx b/astro-site/src/content/docs/experiments/ecg-rvq-8x.mdx index 68d7e15..57f7f28 100644 --- a/astro-site/src/content/docs/experiments/ecg-rvq-8x.mdx +++ b/astro-site/src/content/docs/experiments/ecg-rvq-8x.mdx @@ -10,6 +10,9 @@ Reproduce the `ecg-rvq-8x` configuration. Prepare its dataset before running the ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -55,7 +58,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. - `prior_int8.tflite` / `prior_int8.h` / `prior_manifest.json` — entropy prior (two-stage only). diff --git a/astro-site/src/content/docs/experiments/ppg-rvq-16x.mdx b/astro-site/src/content/docs/experiments/ppg-rvq-16x.mdx index c35d9c6..964d077 100644 --- a/astro-site/src/content/docs/experiments/ppg-rvq-16x.mdx +++ b/astro-site/src/content/docs/experiments/ppg-rvq-16x.mdx @@ -10,6 +10,9 @@ Reproduce the `ppg-rvq-16x` configuration. Prepare its dataset before running th ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -18,7 +21,7 @@ Reproduce the `ppg-rvq-16x` configuration. Prepare its dataset before running th - **Dataset**: [Open unified PPG v1](/compressionkit/datasets/) (`dataset_id: ppg-unified-strict-sanitize-v1`) - **License**: Open (BIDMC, BUT PPG, PPG-DaLiA, WESAD — mixed open licenses, no restricted-access dependency) -- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. Published v1 PPG goldens are MESA-free. Build the cache with `scripts/build_ppg_cache.py`. +- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. The saved training configuration uses these open sources; complete pretraining ancestry was not independently audited in the export repair. Build the cache with `scripts/build_ppg_cache.py`. The lifecycle runner pre-flights dataset availability before training (see the [dataset contract](/compressionkit/api/datasets/)). @@ -50,7 +53,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. ## Customization Notes diff --git a/astro-site/src/content/docs/experiments/ppg-rvq-2x.mdx b/astro-site/src/content/docs/experiments/ppg-rvq-2x.mdx index 44e1487..b130eb4 100644 --- a/astro-site/src/content/docs/experiments/ppg-rvq-2x.mdx +++ b/astro-site/src/content/docs/experiments/ppg-rvq-2x.mdx @@ -10,6 +10,9 @@ Reproduce the `ppg-rvq-2x` configuration. Prepare its dataset before running the ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -18,7 +21,7 @@ Reproduce the `ppg-rvq-2x` configuration. Prepare its dataset before running the - **Dataset**: [Open unified PPG v1](/compressionkit/datasets/) (`dataset_id: ppg-unified-strict-sanitize-v1`) - **License**: Open (BIDMC, BUT PPG, PPG-DaLiA, WESAD — mixed open licenses, no restricted-access dependency) -- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. Published v1 PPG goldens are MESA-free. Build the cache with `scripts/build_ppg_cache.py`. +- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. The saved training configuration uses these open sources; complete pretraining ancestry was not independently audited in the export repair. Build the cache with `scripts/build_ppg_cache.py`. The lifecycle runner pre-flights dataset availability before training (see the [dataset contract](/compressionkit/api/datasets/)). @@ -50,7 +53,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. ## Customization Notes diff --git a/astro-site/src/content/docs/experiments/ppg-rvq-32x.mdx b/astro-site/src/content/docs/experiments/ppg-rvq-32x.mdx index 5667f9a..d9e4885 100644 --- a/astro-site/src/content/docs/experiments/ppg-rvq-32x.mdx +++ b/astro-site/src/content/docs/experiments/ppg-rvq-32x.mdx @@ -10,6 +10,9 @@ Reproduce the `ppg-rvq-32x` configuration. Prepare its dataset before running th ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -18,7 +21,7 @@ Reproduce the `ppg-rvq-32x` configuration. Prepare its dataset before running th - **Dataset**: [Open unified PPG v1](/compressionkit/datasets/) (`dataset_id: ppg-unified-strict-sanitize-v1`) - **License**: Open (BIDMC, BUT PPG, PPG-DaLiA, WESAD — mixed open licenses, no restricted-access dependency) -- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. Published v1 PPG goldens are MESA-free. Build the cache with `scripts/build_ppg_cache.py`. +- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. The saved training configuration uses these open sources; complete pretraining ancestry was not independently audited in the export repair. Build the cache with `scripts/build_ppg_cache.py`. The lifecycle runner pre-flights dataset availability before training (see the [dataset contract](/compressionkit/api/datasets/)). @@ -50,7 +53,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. ## Customization Notes diff --git a/astro-site/src/content/docs/experiments/ppg-rvq-4x-prior.mdx b/astro-site/src/content/docs/experiments/ppg-rvq-4x-prior.mdx index e59c5ec..8403630 100644 --- a/astro-site/src/content/docs/experiments/ppg-rvq-4x-prior.mdx +++ b/astro-site/src/content/docs/experiments/ppg-rvq-4x-prior.mdx @@ -18,7 +18,7 @@ Reproduce the `ppg-rvq-4x-prior` configuration. Prepare its dataset before runni - **Dataset**: [Open unified PPG v1](/compressionkit/datasets/) (`dataset_id: ppg-unified-strict-sanitize-v1`) - **License**: Open (BIDMC, BUT PPG, PPG-DaLiA, WESAD — mixed open licenses, no restricted-access dependency) -- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. Published v1 PPG goldens are MESA-free. Build the cache with `scripts/build_ppg_cache.py`. +- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. The saved training configuration uses these open sources; complete pretraining ancestry was not independently audited in the export repair. Build the cache with `scripts/build_ppg_cache.py`. The lifecycle runner pre-flights dataset availability before training (see the [dataset contract](/compressionkit/api/datasets/)). @@ -35,8 +35,11 @@ Results land under `results/ppg_rvq_64hz_04x_golden/`; deploy artifacts under `r ## Parent codec +The parent codec now uses corrected v1.1 exports. This prior remains on its +historical v1.0 track and has not been requalified for that release. + This entry is the entropy-prior stage paired with [`ppg-rvq-4x`](/compressionkit/experiments/ppg-rvq-4x/). -Codec and prior artifacts publish to the same HuggingFace repo +The historical codec and prior artifacts use the v1.0 HuggingFace repo ([`Ambiq/compressionkit-ppg-4x-v1.0`](https://huggingface.co/Ambiq/compressionkit-ppg-4x-v1.0)). ## Evaluation Metrics @@ -56,7 +59,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. - `prior_int8.tflite` / `prior_int8.h` / `prior_manifest.json` — entropy prior (two-stage only). @@ -64,4 +67,4 @@ The deploy package contains the following artifacts, depending on the export con - Tweak the YAML to explore neighbouring operating points; copy the file before editing. - For new recipes, prefer the `compressionkit/recipes/` package recipes as a starting point. -- To resume publishing without retraining, pass `--skip-train` to `compressionkit golden run ppg-rvq-4x-prior --publish`. +- Publication is blocked until the prior is requalified against its parent's corrected v1.1 release. diff --git a/astro-site/src/content/docs/experiments/ppg-rvq-4x.mdx b/astro-site/src/content/docs/experiments/ppg-rvq-4x.mdx index b9f50df..d715ddf 100644 --- a/astro-site/src/content/docs/experiments/ppg-rvq-4x.mdx +++ b/astro-site/src/content/docs/experiments/ppg-rvq-4x.mdx @@ -10,6 +10,9 @@ Reproduce the `ppg-rvq-4x` configuration. Prepare its dataset before running the ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -18,7 +21,7 @@ Reproduce the `ppg-rvq-4x` configuration. Prepare its dataset before running the - **Dataset**: [Open unified PPG v1](/compressionkit/datasets/) (`dataset_id: ppg-unified-strict-sanitize-v1`) - **License**: Open (BIDMC, BUT PPG, PPG-DaLiA, WESAD — mixed open licenses, no restricted-access dependency) -- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. Published v1 PPG goldens are MESA-free. Build the cache with `scripts/build_ppg_cache.py`. +- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. The saved training configuration uses these open sources; complete pretraining ancestry was not independently audited in the export repair. Build the cache with `scripts/build_ppg_cache.py`. The lifecycle runner pre-flights dataset availability before training (see the [dataset contract](/compressionkit/api/datasets/)). @@ -55,7 +58,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. - `prior_int8.tflite` / `prior_int8.h` / `prior_manifest.json` — entropy prior (two-stage only). diff --git a/astro-site/src/content/docs/experiments/ppg-rvq-8x-prior.mdx b/astro-site/src/content/docs/experiments/ppg-rvq-8x-prior.mdx index 5b42b49..4ec7881 100644 --- a/astro-site/src/content/docs/experiments/ppg-rvq-8x-prior.mdx +++ b/astro-site/src/content/docs/experiments/ppg-rvq-8x-prior.mdx @@ -18,7 +18,7 @@ Reproduce the `ppg-rvq-8x-prior` configuration. Prepare its dataset before runni - **Dataset**: [Open unified PPG v1](/compressionkit/datasets/) (`dataset_id: ppg-unified-strict-sanitize-v1`) - **License**: Open (BIDMC, BUT PPG, PPG-DaLiA, WESAD — mixed open licenses, no restricted-access dependency) -- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. Published v1 PPG goldens are MESA-free. Build the cache with `scripts/build_ppg_cache.py`. +- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. The saved training configuration uses these open sources; complete pretraining ancestry was not independently audited in the export repair. Build the cache with `scripts/build_ppg_cache.py`. The lifecycle runner pre-flights dataset availability before training (see the [dataset contract](/compressionkit/api/datasets/)). @@ -35,8 +35,11 @@ Results land under `results/ppg_rvq_64hz_08x_golden/`; deploy artifacts under `r ## Parent codec +The parent codec now uses corrected v1.1 exports. This prior remains on its +historical v1.0 track and has not been requalified for that release. + This entry is the entropy-prior stage paired with [`ppg-rvq-8x`](/compressionkit/experiments/ppg-rvq-8x/). -Codec and prior artifacts publish to the same HuggingFace repo +The historical codec and prior artifacts use the v1.0 HuggingFace repo ([`Ambiq/compressionkit-ppg-8x-v1.0`](https://huggingface.co/Ambiq/compressionkit-ppg-8x-v1.0)). ## Evaluation Metrics @@ -56,7 +59,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. - `prior_int8.tflite` / `prior_int8.h` / `prior_manifest.json` — entropy prior (two-stage only). @@ -64,4 +67,4 @@ The deploy package contains the following artifacts, depending on the export con - Tweak the YAML to explore neighbouring operating points; copy the file before editing. - For new recipes, prefer the `compressionkit/recipes/` package recipes as a starting point. -- To resume publishing without retraining, pass `--skip-train` to `compressionkit golden run ppg-rvq-8x-prior --publish`. +- Publication is blocked until the prior is requalified against its parent's corrected v1.1 release. diff --git a/astro-site/src/content/docs/experiments/ppg-rvq-8x.mdx b/astro-site/src/content/docs/experiments/ppg-rvq-8x.mdx index 3933531..c5fdd89 100644 --- a/astro-site/src/content/docs/experiments/ppg-rvq-8x.mdx +++ b/astro-site/src/content/docs/experiments/ppg-rvq-8x.mdx @@ -10,6 +10,9 @@ Reproduce the `ppg-rvq-8x` configuration. Prepare its dataset before running the ## Overview +The v1.1 bundle corrects the export of the existing checkpoint without retraining. +Its physiological scorecard remains historical; see [release validation](/compressionkit/rvq-v11-release/). + @@ -18,7 +21,7 @@ Reproduce the `ppg-rvq-8x` configuration. Prepare its dataset before running the - **Dataset**: [Open unified PPG v1](/compressionkit/datasets/) (`dataset_id: ppg-unified-strict-sanitize-v1`) - **License**: Open (BIDMC, BUT PPG, PPG-DaLiA, WESAD — mixed open licenses, no restricted-access dependency) -- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. Published v1 PPG goldens are MESA-free. Build the cache with `scripts/build_ppg_cache.py`. +- **Notes**: Sources: BIDMC, BUT PPG, PPG-DaLiA, and WESAD. The saved training configuration uses these open sources; complete pretraining ancestry was not independently audited in the export repair. Build the cache with `scripts/build_ppg_cache.py`. The lifecycle runner pre-flights dataset availability before training (see the [dataset contract](/compressionkit/api/datasets/)). @@ -55,7 +58,7 @@ The deploy package contains the following artifacts, depending on the export con - `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8). - `decoder.keras` — float32 Python reference decoder. - `codebook.npz` / `codebook.h` — RVQ codebook tables. -- `sample_data.npz` — license-safe input/target/reconstruction reference frames (published to HuggingFace as `sample_stimulus.npz`). +- `sample_data.npz` — normalized synthetic inputs, targets and reconstructions; `sample_stimulus.npz` contains raw synthetic waveforms. - `model_card.json`, `deploy_manifest.json` — metadata. - `prior_int8.tflite` / `prior_int8.h` / `prior_manifest.json` — entropy prior (two-stage only).