Lightweight InTerface for Lossy compression
A flexible Python framework for implementing, testing, and deploying lossy compression algorithms.
- 🔧 Simple Compressors Interface: Simple and universal interface for implementing and sharing compressors
- 📊 Built-in Evaluation: Comprehensive quality metrics with batteries included (MSE, PSNR, SSIM, L1)
- 💾 Standardized Storage Format: Custom
.litlfile format for any compressor with user-defined metadata - 🎯 Multiple Data Formats: Support for NumPy, PyTorch, and NetCDF
- 📈 Rich CLI: Beautiful command-line interface, in addition to rich Python API
pip install litlFor NetCDF support:
pip install litl[netcdf]litl compress <path_to_compressor.py:CompressorClassName> <data_to_compress.npy> <config.json> <output.litl>litl decompress <output.litl> <decompressed.npy>litl evaluate <path_to_compressor.py:CompressorClassName> <data_to_compress.npy> <config.json>litl info <output.litl>import litl
compressed_blob, meta, metrics = litl.compress(
compressor_name="path/to/compressor.py:ClassName",
original_data_path="data/hurricane.npy",
litl_file_path="path/to/compressed.litl"
)
print(f"Compressed data saved to {compressed_path}")
print(f"Metadata: {meta}")
print(f"Metrics: {metrics}")
litl.DotLitl.save(
litl_file_path="path/to/compressed.litl",
blob=compressed_blob,
compressor_name="path/to/compressor.py:ClassName",
meta=meta
)import litl
decompressed_data = litl.decompress(
litl_file_path="path/to/compressed.litl",
decompressed_path="data/decompressed.npy"
)
print(f"Decompressed data saved to {decompressed_path}")
data_numpy = decompressed_data.numpy()Implement the Compressor interface:
from litl.compressors import Compressor, CompressorAbout
from litl.datawrapper import DataWrapper
from litl.blobs import ArrayBlob, Blob
import pydantic
class MyCompressor(Compressor):
@classmethod
def about(cls) -> CompressorAbout:
return CompressorAbout(
name="MyCompressor",
description="A simple lossy compressor",
version="1.0.0",
author="Your Name"
)
@classmethod
def blob_class(cls):
# Specify the blob class used for compressed data. This type will be passed into your decompressed function
return ArrayBlob
@classmethod
def compress(cls, data: DataWrapper, config: dict) -> tuple[Blob, dict]:
# Your compression logic here
# Return a blob containing compressed data.
# Built-ins are:
# - ArrayBlob for NumPy and PyTorch arrays
# - ModelBlob for PyTorch models
# - ByteBlob for byte arrays
# If none of these work - extend the Blob class and implement a custom blob
meta = {} # Metadata required to reconstruct the data, can be any serializable dictionary
return ArrayBlob(compressed_array), meta
@classmethod
def decompress(cls, blob: ArrayBlob, meta: dict) -> DataWrapper:
# Your decompression logic here
# Return Reconstructed data wrapped in DataWrapper
return DataWrapper(decompressed)The DataWrapper class supports multiple formats for loading and saving data:
- NumPy:
.npy,.npfiles - PyTorch:
.ptfiles - NetCDF:
.ncfiles (requiresnetCDF4)
from litl import DataWrapper
# Load data
data = DataWrapper.from_file("data.npy")
# Save data
data.save_to_file("output.nc")
# Access underlying arrays
numpy_array = data.numpy()
torch_tensor = data.tensor()Choose the appropriate blob type for your compressed data:
The Evaluator provides standard compression metrics:
Quality Metrics:
- Mean Squared Error (MSE)
- Peak Signal-to-Noise Ratio (PSNR)
- Structural Similarity Index (SSIM)
- L1 Loss
Size Metrics:
- Original size
- Compressed size
- Compression ratio
The .litl format (DotLitl) stores:
- Compressed data with Zstandard compression
- Compressor metadata and version
- Integrity checksums
- Configuration parameters
MIT License - see LICENSE for details.