# `tract` python bindings
`tract` is a library for neural network inference. While PyTorch and TensorFlow
deal with the much harder training problem, `tract` focuses on what happens once
the model in trained.
`tract` ultimate goal is to use the model on end-user data (aka "running the
model") as efficiently as possible, in a variety of possible deployments,
including some which are no completely mainstream : a lot of energy have been
invested in making `tract` an efficient engine to run models on ARM single board
computers.
## Getting started
### Install tract library
`pip install tract`. Prebuilt wheels are provided for x86-64 Linux and
Windows, x86-64 and arm64 for MacOS.
### Downloading the model
First we need to obtain the model. We will download an ONNX-converted MobileNET
2.7 from the ONNX model zoo.
`wget https://github.com/onnx/models/raw/main/vision/classification/mobilenet/model/mobilenetv2-7.onnx`.
### Preprocessing an image
Then we need a sample image. You can use pretty much anything. If you lack
inspiration, you can this picture of Grace Hopper.
`wget https://s3.amazonaws.com/tract-ci-builds/tests/grace_hopper.jpg`
We will be needing `pillow` to load the image and crop it.
`pip install pillow`
Now let's start our python script. We will want to use tract, obviously, but we
will also need PIL's Image and numpy to put the data in the form MobileNet expects it.
```python
#!/usr/bin/env python
import tract
import numpy
from PIL import Image
```
We want to load the image, crop it into its central square, then scale this
square to be 224x224.
```python
im = Image.open("grace_hopper.jpg")
if im.height > im.width:
top_crop = int((im.height - im.width) / 2)
im = im.crop((0, top_crop, im.width, top_crop + im.width))
else:
left_crop = int((im.width - im.height) / 2)
im = im.crop((left_crop, 0, left_crop + im_height, im.height))
im = im.resize((224, 224))
im = numpy.array(im)
```
At this stage, we obtain a 224x224x3 tensor of 8-bit positive integers. We need to transform
these integers to floats and normalize them for MobileNet.
At some point during this normalization, numpy decides to promote our tensor to
double precision, but our model is single precison, so we are converting it
again after the normalization.
```python
im = (im.astype(float) / 255. - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225]
im = im.astype(numpy.single)
```
Finally, ONNX variant of Mobilenet expects its input in NCHW convention, and
our data is in HWC. We need to move the C axis before H and W, then insert the
N at the left.
```python
im = numpy.moveaxis(im, 2, 0)
im = numpy.expand_dims(im, 0)
```
### Loading the model
Loading a model is relatively simple. We need to instantiate the ONNX loader
first, the we use it to load the model. Then we ask tract to optimize the model
and get it ready to run.
```python
model = tract.onnx().model_for_path("./mobilenetv2-7.onnx").into_optimized().into_runnable()
```
If we wanted to process several images, this would only have to be done once
out of our image loop.
### Running the model
tract run methods take a list of inputs and returns a list of outputs. Each input
can be a numpy array. The outputs are tract's own Value data type, which should
be converted to numpy array.
```python
outputs = model.run([im])
output = outputs[0].to_numpy()
```
### Interpreting the result
If we print the output, what we get is a array of 1000 values. Each value is
the score of our image on one of the 1000 categoris of ImageNet. What we want
is to find the category with the highest score.
```python
print(numpy.argmax(output))
```
If all goes according to plan, this should output the number 652. There is a copy
of ImageNet categories at the following URL, with helpful line numbering.
```
https://github.com/sonos/tract/blob/main/examples/nnef-mobilenet-v2/imagenet_slim_labels.txt
```
And... 652 is "microphone". Which is wrong. The trick is, the lines are
numbered from 1, while our results starts at 0, plus the label list includes a
"dummy" label first that should be ignored. So the right value is at the line
654: "military uniform". If you looked at the picture before you noticed that
Grace Hopper is in uniform on the picture, so it does make sense.
## Model cooking with `tract`
Over the years of `tract` development, it became clear that beside "training"
and "running", there was a third time in the life-cycle of a model. One of
our contributors nicknamed it "model cooking" and the term stuck. This extra stage
is about all what happens after the training and before running.
If training and Runtime are relatively easy to define, the model cooking gets a
bit less obvious. It comes from the realisation that the training form (an ONNX
or TensorFlow file or ste of files) of a model may is usually not the most
convenient form for running it. Every time a device loads a model in ONNX form
and transform it into a suitable form for runtime, it goes through the same
series or more or less complicated operations, that can amount to several
seconds of high-CPU usage for current models. When running the model on a
device, this can have several negative impact on experience: the device will
take time to start-up, consume a lot of battery energy to get ready, maybe fight
over CPU availability with other processes trying to get ready at the same
instant on the device.
As this sequence of operations is generally the same, it becomes relevant to
persist the model resulting of the transformation. It could be persisted at the
first application start-up for instance. But it could also be "prepared", or
"cooked" before distribution to the devices.
## Cooking to NNEF
`tract` supports NNEF. It can read a NNEF neural network and run it. But it can
also dump its preferred representation of a model in NNEF.
At this stage, a possible path to production for a neural model becomes can be drawn:
* model is trained, typically on big servers on the cloud, and exported to ONNX.
* model is cooked, simplified, using `tract` command line or python bindings.
* model is shipped to devices or servers in charge of running it.
## Testing and benching models early
As soon as the model is in ONNX form, `tract` can load and run it. It gives
opportunities to validate and test on the training system, asserting early on that
`tract` will compute at runtime the same result than what the training model
predicts, limiting the risk of late-minute surprise.
But tract command line can also be used to bench and profile an ONNX model on
the target system answering very early the "will the device be fast enough"
question. The nature of neural network is such that in many cases an
untrained model, or a poorly trained one will perform the same computations than
the final model, so it may be possible to bench the model for on-device
efficiency before going through a costly and long model training.
## tract-opl
NNEF is a pretty little standard. But we needed to go beyond it and we extended
it in several ways. For instance, NNEF does not provide syntax for recurring
neural network (LSTM and friends), which are an absolute must in signal and voice
processing. `tract` also supports symbolic dimensions, which are useful to
represent a late bound batch dimension (if you don't know in advance how many
inputs will have to be computed concurrently).
## Pulsing
For interactive applications where time plays a role (voice, signal, ...),
`tract` can automatically transform batch models, to equivalent streaming models
suitable for runtime. While batch models are presented at training time the
whole signal in one go, a streaming model received the signal by "pulse" and
produces step by step the same output that the batching model.
It does not work for every model, `tract` can obviously not generate a model
where the output at a time depends on input not received yet. Of course, models
have to be *causal* to be pulsable. For instance, a bi-directional LSTM is not
pulsable. Most convolution nets can be made causal at designe time by padding,
or at cooking time by adding fixed delays.
This cooking step is a recurring annoyance in the real-time voice and signal
field : it can be done manually, but is very easy to get wrong. `tract` makes
it automactic.
Raw data
{
"_id": null,
"home_page": null,
"name": "tract",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "onnx tensorflow nnef runtime neural network",
"author": "Mathieu Poumeyrol, Sonos, and tract contributors",
"author_email": "mathieu@poumeyrol.fr",
"download_url": "https://files.pythonhosted.org/packages/64/0d/e3fae5d6220eed339f62ce51b77c486017bfb14a85c33d0bef0ceadb98d8/tract-0.21.8.tar.gz",
"platform": null,
"description": "# `tract` python bindings\n\n`tract` is a library for neural network inference. While PyTorch and TensorFlow\ndeal with the much harder training problem, `tract` focuses on what happens once\nthe model in trained.\n\n`tract` ultimate goal is to use the model on end-user data (aka \"running the\nmodel\") as efficiently as possible, in a variety of possible deployments,\nincluding some which are no completely mainstream : a lot of energy have been\ninvested in making `tract` an efficient engine to run models on ARM single board\ncomputers.\n\n## Getting started\n\n### Install tract library\n\n`pip install tract`. Prebuilt wheels are provided for x86-64 Linux and\nWindows, x86-64 and arm64 for MacOS.\n\n### Downloading the model\n\nFirst we need to obtain the model. We will download an ONNX-converted MobileNET\n2.7 from the ONNX model zoo.\n\n`wget https://github.com/onnx/models/raw/main/vision/classification/mobilenet/model/mobilenetv2-7.onnx`.\n\n### Preprocessing an image\n\nThen we need a sample image. You can use pretty much anything. If you lack\ninspiration, you can this picture of Grace Hopper.\n\n`wget https://s3.amazonaws.com/tract-ci-builds/tests/grace_hopper.jpg`\n\nWe will be needing `pillow` to load the image and crop it.\n\n`pip install pillow`\n\nNow let's start our python script. We will want to use tract, obviously, but we\nwill also need PIL's Image and numpy to put the data in the form MobileNet expects it.\n\n```python\n#!/usr/bin/env python\n\nimport tract\nimport numpy\nfrom PIL import Image\n```\n\nWe want to load the image, crop it into its central square, then scale this\nsquare to be 224x224.\n\n```python\nim = Image.open(\"grace_hopper.jpg\")\nif im.height > im.width:\n top_crop = int((im.height - im.width) / 2)\n im = im.crop((0, top_crop, im.width, top_crop + im.width))\nelse:\n left_crop = int((im.width - im.height) / 2)\n im = im.crop((left_crop, 0, left_crop + im_height, im.height))\nim = im.resize((224, 224))\nim = numpy.array(im)\n```\n\nAt this stage, we obtain a 224x224x3 tensor of 8-bit positive integers. We need to transform\nthese integers to floats and normalize them for MobileNet.\nAt some point during this normalization, numpy decides to promote our tensor to\ndouble precision, but our model is single precison, so we are converting it\nagain after the normalization.\n\n```python\nim = (im.astype(float) / 255. - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225]\nim = im.astype(numpy.single)\n```\n\nFinally, ONNX variant of Mobilenet expects its input in NCHW convention, and\nour data is in HWC. We need to move the C axis before H and W, then insert the\nN at the left.\n\n```python\nim = numpy.moveaxis(im, 2, 0)\nim = numpy.expand_dims(im, 0)\n```\n\n### Loading the model\n\nLoading a model is relatively simple. We need to instantiate the ONNX loader\nfirst, the we use it to load the model. Then we ask tract to optimize the model\nand get it ready to run.\n\n```python\nmodel = tract.onnx().model_for_path(\"./mobilenetv2-7.onnx\").into_optimized().into_runnable()\n```\n\nIf we wanted to process several images, this would only have to be done once\nout of our image loop.\n\n### Running the model\n\ntract run methods take a list of inputs and returns a list of outputs. Each input\ncan be a numpy array. The outputs are tract's own Value data type, which should \nbe converted to numpy array.\n\n```python\noutputs = model.run([im])\noutput = outputs[0].to_numpy()\n```\n\n### Interpreting the result\n\nIf we print the output, what we get is a array of 1000 values. Each value is\nthe score of our image on one of the 1000 categoris of ImageNet. What we want\nis to find the category with the highest score.\n\n```python\nprint(numpy.argmax(output))\n```\n\nIf all goes according to plan, this should output the number 652. There is a copy\nof ImageNet categories at the following URL, with helpful line numbering.\n\n```\nhttps://github.com/sonos/tract/blob/main/examples/nnef-mobilenet-v2/imagenet_slim_labels.txt\n```\n\nAnd... 652 is \"microphone\". Which is wrong. The trick is, the lines are\nnumbered from 1, while our results starts at 0, plus the label list includes a\n\"dummy\" label first that should be ignored. So the right value is at the line\n654: \"military uniform\". If you looked at the picture before you noticed that\nGrace Hopper is in uniform on the picture, so it does make sense.\n\n## Model cooking with `tract`\n\nOver the years of `tract` development, it became clear that beside \"training\"\nand \"running\", there was a third time in the life-cycle of a model. One of\nour contributors nicknamed it \"model cooking\" and the term stuck. This extra stage\nis about all what happens after the training and before running.\n\nIf training and Runtime are relatively easy to define, the model cooking gets a\nbit less obvious. It comes from the realisation that the training form (an ONNX\nor TensorFlow file or ste of files) of a model may is usually not the most\nconvenient form for running it. Every time a device loads a model in ONNX form\nand transform it into a suitable form for runtime, it goes through the same\nseries or more or less complicated operations, that can amount to several\nseconds of high-CPU usage for current models. When running the model on a\ndevice, this can have several negative impact on experience: the device will\ntake time to start-up, consume a lot of battery energy to get ready, maybe fight\nover CPU availability with other processes trying to get ready at the same\ninstant on the device.\n\nAs this sequence of operations is generally the same, it becomes relevant to\npersist the model resulting of the transformation. It could be persisted at the\nfirst application start-up for instance. But it could also be \"prepared\", or\n\"cooked\" before distribution to the devices.\n\n## Cooking to NNEF\n\n`tract` supports NNEF. It can read a NNEF neural network and run it. But it can\nalso dump its preferred representation of a model in NNEF.\n\nAt this stage, a possible path to production for a neural model becomes can be drawn:\n* model is trained, typically on big servers on the cloud, and exported to ONNX.\n* model is cooked, simplified, using `tract` command line or python bindings.\n* model is shipped to devices or servers in charge of running it.\n\n## Testing and benching models early\n\nAs soon as the model is in ONNX form, `tract` can load and run it. It gives\nopportunities to validate and test on the training system, asserting early on that\n`tract` will compute at runtime the same result than what the training model\npredicts, limiting the risk of late-minute surprise.\n\nBut tract command line can also be used to bench and profile an ONNX model on\nthe target system answering very early the \"will the device be fast enough\"\nquestion. The nature of neural network is such that in many cases an\nuntrained model, or a poorly trained one will perform the same computations than\nthe final model, so it may be possible to bench the model for on-device\nefficiency before going through a costly and long model training.\n\n## tract-opl\n\nNNEF is a pretty little standard. But we needed to go beyond it and we extended\nit in several ways. For instance, NNEF does not provide syntax for recurring\nneural network (LSTM and friends), which are an absolute must in signal and voice\nprocessing. `tract` also supports symbolic dimensions, which are useful to\nrepresent a late bound batch dimension (if you don't know in advance how many\ninputs will have to be computed concurrently).\n\n## Pulsing\n\nFor interactive applications where time plays a role (voice, signal, ...),\n`tract` can automatically transform batch models, to equivalent streaming models\nsuitable for runtime. While batch models are presented at training time the\nwhole signal in one go, a streaming model received the signal by \"pulse\" and\nproduces step by step the same output that the batching model.\n\nIt does not work for every model, `tract` can obviously not generate a model\nwhere the output at a time depends on input not received yet. Of course, models\nhave to be *causal* to be pulsable. For instance, a bi-directional LSTM is not\npulsable. Most convolution nets can be made causal at designe time by padding,\nor at cooking time by adding fixed delays.\n\nThis cooking step is a recurring annoyance in the real-time voice and signal\nfield : it can be done manually, but is very easy to get wrong. `tract` makes\nit automactic.\n",
"bugtrack_url": null,
"license": "Apache License, Version 2.0 OR MIT",
"summary": "Python bindings for tract, a neural network inference engine",
"version": "0.21.8",
"project_urls": {
"Documentation": "https://sonos.github.io/tract",
"Source": "https://github.com/sonos/tract"
},
"split_keywords": [
"onnx",
"tensorflow",
"nnef",
"runtime",
"neural",
"network"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "fc5a439e94f41b1f05652a7730ef3cda19a5c74db72fdf2bbbe688d4c49b7e86",
"md5": "0f44df953bb28de4ca9becdffd9bdf77",
"sha256": "dd3fa11746f8e93208b8043cd0c842642d653deca8e4c8afbc3f9edb8c0e2d09"
},
"downloads": -1,
"filename": "tract-0.21.8-cp310-cp310-macosx_10_12_universal2.whl",
"has_sig": false,
"md5_digest": "0f44df953bb28de4ca9becdffd9bdf77",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 13575919,
"upload_time": "2024-12-05T12:02:32",
"upload_time_iso_8601": "2024-12-05T12:02:32.980294Z",
"url": "https://files.pythonhosted.org/packages/fc/5a/439e94f41b1f05652a7730ef3cda19a5c74db72fdf2bbbe688d4c49b7e86/tract-0.21.8-cp310-cp310-macosx_10_12_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "87c8b04febf00481d4eba675da34d2232cc3db79cbef2d8cffcc284d89c8af76",
"md5": "ed70d41b5f0daddbc61d67e924280c49",
"sha256": "bd39449403c991a6f0e59f7a03eb8ea6106d58cfe7baa20d9888f11382bfb17b"
},
"downloads": -1,
"filename": "tract-0.21.8-cp310-cp310-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "ed70d41b5f0daddbc61d67e924280c49",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 7259015,
"upload_time": "2024-12-05T12:02:37",
"upload_time_iso_8601": "2024-12-05T12:02:37.025299Z",
"url": "https://files.pythonhosted.org/packages/87/c8/b04febf00481d4eba675da34d2232cc3db79cbef2d8cffcc284d89c8af76/tract-0.21.8-cp310-cp310-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c0b7d12dd639a2480f54f51d13f73e9b3a34c8fbc71036a2cd047dfbec3e825a",
"md5": "8dcc624500e9d7fadc6dfdf453951865",
"sha256": "e8e8cff671e5dd6dc7015c70da0b57ca671dbe866b7778de8a9f1302ceff9a57"
},
"downloads": -1,
"filename": "tract-0.21.8-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "8dcc624500e9d7fadc6dfdf453951865",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 6330079,
"upload_time": "2024-12-05T12:02:38",
"upload_time_iso_8601": "2024-12-05T12:02:38.789760Z",
"url": "https://files.pythonhosted.org/packages/c0/b7/d12dd639a2480f54f51d13f73e9b3a34c8fbc71036a2cd047dfbec3e825a/tract-0.21.8-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a655ce55b20c4d2a3f39c6e5f676c40f175c5ed459fccfbac05338fcc831bc14",
"md5": "59c50002f595b7730044a1e74643949c",
"sha256": "d3b8ac1b2a6960b4fd8e56dfdd8cdb59b10f37ce2914c2cd1f65c337146e1c7d"
},
"downloads": -1,
"filename": "tract-0.21.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "59c50002f595b7730044a1e74643949c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 7690609,
"upload_time": "2024-12-05T12:02:41",
"upload_time_iso_8601": "2024-12-05T12:02:41.298633Z",
"url": "https://files.pythonhosted.org/packages/a6/55/ce55b20c4d2a3f39c6e5f676c40f175c5ed459fccfbac05338fcc831bc14/tract-0.21.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "217e351dcc1f4b171a90e63d0524ddb506c8273e92115a03fa84390849ff8c82",
"md5": "970ff92eca56482757d330a007afb35b",
"sha256": "a2669fae94488ddaa008cd5c0c413c112fc313987d2c6928ab17823493a8b13b"
},
"downloads": -1,
"filename": "tract-0.21.8-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "970ff92eca56482757d330a007afb35b",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 7758224,
"upload_time": "2024-12-05T12:02:44",
"upload_time_iso_8601": "2024-12-05T12:02:44.969068Z",
"url": "https://files.pythonhosted.org/packages/21/7e/351dcc1f4b171a90e63d0524ddb506c8273e92115a03fa84390849ff8c82/tract-0.21.8-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "21454371a2b0dd6c890edccd83cbe49b4348de5c8da1d659ccce867a2fe75755",
"md5": "55b1026fa673843c015b2800b80b3afc",
"sha256": "b4732460c6d2636a7f107aecc48520b883dc4cbc7db04e9fb69511e7939d9a92"
},
"downloads": -1,
"filename": "tract-0.21.8-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "55b1026fa673843c015b2800b80b3afc",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 7366635,
"upload_time": "2024-12-05T12:02:47",
"upload_time_iso_8601": "2024-12-05T12:02:47.531199Z",
"url": "https://files.pythonhosted.org/packages/21/45/4371a2b0dd6c890edccd83cbe49b4348de5c8da1d659ccce867a2fe75755/tract-0.21.8-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7fe4ff1675a2e0fee0fbe24e37aca9936fa1974e4c5af329650b3724eb93e889",
"md5": "8b6093259c6b68f020e830675dae690d",
"sha256": "d59ba6a4ac48304ac6ecdb1e7043e9f207c529c2b1c059f525ffbf66386d1b4b"
},
"downloads": -1,
"filename": "tract-0.21.8-cp311-cp311-macosx_10_12_universal2.whl",
"has_sig": false,
"md5_digest": "8b6093259c6b68f020e830675dae690d",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 13575918,
"upload_time": "2024-12-05T12:02:52",
"upload_time_iso_8601": "2024-12-05T12:02:52.097699Z",
"url": "https://files.pythonhosted.org/packages/7f/e4/ff1675a2e0fee0fbe24e37aca9936fa1974e4c5af329650b3724eb93e889/tract-0.21.8-cp311-cp311-macosx_10_12_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "25c5a7fe320e31cceede6c0929667b07efe4f1778dd7119c66180b5dd92ea07a",
"md5": "7f49d09c8ebd8b95b1247cd8c62295c6",
"sha256": "169828923e1606ae9e6d535f1f8052f5e8f9adea298607632cc992567a9a6932"
},
"downloads": -1,
"filename": "tract-0.21.8-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "7f49d09c8ebd8b95b1247cd8c62295c6",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 7259015,
"upload_time": "2024-12-05T12:02:56",
"upload_time_iso_8601": "2024-12-05T12:02:56.913470Z",
"url": "https://files.pythonhosted.org/packages/25/c5/a7fe320e31cceede6c0929667b07efe4f1778dd7119c66180b5dd92ea07a/tract-0.21.8-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "29ce8dfe0a6e5741195a93eba9ef3bcf6fa56f074df11f5b9a6e1bb29acb46f3",
"md5": "26a3b65ad8edb06fe06406e1d69bf33a",
"sha256": "18e6b5e66a635ec06de3b240c5e3c3a208212c1d6d3fd202ab81607a75f440d6"
},
"downloads": -1,
"filename": "tract-0.21.8-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "26a3b65ad8edb06fe06406e1d69bf33a",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 6330073,
"upload_time": "2024-12-05T12:03:00",
"upload_time_iso_8601": "2024-12-05T12:03:00.337018Z",
"url": "https://files.pythonhosted.org/packages/29/ce/8dfe0a6e5741195a93eba9ef3bcf6fa56f074df11f5b9a6e1bb29acb46f3/tract-0.21.8-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "58762b433f250e364cad80b2d53654fd891f4e08af00c865a96e9c7e07911505",
"md5": "df0d88e3e7bf7f232bc4ddf76f60cc85",
"sha256": "2e042c0b20de783fcb50ea4e5deb3e6181adef332c190c31b8ae7c2ef83602cb"
},
"downloads": -1,
"filename": "tract-0.21.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "df0d88e3e7bf7f232bc4ddf76f60cc85",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 7690607,
"upload_time": "2024-12-05T12:03:02",
"upload_time_iso_8601": "2024-12-05T12:03:02.801048Z",
"url": "https://files.pythonhosted.org/packages/58/76/2b433f250e364cad80b2d53654fd891f4e08af00c865a96e9c7e07911505/tract-0.21.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1f7f31fc6a7466fb829816fb509e6ccdf16f357a0bcab78299a19d3fc517eba6",
"md5": "8f73117a9fba78c69fa171694cf74b0f",
"sha256": "da21d981cb7432f10b51a05075b3ba32226b060b1f073990148f5d059b831f57"
},
"downloads": -1,
"filename": "tract-0.21.8-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "8f73117a9fba78c69fa171694cf74b0f",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 7758227,
"upload_time": "2024-12-05T12:03:04",
"upload_time_iso_8601": "2024-12-05T12:03:04.661383Z",
"url": "https://files.pythonhosted.org/packages/1f/7f/31fc6a7466fb829816fb509e6ccdf16f357a0bcab78299a19d3fc517eba6/tract-0.21.8-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4208819c103bdada3b59a60e79424ca85a64e10439bca7514c89ff79ee26945e",
"md5": "3eb782f442781e4fb65181ba62b855fe",
"sha256": "a5be933eda9170ab3d4b49a5fd6804e6b3335c5a0e926cf0384f71d1c20c5dd6"
},
"downloads": -1,
"filename": "tract-0.21.8-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "3eb782f442781e4fb65181ba62b855fe",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 7366636,
"upload_time": "2024-12-05T12:03:06",
"upload_time_iso_8601": "2024-12-05T12:03:06.502005Z",
"url": "https://files.pythonhosted.org/packages/42/08/819c103bdada3b59a60e79424ca85a64e10439bca7514c89ff79ee26945e/tract-0.21.8-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2212a4f121b55f75d4caaadc4911c61b6660fe261bc16f5f376acf91f5e31c8c",
"md5": "dbfa1d636d741cb492af4d3befa037a1",
"sha256": "9a0c02b85f841f48fb176034b1a8e93ee15f1aae658591da9574819fd78f4951"
},
"downloads": -1,
"filename": "tract-0.21.8-cp312-cp312-macosx_10_13_universal2.whl",
"has_sig": false,
"md5_digest": "dbfa1d636d741cb492af4d3befa037a1",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 13575916,
"upload_time": "2024-12-05T12:03:08",
"upload_time_iso_8601": "2024-12-05T12:03:08.687319Z",
"url": "https://files.pythonhosted.org/packages/22/12/a4f121b55f75d4caaadc4911c61b6660fe261bc16f5f376acf91f5e31c8c/tract-0.21.8-cp312-cp312-macosx_10_13_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9f0eb22bfc3eb12c3ed7d11737fe802f6523d73bbbd887609428b8e95b82bf67",
"md5": "d071570115746edd15da3b9498f29fe5",
"sha256": "706d733bc88d29b40d91145408522103392c134ccea71da07946a9a07fbbd57f"
},
"downloads": -1,
"filename": "tract-0.21.8-cp312-cp312-macosx_10_13_x86_64.whl",
"has_sig": false,
"md5_digest": "d071570115746edd15da3b9498f29fe5",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 7259015,
"upload_time": "2024-12-05T12:03:12",
"upload_time_iso_8601": "2024-12-05T12:03:12.053438Z",
"url": "https://files.pythonhosted.org/packages/9f/0e/b22bfc3eb12c3ed7d11737fe802f6523d73bbbd887609428b8e95b82bf67/tract-0.21.8-cp312-cp312-macosx_10_13_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ac200a2c6db5afb9064e711ce7ac3dc670e082e69645b48e923c3013d7df36b4",
"md5": "66db271f98c95b05acd3859bc9dbaa1d",
"sha256": "f798f5babed44672799c3dc8d19fc9bae0059ce7ecdbe30cab3fc0c2c7980b83"
},
"downloads": -1,
"filename": "tract-0.21.8-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "66db271f98c95b05acd3859bc9dbaa1d",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 6330077,
"upload_time": "2024-12-05T12:03:13",
"upload_time_iso_8601": "2024-12-05T12:03:13.852467Z",
"url": "https://files.pythonhosted.org/packages/ac/20/0a2c6db5afb9064e711ce7ac3dc670e082e69645b48e923c3013d7df36b4/tract-0.21.8-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "caa6d7c6d928282d78a989eb11fe53b2dd6317e454f99adf2fd36fd3d160d3d4",
"md5": "f29b9a0c2fe39ed9f114369c385938b4",
"sha256": "f0e254ba111c716332fc421192aa2954877e774e36436e044aba00d4d1073bb5"
},
"downloads": -1,
"filename": "tract-0.21.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f29b9a0c2fe39ed9f114369c385938b4",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 7690606,
"upload_time": "2024-12-05T12:03:15",
"upload_time_iso_8601": "2024-12-05T12:03:15.570585Z",
"url": "https://files.pythonhosted.org/packages/ca/a6/d7c6d928282d78a989eb11fe53b2dd6317e454f99adf2fd36fd3d160d3d4/tract-0.21.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "979adcc2ee2c250d636151aecc847987c3cd311c86a9124fcf6fbd8f01c44b9c",
"md5": "b1894b290eb6c18a1b85574ba461f064",
"sha256": "a03ad46c271914614e8257b58db87fe9a10b5598287443147861f78a575b69aa"
},
"downloads": -1,
"filename": "tract-0.21.8-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "b1894b290eb6c18a1b85574ba461f064",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 7758228,
"upload_time": "2024-12-05T12:03:18",
"upload_time_iso_8601": "2024-12-05T12:03:18.274472Z",
"url": "https://files.pythonhosted.org/packages/97/9a/dcc2ee2c250d636151aecc847987c3cd311c86a9124fcf6fbd8f01c44b9c/tract-0.21.8-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b264b88e5bc1a022a7f1b124901c70ae1e2e7cd6a63b7f0b2cf10d1d3f17f127",
"md5": "b95abd624f9f9b5e7a48d0355f543f0e",
"sha256": "2e1b7c3e34a5396b0cfe008dc993a0910d43c15f08a9f6e6022012fe1c7d6468"
},
"downloads": -1,
"filename": "tract-0.21.8-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "b95abd624f9f9b5e7a48d0355f543f0e",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 7366639,
"upload_time": "2024-12-05T12:03:20",
"upload_time_iso_8601": "2024-12-05T12:03:20.521820Z",
"url": "https://files.pythonhosted.org/packages/b2/64/b88e5bc1a022a7f1b124901c70ae1e2e7cd6a63b7f0b2cf10d1d3f17f127/tract-0.21.8-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1bd6242cd5ba1c3505711a4f186115d8bc59f68d2fe7a8455b3c2b406adb2ad8",
"md5": "00ef07ebf4bc96c970e2c5220153e53d",
"sha256": "df0b441077c308bd6d923b4e22c575d8c622cf6ec0a0c3fb4fe0b2e85cb1e94c"
},
"downloads": -1,
"filename": "tract-0.21.8-cp37-cp37m-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "00ef07ebf4bc96c970e2c5220153e53d",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 7259013,
"upload_time": "2024-12-05T12:03:22",
"upload_time_iso_8601": "2024-12-05T12:03:22.836803Z",
"url": "https://files.pythonhosted.org/packages/1b/d6/242cd5ba1c3505711a4f186115d8bc59f68d2fe7a8455b3c2b406adb2ad8/tract-0.21.8-cp37-cp37m-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d51d1e6fb29f2916ce301d913e85cd3ec6d8929fe7f04bfe0296af52be470228",
"md5": "9436789e0b89389bea5e46b996c3c89d",
"sha256": "a7cccd83bc3530fa8516449d8731c1a847e4031214790c6e1675ee244b4456fa"
},
"downloads": -1,
"filename": "tract-0.21.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "9436789e0b89389bea5e46b996c3c89d",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 7690610,
"upload_time": "2024-12-05T12:03:24",
"upload_time_iso_8601": "2024-12-05T12:03:24.646509Z",
"url": "https://files.pythonhosted.org/packages/d5/1d/1e6fb29f2916ce301d913e85cd3ec6d8929fe7f04bfe0296af52be470228/tract-0.21.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "45d048a4f614cf1938dcb9d122cd460d34d4e554af872b3776573fcaeb59ee49",
"md5": "5cbd39f57a2098c3b45509cf9668a55e",
"sha256": "9bf5eb536a375c1716d23301f031e6db76255bc1bf7b0ac3ee112bf9750dcf56"
},
"downloads": -1,
"filename": "tract-0.21.8-cp37-cp37m-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "5cbd39f57a2098c3b45509cf9668a55e",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 7758224,
"upload_time": "2024-12-05T12:03:26",
"upload_time_iso_8601": "2024-12-05T12:03:26.730793Z",
"url": "https://files.pythonhosted.org/packages/45/d0/48a4f614cf1938dcb9d122cd460d34d4e554af872b3776573fcaeb59ee49/tract-0.21.8-cp37-cp37m-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ae2be10cd5b1c9448bb47df4b8b54e5f67cd789fca6378578a9c047c0b27cf47",
"md5": "2c86b8efc592eaf8fb544fe587e72b80",
"sha256": "90be7c1743d89656044f82a0a7350b812dac2d0ccb60ebc6986e84cc88d80038"
},
"downloads": -1,
"filename": "tract-0.21.8-cp38-cp38-macosx_10_12_universal2.whl",
"has_sig": false,
"md5_digest": "2c86b8efc592eaf8fb544fe587e72b80",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 13575825,
"upload_time": "2024-12-05T12:03:28",
"upload_time_iso_8601": "2024-12-05T12:03:28.676678Z",
"url": "https://files.pythonhosted.org/packages/ae/2b/e10cd5b1c9448bb47df4b8b54e5f67cd789fca6378578a9c047c0b27cf47/tract-0.21.8-cp38-cp38-macosx_10_12_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e69ef90627db7e3289fd42ba014c99a69a546dc4b4312d0580e52cc6c59ae1f5",
"md5": "583a753b70c264a739dbcfc92aa2d432",
"sha256": "5f87edf154467e39f55ae00ee824b766d10099998bd5db7f40a51655ccdad2bc"
},
"downloads": -1,
"filename": "tract-0.21.8-cp38-cp38-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "583a753b70c264a739dbcfc92aa2d432",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 7259004,
"upload_time": "2024-12-05T12:03:31",
"upload_time_iso_8601": "2024-12-05T12:03:31.057276Z",
"url": "https://files.pythonhosted.org/packages/e6/9e/f90627db7e3289fd42ba014c99a69a546dc4b4312d0580e52cc6c59ae1f5/tract-0.21.8-cp38-cp38-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8d141a09458b2cb110fea4ef1b4c12f8f61595fc81a2827f49fdaceff5623d18",
"md5": "b34dc7e360d3a7344519f249f478bd86",
"sha256": "a5fd80a1c60ee4f7c8e0767c13b95e27f3d456286cde4a18c08bc3e175e18e0a"
},
"downloads": -1,
"filename": "tract-0.21.8-cp38-cp38-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "b34dc7e360d3a7344519f249f478bd86",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 6330076,
"upload_time": "2024-12-05T12:03:32",
"upload_time_iso_8601": "2024-12-05T12:03:32.732787Z",
"url": "https://files.pythonhosted.org/packages/8d/14/1a09458b2cb110fea4ef1b4c12f8f61595fc81a2827f49fdaceff5623d18/tract-0.21.8-cp38-cp38-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e7ef1474c6df3640540cfdfda75df1341cdda09bd5872874c034d2f77caea1bb",
"md5": "909777b640b9431344667f832e9badd1",
"sha256": "1c8a20714408d8d4867271553ea9e0c2420c066c4b399daf6d44fa261c4a61f9"
},
"downloads": -1,
"filename": "tract-0.21.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "909777b640b9431344667f832e9badd1",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 7690605,
"upload_time": "2024-12-05T12:03:34",
"upload_time_iso_8601": "2024-12-05T12:03:34.534223Z",
"url": "https://files.pythonhosted.org/packages/e7/ef/1474c6df3640540cfdfda75df1341cdda09bd5872874c034d2f77caea1bb/tract-0.21.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e5435167b24effa010af554ee3e7670b183eb5fe81b8c4a881480cf883ba5391",
"md5": "f2cc07b1e42256fa839d6f213e973de4",
"sha256": "831afe7bea26abd1fd0e805d6f2d2646aaa93b75b04b0ea4db2883be6d1315d5"
},
"downloads": -1,
"filename": "tract-0.21.8-cp38-cp38-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "f2cc07b1e42256fa839d6f213e973de4",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 7758219,
"upload_time": "2024-12-05T12:03:36",
"upload_time_iso_8601": "2024-12-05T12:03:36.220716Z",
"url": "https://files.pythonhosted.org/packages/e5/43/5167b24effa010af554ee3e7670b183eb5fe81b8c4a881480cf883ba5391/tract-0.21.8-cp38-cp38-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d8201e542dfe17e50b0423842370bb93b5d021c65b411ab78f254a4588e8c09b",
"md5": "45218e14de1490c3bde16f4e3dab8007",
"sha256": "819df9a3a49e1b382601d5243f83295d3e262c5897646225dac770e8f0cdcb56"
},
"downloads": -1,
"filename": "tract-0.21.8-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "45218e14de1490c3bde16f4e3dab8007",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 7366632,
"upload_time": "2024-12-05T12:03:38",
"upload_time_iso_8601": "2024-12-05T12:03:38.331699Z",
"url": "https://files.pythonhosted.org/packages/d8/20/1e542dfe17e50b0423842370bb93b5d021c65b411ab78f254a4588e8c09b/tract-0.21.8-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "522f7fd76f147baf05ecd2de893a4f53035596092ae2c4e340e0ba44266c4963",
"md5": "e0eafc343e2c49ea029846d436ce16ec",
"sha256": "8921810118c9060621d2c071545d76f58f663ddb56c53765ac0cc403d326d200"
},
"downloads": -1,
"filename": "tract-0.21.8-cp39-cp39-macosx_10_12_universal2.whl",
"has_sig": false,
"md5_digest": "e0eafc343e2c49ea029846d436ce16ec",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 13575919,
"upload_time": "2024-12-05T12:03:41",
"upload_time_iso_8601": "2024-12-05T12:03:41.565291Z",
"url": "https://files.pythonhosted.org/packages/52/2f/7fd76f147baf05ecd2de893a4f53035596092ae2c4e340e0ba44266c4963/tract-0.21.8-cp39-cp39-macosx_10_12_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "819de36e44a9ee8b4c7bd61e24544120488fd2cdafd6f6ac639ffb10d63e8e06",
"md5": "6e6f58d91b2b5a3978e2c2b5b3cf1db0",
"sha256": "cdc20f9043b703fadc0a5d993129c9fc9d9612815bff349e76752d90f8034865"
},
"downloads": -1,
"filename": "tract-0.21.8-cp39-cp39-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "6e6f58d91b2b5a3978e2c2b5b3cf1db0",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 7259006,
"upload_time": "2024-12-05T12:03:44",
"upload_time_iso_8601": "2024-12-05T12:03:44.312459Z",
"url": "https://files.pythonhosted.org/packages/81/9d/e36e44a9ee8b4c7bd61e24544120488fd2cdafd6f6ac639ffb10d63e8e06/tract-0.21.8-cp39-cp39-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e6be93921cea013854553f15a2d6a54629cab96b1e1aaebc9c6e64ebfa44da6d",
"md5": "e79f3b42464b8c6b73ea598cb9ab5a7f",
"sha256": "75766f597690846ecf9f26213e59ba9ed40f66e429f522691ea0f19029d3c85b"
},
"downloads": -1,
"filename": "tract-0.21.8-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "e79f3b42464b8c6b73ea598cb9ab5a7f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 6330082,
"upload_time": "2024-12-05T12:03:45",
"upload_time_iso_8601": "2024-12-05T12:03:45.944303Z",
"url": "https://files.pythonhosted.org/packages/e6/be/93921cea013854553f15a2d6a54629cab96b1e1aaebc9c6e64ebfa44da6d/tract-0.21.8-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "879626f74a5f583868c241c673a0bd6e6def07c9a56a6612a5352442da7f1635",
"md5": "e1496f83ce21b15543e3dda6da4e006a",
"sha256": "762e59dd68a0ac052d59ee378d393acfe1f0baf45d48238b5c3146025936f44a"
},
"downloads": -1,
"filename": "tract-0.21.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e1496f83ce21b15543e3dda6da4e006a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 7690605,
"upload_time": "2024-12-05T12:03:47",
"upload_time_iso_8601": "2024-12-05T12:03:47.744964Z",
"url": "https://files.pythonhosted.org/packages/87/96/26f74a5f583868c241c673a0bd6e6def07c9a56a6612a5352442da7f1635/tract-0.21.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "adf5aa5eb478540f44857f3374154f67011279ef1b5e8ed4b972a2b81e286ef6",
"md5": "3d739608e4c289bd5c06ee31649a7197",
"sha256": "ba3b2ce60c7cf785f1df5940c9bfd7599b0169b79fdd8208649c843255f41476"
},
"downloads": -1,
"filename": "tract-0.21.8-cp39-cp39-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "3d739608e4c289bd5c06ee31649a7197",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 7758219,
"upload_time": "2024-12-05T12:03:49",
"upload_time_iso_8601": "2024-12-05T12:03:49.906464Z",
"url": "https://files.pythonhosted.org/packages/ad/f5/aa5eb478540f44857f3374154f67011279ef1b5e8ed4b972a2b81e286ef6/tract-0.21.8-cp39-cp39-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "83cb6c07f4b34576e095075b2f63f3285c91315f2736c937dacc44518c75317c",
"md5": "258173aaeb25b9f0a30ee45dccfe312c",
"sha256": "f45fe0bab4082536ae00269dd53a6b51e02e8f12879cd60551c830a4527b6425"
},
"downloads": -1,
"filename": "tract-0.21.8-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "258173aaeb25b9f0a30ee45dccfe312c",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 7366635,
"upload_time": "2024-12-05T12:03:51",
"upload_time_iso_8601": "2024-12-05T12:03:51.699261Z",
"url": "https://files.pythonhosted.org/packages/83/cb/6c07f4b34576e095075b2f63f3285c91315f2736c937dacc44518c75317c/tract-0.21.8-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6ee07aabadd3ed1a8de34ca21bf8ca2e0d19d9010de9f0debd986ad76c84aa99",
"md5": "47b288169a770e7b39d30d95e7b34a26",
"sha256": "6a49ce129a6d22051fda53d1dbb126a520ade9e1520609f262436e905e861bb7"
},
"downloads": -1,
"filename": "tract-0.21.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "47b288169a770e7b39d30d95e7b34a26",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.7",
"size": 7690615,
"upload_time": "2024-12-05T12:03:53",
"upload_time_iso_8601": "2024-12-05T12:03:53.462617Z",
"url": "https://files.pythonhosted.org/packages/6e/e0/7aabadd3ed1a8de34ca21bf8ca2e0d19d9010de9f0debd986ad76c84aa99/tract-0.21.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ede74d257eade9eb280a9b87f0006608c15e431fac8e49e80a64fc11a39ffad0",
"md5": "b8d45be9a4a10901f83ac093c8130120",
"sha256": "de90c47f18b7027aee7df568c898ce5962119bdfc5f32d7701eed1a9c5d4fd2a"
},
"downloads": -1,
"filename": "tract-0.21.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b8d45be9a4a10901f83ac093c8130120",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": ">=3.7",
"size": 7690612,
"upload_time": "2024-12-05T12:03:55",
"upload_time_iso_8601": "2024-12-05T12:03:55.135344Z",
"url": "https://files.pythonhosted.org/packages/ed/e7/4d257eade9eb280a9b87f0006608c15e431fac8e49e80a64fc11a39ffad0/tract-0.21.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6762b7a73ce9b079b4ab029c55b0e516d248e26bd73b13b7fa517dd67a99853e",
"md5": "79e99ff4c9041d5addd9fa94d8d0b919",
"sha256": "91c55978217bdf9d509b0f7f28052fcdcd18b4e012a2b0540004ba0ee72292cb"
},
"downloads": -1,
"filename": "tract-0.21.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "79e99ff4c9041d5addd9fa94d8d0b919",
"packagetype": "bdist_wheel",
"python_version": "pp38",
"requires_python": ">=3.7",
"size": 7690612,
"upload_time": "2024-12-05T12:03:56",
"upload_time_iso_8601": "2024-12-05T12:03:56.979394Z",
"url": "https://files.pythonhosted.org/packages/67/62/b7a73ce9b079b4ab029c55b0e516d248e26bd73b13b7fa517dd67a99853e/tract-0.21.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "50b2cdb4891d679218812a6ca640cf60c11d88adfdd17627f2c2aed6d352062c",
"md5": "a786332b695821483536c86b5c86603e",
"sha256": "895a284b56d1a4e23ba9528e69fad886fb5223ffb387970ac520d1c59a0d330f"
},
"downloads": -1,
"filename": "tract-0.21.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "a786332b695821483536c86b5c86603e",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.7",
"size": 7690613,
"upload_time": "2024-12-05T12:03:59",
"upload_time_iso_8601": "2024-12-05T12:03:59.708718Z",
"url": "https://files.pythonhosted.org/packages/50/b2/cdb4891d679218812a6ca640cf60c11d88adfdd17627f2c2aed6d352062c/tract-0.21.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "640de3fae5d6220eed339f62ce51b77c486017bfb14a85c33d0bef0ceadb98d8",
"md5": "eef753d8f8106a94c42133ac77acc303",
"sha256": "a0a0e51955dd4ad98999fedb7fce3024198b19fe013e43a8e352075a50ed2475"
},
"downloads": -1,
"filename": "tract-0.21.8.tar.gz",
"has_sig": false,
"md5_digest": "eef753d8f8106a94c42133ac77acc303",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 6557594,
"upload_time": "2024-12-05T12:04:01",
"upload_time_iso_8601": "2024-12-05T12:04:01.519865Z",
"url": "https://files.pythonhosted.org/packages/64/0d/e3fae5d6220eed339f62ce51b77c486017bfb14a85c33d0bef0ceadb98d8/tract-0.21.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-05 12:04:01",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "sonos",
"github_project": "tract",
"travis_ci": true,
"coveralls": false,
"github_actions": true,
"lcname": "tract"
}