<p align="center">
<img height="120" src="https://github.com/perpetual-ml/perpetual/raw/main/resources/perp_logo.png">
</p>
<div align="center">
[](https://pypi.org/project/perpetual)
[](https://pypi.org/project/perpetual)
[](https://crates.io/crates/perpetual)
[](https://discord.gg/AyUK7rr6wy)

</div>
# Perpetual
PerpetualBooster is a gradient boosting machine (GBM) algorithm that doesn't need hyperparameter optimization unlike other GBM algorithms. Similar to AutoML libraries, it has a `budget` parameter. Increasing the `budget` parameter increases the predictive power of the algorithm and gives better results on unseen data. Start with a small budget (e.g. 0.5) and increase it (e.g. 1.0) once you are confident with your features. If you don't see any improvement with further increasing the `budget`, it means that you are already extracting the most predictive power out of your data.
## Usage
You can use the algorithm like in the example below. Check examples folders for both Rust and Python.
```python
from perpetual import PerpetualBooster
model = PerpetualBooster(objective="SquaredLoss")
model.fit(X, y, budget=1.0)
```
## Documentation
Documentation for the Python API can be found [here](https://perpetual-ml.github.io/perpetual) and for the Rust API [here](https://docs.rs/perpetual/latest/perpetual/).
## Usage
You can use the algorithm like in the example below. Check examples folders for both Rust and Python.
```python
from perpetual import PerpetualBooster
model = PerpetualBooster(objective="SquaredLoss")
model.fit(X, y, budget=1.0)
```
## Documentation
Documentation for the Python API can be found [here](https://perpetual-ml.github.io/perpetual) and for the Rust API [here](https://docs.rs/perpetual/latest/perpetual/).
## Benchmark
### PerpetualBooster vs. Optuna + LightGBM
Hyperparameter optimization usually takes 100 iterations with plain GBM algorithms. PerpetualBooster achieves the same accuracy in a single run. Thus, it achieves up to 100x speed-up at the same accuracy with different `budget` levels and with different datasets.
The following table summarizes the results for the [California Housing](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_california_housing.html) dataset (regression):
| Perpetual budget | LightGBM n_estimators | Perpetual mse | LightGBM mse | Speed-up wall time | Speed-up cpu time |
| ---------------- | --------------------- | ------------- | ------------ | ------------------ | ----------------- |
| 1.0 | 100 | 0.192 | 0.192 | 54x | 56x |
| 1.5 | 300 | 0.188 | 0.188 | 59x | 58x |
| 2.1 | 1000 | 0.185 | 0.186 | 42x | 41x |
The following table summarizes the results for the [Cover Types](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_covtype.html) dataset (classification):
| Perpetual budget | LightGBM n_estimators | Perpetual log loss | LightGBM log loss | Speed-up wall time | Speed-up cpu time |
| ---------------- | --------------------- | ------------------ | ----------------- | ------------------ | ----------------- |
| 0.9 | 100 | 0.091 | 0.084 | 72x | 78x |
The results can be reproduced using the scripts in the [examples](./python-package/examples) folder.
### PerpetualBooster vs. AutoGluon
PerpetualBooster is a GBM but behaves like AutoML so it is benchmarked also against AutoGluon (v1.2, best quality preset), the current leader in [AutoML benchmark](https://automlbenchmark.streamlit.app/cd_diagram). Top 10 datasets with the most number of rows are selected from [OpenML datasets](https://www.openml.org/) for both regression and classification tasks.
The results are summarized in the following table for regression tasks:
| OpenML Task | Perpetual Training Duration | Perpetual Inference Duration | Perpetual RMSE | AutoGluon Training Duration | AutoGluon Inference Duration | AutoGluon RMSE |
| -------------------------------------------------------- | ----- | ----- | ------------------- | -------- | ------ | ------------------ |
| [Airlines_DepDelay_10M](https://www.openml.org/t/359929) | 518 | 11.3 | 29.0 | 520 | 30.9 | <ins> 28.8 </ins> |
| [bates_regr_100](https://www.openml.org/t/361940) | 3421 | 15.1 | <ins> 1.084 </ins> | OOM | OOM | OOM |
| [BNG(libras_move)](https://www.openml.org/t/7327) | 1956 | 4.2 | <ins> 2.51 </ins> | 1922 | 97.6 | 2.53 |
| [BNG(satellite_image)](https://www.openml.org/t/7326) | 334 | 1.6 | 0.731 | 337 | 10.0 | <ins> 0.721 </ins> |
| [COMET_MC](https://www.openml.org/t/14949) | 44 | 1.0 | <ins> 0.0615 </ins> | 47 | 5.0 | 0.0662 |
| [friedman1](https://www.openml.org/t/361939) | 275 | 4.2 | <ins> 1.047 </ins> | 278 | 5.1 | 1.487 |
| [poker](https://www.openml.org/t/10102) | 38 | 0.6 | <ins> 0.256 </ins> | 41 | 1.2 | 0.722 |
| [subset_higgs](https://www.openml.org/t/361955) | 868 | 10.6 | <ins> 0.420 </ins> | 870 | 24.5 | 0.421 |
| [BNG(autoHorse)](https://www.openml.org/t/7319) | 107 | 1.1 | <ins> 19.0 </ins> | 107 | 3.2 | 20.5 |
| [BNG(pbc)](https://www.openml.org/t/7318) | 48 | 0.6 | <ins> 836.5 </ins> | 51 | 0.2 | 957.1 |
| average | 465 | 3.9 | - | 464 | 19.7 | - |
PerpetualBooster outperformed AutoGluon on 8 out of 10 regression tasks, training equally fast and inferring 5.1x faster.
The results are summarized in the following table for classification tasks:
| OpenML Task | Perpetual Training Duration | Perpetual Inference Duration | Perpetual AUC | AutoGluon Training Duration | AutoGluon Inference Duration | AutoGluon AUC |
| -------------------------------------------------------- | ------- | ------ | ------------------- | -------- | ------ | ------------------ |
| [BNG(spambase)](https://www.openml.org/t/146163) | 70.1 | 2.1 | <ins> 0.671 </ins> | 73.1 | 3.7 | 0.669 |
| [BNG(trains)](https://www.openml.org/t/208) | 89.5 | 1.7 | <ins> 0.996 </ins> | 106.4 | 2.4 | 0.994 |
| [breast](https://www.openml.org/t/361942) | 13699.3 | 97.7 | <ins> 0.991 </ins> | 13330.7 | 79.7 | 0.949 |
| [Click_prediction_small](https://www.openml.org/t/7291) | 89.1 | 1.0 | <ins> 0.749 </ins> | 101.0 | 2.8 | 0.703 |
| [colon](https://www.openml.org/t/361938) | 12435.2 | 126.7 | <ins> 0.997 </ins> | 12356.2 | 152.3 | 0.997 |
| [Higgs](https://www.openml.org/t/362113) | 3485.3 | 40.9 | <ins> 0.843 </ins> | 3501.4 | 67.9 | 0.816 |
| [SEA(50000)](https://www.openml.org/t/230) | 21.9 | 0.2 | <ins> 0.936 </ins> | 25.6 | 0.5 | 0.935 |
| [sf-police-incidents](https://www.openml.org/t/359994) | 85.8 | 1.5 | <ins> 0.687 </ins> | 99.4 | 2.8 | 0.659 |
| [bates_classif_100](https://www.openml.org/t/361941) | 11152.8 | 50.0 | <ins> 0.864 </ins> | OOM | OOM | OOM |
| [prostate](https://www.openml.org/t/361945) | 13699.9 | 79.8 | <ins> 0.987 </ins> | OOM | OOM | OOM |
| average | 3747.0 | 34.0 | - | 3699.2 | 39.0 | - |
PerpetualBooster outperformed AutoGluon on 10 out of 10 classification tasks, training equally fast and inferring 1.1x faster.
PerpetualBooster demonstrates greater robustness compared to AutoGluon, successfully training on all 20 tasks, whereas AutoGluon encountered out-of-memory errors on 3 of those tasks.
The results can be reproduced using the automlbenchmark fork [here](https://github.com/deadsoul44/automlbenchmark).
## Installation
The package can be installed directly from [pypi](https://pypi.org/project/perpetual):
```shell
pip install perpetual
```
Using [conda-forge](https://anaconda.org/conda-forge/perpetual):
```shell
conda install conda-forge::perpetual
```
To use in a Rust project and to get the package from [crates.io](https://crates.io/crates/perpetual):
```shell
cargo add perpetual
```
## Contribution
Contributions are welcome. Check CONTRIBUTING.md for the guideline.
## Paper
PerpetualBooster prevents overfitting with a generalization algorithm. The paper is work-in-progress to explain how the algorithm works. Check our [blog post](https://perpetual-ml.com/blog/how-perpetual-works) for a high level introduction to the algorithm.
Raw data
{
"_id": null,
"home_page": "https://perpetual-ml.com",
"name": "perpetual",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "rust, perpetual, machine learning, tree model, decision tree, gradient boosted decision tree, gradient boosting machine",
"author": "Mutlu Simsek",
"author_email": "Mutlu Simsek <msimsek@perpetual-ml.com>",
"download_url": "https://files.pythonhosted.org/packages/43/33/778d64ca8cf61ac8d9451629ff1450889803a617497f3c543587282bfa49/perpetual-0.8.0.tar.gz",
"platform": null,
"description": "<p align=\"center\">\n <img height=\"120\" src=\"https://github.com/perpetual-ml/perpetual/raw/main/resources/perp_logo.png\">\n</p>\n\n<div align=\"center\">\n\n[](https://pypi.org/project/perpetual)\n[](https://pypi.org/project/perpetual)\n[](https://crates.io/crates/perpetual)\n[](https://discord.gg/AyUK7rr6wy)\n\n\n</div>\n\n# Perpetual\n\nPerpetualBooster is a gradient boosting machine (GBM) algorithm that doesn't need hyperparameter optimization unlike other GBM algorithms. Similar to AutoML libraries, it has a `budget` parameter. Increasing the `budget` parameter increases the predictive power of the algorithm and gives better results on unseen data. Start with a small budget (e.g. 0.5) and increase it (e.g. 1.0) once you are confident with your features. If you don't see any improvement with further increasing the `budget`, it means that you are already extracting the most predictive power out of your data.\n\n## Usage\n\nYou can use the algorithm like in the example below. Check examples folders for both Rust and Python.\n\n```python\nfrom perpetual import PerpetualBooster\n\nmodel = PerpetualBooster(objective=\"SquaredLoss\")\nmodel.fit(X, y, budget=1.0)\n```\n\n## Documentation\n\nDocumentation for the Python API can be found [here](https://perpetual-ml.github.io/perpetual) and for the Rust API [here](https://docs.rs/perpetual/latest/perpetual/).\n\n## Usage\n\nYou can use the algorithm like in the example below. Check examples folders for both Rust and Python.\n\n```python\nfrom perpetual import PerpetualBooster\n\nmodel = PerpetualBooster(objective=\"SquaredLoss\")\nmodel.fit(X, y, budget=1.0)\n```\n\n## Documentation\n\nDocumentation for the Python API can be found [here](https://perpetual-ml.github.io/perpetual) and for the Rust API [here](https://docs.rs/perpetual/latest/perpetual/).\n\n## Benchmark\n\n### PerpetualBooster vs. Optuna + LightGBM\n\nHyperparameter optimization usually takes 100 iterations with plain GBM algorithms. PerpetualBooster achieves the same accuracy in a single run. Thus, it achieves up to 100x speed-up at the same accuracy with different `budget` levels and with different datasets.\n\nThe following table summarizes the results for the [California Housing](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_california_housing.html) dataset (regression):\n\n| Perpetual budget | LightGBM n_estimators | Perpetual mse | LightGBM mse | Speed-up wall time | Speed-up cpu time |\n| ---------------- | --------------------- | ------------- | ------------ | ------------------ | ----------------- |\n| 1.0 | 100 | 0.192 | 0.192 | 54x | 56x |\n| 1.5 | 300 | 0.188 | 0.188 | 59x | 58x |\n| 2.1 | 1000 | 0.185 | 0.186 | 42x | 41x |\n\nThe following table summarizes the results for the [Cover Types](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_covtype.html) dataset (classification):\n\n| Perpetual budget | LightGBM n_estimators | Perpetual log loss | LightGBM log loss | Speed-up wall time | Speed-up cpu time |\n| ---------------- | --------------------- | ------------------ | ----------------- | ------------------ | ----------------- |\n| 0.9 | 100 | 0.091 | 0.084 | 72x | 78x |\n\nThe results can be reproduced using the scripts in the [examples](./python-package/examples) folder.\n\n### PerpetualBooster vs. AutoGluon\n\nPerpetualBooster is a GBM but behaves like AutoML so it is benchmarked also against AutoGluon (v1.2, best quality preset), the current leader in [AutoML benchmark](https://automlbenchmark.streamlit.app/cd_diagram). Top 10 datasets with the most number of rows are selected from [OpenML datasets](https://www.openml.org/) for both regression and classification tasks. \n\nThe results are summarized in the following table for regression tasks:\n\n| OpenML Task | Perpetual Training Duration | Perpetual Inference Duration | Perpetual RMSE | AutoGluon Training Duration | AutoGluon Inference Duration | AutoGluon RMSE |\n| -------------------------------------------------------- | ----- | ----- | ------------------- | -------- | ------ | ------------------ |\n| [Airlines_DepDelay_10M](https://www.openml.org/t/359929) | 518 | 11.3 | 29.0 | 520 | 30.9 | <ins> 28.8 </ins> |\n| [bates_regr_100](https://www.openml.org/t/361940) | 3421 | 15.1 | <ins> 1.084 </ins> | OOM | OOM | OOM |\n| [BNG(libras_move)](https://www.openml.org/t/7327) | 1956 | 4.2 | <ins> 2.51 </ins> | 1922 | 97.6 | 2.53 |\n| [BNG(satellite_image)](https://www.openml.org/t/7326) | 334 | 1.6 | 0.731 | 337 | 10.0 | <ins> 0.721 </ins> |\n| [COMET_MC](https://www.openml.org/t/14949) | 44 | 1.0 | <ins> 0.0615 </ins> | 47 | 5.0 | 0.0662 |\n| [friedman1](https://www.openml.org/t/361939) | 275 | 4.2 | <ins> 1.047 </ins> | 278 | 5.1 | 1.487 |\n| [poker](https://www.openml.org/t/10102) | 38 | 0.6 | <ins> 0.256 </ins> | 41 | 1.2 | 0.722 |\n| [subset_higgs](https://www.openml.org/t/361955) | 868 | 10.6 | <ins> 0.420 </ins> | 870 | 24.5 | 0.421 |\n| [BNG(autoHorse)](https://www.openml.org/t/7319) | 107 | 1.1 | <ins> 19.0 </ins> | 107 | 3.2 | 20.5 |\n| [BNG(pbc)](https://www.openml.org/t/7318) | 48 | 0.6 | <ins> 836.5 </ins> | 51 | 0.2 | 957.1 |\n| average | 465 | 3.9 | - | 464 | 19.7 | - |\n\nPerpetualBooster outperformed AutoGluon on 8 out of 10 regression tasks, training equally fast and inferring 5.1x faster. \n\nThe results are summarized in the following table for classification tasks:\n\n| OpenML Task | Perpetual Training Duration | Perpetual Inference Duration | Perpetual AUC | AutoGluon Training Duration | AutoGluon Inference Duration | AutoGluon AUC |\n| -------------------------------------------------------- | ------- | ------ | ------------------- | -------- | ------ | ------------------ |\n| [BNG(spambase)](https://www.openml.org/t/146163) | 70.1 | 2.1 | <ins> 0.671 </ins> | 73.1 | 3.7 | 0.669 |\n| [BNG(trains)](https://www.openml.org/t/208) | 89.5 | 1.7 | <ins> 0.996 </ins> | 106.4 | 2.4 | 0.994 |\n| [breast](https://www.openml.org/t/361942) | 13699.3 | 97.7 | <ins> 0.991 </ins> | 13330.7 | 79.7 | 0.949 |\n| [Click_prediction_small](https://www.openml.org/t/7291) | 89.1 | 1.0 | <ins> 0.749 </ins> | 101.0 | 2.8 | 0.703 |\n| [colon](https://www.openml.org/t/361938) | 12435.2 | 126.7 | <ins> 0.997 </ins> | 12356.2 | 152.3 | 0.997 |\n| [Higgs](https://www.openml.org/t/362113) | 3485.3 | 40.9 | <ins> 0.843 </ins> | 3501.4 | 67.9 | 0.816 |\n| [SEA(50000)](https://www.openml.org/t/230) | 21.9 | 0.2 | <ins> 0.936 </ins> | 25.6 | 0.5 | 0.935 |\n| [sf-police-incidents](https://www.openml.org/t/359994) | 85.8 | 1.5 | <ins> 0.687 </ins> | 99.4 | 2.8 | 0.659 |\n| [bates_classif_100](https://www.openml.org/t/361941) | 11152.8 | 50.0 | <ins> 0.864 </ins> | OOM | OOM | OOM |\n| [prostate](https://www.openml.org/t/361945) | 13699.9 | 79.8 | <ins> 0.987 </ins> | OOM | OOM | OOM |\n| average | 3747.0 | 34.0 | - | 3699.2 | 39.0 | - |\n\nPerpetualBooster outperformed AutoGluon on 10 out of 10 classification tasks, training equally fast and inferring 1.1x faster. \n\nPerpetualBooster demonstrates greater robustness compared to AutoGluon, successfully training on all 20 tasks, whereas AutoGluon encountered out-of-memory errors on 3 of those tasks.\n\nThe results can be reproduced using the automlbenchmark fork [here](https://github.com/deadsoul44/automlbenchmark).\n\n\n\n## Installation\n\nThe package can be installed directly from [pypi](https://pypi.org/project/perpetual):\n\n```shell\npip install perpetual\n```\n\nUsing [conda-forge](https://anaconda.org/conda-forge/perpetual):\n\n```shell\nconda install conda-forge::perpetual\n```\n\nTo use in a Rust project and to get the package from [crates.io](https://crates.io/crates/perpetual):\n\n```shell\ncargo add perpetual\n```\n\n## Contribution\n\nContributions are welcome. Check CONTRIBUTING.md for the guideline.\n\n## Paper\n\nPerpetualBooster prevents overfitting with a generalization algorithm. The paper is work-in-progress to explain how the algorithm works. Check our [blog post](https://perpetual-ml.com/blog/how-perpetual-works) for a high level introduction to the algorithm.\n\n",
"bugtrack_url": null,
"license": null,
"summary": "A self-generalizing gradient boosting machine that doesn't need hyperparameter optimization",
"version": "0.8.0",
"project_urls": {
"Homepage": "https://perpetual-ml.com",
"Source Code": "https://github.com/perpetual-ml/perpetual"
},
"split_keywords": [
"rust",
" perpetual",
" machine learning",
" tree model",
" decision tree",
" gradient boosted decision tree",
" gradient boosting machine"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "1611dcfbd2c46e3cb7c9d8c1148e2b9a3f1fdf9a372bdddb774044302931720e",
"md5": "6646f7466da80d9ed079fb8617ceca19",
"sha256": "471139f4b54fb7f3e71cff93cec5ac8745caf3ee850b0ce1f0730d554ecdd82f"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "6646f7466da80d9ed079fb8617ceca19",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 897859,
"upload_time": "2025-02-23T09:09:36",
"upload_time_iso_8601": "2025-02-23T09:09:36.866994Z",
"url": "https://files.pythonhosted.org/packages/16/11/dcfbd2c46e3cb7c9d8c1148e2b9a3f1fdf9a372bdddb774044302931720e/perpetual-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3b79172a495a176210a64c9e1589cb67a76b29e1e24446902a30a9afc92a12e3",
"md5": "d18b4b8e10ec841cf95d9eb70803362c",
"sha256": "af4b591c2f4d48859782658a8d9920f038fc0941de5b3501c69ccad691886222"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "d18b4b8e10ec841cf95d9eb70803362c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 946505,
"upload_time": "2025-02-23T09:09:39",
"upload_time_iso_8601": "2025-02-23T09:09:39.694390Z",
"url": "https://files.pythonhosted.org/packages/3b/79/172a495a176210a64c9e1589cb67a76b29e1e24446902a30a9afc92a12e3/perpetual-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "22f68743d19481c81e0ad2ec29f457d5044139a632d7beccebbea40c8ee2d14a",
"md5": "72ce13731a9b740f12d27c8d76ec2158",
"sha256": "2375d687aed8e1d46d58f5f825677c636c720089b2e33dc90aa26819077825a0"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp310-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "72ce13731a9b740f12d27c8d76ec2158",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 675297,
"upload_time": "2025-02-23T09:09:42",
"upload_time_iso_8601": "2025-02-23T09:09:42.053100Z",
"url": "https://files.pythonhosted.org/packages/22/f6/8743d19481c81e0ad2ec29f457d5044139a632d7beccebbea40c8ee2d14a/perpetual-0.8.0-cp310-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c9f6ce3ef455b0847cd2b9d2a5c9ec11454d7cd62da4d5ebace94f88cc2970a3",
"md5": "2818b929c9090a1ab15c504204fabd08",
"sha256": "73921ed05302b44cfc21d39741d0dbb168e935066774ef385fd0af00657ab186"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "2818b929c9090a1ab15c504204fabd08",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 725981,
"upload_time": "2025-02-23T09:09:44",
"upload_time_iso_8601": "2025-02-23T09:09:44.364315Z",
"url": "https://files.pythonhosted.org/packages/c9/f6/ce3ef455b0847cd2b9d2a5c9ec11454d7cd62da4d5ebace94f88cc2970a3/perpetual-0.8.0-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "21bd65a6b402ed7689223673851255b515a7edd24e801c1bb01a2e54b5297e00",
"md5": "a3e0077246bb8416fa0d0a8a83b479ad",
"sha256": "29895c3878cabad0476571deda40ee2e0c1c1bccdd78272abc3f205c18a3c871"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "a3e0077246bb8416fa0d0a8a83b479ad",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 679867,
"upload_time": "2025-02-23T09:09:46",
"upload_time_iso_8601": "2025-02-23T09:09:46.679100Z",
"url": "https://files.pythonhosted.org/packages/21/bd/65a6b402ed7689223673851255b515a7edd24e801c1bb01a2e54b5297e00/perpetual-0.8.0-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e132e9f5c297de9c1ff453072d7feb956ebb169ae69f7b0f6d91c57cf93081ea",
"md5": "df561ac408933f703dc8a1e655d501b3",
"sha256": "04118685fc39362a315db1d537a0b884c6532d6552d9a3d27ad47dc3b9b749fb"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "df561ac408933f703dc8a1e655d501b3",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 897790,
"upload_time": "2025-02-23T09:09:48",
"upload_time_iso_8601": "2025-02-23T09:09:48.978745Z",
"url": "https://files.pythonhosted.org/packages/e1/32/e9f5c297de9c1ff453072d7feb956ebb169ae69f7b0f6d91c57cf93081ea/perpetual-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "240b175c3ffb115e48ce80bba8dea990ee4d1e18b937681afc7401583c64909e",
"md5": "6027d1609b70c2be0f8625b44fde64f8",
"sha256": "e91b5c2427d6ec82cd86902ff14ec66a5e226e3f734f16ae1b6085fb9adc77b1"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "6027d1609b70c2be0f8625b44fde64f8",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 946557,
"upload_time": "2025-02-23T09:09:51",
"upload_time_iso_8601": "2025-02-23T09:09:51.495625Z",
"url": "https://files.pythonhosted.org/packages/24/0b/175c3ffb115e48ce80bba8dea990ee4d1e18b937681afc7401583c64909e/perpetual-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a3d676237d63d968badeadec124d76bf20ef6d13af1f49a02a9ad6a5f19db1f4",
"md5": "0282c3fe35805499e346576c0e7737a0",
"sha256": "e06187af5c7cc41de9c297d6a7ea069f789f4e075d1233ff3c067f7abd962dac"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp311-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "0282c3fe35805499e346576c0e7737a0",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 675282,
"upload_time": "2025-02-23T09:09:55",
"upload_time_iso_8601": "2025-02-23T09:09:55.069392Z",
"url": "https://files.pythonhosted.org/packages/a3/d6/76237d63d968badeadec124d76bf20ef6d13af1f49a02a9ad6a5f19db1f4/perpetual-0.8.0-cp311-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "25300021b94ada01331b8e37fae4ebad88515ac9b9c49043f3df95e319039744",
"md5": "7439e80e4cb3eba5a34d23ea08a0852b",
"sha256": "93e7c26e7089aacf843bcadb0ba57f27cdf51b348f81e5a6c2beb04400f82ef0"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "7439e80e4cb3eba5a34d23ea08a0852b",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 723593,
"upload_time": "2025-02-23T09:09:58",
"upload_time_iso_8601": "2025-02-23T09:09:58.011981Z",
"url": "https://files.pythonhosted.org/packages/25/30/0021b94ada01331b8e37fae4ebad88515ac9b9c49043f3df95e319039744/perpetual-0.8.0-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2a8a814862f2ca870be86889e0205e77fa01f57ca3ec4bbe034841efeadbc515",
"md5": "5edd13725509448dcacf408bde907536",
"sha256": "e3e7c64ac3bfaa44bd522d3f41f6bea3261347907f80b3b83ab8c600f2cbc975"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "5edd13725509448dcacf408bde907536",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 678040,
"upload_time": "2025-02-23T09:09:59",
"upload_time_iso_8601": "2025-02-23T09:09:59.476957Z",
"url": "https://files.pythonhosted.org/packages/2a/8a/814862f2ca870be86889e0205e77fa01f57ca3ec4bbe034841efeadbc515/perpetual-0.8.0-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b06295efd076b2695f54ca1fa575e70eaddd457cd8479a119ea82c9c8a0b3b10",
"md5": "55f2dd9358174ebecd04be3a8cae6b83",
"sha256": "4f9d0cb2bd9923f412a4a52d144f8959aca4a5bd01c595b02098b70ae9fb7763"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "55f2dd9358174ebecd04be3a8cae6b83",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 896339,
"upload_time": "2025-02-23T09:10:01",
"upload_time_iso_8601": "2025-02-23T09:10:01.360998Z",
"url": "https://files.pythonhosted.org/packages/b0/62/95efd076b2695f54ca1fa575e70eaddd457cd8479a119ea82c9c8a0b3b10/perpetual-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c13f1810d2f9154f640ec641b3763adcab3dd343c25ea447780375a2745a437a",
"md5": "41f3b4cb57990dede775327b1136f827",
"sha256": "33333f1e5370bd3525ce35724660aae910b9384ed0739639ed0aed2f85f1f2db"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "41f3b4cb57990dede775327b1136f827",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 946224,
"upload_time": "2025-02-23T09:10:03",
"upload_time_iso_8601": "2025-02-23T09:10:03.655346Z",
"url": "https://files.pythonhosted.org/packages/c1/3f/1810d2f9154f640ec641b3763adcab3dd343c25ea447780375a2745a437a/perpetual-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bdff8e3bbf8a9c94a9529625242f45fddd4302c44ac17a367f606cc3fcbfe037",
"md5": "75cb7ee15a8e88fcac1a220a90199b7b",
"sha256": "3092391b7cf5c3d9ed8897076aa329f8a3a3ea8956522f768793eced020c3578"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp312-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "75cb7ee15a8e88fcac1a220a90199b7b",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 675604,
"upload_time": "2025-02-23T09:10:05",
"upload_time_iso_8601": "2025-02-23T09:10:05.228961Z",
"url": "https://files.pythonhosted.org/packages/bd/ff/8e3bbf8a9c94a9529625242f45fddd4302c44ac17a367f606cc3fcbfe037/perpetual-0.8.0-cp312-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c7fe8c9cede20b91f63425e23301c0e7af598be5f9e553e16ea9d3a284d0a7ef",
"md5": "65ef6a4ae2f72f00e547343eff78ad79",
"sha256": "2bd99d49570e7c516d94dc833a63ecab8c732912d39a9f79308709201a857aed"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp313-cp313-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "65ef6a4ae2f72f00e547343eff78ad79",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 722713,
"upload_time": "2025-02-23T09:10:06",
"upload_time_iso_8601": "2025-02-23T09:10:06.611901Z",
"url": "https://files.pythonhosted.org/packages/c7/fe/8c9cede20b91f63425e23301c0e7af598be5f9e553e16ea9d3a284d0a7ef/perpetual-0.8.0-cp313-cp313-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f15f61c96b80e1d6bf7ed4b8a16b511df14ef05bee786308999730a285ccbacf",
"md5": "bce96a0d8dd78711296edad20e93c574",
"sha256": "3e0f6a40741dc97a1034f3f3111678c63717a4045c70e93eb1df14263e093a61"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "bce96a0d8dd78711296edad20e93c574",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 677325,
"upload_time": "2025-02-23T09:10:07",
"upload_time_iso_8601": "2025-02-23T09:10:07.985559Z",
"url": "https://files.pythonhosted.org/packages/f1/5f/61c96b80e1d6bf7ed4b8a16b511df14ef05bee786308999730a285ccbacf/perpetual-0.8.0-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6eb4594c6e5093a7c8aa2c57b800b1a924aacc26eb856e098804a090913709d5",
"md5": "9abd09cc5e9c122c9823f041445c4bac",
"sha256": "b849655bf0304349fe2794070ab13e27ecfc63e7cba11d876ab4f8847e11dfe3"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "9abd09cc5e9c122c9823f041445c4bac",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 895922,
"upload_time": "2025-02-23T09:10:09",
"upload_time_iso_8601": "2025-02-23T09:10:09.482807Z",
"url": "https://files.pythonhosted.org/packages/6e/b4/594c6e5093a7c8aa2c57b800b1a924aacc26eb856e098804a090913709d5/perpetual-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c582f99e8ec16e88731b8e4618b24ac1838d03da24409463a5921d154b42952d",
"md5": "c62e268168d2ca2fdafa43ea82d6f543",
"sha256": "5151c9ee0eb5a4cc3bd56f67661006f0f0fa07e361cc1ec27447a8ceba8a0933"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c62e268168d2ca2fdafa43ea82d6f543",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 945533,
"upload_time": "2025-02-23T09:10:11",
"upload_time_iso_8601": "2025-02-23T09:10:11.937870Z",
"url": "https://files.pythonhosted.org/packages/c5/82/f99e8ec16e88731b8e4618b24ac1838d03da24409463a5921d154b42952d/perpetual-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3d88cb029555cc0e63aa246890bd887ea67c4a4733a85a937ece5f75ad27cf4d",
"md5": "e9dc9949c34712a66892dd858de0efbd",
"sha256": "30405a59f7a267abfbf55c290eb2935494527e8e0ec24db8981791fe64b4c553"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp313-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "e9dc9949c34712a66892dd858de0efbd",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 675105,
"upload_time": "2025-02-23T09:10:14",
"upload_time_iso_8601": "2025-02-23T09:10:14.349830Z",
"url": "https://files.pythonhosted.org/packages/3d/88/cb029555cc0e63aa246890bd887ea67c4a4733a85a937ece5f75ad27cf4d/perpetual-0.8.0-cp313-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "927fe14d664efcda0f335ad656d89491a00b6a64ea7bb14e796ccc137ab62030",
"md5": "f43076de4a4d5948f8d617f6b6db0ea4",
"sha256": "5c0c9872515d11c3d8cb8c8cff4bb8e2d2fc7d2a35bb7056fa635106a0b3211e"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "f43076de4a4d5948f8d617f6b6db0ea4",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 898804,
"upload_time": "2025-02-23T09:10:16",
"upload_time_iso_8601": "2025-02-23T09:10:16.611609Z",
"url": "https://files.pythonhosted.org/packages/92/7f/e14d664efcda0f335ad656d89491a00b6a64ea7bb14e796ccc137ab62030/perpetual-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "04d993fd16ec7866055631798e7e9cf21d0d3a7136e095cfec49644e4149fdbb",
"md5": "8203cda3d2972f24bff9ea1979335701",
"sha256": "236ad046f2bfa6b4d73adf23f4c82b3eed3c3a08446c5bc69d3887a112ce74bb"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8203cda3d2972f24bff9ea1979335701",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 947746,
"upload_time": "2025-02-23T09:10:19",
"upload_time_iso_8601": "2025-02-23T09:10:19.028906Z",
"url": "https://files.pythonhosted.org/packages/04/d9/93fd16ec7866055631798e7e9cf21d0d3a7136e095cfec49644e4149fdbb/perpetual-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ed93f2d072d86310f21381155d40c7321beedbc2db61e0904569fcdae6d43894",
"md5": "c19555f058240f1474c657cfd5cfe7e3",
"sha256": "f0a4f7ac45a9f19b546ea94fe47197af01118f2636bcce104c6c94187c98cbf1"
},
"downloads": -1,
"filename": "perpetual-0.8.0-cp39-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "c19555f058240f1474c657cfd5cfe7e3",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 676579,
"upload_time": "2025-02-23T09:10:20",
"upload_time_iso_8601": "2025-02-23T09:10:20.483595Z",
"url": "https://files.pythonhosted.org/packages/ed/93/f2d072d86310f21381155d40c7321beedbc2db61e0904569fcdae6d43894/perpetual-0.8.0-cp39-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4333778d64ca8cf61ac8d9451629ff1450889803a617497f3c543587282bfa49",
"md5": "f9eb049e4e84b9b3cd7dbfab38cf59e2",
"sha256": "f08b03292602735ede39b2fe07b9869f1998885606c91a29327ee286eb985243"
},
"downloads": -1,
"filename": "perpetual-0.8.0.tar.gz",
"has_sig": false,
"md5_digest": "f9eb049e4e84b9b3cd7dbfab38cf59e2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 280625,
"upload_time": "2025-02-23T09:10:21",
"upload_time_iso_8601": "2025-02-23T09:10:21.854592Z",
"url": "https://files.pythonhosted.org/packages/43/33/778d64ca8cf61ac8d9451629ff1450889803a617497f3c543587282bfa49/perpetual-0.8.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-23 09:10:21",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "perpetual-ml",
"github_project": "perpetual",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "perpetual"
}