perpetual


Nameperpetual JSON
Version 0.7.10 PyPI version JSON
download
home_pagehttps://perpetual-ml.com
SummaryA self-generalizing gradient boosting machine which doesn't need hyperparameter optimization
upload_time2024-12-02 17:13:00
maintainerNone
docs_urlNone
authorMutlu Simsek
requires_python>=3.9
licenseNone
keywords rust perpetual machine learning tree model decision tree gradient boosted decision tree gradient boosting machine
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <p align="center">
  <img  height="120" src="https://github.com/perpetual-ml/perpetual/raw/main/resources/perp_logo.png">
</p>

<div align="center">

[![Python Versions](https://img.shields.io/pypi/pyversions/perpetual.svg?logo=python&logoColor=white)](https://pypi.org/project/perpetual)
[![PyPI Version](https://img.shields.io/pypi/v/perpetual.svg?logo=pypi&logoColor=white)](https://pypi.org/project/perpetual)
[![Crates.io Version](https://img.shields.io/crates/v/perpetual?logo=rust&logoColor=white)](https://crates.io/crates/perpetual)
[![Static Badge](https://img.shields.io/badge/join-discord-blue?logo=discord)](https://discord.gg/AyUK7rr6wy)
![PyPI - Downloads](https://img.shields.io/pypi/dm/perpetual)

</div>

# Perpetual

PerpetualBooster is a gradient boosting machine (GBM) algorithm which 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. 1.0) and increase it (e.g. 2.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.

## Benchmark

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 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/). 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](openml.org/t/359929) | 518                         | 11.3                                                              | 29.0           | 520                         | 30.9 <td style="background-color:green;color:white;"> 28.8 </td>  |
| [bates_regr_100](openml.org/t/361940)        | 3421                        | 15.1 <td style="background-color:green;color:white;"> 1.084 </td> | OOM            | OOM                         | OOM                                                               |
| [BNG(libras_move)](openml.org/t/7327)        | 1956                        | 4.2 <td style="background-color:green;color:white;"> 2.51 </td>   | 1922           | 97.6                        | 2.53                                                              |
| [BNG(satellite_image)](openml.org/t/7326)    | 334                         | 1.6                                                               | 0.731          | 337                         | 10.0 <td style="background-color:green;color:white;"> 0.721 </td> |
| [COMET_MC](openml.org/t/14949)               | 44                          | 1.0 <td style="background-color:green;color:white;"> 0.0615 </td> | 47             | 5.0                         | 0.0662                                                            |
| [friedman1](openml.org/t/361939)             | 275                         | 4.2 <td style="background-color:green;color:white;"> 1.047 </td>  | 278            | 5.1                         | 1.487                                                             |
| [poker](openml.org/t/10102)                  | 38                          | 0.6 <td style="background-color:green;color:white;"> 0.256 </td>  | 41             | 1.2                         | 0.722                                                             |
| [subset_higgs](openml.org/t/361955)          | 868                         | 10.6 <td style="background-color:green;color:white;"> 0.420 </td> | 870            | 24.5                        | 0.421                                                             |
| [BNG(autoHorse)](openml.org/t/7319)          | 107                         | 1.1 <td style="background-color:green;color:white;"> 19.0 </td>   | 107            | 3.2                         | 20.5                                                              |
| [BNG(pbc)](openml.org/t/7318)                | 48                          | 0.6 <td style="background-color:green;color:white;"> 836.5 </td>  | 51             | 0.2                         | 957.1                                                             |
| average                                      | 465                         | 3.9                                                               | -              | 464                         | 19.7                                                              | -              |

PerpetualBooster outperformed AutoGluon on 8 out of 10 datasets, training equally fast and inferring 5x faster. The results can be reproduced using the automlbenchmark fork [here](https://github.com/deadsoul44/automlbenchmark).

## 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/).

## 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/9d/f4/9d8f94e035787d67530ca08dbd8cfa274518be3fad0b95346c3017e8e2d9/perpetual-0.7.10.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[![Python Versions](https://img.shields.io/pypi/pyversions/perpetual.svg?logo=python&logoColor=white)](https://pypi.org/project/perpetual)\n[![PyPI Version](https://img.shields.io/pypi/v/perpetual.svg?logo=pypi&logoColor=white)](https://pypi.org/project/perpetual)\n[![Crates.io Version](https://img.shields.io/crates/v/perpetual?logo=rust&logoColor=white)](https://crates.io/crates/perpetual)\n[![Static Badge](https://img.shields.io/badge/join-discord-blue?logo=discord)](https://discord.gg/AyUK7rr6wy)\n![PyPI - Downloads](https://img.shields.io/pypi/dm/perpetual)\n\n</div>\n\n# Perpetual\n\nPerpetualBooster is a gradient boosting machine (GBM) algorithm which 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. 1.0) and increase it (e.g. 2.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## Benchmark\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\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/). The 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](openml.org/t/359929) | 518                         | 11.3                                                              | 29.0           | 520                         | 30.9 <td style=\"background-color:green;color:white;\"> 28.8 </td>  |\n| [bates_regr_100](openml.org/t/361940)        | 3421                        | 15.1 <td style=\"background-color:green;color:white;\"> 1.084 </td> | OOM            | OOM                         | OOM                                                               |\n| [BNG(libras_move)](openml.org/t/7327)        | 1956                        | 4.2 <td style=\"background-color:green;color:white;\"> 2.51 </td>   | 1922           | 97.6                        | 2.53                                                              |\n| [BNG(satellite_image)](openml.org/t/7326)    | 334                         | 1.6                                                               | 0.731          | 337                         | 10.0 <td style=\"background-color:green;color:white;\"> 0.721 </td> |\n| [COMET_MC](openml.org/t/14949)               | 44                          | 1.0 <td style=\"background-color:green;color:white;\"> 0.0615 </td> | 47             | 5.0                         | 0.0662                                                            |\n| [friedman1](openml.org/t/361939)             | 275                         | 4.2 <td style=\"background-color:green;color:white;\"> 1.047 </td>  | 278            | 5.1                         | 1.487                                                             |\n| [poker](openml.org/t/10102)                  | 38                          | 0.6 <td style=\"background-color:green;color:white;\"> 0.256 </td>  | 41             | 1.2                         | 0.722                                                             |\n| [subset_higgs](openml.org/t/361955)          | 868                         | 10.6 <td style=\"background-color:green;color:white;\"> 0.420 </td> | 870            | 24.5                        | 0.421                                                             |\n| [BNG(autoHorse)](openml.org/t/7319)          | 107                         | 1.1 <td style=\"background-color:green;color:white;\"> 19.0 </td>   | 107            | 3.2                         | 20.5                                                              |\n| [BNG(pbc)](openml.org/t/7318)                | 48                          | 0.6 <td style=\"background-color:green;color:white;\"> 836.5 </td>  | 51             | 0.2                         | 957.1                                                             |\n| average                                      | 465                         | 3.9                                                               | -              | 464                         | 19.7                                                              | -              |\n\nPerpetualBooster outperformed AutoGluon on 8 out of 10 datasets, training equally fast and inferring 5x faster. The results can be reproduced using the automlbenchmark fork [here](https://github.com/deadsoul44/automlbenchmark).\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## 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 which doesn't need hyperparameter optimization",
    "version": "0.7.10",
    "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": "",
            "digests": {
                "blake2b_256": "5cef15487bac34f4017ad73fba217db3107a426899642248826af7e480d8b742",
                "md5": "9820ab329ece6c242b92d37d1c849ceb",
                "sha256": "6c8123465e56ebecfa4bd1d82d223202866e835dcc930c0b664672dbc7fdf847"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9820ab329ece6c242b92d37d1c849ceb",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 895080,
            "upload_time": "2024-12-02T17:12:35",
            "upload_time_iso_8601": "2024-12-02T17:12:35.696930Z",
            "url": "https://files.pythonhosted.org/packages/5c/ef/15487bac34f4017ad73fba217db3107a426899642248826af7e480d8b742/perpetual-0.7.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8f15fe6fe4b279dfcfd5e104481493f7d8832c041e91007562da919c1df201d5",
                "md5": "4a98ed4da63b4cfb5ede075af6aca193",
                "sha256": "3b26ca5d72c99c90e4df3d2e965d38e5d88a1fa6488f76d44b5939c59aa5213c"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp310-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "4a98ed4da63b4cfb5ede075af6aca193",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 631802,
            "upload_time": "2024-12-02T17:12:38",
            "upload_time_iso_8601": "2024-12-02T17:12:38.594446Z",
            "url": "https://files.pythonhosted.org/packages/8f/15/fe6fe4b279dfcfd5e104481493f7d8832c041e91007562da919c1df201d5/perpetual-0.7.10-cp310-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c766c7844dc7fb8cd7858160277d73a11ac3cc2db91edcf11e67e2a5173e5416",
                "md5": "90bd840bab72f49ec4393d0f3bec2733",
                "sha256": "d067797d0cdf53d6fabf467f719df414a7983886e938aa701d70431e3390cd3c"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp311-cp311-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "90bd840bab72f49ec4393d0f3bec2733",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 680381,
            "upload_time": "2024-12-02T17:12:40",
            "upload_time_iso_8601": "2024-12-02T17:12:40.804378Z",
            "url": "https://files.pythonhosted.org/packages/c7/66/c7844dc7fb8cd7858160277d73a11ac3cc2db91edcf11e67e2a5173e5416/perpetual-0.7.10-cp311-cp311-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e03e557c326add616f6cb86e7069672e850aaf93ddb2a32f98f99994d68ea6b1",
                "md5": "1e223d9eee76b83cc818f1de87b21a01",
                "sha256": "f8ae48764ed5890b5d39500b404863cc86615bfcb858fcb5b593a5f07387853e"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "1e223d9eee76b83cc818f1de87b21a01",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 641158,
            "upload_time": "2024-12-02T17:12:42",
            "upload_time_iso_8601": "2024-12-02T17:12:42.521133Z",
            "url": "https://files.pythonhosted.org/packages/e0/3e/557c326add616f6cb86e7069672e850aaf93ddb2a32f98f99994d68ea6b1/perpetual-0.7.10-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "adee4b41d08052940b08a9fb00bac4243bfd5357aa602c3d7b5f9414fe7669bf",
                "md5": "2294b00e0c0e2266b62ca1480231f5ec",
                "sha256": "b47c0b11f5b1f2e0e6de7b36dadf3a5a52c3c9a788ecbf10c94cf9ea2259e909"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2294b00e0c0e2266b62ca1480231f5ec",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 894895,
            "upload_time": "2024-12-02T17:12:44",
            "upload_time_iso_8601": "2024-12-02T17:12:44.480493Z",
            "url": "https://files.pythonhosted.org/packages/ad/ee/4b41d08052940b08a9fb00bac4243bfd5357aa602c3d7b5f9414fe7669bf/perpetual-0.7.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ea5480185f852891682a16bfc811bedc2c0658c4621fc9207d903038a1e9f3d9",
                "md5": "0ce98b38fedefcb6d2f48a609abf9238",
                "sha256": "d3b6087bdafaf6bd3bb16911d59a86e1fd9d0dd97f2d5b8b96ceeab9acb3372d"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp311-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "0ce98b38fedefcb6d2f48a609abf9238",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 631845,
            "upload_time": "2024-12-02T17:12:46",
            "upload_time_iso_8601": "2024-12-02T17:12:46.641375Z",
            "url": "https://files.pythonhosted.org/packages/ea/54/80185f852891682a16bfc811bedc2c0658c4621fc9207d903038a1e9f3d9/perpetual-0.7.10-cp311-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8d04d1a037f338b38c3753dd2cda5f23585dc152e874cf17e4484387db31216c",
                "md5": "5384f73552d25995a733a9a3c7afc5f1",
                "sha256": "e4090ad6defb82be28f8f649256f5317ae51c4330c2250d00a112f8b6dc32cf8"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp312-cp312-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5384f73552d25995a733a9a3c7afc5f1",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 675236,
            "upload_time": "2024-12-02T17:12:48",
            "upload_time_iso_8601": "2024-12-02T17:12:48.362120Z",
            "url": "https://files.pythonhosted.org/packages/8d/04/d1a037f338b38c3753dd2cda5f23585dc152e874cf17e4484387db31216c/perpetual-0.7.10-cp312-cp312-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a3c8a44088cb3f56815347dc25a6f3729437ba39cf9f00ebd146d179e6b24366",
                "md5": "7ddc5fe367358458d9b33aacd0cceba1",
                "sha256": "ddb6968260a2bff3db19e0e59616c1958f12f071dc2effe72fed6ea334b3e211"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "7ddc5fe367358458d9b33aacd0cceba1",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 636914,
            "upload_time": "2024-12-02T17:12:50",
            "upload_time_iso_8601": "2024-12-02T17:12:50.821063Z",
            "url": "https://files.pythonhosted.org/packages/a3/c8/a44088cb3f56815347dc25a6f3729437ba39cf9f00ebd146d179e6b24366/perpetual-0.7.10-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a4d376e2db56170c9ff2e5fede3231d30db840d2dcedbba0f4415375a78433e3",
                "md5": "a877b2b89807817ccb1df7a9c73efc92",
                "sha256": "61edc988d5280309774cc3b9bc3967396cdfabda1941961bf67359c1245ab950"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a877b2b89807817ccb1df7a9c73efc92",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 893106,
            "upload_time": "2024-12-02T17:12:52",
            "upload_time_iso_8601": "2024-12-02T17:12:52.909302Z",
            "url": "https://files.pythonhosted.org/packages/a4/d3/76e2db56170c9ff2e5fede3231d30db840d2dcedbba0f4415375a78433e3/perpetual-0.7.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e558e1f30c9dc4a18416c61dc20e77041d1ddddc594351ec6532af569bc09228",
                "md5": "52db3705081abda5ad4ae33390ea1a7a",
                "sha256": "3a82eb7e34baed4f6ce774a3fee04ff55ea6266ea7cd9115de8fb2dc8837cf9f"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp312-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "52db3705081abda5ad4ae33390ea1a7a",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 630996,
            "upload_time": "2024-12-02T17:12:55",
            "upload_time_iso_8601": "2024-12-02T17:12:55.181209Z",
            "url": "https://files.pythonhosted.org/packages/e5/58/e1f30c9dc4a18416c61dc20e77041d1ddddc594351ec6532af569bc09228/perpetual-0.7.10-cp312-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cd4a3b700adb4592acffe22e05b6f9a8c3a40f1bace0c77eecae7ef7f63bc13d",
                "md5": "eadb6e4f1e63f2f62e689eefe2f38ff0",
                "sha256": "a11b5d1aaae411b8bbdaf605a5636f4e1ebcbf00bd08acccc55036ff2f938d07"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "eadb6e4f1e63f2f62e689eefe2f38ff0",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 896605,
            "upload_time": "2024-12-02T17:12:56",
            "upload_time_iso_8601": "2024-12-02T17:12:56.812294Z",
            "url": "https://files.pythonhosted.org/packages/cd/4a/3b700adb4592acffe22e05b6f9a8c3a40f1bace0c77eecae7ef7f63bc13d/perpetual-0.7.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f461e1a0de4eebee881c8e286d6dcbfc4c6fc75121fc10765f7834f645453fec",
                "md5": "337425a2481c632d1cb28de97a70834a",
                "sha256": "dfe2b579558b2046dd121aed73c84b4a13e5e5be4a52c306064a49b1ad186664"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10-cp39-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "337425a2481c632d1cb28de97a70834a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 632387,
            "upload_time": "2024-12-02T17:12:59",
            "upload_time_iso_8601": "2024-12-02T17:12:59.354842Z",
            "url": "https://files.pythonhosted.org/packages/f4/61/e1a0de4eebee881c8e286d6dcbfc4c6fc75121fc10765f7834f645453fec/perpetual-0.7.10-cp39-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9df49d8f94e035787d67530ca08dbd8cfa274518be3fad0b95346c3017e8e2d9",
                "md5": "125b9beccb66aa2d474b0f3f11ba4496",
                "sha256": "7669534477b84bf8b360e79905bc4ce7377a1214a6c583671099839432bc58c0"
            },
            "downloads": -1,
            "filename": "perpetual-0.7.10.tar.gz",
            "has_sig": false,
            "md5_digest": "125b9beccb66aa2d474b0f3f11ba4496",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 150764,
            "upload_time": "2024-12-02T17:13:00",
            "upload_time_iso_8601": "2024-12-02T17:13:00.619440Z",
            "url": "https://files.pythonhosted.org/packages/9d/f4/9d8f94e035787d67530ca08dbd8cfa274518be3fad0b95346c3017e8e2d9/perpetual-0.7.10.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-12-02 17:13:00",
    "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"
}
        
Elapsed time: 4.08062s