Skip to main content

Entropy coders for research and production (Rust and Python).

Project description

Entropy Coders for Research and Production

The constriction library provides a set of composable entropy coding algorithms with a focus on correctness, versatility, ease of use, compression performance, and computational efficiency. The goals of constriction are three-fold:

  1. to facilitate research on novel lossless and lossy compression methods by providing a composable set of primitives (e.g., you can can easily switch out a Range Coder for an ANS coder without having to find a new library or change how you represent exactly invertible entropy models);
  2. to simplify the transition from research code to deployed software by providing similar APIs and binary compatible entropy coders for both Python (for rapid prototyping on research code) and Rust (for turning successful prototypes into standalone binaries, libraries, or WebAssembly modules); and
  3. to serve as a teaching resource by providing a variety of entropy coding primitives within a single consistent framework. Check out our additional teaching material from a university course on data compression, which contains some problem sets where you use constriction (with solutions).

More Information: project website

Live demo: here's a web app that started out as a machine-learning research project in Python and was later turned into a web app by using constriction in a WebAssembly module).

Quick Start

Installing constriction for Python

pip install constriction~=0.4.1

Hello, World

You'll mostly use the stream submodule, which provides stream codes (like Range Coding or ANS). The following example shows a simple encoding-decoding round trip. More complex entropy models and other entropy coders are also supported, see section "More Examples" below.

import constriction
import numpy as np

message = np.array([6, 10, -4, 2, 5, 2, 1, 0, 2], dtype=np.int32)

# Define an i.i.d. entropy model (see below for more complex models):
entropy_model = constriction.stream.model.QuantizedGaussian(-50, 50, 3.2, 9.6)

# Let's use an ANS coder in this example. See below for a Range Coder example.
encoder = constriction.stream.stack.AnsCoder()
encoder.encode_reverse(message, entropy_model)

compressed = encoder.get_compressed()
print(f"compressed representation: {compressed}")
print(f"(in binary: {[bin(word) for word in compressed]})")

decoder = constriction.stream.stack.AnsCoder(compressed)
decoded = decoder.decode(entropy_model, 9) # (decodes 9 symbols)
assert np.all(decoded == message)

More Examples

Switching Out the Entropy Coding Algorithm

Let's take our "Hello, World" example from above and assume we want to switch the entropy coding algorithm from ANS to Range Coding. But we don't want to look for a new library or change how we represent entropy models and compressed data. Luckily, we only have to modify a few lines of code:

import constriction
import numpy as np

# Same representation of message and entropy model as in the previous example:
message = np.array([6, 10, -4, 2, 5, 2, 1, 0, 2], dtype=np.int32)
entropy_model = constriction.stream.model.QuantizedGaussian(-50, 50, 3.2, 9.6)

# Let's use a Range coder now:
encoder = constriction.stream.queue.RangeEncoder()         # <-- CHANGED LINE
encoder.encode(message, entropy_model)          # <-- (slightly) CHANGED LINE

compressed = encoder.get_compressed()
print(f"compressed representation: {compressed}")
print(f"(in binary: {[bin(word) for word in compressed]})")

decoder = constriction.stream.queue.RangeDecoder(compressed) #<--CHANGED LINE
decoded = decoder.decode(entropy_model, 9) # (decodes 9 symbols)
assert np.all(decoded == message)

Complex Entropy Models

This time, let's keep the entropy coding algorithm as it is but make the entropy model more complex. We'll encode the first 5 symbols of the message again with a QuantizedGaussian distribution, but this time we'll use individual model parameters (means and standard deviations) for each of the 5 symbols. For the remaining 4 symbols, we'll use a fixed categorical distribution, just to make it more interesting:

import constriction
import numpy as np

# Same message as above, but a complex entropy model consisting of two parts:
message = np.array([6,   10,   -4,   2,   5,    2, 1, 0, 2], dtype=np.int32)
means   = np.array([2.3,  6.1, -8.5, 4.1, 1.3], dtype=np.float32)
stds    = np.array([6.2,  5.3,  3.8, 3.2, 4.7], dtype=np.float32)
entropy_model1 = constriction.stream.model.QuantizedGaussian(-50, 50)
entropy_model2 = constriction.stream.model.Categorical(
    np.array([0.2, 0.5, 0.3], dtype=np.float32), # Probabilities of the symbols 0,1,2.
    perfect=False
) 

