A Python implementation of the tANS algorithm
Project description
tANS_py
Tabled Asymmetric Numeral Systems Implementation in Python. This code is available as a package on PyPI here.
Asymmetric Numeral Systems (ANS) is a Entropy Coding compression technique created by Jarek Duda. This repository contains a Python implementation a version of the techinque that uses lookup table to store the state transitions (called tANS).
This implementation is based on the following resources:
- The original paper Asymmetric Numeral Systems by Jarek Duda
- Slides from a course taught by Duda (see slide 38)
- The following medium article
- This python implementation of tANS
- My implementation is very similar to this code, but is written to be more readable and fixes some of the small bugs in the original code
- This blog post explaining ANS
Limitations
This implementation is not optimized for speed. It is meant to be a simple implementation that is easy to understand.
The main limitation of this implementation is that L, the table size, must be a power of 2.
Usage
See example.ipynb for examples of all the things discussed below.
Main Workflow
The main workflow of this implementation can be found in tANS.py. This file contains functions which encode and decode messages using the Coder class. The benefit of using this file is that it allows for a more streamlined workflow, removing the need for the user to interact with the Coder class directly and define symbols and their frequencies.
Example Usage:
# Importing the tANS module and testing it with a simple message
from tANS_py import tANS
# takes a string or list of symbols as input
msg = "Hello World! This is a test message to see how well the tANS algorithm works. It should be able to compress this message quite well, as it has a lot of repeated characters. Let's see how well it does!"
msg_list = list(msg)
# Using the tANS module to encode and decode the message as a string
# L determines the table size, the larger the table, the more efficient the encoding (default is 1024)
# fast determines whether to use the fast or slow version of the spread, slow is more efficient but slower (default is False)
bits, c = tANS.encode(msg, L = 128, fast= False)
# Note: the output of encode, c, must be passed to decode, as it contains the data necessary to decode the message
res = tANS.decode(bits, c)
# returns a list of characters, so we need to join them into a string
res = "".join(res)
print(msg[:11])
print("String Works:",res == msg)
# Using the tANS module to encode and decode the message as a list
bits, c = tANS.encode(msg_list)
res = tANS.decode(bits, c)
print(msg_list[:11])
print("List Works:",res == msg_list)
Hello World
String Works: True
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
List Works: True
Submodules
tANS_py contains several submodules that can be used to interact with the tANS algorithm. These submodules are:
- Coder - The main class that is used to encode and decode messages
- Decoder - Contains the functions necessary to decode a message
- Encoder - Contains the functions necessary to encode a message
- SpreadFunction - Contains the functions necessary to build the encoder and decoder tables
- Utils - Contains utility functions that are mainly used to generate frequency counts given a probability distribution
You can find examples of how to use these submodules in example.ipynb.
About
This implementation was created by Adam Taback as part of a research project at the University of Toronto, aiming to use ANS to compress neural network traces.
If you have any questions, reach out to me at adamrtaback@gmail.com.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tans_py-0.1.3.tar.gz.
File metadata
- Download URL: tans_py-0.1.3.tar.gz
- Upload date:
- Size: 14.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8cd168b8dd1424ac2005d4bc7567dc1bfa26faec91dd1081fbffc9a2b8dd5c23
|
|
| MD5 |
c18315b4b018e12e3cae89542223c21d
|
|
| BLAKE2b-256 |
cb01e35d83a03a3ff61761c6c076a9fdf65002b77c68bf49f11a02a3c8ad0baf
|
File details
Details for the file tans_py-0.1.3-py3-none-any.whl.
File metadata
- Download URL: tans_py-0.1.3-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
02ef299807fb5ec2ba1ad4b4d4ce8200f6a95fef2df084d031038d9749a43d32
|
|
| MD5 |
868628f7e27ac362b77c97b0efdccb47
|
|
| BLAKE2b-256 |
17c1aa326fd19aaddf8a3a2646e140e73eefbdaacc8bad7f5b3d4d001fb5181a
|