egobox


Nameegobox JSON
Version 0.3.1 PyPI version JSON
download
home_page
SummaryA toolbox for efficient global optimization
upload_time2022-06-23 20:26:19
maintainer
docs_urlNone
authorRémi Lafage <remi.lafage@onera.fr>
requires_python
licenseApache-2.0
keywords machine-learning doe gaussian-process mixture-of-experts optimization
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # egobox

[![tests](https://github.com/relf/egobox/workflows/tests/badge.svg)](https://github.com/relf/egobox/actions?query=workflow%3Atests)
[![pytests](https://github.com/relf/egobox/workflows/pytests/badge.svg)](https://github.com/relf/egobox/actions?query=workflow%3Apytests)
[![linting](https://github.com/relf/egobox/workflows/lint/badge.svg)](https://github.com/relf/egobox/actions?query=workflow%3Alint)
[![status](https://joss.theoj.org/papers/0b252f280b5e5b67b9caba72d56cb156/status.svg)](https://joss.theoj.org/papers/0b252f280b5e5b67b9caba72d56cb156)

Rust toolbox for Efficient Global Optimization algorithms inspired from [SMT](https://github.com/SMTorg/smt). 

`egobox` consists of the following sub-packages.

| Name         | Version                                                                                         | Documentation                                                               | Description                                                                     |
| :----------- | :---------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | :------------------------------------------------------------------------------ |
| [doe](./doe) | [![crates.io](https://img.shields.io/crates/v/egobox-doe)](https://crates.io/crates/egobox-doe) | [![docs](https://docs.rs/egobox-doe/badge.svg)](https://docs.rs/egobox-doe) | sampling methods; contains LHS, FullFactorial, Random methods                   |
| [gp](./gp)   | [![crates.io](https://img.shields.io/crates/v/egobox-gp)](https://crates.io/crates/egobox-gp)   | [![docs](https://docs.rs/egobox-gp/badge.svg)](https://docs.rs/egobox-gp)   | gaussian process regression; contains Kriging and PLS dimension reduction       |
| [moe](./gp)  | [![crates.io](https://img.shields.io/crates/v/egobox-moe)](https://crates.io/crates/egobox-moe) | [![docs](https://docs.rs/egobox-moe/badge.svg)](https://docs.rs/egobox-moe) | mixture of experts using GP models                                              |
| [ego](./ego) | [![crates.io](https://img.shields.io/crates/v/egobox-ego)](https://crates.io/crates/egobox-ego) | [![docs](https://docs.rs/egobox-ego/badge.svg)](https://docs.rs/egobox-ego) | efficient global optimization with basic constraints and mixed integer handling |

## Usage

Depending on the sub-packages you want to use, you have to add following declarations to your `Cargo.toml`

```
[dependencies]
egobox-doe = { version = "0.3.0" }
egobox-gp  = { version = "0.3.0" }
egobox-moe = { version = "0.3.0" }
egobox-ego = { version = "0.3.0" }
```

## Features

### linfa BLAS/Lapack backend feature

 relies on `linfa` [BLAS/Lapack backend features](https://github.com/rust-ml/linfa#blaslapack-backend).

End user project using `gp`, `moe` and `ego` should select a BLAS/Lapack backend 
depending its environment; it can be either: 
 * Openblas: `linfa/openblas-system` or `linfa/openblas-static`
 * Netlib: `linfa/netlib-system` or `linfa/netlib-static`
 * Intel MKL: `linfa/intel-mkl-system` or `linfa/intel-mkl-static`

where

 * `*-system` features: try to find the corresponding backend in your installation.
 * `*-static` features: try to download and compile the corresponing backend.

More information in [linfa features](https://github.com/rust-ml/linfa#blaslapack-backend)

For instance, using `gp` with the Intel MKL BLAS/Lapack backend, you have to specify the linfa backend feature :

```
[dependencies]
egobox-gp = { version = "0.3.0", features = ["linfa/intel-mkl-static"] }
```

Note: only end-user projects should specify a provider in `Cargo.toml` (not librairies). In case of library development, the backend is specified on the command line as for examples below.

### `serializable-gp` 

The `serializable-gp` feature enables the serialization of GP models using the [serde crate](https://serde.rs/). 

### `persistent-moe` 

The `persistent-moe` feature enables `save()` and `load()` methods for MoE model to/from a json file using the [serde crate](https://serde.rs/). 

## Examples

Examples (in `examples/` sub-packages folder) are run as follows:

```bash
$ cd doe && cargo run --example samplings --release
```

Using the Intel MKL BLAS/Lapack backend, you can run :

``` bash
$ cd gp && cargo run --example kriging --release --features linfa/intel-mkl-static
```

``` bash
$ cd moe && cargo run --example clustering --release --features linfa/intel-mkl-static
```

``` bash
$ cd ego && cargo run --example ackley --release --features linfa/intel-mkl-static
```

Thanks to the [PyO3 project](https://pyo3.rs), which makes Rust well suited for building Python extensions, the EGO algorithm written in Rust (aka `Egor`) is binded in Python. You can install the Python package using:

```bash
$ pip install egobox
```

See the [tutorial notebook](doc/TutorialEgor.ipynb) for usage of the optimizer.

## Why egobox?

I started this library as a way to learn Rust and see if it can be used to implement algorithms like those in the SMT toolbox[^1]. As the first components (doe, gp) emerged, it appears I could translate Python code almost line by line in Rust (well... after a great deal of borrow-checker fight!) and thanks to [Rust ndarray library ecosystem](https://github.com/rust-ndarray). 

This library relies also on the [linfa project](https://github.com/rust-ml/linfa) which aims at being the "scikit-learn-like ML library for Rust". Along the way I could contribute to `linfa` by porting gaussian mixture model (`linfa-clustering/gmm`) and partial least square family methods (`linfa-pls`) confirming the fact that Python algorithms translation in Rust could be pretty straightforward.

While I did not benchmark exactly my Rust code against SMT Python one, from my debugging sessions, I noticed I did not get such a great speed up. Actually, algorithms like `doe` and `gp` relies extensively on linear algebra and Python famous libraries `numpy`/`scipy` which are strongly optimized by calling C or Fortran compiled code.

My guess at this point is that interest could come from some Rust algorithms built upon these initial building blocks hence I started to implement mixture of experts algorithm (`moe`) and on top surrogate-based optimization EGO algorithm (`ego`) which gives its name to the library[^2][^3]. Aside from performance, such library can also take advantage from the others [Rust selling points](https://www.rust-lang.org/), namely reliability and productivity. 

## Cite

If you happen to find this Rust library useful for your research, you can cite this project as follows: 

```
@Misc{egobox,
  author = {Rémi Lafage},
  title = {Egobox: efficient global optimization toolbox in Rust},
  year = {2020--},
  url = "https://github.com/relf/egobox"
}
```

[^1]: M. A. Bouhlel and J. T. Hwang and N. Bartoli and R. Lafage and J. Morlier and J. R. R. A. Martins. A Python surrogate modeling framework with derivatives. Advances in Engineering Software, 2019.

[^2]: Bartoli, Nathalie, et al. "Adaptive modeling strategy for constrained global optimization with application to aerodynamic wing design." Aerospace Science and technology 90 (2019): 85-102.

[^3]: Dubreuil, Sylvain, et al. "Towards an efficient global multidisciplinary design optimization algorithm." Structural and Multidisciplinary Optimization 62.4 (2020): 1739-1765.


            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "egobox",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "machine-learning,doe,gaussian-process,mixture-of-experts,optimization",
    "author": "R\u00e9mi Lafage <remi.lafage@onera.fr>",
    "author_email": "R\u00e9mi Lafage <remi.lafage@onera.fr>",
    "download_url": "https://files.pythonhosted.org/packages/bc/39/63423fe2fbe8da1dc6ab6a0f2316d1b8569f3d928b81d8a8ae882195647d/egobox-0.3.1.tar.gz",
    "platform": null,
    "description": "# egobox\r\n\r\n[![tests](https://github.com/relf/egobox/workflows/tests/badge.svg)](https://github.com/relf/egobox/actions?query=workflow%3Atests)\r\n[![pytests](https://github.com/relf/egobox/workflows/pytests/badge.svg)](https://github.com/relf/egobox/actions?query=workflow%3Apytests)\r\n[![linting](https://github.com/relf/egobox/workflows/lint/badge.svg)](https://github.com/relf/egobox/actions?query=workflow%3Alint)\r\n[![status](https://joss.theoj.org/papers/0b252f280b5e5b67b9caba72d56cb156/status.svg)](https://joss.theoj.org/papers/0b252f280b5e5b67b9caba72d56cb156)\r\n\r\nRust toolbox for Efficient Global Optimization algorithms inspired from [SMT](https://github.com/SMTorg/smt). \r\n\r\n`egobox` consists of the following sub-packages.\r\n\r\n| Name         | Version                                                                                         | Documentation                                                               | Description                                                                     |\r\n| :----------- | :---------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | :------------------------------------------------------------------------------ |\r\n| [doe](./doe) | [![crates.io](https://img.shields.io/crates/v/egobox-doe)](https://crates.io/crates/egobox-doe) | [![docs](https://docs.rs/egobox-doe/badge.svg)](https://docs.rs/egobox-doe) | sampling methods; contains LHS, FullFactorial, Random methods                   |\r\n| [gp](./gp)   | [![crates.io](https://img.shields.io/crates/v/egobox-gp)](https://crates.io/crates/egobox-gp)   | [![docs](https://docs.rs/egobox-gp/badge.svg)](https://docs.rs/egobox-gp)   | gaussian process regression; contains Kriging and PLS dimension reduction       |\r\n| [moe](./gp)  | [![crates.io](https://img.shields.io/crates/v/egobox-moe)](https://crates.io/crates/egobox-moe) | [![docs](https://docs.rs/egobox-moe/badge.svg)](https://docs.rs/egobox-moe) | mixture of experts using GP models                                              |\r\n| [ego](./ego) | [![crates.io](https://img.shields.io/crates/v/egobox-ego)](https://crates.io/crates/egobox-ego) | [![docs](https://docs.rs/egobox-ego/badge.svg)](https://docs.rs/egobox-ego) | efficient global optimization with basic constraints and mixed integer handling |\r\n\r\n## Usage\r\n\r\nDepending on the sub-packages you want to use, you have to add following declarations to your `Cargo.toml`\r\n\r\n```\r\n[dependencies]\r\negobox-doe = { version = \"0.3.0\" }\r\negobox-gp  = { version = \"0.3.0\" }\r\negobox-moe = { version = \"0.3.0\" }\r\negobox-ego = { version = \"0.3.0\" }\r\n```\r\n\r\n## Features\r\n\r\n### linfa BLAS/Lapack backend feature\r\n\r\n relies on `linfa` [BLAS/Lapack backend features](https://github.com/rust-ml/linfa#blaslapack-backend).\r\n\r\nEnd user project using `gp`, `moe` and `ego` should select a BLAS/Lapack backend \r\ndepending its environment; it can be either: \r\n * Openblas: `linfa/openblas-system` or `linfa/openblas-static`\r\n * Netlib: `linfa/netlib-system` or `linfa/netlib-static`\r\n * Intel MKL: `linfa/intel-mkl-system` or `linfa/intel-mkl-static`\r\n\r\nwhere\r\n\r\n * `*-system` features: try to find the corresponding backend in your installation.\r\n * `*-static` features: try to download and compile the corresponing backend.\r\n\r\nMore information in [linfa features](https://github.com/rust-ml/linfa#blaslapack-backend)\r\n\r\nFor instance, using `gp` with the Intel MKL BLAS/Lapack backend, you have to specify the linfa backend feature :\r\n\r\n```\r\n[dependencies]\r\negobox-gp = { version = \"0.3.0\", features = [\"linfa/intel-mkl-static\"] }\r\n```\r\n\r\nNote: only end-user projects should specify a provider in `Cargo.toml` (not librairies). In case of library development, the backend is specified on the command line as for examples below.\r\n\r\n### `serializable-gp` \r\n\r\nThe `serializable-gp` feature enables the serialization of GP models using the [serde crate](https://serde.rs/). \r\n\r\n### `persistent-moe` \r\n\r\nThe `persistent-moe` feature enables `save()` and `load()` methods for MoE model to/from a json file using the [serde crate](https://serde.rs/). \r\n\r\n## Examples\r\n\r\nExamples (in `examples/` sub-packages folder) are run as follows:\r\n\r\n```bash\r\n$ cd doe && cargo run --example samplings --release\r\n```\r\n\r\nUsing the Intel MKL BLAS/Lapack backend, you can run :\r\n\r\n``` bash\r\n$ cd gp && cargo run --example kriging --release --features linfa/intel-mkl-static\r\n```\r\n\r\n``` bash\r\n$ cd moe && cargo run --example clustering --release --features linfa/intel-mkl-static\r\n```\r\n\r\n``` bash\r\n$ cd ego && cargo run --example ackley --release --features linfa/intel-mkl-static\r\n```\r\n\r\nThanks to the [PyO3 project](https://pyo3.rs), which makes Rust well suited for building Python extensions, the EGO algorithm written in Rust (aka `Egor`) is binded in Python. You can install the Python package using:\r\n\r\n```bash\r\n$ pip install egobox\r\n```\r\n\r\nSee the [tutorial notebook](doc/TutorialEgor.ipynb) for usage of the optimizer.\r\n\r\n## Why egobox?\r\n\r\nI started this library as a way to learn Rust and see if it can be used to implement algorithms like those in the SMT toolbox[^1]. As the first components (doe, gp) emerged, it appears I could translate Python code almost line by line in Rust (well... after a great deal of borrow-checker fight!) and thanks to [Rust ndarray library ecosystem](https://github.com/rust-ndarray). \r\n\r\nThis library relies also on the [linfa project](https://github.com/rust-ml/linfa) which aims at being the \"scikit-learn-like ML library for Rust\". Along the way I could contribute to `linfa` by porting gaussian mixture model (`linfa-clustering/gmm`) and partial least square family methods (`linfa-pls`) confirming the fact that Python algorithms translation in Rust could be pretty straightforward.\r\n\r\nWhile I did not benchmark exactly my Rust code against SMT Python one, from my debugging sessions, I noticed I did not get such a great speed up. Actually, algorithms like `doe` and `gp` relies extensively on linear algebra and Python famous libraries `numpy`/`scipy` which are strongly optimized by calling C or Fortran compiled code.\r\n\r\nMy guess at this point is that interest could come from some Rust algorithms built upon these initial building blocks hence I started to implement mixture of experts algorithm (`moe`) and on top surrogate-based optimization EGO algorithm (`ego`) which gives its name to the library[^2][^3]. Aside from performance, such library can also take advantage from the others [Rust selling points](https://www.rust-lang.org/), namely reliability and productivity. \r\n\r\n## Cite\r\n\r\nIf you happen to find this Rust library useful for your research, you can cite this project as follows: \r\n\r\n```\r\n@Misc{egobox,\r\n  author = {R\u00e9mi Lafage},\r\n  title = {Egobox: efficient global optimization toolbox in Rust},\r\n  year = {2020--},\r\n  url = \"https://github.com/relf/egobox\"\r\n}\r\n```\r\n\r\n[^1]: M. A. Bouhlel and J. T. Hwang and N. Bartoli and R. Lafage and J. Morlier and J. R. R. A. Martins. A Python surrogate modeling framework with derivatives. Advances in Engineering Software, 2019.\r\n\r\n[^2]: Bartoli, Nathalie, et al. \"Adaptive modeling strategy for constrained global optimization with application to aerodynamic wing design.\" Aerospace Science and technology 90 (2019): 85-102.\r\n\r\n[^3]: Dubreuil, Sylvain, et al. \"Towards an efficient global multidisciplinary design optimization algorithm.\" Structural and Multidisciplinary Optimization 62.4 (2020): 1739-1765.\r\n\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "A toolbox for efficient global optimization",
    "version": "0.3.1",
    "split_keywords": [
        "machine-learning",
        "doe",
        "gaussian-process",
        "mixture-of-experts",
        "optimization"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "bec86e5c3d305e725a888b584bfda6c1",
                "sha256": "d4ff02f5098a48afe5d943013e93f9c2675834d1792f7e34ce7db970f17b1b02"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bec86e5c3d305e725a888b584bfda6c1",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 7806544,
            "upload_time": "2022-06-23T20:25:35",
            "upload_time_iso_8601": "2022-06-23T20:25:35.749726Z",
            "url": "https://files.pythonhosted.org/packages/be/36/ea99b7c60b4a4aca36e4afbc070568c82b3f1b09fd0ea74ce6abbf45e926/egobox-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "562c4feb8b9895b5b8c9e78bd3777122",
                "sha256": "c158f5871c1213994ce6d8a58aa140068c677edfbb06242eaefbdd67eb958571"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "562c4feb8b9895b5b8c9e78bd3777122",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": null,
            "size": 7803127,
            "upload_time": "2022-06-23T20:25:40",
            "upload_time_iso_8601": "2022-06-23T20:25:40.400641Z",
            "url": "https://files.pythonhosted.org/packages/de/45/a8cc7c018c6a65fc69665e3fb236cb228242d72fd4fe2eacf83d3b9e831c/egobox-0.3.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "fd1e80e30d49e0855611aa0044130ce8",
                "sha256": "7d03380509e68db358cc398fe94414fb1a7d18438f694995b22291f5156bc941"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fd1e80e30d49e0855611aa0044130ce8",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 7805675,
            "upload_time": "2022-06-23T20:25:45",
            "upload_time_iso_8601": "2022-06-23T20:25:45.753042Z",
            "url": "https://files.pythonhosted.org/packages/61/a6/2e5a4c7ade9e0425ea1b90a1f1848fd52dd0607f210ef1269c68445b3a2f/egobox-0.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "a2d5a70bd48da98bd52963077819a62b",
                "sha256": "982b7ebd5c1e43bf64c2d60500f3a6b2235db5224463fbae6471d74bafebe243"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1-cp37-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "a2d5a70bd48da98bd52963077819a62b",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 6209049,
            "upload_time": "2022-06-23T20:25:50",
            "upload_time_iso_8601": "2022-06-23T20:25:50.135356Z",
            "url": "https://files.pythonhosted.org/packages/87/d0/0d8aee56d0603db31e27e672c4f28797a86af114eb1ed7969623f64ba001/egobox-0.3.1-cp37-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "e51e3c546663b75e8fcb2c926325307f",
                "sha256": "c6d319324d76882c916903caf38a350162385f3876f80fbc8e970b670f6d4242"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e51e3c546663b75e8fcb2c926325307f",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 7806127,
            "upload_time": "2022-06-23T20:25:55",
            "upload_time_iso_8601": "2022-06-23T20:25:55.040711Z",
            "url": "https://files.pythonhosted.org/packages/e9/0d/57de7defbcecb15bb14407a1421c627d220e10377a49f21d7123798117cc/egobox-0.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "9a49b82a419966dc738322b2c6d8a2b1",
                "sha256": "7118c25a0612e268740b5946dc405cc98a77ea3cd4781b9468ea6a3539db6357"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1-cp38-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "9a49b82a419966dc738322b2c6d8a2b1",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 6209598,
            "upload_time": "2022-06-23T20:26:00",
            "upload_time_iso_8601": "2022-06-23T20:26:00.038512Z",
            "url": "https://files.pythonhosted.org/packages/44/a4/79d42ce9f940a2dc0cb17a34f2d30112924e1e6dd68c64de7a0a46006116/egobox-0.3.1-cp38-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "d98f33651627f81994d3dbd2de93de73",
                "sha256": "7e136febe611c0159238a2d3e66ad8c91d297ef2a28d57a179fa49c55e681c01"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d98f33651627f81994d3dbd2de93de73",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 7807297,
            "upload_time": "2022-06-23T20:26:06",
            "upload_time_iso_8601": "2022-06-23T20:26:06.816258Z",
            "url": "https://files.pythonhosted.org/packages/2e/84/7625b5b420d70a97ed3d92ab1489910cbd7a62e57b3bb981ad3007e337ee/egobox-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "3c94fc21cb10d4090dd3785c8317b37f",
                "sha256": "c40577a67bafc2f399382642950510bb9158766aeb29a56a9271741e5fd83e83"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1-cp39-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "3c94fc21cb10d4090dd3785c8317b37f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 6207871,
            "upload_time": "2022-06-23T20:26:11",
            "upload_time_iso_8601": "2022-06-23T20:26:11.739690Z",
            "url": "https://files.pythonhosted.org/packages/f8/1d/4ef4097f49d48e4ab57312aad25def68b32c58d8121da50d1a7b5cb5cb36/egobox-0.3.1-cp39-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "fb2312f54b7d57c8a5a5bf2ae8e51565",
                "sha256": "eac5e21746c47598d4523d7cd057be53375a227f5b6c48f166c763ced272c961"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fb2312f54b7d57c8a5a5bf2ae8e51565",
            "packagetype": "bdist_wheel",
            "python_version": "pp37",
            "requires_python": null,
            "size": 7807728,
            "upload_time": "2022-06-23T20:26:17",
            "upload_time_iso_8601": "2022-06-23T20:26:17.296889Z",
            "url": "https://files.pythonhosted.org/packages/ee/a7/fb7589a1429c7cdd74906b0b5889c0d1e1dab8a0b4e2a21b51e97c39ac4e/egobox-0.3.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "9142151792569ea5d14f66ba8353102d",
                "sha256": "4d2179f28f1c84b9d3e41c98b4944aeb627c35f932d68e4be97f8e35394f61ce"
            },
            "downloads": -1,
            "filename": "egobox-0.3.1.tar.gz",
            "has_sig": false,
            "md5_digest": "9142151792569ea5d14f66ba8353102d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 95986,
            "upload_time": "2022-06-23T20:26:19",
            "upload_time_iso_8601": "2022-06-23T20:26:19.948881Z",
            "url": "https://files.pythonhosted.org/packages/bc/39/63423fe2fbe8da1dc6ab6a0f2316d1b8569f3d928b81d8a8ae882195647d/egobox-0.3.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2022-06-23 20:26:19",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "lcname": "egobox"
}
        
Elapsed time: 0.53898s