# Simply encode both parts in sequence with their respective models:
encoder = constriction.stream.queue.RangeEncoder()
encoder.encode(message[0:5], entropy_model1, means, stds) # per-symbol params.
encoder.encode(message[5:9], entropy_model2)

compressed = encoder.get_compressed()
print(f"compressed representation: {compressed}")
print(f"(in binary: {[bin(word) for word in compressed]})")

decoder = constriction.stream.queue.RangeDecoder(compressed)
decoded_part1 = decoder.decode(entropy_model1, means, stds)
decoded_part2 = decoder.decode(entropy_model2, 4)
assert np.all(np.concatenate((decoded_part1, decoded_part2)) == message)

You can define even more complex entropy models by providing an arbitrary Python function for the cumulative distribution function (see CustomModel and ScipyModel). The constriction library provides wrappers that turn your models into exactly invertible fixed-point arithmetic since even tiny rounding errors could otherwise completely break an entropy coding algorithm.

Exercise

We've shown examples of ANS coding with a simple entropy model, of Range Coding with the same simple entropy model, and of Range coding with a complex entropy model. One combination is still missing: ANS coding with the complex entropy model from the last example above. This should be no problem now, so try it out yourself:

  • In the last example above, change both "queue.RangeEncoder" and "queue.RangeDecoder" to "stack.AnsCoder" (ANS uses the same data structure for both encoding and decoding).
  • Then change both occurrences of .encode(...) to .encode_reverse(...) (since ANS operates as a stack, i.e., last-in-first-out, we encode the symbols in reverse order so that we can decode them in their normal order).
  • Finally, there's one slightly subtle change: when encoding the message, switch the order of the two lines that encode message[0:5] and message[5:9], respectively. Do not change the order of decoding though. This is again necessary because ANS operates as a stack.

Congratulations, you've successfully implemented your first own compression scheme with constriction.

Further Reading

You can find links to more examples and tutorials on the project website. Or just dive right into the documentation of range coding, ANS, and entropy models.

If you're still new to the concept of entropy coding then check out the teaching material.

Contributing

Pull requests and issue reports are welcome. Unless contributors explicitly state otherwise at the time of contributing, all contributions will be assumed to be licensed under either one of MIT license, Apache License Version 2.0, or Boost Software License Version 1.0, at the choice of each licensee.

There's no official guide for contributions since nobody reads those anyway. Just be nice to other people and act like a grown-up (i.e., it's OK to make mistakes as long as you strive for improvement and are open to consider respectfully phrased opinions of other people).

License

This work is licensed under the terms of the MIT license, Apache License Version 2.0, or Boost Software License Version 1.0. You can choose between one of them if you use this work. See the files whose name start with LICENSE in this directory. The compiled python extension module is linked with a number of third party libraries. Binary distributions of the constriction python extension module contain a file LICENSE.html that includes all licenses of all dependencies (the file is also available online).

What's With the Name?

Constriction is a library of compression primitives with bindings for Rust and Python. Pythons are a family of nonvenomous snakes that subdue their prey by "compressing" it, a method known as constriction.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

constriction-0.4.1-cp313-none-win_amd64.whl (299.7 kB view details)

Uploaded CPython 3.13 Windows x86-64

constriction-0.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.6 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

