Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions compressionkit/export/artifact_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class ArtifactFile(StrEnum):
DECODER_FLOAT32_TFLITE = "decoder_float32.tflite"
DECODER_HEADER = "decoder.h"
DECODER_INT8_HF_TFLITE = "decoder_int8.tflite"
DECODER_KERAS = "decoder.keras"
DECODER_TFLITE = "decoder.tflite"
DENOISER_GAIN_MODEL = "denoiser_gain_model.keras"
DENOISER_HEADER = "denoiser_gain_model.h"
Expand All @@ -30,6 +31,7 @@ class ArtifactFile(StrEnum):
DEPLOY_MANIFEST = "deploy_manifest.json"
ENCODER_HEADER = "encoder.h"
ENCODER_INT8_HF_TFLITE = "encoder_int8.tflite"
ENCODER_KERAS = "encoder.keras"
ENCODER_TFLITE = "encoder.tflite"
HF_CONFIG = "config.json"
HYBRID_MANIFEST = "hybrid_manifest.json"
Expand Down Expand Up @@ -60,10 +62,12 @@ class SampleArray(StrEnum):
RVQ_HF_FILE_RENAMES: tuple[tuple[ArtifactFile, ArtifactFile], ...] = (
(ArtifactFile.ENCODER_TFLITE, ArtifactFile.ENCODER_INT8_HF_TFLITE),
(ArtifactFile.ENCODER_HEADER, ArtifactFile.ENCODER_HEADER),
(ArtifactFile.ENCODER_KERAS, ArtifactFile.ENCODER_KERAS),
(ArtifactFile.DECODER_FLOAT32_TFLITE, ArtifactFile.DECODER_FLOAT32_TFLITE),
(ArtifactFile.DECODER_TFLITE, ArtifactFile.DECODER_INT8_HF_TFLITE),
(ArtifactFile.DECODER_INT8_HF_TFLITE, ArtifactFile.DECODER_INT8_HF_TFLITE),
(ArtifactFile.DECODER_HEADER, ArtifactFile.DECODER_HEADER),
(ArtifactFile.DECODER_KERAS, ArtifactFile.DECODER_KERAS),
(ArtifactFile.CODEBOOK_NPZ, ArtifactFile.CODEBOOK_NPZ),
(ArtifactFile.CODEBOOK_HEADER, ArtifactFile.CODEBOOK_HEADER),
(ArtifactFile.CODEC_SPEC, ArtifactFile.CODEC_SPEC),
Expand Down
11 changes: 11 additions & 0 deletions compressionkit/export/deploy.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class DeploymentArtifacts:
output_dir: Path
encoder_tflite: Path = field(default_factory=Path)
encoder_header: Path = field(default_factory=Path)
encoder_keras: Path = field(default_factory=Path)
decoder_keras: Path = field(default_factory=Path)
decoder_float32_tflite: Path = field(default_factory=Path)
decoder_int8_tflite: Path = field(default_factory=Path)
Expand Down Expand Up @@ -95,6 +96,7 @@ def _render_readme(
* `deploy_manifest.json` — top-level package manifest.
* `codec_spec.json` — canonical runtime hydration contract.
* `encoder.tflite`, `encoder.h` — edge encoder artifacts.
* `encoder.keras` — float32 Python reference encoder (training/inspection use).
* `codebook.npz`, `codebook.h` — RVQ codebook tables.
* `decoder.keras` and optional decoder TFLite files — reconstruction artifacts.
* `reference_vectors.npz` — known-good encode/decode vectors when sample inputs were exported.
Expand Down Expand Up @@ -210,6 +212,13 @@ def export_for_deployment(
artifacts.encoder_tflite = enc_tflite
artifacts.encoder_header = enc_header

# 1b. Encoder (.keras -- float32 reference alongside the quantized
# encoder.tflite used on-device; mirrors the decoder.keras reference below).
logger.info("Exporting encoder as .keras...")
encoder_keras_path = output_dir / "encoder.keras"
encoder.save(encoder_keras_path)
artifacts.encoder_keras = encoder_keras_path

# 2. Decoder (.keras — runs server-side, no quantization needed)
logger.info("Exporting decoder as .keras...")
decoder_keras_path = output_dir / "decoder.keras"
Expand Down Expand Up @@ -317,6 +326,7 @@ def export_for_deployment(
"encoder": {
"tflite": enc_tflite.name,
"header": enc_header.name,
"keras": encoder_keras_path.name,
"input_shape": list(encoder.input_shape),
"output_shape": list(encoder.output_shape),
},
Expand Down Expand Up @@ -390,6 +400,7 @@ def export_for_deployment(
"encoder": {
"tflite": enc_tflite.name,
"header": enc_header.name,
"keras": encoder_keras_path.name,
"input_shape": list(encoder.input_shape),
"output_shape": list(encoder.output_shape),
},
Expand Down
8 changes: 7 additions & 1 deletion compressionkit/export/family_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,13 @@ class CodecFamilySpec:
"rvq": CodecFamilySpec(
family="rvq",
loader=_load_rvq,
required_artifacts=("encoder.tflite", "codebook.npz", "codebook.h"),
required_artifacts=(
"encoder.tflite",
"encoder.keras",
"decoder.keras",
"codebook.npz",
"codebook.h",
),
release_extras=("model_card.json", "README.md", "scorecard.json", "reference_vectors.npz", "sample_data.npz"),
hf_file_renames=tuple(RVQ_HF_FILE_RENAMES),
has_c_sources=False,
Expand Down
2 changes: 2 additions & 0 deletions compressionkit/export/model_card.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,10 @@ def generate_model_card(
lines.append("|------|-------------|")
lines.append("| `encoder_int8.tflite` | INT8 quantized encoder (on-device) |")
lines.append("| `encoder.h` | C header for encoder |")
lines.append("| `encoder.keras` | Float32 Python reference encoder (training/inspection use) |")
lines.append("| `decoder_float32.tflite` | Float32 decoder (server-side evaluation) |")
lines.append("| `decoder_int8.tflite` | INT8 decoder (optional, on-device) |")
lines.append("| `decoder.keras` | Float32 Python reference decoder (training/inspection use) |")
lines.append("| `codebook.npz` | RVQ codebook tables |")
lines.append("| `codebook.h` | C header for codebook |")
lines.append("| `config.json` | Deployment manifest |")
Expand Down
1 change: 1 addition & 0 deletions docs/deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ For most users, the only runtime object you need is `compressionkit.runtime.RVQC
| `deploy_manifest.json` | Yes | Declares file names, tensor shapes, quantization mode, and codebook metadata. | Runtime metadata |
| `encoder.tflite` | Yes | INT8 LiteRT encoder used to produce continuous latents from input frames. | MCU / edge device |
| `encoder.h` | Yes | C header for the quantized encoder blob. | MCU firmware |
| `encoder.keras` | Yes | Reference encoder kept in Keras format. | Server / offline tools |
| `decoder.keras` | Yes | Reference decoder kept in Keras format. | Server / offline tools |
| `decoder_float32.tflite` | Optional, exported by default | Float32 LiteRT decoder for host-side reconstruction without Keras. | x86 / ARM Linux |
| `decoder.tflite` | Optional | INT8 LiteRT decoder for full on-device reconstruction. | MCU / edge device |
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ecg-rvq-16x.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ecg-rvq-2x.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ecg-rvq-32x.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ecg-rvq-4x-prior.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ecg-rvq-4x.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ecg-rvq-64x.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ecg-rvq-8x-prior.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ecg-rvq-8x.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ppg-rvq-16x.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ppg-rvq-2x.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ppg-rvq-32x.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ppg-rvq-4x-prior.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ppg-rvq-4x.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ppg-rvq-8x-prior.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
2 changes: 2 additions & 0 deletions docs/experiments/ppg-rvq-8x.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ Each run writes `quality_scorecard.json` and `summary.json` under its `results/<
Every successful run produces the canonical edge deploy package:

- `encoder.tflite` / `encoder.h` — INT8 encoder.
- `encoder.keras` — float32 Python reference encoder.
- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).
- `decoder.keras` — float32 Python reference decoder.
- `codebook.npz` / `codebook.h` — RVQ codebook tables.
- `sample_stimulus.npz` — license-safe input/output reference frames.
- `model_card.json`, `deploy_manifest.json` — metadata.
Expand Down
1 change: 1 addition & 0 deletions docs/models/ecg.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ results/ecg_rvq_256hz_08x_golden/
└── deploy/ # Deployment artifacts
├── encoder.tflite # INT8 quantized encoder
├── encoder.h # C header for encoder
├── encoder.keras # Keras encoder model
├── decoder.keras # Keras decoder model
├── decoder_float32.tflite # Float32 LiteRT decoder for host-side decode
├── decoder.tflite # Optional INT8 decoder for on-device decode
Expand Down
1 change: 1 addition & 0 deletions docs/models/ppg.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ results/ppg_rvq_64hz_08x_golden/
└── deploy/ # Deployment artifacts
├── encoder.tflite # INT8 quantized encoder
├── encoder.h # C header for encoder
├── encoder.keras # Keras encoder model
├── decoder.keras # Keras decoder model
├── decoder_float32.tflite # Float32 LiteRT decoder for host-side decode
├── decoder.tflite # Optional INT8 decoder for on-device decode
Expand Down
1 change: 1 addition & 0 deletions docs/release-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ AI packages may expose their demo frames as `sample_data.npz` when the file carr
|------|---------|
| `encoder.tflite` | Edge encoder |
| `encoder.h` | Embedded encoder header |
| `encoder.keras` | Host reference encode |
| `decoder.keras` or `decoder_float32.tflite` | Host reference decode |
| `decoder.tflite` and `decoder.h` | Optional on-device decode |
| `codebook.npz` | Python codebook tables |
Expand Down
2 changes: 2 additions & 0 deletions scripts/render_experiment_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,9 @@ def _render_experiment(exp: GoldenExperiment) -> str:
if exp.method == "rvq":
lines += [
"- `encoder.tflite` / `encoder.h` — INT8 encoder.",
"- `encoder.keras` — float32 Python reference encoder.",
"- `decoder.tflite` / `decoder.h` — decoder (float32 + optional INT8).",
"- `decoder.keras` — float32 Python reference decoder.",
"- `codebook.npz` / `codebook.h` — RVQ codebook tables.",
"- `sample_stimulus.npz` — license-safe input/output reference frames.",
"- `model_card.json`, `deploy_manifest.json` — metadata.",
Expand Down
4 changes: 4 additions & 0 deletions tests/test_deploy_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ def test_strict_rvq_contract_accepts_complete_file_set(tmp_path) -> None:
_write_minimal_manifest(tmp_path, family="rvq")
for rel in [
"encoder.tflite",
"encoder.keras",
"decoder.keras",
"codebook.npz",
"codebook.h",
"model_card.json",
Expand All @@ -74,6 +76,8 @@ def test_strict_rvq_contract_accepts_complete_file_set(tmp_path) -> None:
assert result.warnings == []
assert "scorecard.json" in result.checked_files
assert "sample_data.npz" in result.checked_files
assert "encoder.keras" in result.checked_files
assert "decoder.keras" in result.checked_files


def test_strict_spiht_contract_accepts_complete_file_set(tmp_path) -> None:
Expand Down
Loading