constriction-0.4.1-cp313-cp313-macosx_11_0_arm64.whl (411.9 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

constriction-0.4.1-cp313-cp313-macosx_10_12_x86_64.whl (419.2 kB view details)

Uploaded CPython 3.13 macOS 10.12+ x86-64

constriction-0.4.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (815.7 kB view details)

Uploaded CPython 3.13 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

constriction-0.4.1-cp312-none-win_amd64.whl (300.4 kB view details)

Uploaded CPython 3.12 Windows x86-64

constriction-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (460.5 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

constriction-0.4.1-cp312-cp312-macosx_11_0_arm64.whl (412.6 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

constriction-0.4.1-cp312-cp312-macosx_10_12_x86_64.whl (420.3 kB view details)

Uploaded CPython 3.12 macOS 10.12+ x86-64

constriction-0.4.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (817.3 kB view details)

Uploaded CPython 3.12 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

constriction-0.4.1-cp311-none-win_amd64.whl (301.4 kB view details)

Uploaded CPython 3.11 Windows x86-64

constriction-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (461.3 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

constriction-0.4.1-cp311-cp311-macosx_11_0_arm64.whl (413.2 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

constriction-0.4.1-cp311-cp311-macosx_10_12_x86_64.whl (415.9 kB view details)

Uploaded CPython 3.11 macOS 10.12+ x86-64

constriction-0.4.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (814.3 kB view details)

Uploaded CPython 3.11 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

constriction-0.4.1-cp310-none-win_amd64.whl (301.4 kB view details)

Uploaded CPython 3.10 Windows x86-64

constriction-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (461.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

constriction-0.4.1-cp310-cp310-macosx_11_0_arm64.whl (413.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

constriction-0.4.1-cp310-cp310-macosx_10_12_x86_64.whl (415.9 kB view details)

Uploaded CPython 3.10 macOS 10.12+ x86-64

constriction-0.4.1-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (814.4 kB view details)

Uploaded CPython 3.10 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

constriction-0.4.1-cp39-none-win_amd64.whl (302.3 kB view details)

Uploaded CPython 3.9 Windows x86-64

constriction-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (461.8 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

constriction-0.4.1-cp39-cp39-macosx_11_0_arm64.whl (413.5 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

constriction-0.4.1-cp39-cp39-macosx_10_12_x86_64.whl (416.7 kB view details)

Uploaded CPython 3.9 macOS 10.12+ x86-64

constriction-0.4.1-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (815.3 kB view details)

Uploaded CPython 3.9 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

constriction-0.4.1-cp38-none-win_amd64.whl (301.6 kB view details)

Uploaded CPython 3.8 Windows x86-64

constriction-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (461.7 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

constriction-0.4.1-cp38-cp38-macosx_11_0_arm64.whl (413.4 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

constriction-0.4.1-cp38-cp38-macosx_10_12_x86_64.whl (416.2 kB view details)

Uploaded CPython 3.8 macOS 10.12+ x86-64

constriction-0.4.1-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (814.8 kB view details)

Uploaded CPython 3.8 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

File details

Details for the file constriction-0.4.1-cp313-none-win_amd64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp313-none-win_amd64.whl
Algorithm Hash digest
SHA256 314c4e70a1322a839904a58d63c8ead373d42936ae4754fa496df9db452e8dd0
MD5 1426b36a2f1e823a7fa35712304f2713
BLAKE2b-256 e05ff91492ed4a1601392c79eca3ef65e8f9cc49db06168845724b5810867271

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9d1ff5d05f7ba384a025acf6585fc78f79663d5f7379da5100c55af372b87a89
MD5 eea749aacb074fdf8a0b57ebc1635de4
BLAKE2b-256 1381ef8a8276cb8a6cfc78e663127af0413e67c64ef69f2f3c70a584dd910e34

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd9076c942741460b7e5c999ca3aead4c72b8231c619d711c16a623815e21ebd
MD5 340a0470ff9e226d8b738a23df4e0650
BLAKE2b-256 498e211d84cbce742835a568976b7cc1b582138e08f5e55d65a5c4abe294f4d6

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ff3f5932f55f0ca64bb81210c16bc690dd62f2f34fa328e089dc81a90cc08fa0
MD5 0e129eebf9cfc9adb82f495ee73c37d6
BLAKE2b-256 33c4dc06ee3ad441348659e1cfe56824e71a9c96bc4ea3b80c5a6c8a2f8b1308

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 582b728a57931f0fb995c0d56ad3ad57c7eea0ad8e216206acbc7da78aadcc12
MD5 cb4d575ff52cfc8e1fdfb07e3f9a4d1c
BLAKE2b-256 58d4c84580411e2c63f9c29be195ba9d461960ce04936d09ec086aac8ec3ad29

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp312-none-win_amd64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 e9f2d0b9496d47f0888213e4ea72d7154f933efaeea76ef4549603a45327b61c
MD5 b0dc802181e03f7451836caa9aff4913
BLAKE2b-256 f43b3b3413058e1f507b3c6870c7c3f3b2d006529e2bd7f39f46b13c832d964c

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 15d0e25689a0efaa02e8137829bc02895833205b142f03947283219fe5eb6d78
MD5 25128f949097f0ee1478e2e1e1466ec3
BLAKE2b-256 8b4b64a35c48a0b43f03d4be362877e25f469910f1d0585dd070546ccaa7d83d

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 564f93bf485a624a8952c7701e3c5e384e8826e8e923d4b33f9b752b7f4efa1f
MD5 19763aa75f1f1f9b718e5094b80a22e4
BLAKE2b-256 6defb4f3c1a58f9f169ed6513797f8ce4bd8aad807274a60c25a16f7d432e213

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 220bd9ebf63d1483573bb11f477808b03eb08d375d00d4420408b352dcb6bb53
MD5 78002b7b900d632cdaddbc6c03917fcf
BLAKE2b-256 93d36bfd70b16ad8f8f1d1f933b85ddfb0490582698a3a3595bd3e2cfdef0cb7

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 3e1acbb1ab80297730aa8b60c7d28306f557149a298cae3c48ef974a63007862
MD5 604552317db661563b3e503428e9fbff
BLAKE2b-256 48a4aaac45be6506cc6a9fe00ff6e3a4481e697c5a39bacfecc8b473dbdbc740

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp311-none-win_amd64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 4c6a6657505533f462fe103a2a32b14bed7e09719074e2caff7f7aa06559697a
MD5 a7fbe5a86146f63499d48ba3cde13dd0
BLAKE2b-256 94e63aad0b68b64e5551131b6572d7106c28975b10466906542d1156ae87ac27

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5629e1a4785be4b59e0cf15f76408b3ac0587976db838737373a16f1e4191e03
MD5 d20a93913541038583b7014db21a11a3
BLAKE2b-256 4f8cad7ac213e272e56162835951e7d7b4ccdac48c076daddc662f94125a7118

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9753302b8af085dadb85aa9f26f4b6d2fcd6e2e8c1d69d647404f70c721ae215
MD5 0ed5f6228f6bddad98b48ba61cb132a8
BLAKE2b-256 ea8fbca40e8e305ec0baebd754fb65ed6d94e5a408683b19a4934ca099d51bab

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 cc050f76178ec578d767a8205fbbdedc0ff43c155e6ccc818fe61fe28ec4f5b6
MD5 5796356612a57bab1d3297e3ddd1663a
BLAKE2b-256 dfa1444232bd5cb4a3f11d5d56cca3d840c18bf72a2de949cc3ff17ad25facb7

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 07b49e8158ef529406d2a978ee3f0d6a80c0c37719c9498cd1e2db62e654e60a
MD5 1e1aea232afbb5ce7834d511259b4d70
BLAKE2b-256 da6691437bae9efe39db4b2e1c98877db0f6e6713475394414eda0f4f723b8b7

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp310-none-win_amd64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 fc0c5e746f4154bb13a723e95673d5580974fb6a9422e45018fb1fe1f16c8a36
MD5 a1ba3fbba4a969c0e68b9a5fa0eb2ef9
BLAKE2b-256 8d5ead33ab67f64db8b0f60876da29e3f6d0c43393d5d2c1ea81158960e282ad

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 418872bd9135a7113bc494ea1d2818e891663bcc8e8aa8400242bc7a19e076ac
MD5 950c245bc554078c4465e733bf379738
BLAKE2b-256 2c82de9d2293d17548fed7cf2d32891d1c8bca5de57d2501b7e42bb9e495ccd4

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 158853a0f5f0290e8dd43f0c6773061d609b7d025e76d49c02402863a9db71a4
MD5 7c80dd8a3af814e6f4b5098511ff5a80
BLAKE2b-256 18c62492d14cd804f131c2df5e4cc29820e51405a1b80ddf7e2c1f4f1ff03f9d

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5578d053a0d34e6f12f67197ba647c0be2696a31c61c6760c75e3bdff854ad5f
MD5 41af99f7ed051be63002bfe28b5e335f
BLAKE2b-256 276fe1c1c35a702786df92e2a0a75c07c71dc08f18c8880177965014cb0686f3

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 36df35c8f7665a9bf9cb1cbe545b0275e93a3a8c6d74438f70b526d90388ce1c
MD5 c12a99e404e1bffd96879b14b2afca80
BLAKE2b-256 f48ecb5f62de673cba49f31c7ecca330e8359d5c94148965e6bd5d92f5e0fc47

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp39-none-win_amd64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 693e74cf9ed7bdb4e36596281fb492c01fbe7c1d5b2c036d69597c97c7b393dc
MD5 42f41c82835b72590b3336410961997b
BLAKE2b-256 d12095ea1c1482f234a511ab0c58802ec1c21a150b7a095ec1cac7807891230a

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 14f4c3b0213d8caefd38f1526e8d5cbf07979640583c4c2404fcb78f6bbcb917
MD5 0243d4b984f09112e79f3f6e3b8c92e9
BLAKE2b-256 29bb486ab03562d2894f68bcb5e0db86ef6393858a699ecc6738c49f0bf9943f

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5f29dd82aef092a6792e6c1897a39d40830a0e7bef1e06b5e932b1be138a6106
MD5 958f6c1c4f1dc6b188befce5d045d5c1
BLAKE2b-256 d88ae1eb0cb4edfdcb798596fefed596f882ea16d6ff1277de06ec770a06df0a

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d57a9f633e1f56cb6a590582b6e5a557a0de6888894f7c7f106986a72560d3ca
MD5 5722c0e6477904dda6f95bd8375291e5
BLAKE2b-256 44694a8e6214a515f14a016b0e8a0fd04b445fda7e8082ffc1d81aa9a5e339f8

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 686aabfd0fd839097c627211310f4f6de213d85ead53b1035e10fe884c71610b
MD5 0e68ac601ca40a18e7916093453bef21
BLAKE2b-256 a603bedb0d6ef40748bd6704b9bda7ad8aa25fd1043bb52c6ae1fd00f99dbd79

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp38-none-win_amd64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 d51c9fa611e5374948cce35d6a0829d3a40fcfa443eeef6022114230ad19e903
MD5 e6f20f3bdaf8275e9a5d1c4e59161824
BLAKE2b-256 e5434ea1737a98350157b7e7a27a707d9209596c966bac3901f54fac189ea647

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 40af92426ff4231134086785d6930c625074e939dbb44ab5ec3e58a4d8a3d99a
MD5 62f578c54ab8a902efc051d1f81e1764
BLAKE2b-256 e8cfae3746a7f75d9f4673f6f49c6d47db21ea7825cd90d475427cf2e1de9cb4

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fea787493a5a354dbd96b9f1e9a6a05cad29dca06d53fbf6c27c1c5a6c80cbb9
MD5 de35264998ad12f7147df2fb5d2ca19b
BLAKE2b-256 71e38954268f9c329b9479b937d839e50b3dc3c243e99065486a6fd6d4799c22

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp38-cp38-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 80067a9ab364f5e0f9fddb79857ddaca64fd296f0aa0bc5258175ce4dd0a4755
MD5 8847ebdfb52782e1a28063d7204fa001
BLAKE2b-256 67752010eea1035e2944c856c9d580248c9bc16ce90b02ce4f565e5d43a89706

See more details on using hashes here.

File details

Details for the file constriction-0.4.1-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for constriction-0.4.1-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 2feb39a6bb55ab613ca5dad569ecb5cb2dd705de78a4e32c8c39dc8622c1ac5c
MD5 b7ba1efc3c4ef66b9c7c81f8801925a2
BLAKE2b-256 bb88b4c1ff72c148fefad1226b9a22600c42a718c487e3fb3d68ea6570243807

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page