# Laser Learning Environment (LLE)
Documentation: [https://yamoling.github.io/lle/](https://yamoling.github.io/lle/)
LLE is a fast Multi-Agent Reinforcement Learning environment written in Rust which has proven to be a difficult exploration benchmark so far. The agents start in the start tiles, must collect the gems and finish the game by reaching the exit tiles. There are five actions: North, South, East, West and Stay.
When an agent enters a laser of its own colour, it blocks it. Otherwise, it dies and the game ends.
![LLE](docs/lvl6-annotated.png)
# Quick start
## Installation
You can install the Laser Learning Environment with pip or poetry.
```bash
pip install laser-learning-environment # Latest stable release with pip
pip install git+https://github.com/yamoling/lle # latest push on master
```
## Usage
LLE can be used at two levels of abstraction: as an `RLEnv` for cooperative multi-agent reinforcement learning or as a `World` for many other purposes.
### For cooperative multi-agent reinforcement learning
The `LLE` class inherits from the `RLEnv` class in the [rlenv](https://github.com/yamoling/rlenv) framework. Here is an example with the following map: ![LLE](docs/3x1.png)
```python
from lle import LLE
env = LLE.from_str("S0 G X").single_objective()
done = truncated = False
obs, state = env.reset()
while not (done or truncated):
# env.render() # Uncomment to render
actions = env.sample_action()
obs, state, reward, done, truncated, info = env.step(actions)
```
### For other purposes or fine grained control
The `World` class provides fine grained control on the environment by exposing the state of the world and the events that happen when the agents move.
```python
from lle import World, Action, EventType
world = World("S0 G X") # Linear world with start S0, gem G and exit X
world.reset()
available_actions = world.available_actions()[0] # [Action.STAY, Action.EAST]
events = world.step([Action.EAST])
assert events[0].event_type == EventType.GEM_COLLECTED
events = world.step([Action.EAST])
assert events[0].event_type == EventType.AGENT_EXIT
```
You can also access and force the state of the world
```python
state = world.get_state()
...
events = world.set_state(state)
```
You can query the world on the tiles with `world.start_pos`, `world.exit_pos`, `world.gem_pos`, ...
## Citing our work
The environment has been presented at [EWRL 2023](https://openreview.net/pdf?id=IPfdjr4rIs) and at [BNAIC 2023](https://bnaic2023.tudelft.nl/static/media/BNAICBENELEARN_2023_paper_124.c9f5d29e757e5ee27c44.pdf) where it received the best paper award.
```
@inproceedings{molinghen2023lle,
title={Laser Learning Environment: A new environment for coordination-critical multi-agent tasks},
author={Molinghen, Yannick and Avalos, Raphaël and Van Achter, Mark and Nowé, Ann and Lenaerts, Tom},
year={2023},
series={BeNeLux Artificial Intelligence Conference},
booktitle={BNAIC 2023}
}
```
## Development
If you want to modify the environment, you can clone the repo, install the python dependencies then compile it with `maturin`. The below example assumes that you are using `uv` as package manager but it should work with `conda`, `poetry` or just `pip` as well.
```
git clone https://github.com/yamoling/lle
uv venv # create a virtual environment
source .venv/bin/activate
uv sync # install python dependencies
maturin dev # build and install lle in the venv
```
You can also re-generate the python bindings in the folder `python/lle` with
```bash
cargo run --bin stub-gen
```
## Tests
This project **does not** respect Rust unit tests convention and takes inspiration from [this structure](http://xion.io/post/code/rust-unit-test-placement.html). Unit tests are in the `src/unit_tests` folder and are explicitely linked to in each file with the `#path` directive.
Integration tests are written on the python side.
Run unit tests with
```bash
cargo test
```
Run integration tests with
```bash
maturin develop
pytest
```
Raw data
{
"_id": null,
"home_page": "https://github.com/yamoling/lle",
"name": "laser-learning-environment",
"maintainer": null,
"docs_url": null,
"requires_python": "<4,>=3.10",
"maintainer_email": null,
"keywords": "marl, rl, lle, laser, environment",
"author": null,
"author_email": "Yannick Molinghen <yannick.molinghen@ulb.be>",
"download_url": "https://files.pythonhosted.org/packages/ee/88/9a72da6cc5a5b9f6f27434961cc200ff395517489318a05e3c28702aadd5/laser_learning_environment-2.1.1.tar.gz",
"platform": null,
"description": "# Laser Learning Environment (LLE)\nDocumentation: [https://yamoling.github.io/lle/](https://yamoling.github.io/lle/)\n\nLLE is a fast Multi-Agent Reinforcement Learning environment written in Rust which has proven to be a difficult exploration benchmark so far. The agents start in the start tiles, must collect the gems and finish the game by reaching the exit tiles. There are five actions: North, South, East, West and Stay. \n\nWhen an agent enters a laser of its own colour, it blocks it. Otherwise, it dies and the game ends.\n\n![LLE](docs/lvl6-annotated.png)\n\n# Quick start\n## Installation\nYou can install the Laser Learning Environment with pip or poetry.\n```bash\npip install laser-learning-environment # Latest stable release with pip\npip install git+https://github.com/yamoling/lle # latest push on master\n```\n\n## Usage\nLLE can be used at two levels of abstraction: as an `RLEnv` for cooperative multi-agent reinforcement learning or as a `World` for many other purposes.\n### For cooperative multi-agent reinforcement learning\nThe `LLE` class inherits from the `RLEnv` class in the [rlenv](https://github.com/yamoling/rlenv) framework. Here is an example with the following map: ![LLE](docs/3x1.png)\n\n\n```python\nfrom lle import LLE\n\nenv = LLE.from_str(\"S0 G X\").single_objective()\ndone = truncated = False\nobs, state = env.reset()\nwhile not (done or truncated):\n # env.render() # Uncomment to render\n actions = env.sample_action()\n obs, state, reward, done, truncated, info = env.step(actions)\n```\n\n\n### For other purposes or fine grained control\nThe `World` class provides fine grained control on the environment by exposing the state of the world and the events that happen when the agents move.\n\n```python\nfrom lle import World, Action, EventType\n\nworld = World(\"S0 G X\") # Linear world with start S0, gem G and exit X\nworld.reset()\navailable_actions = world.available_actions()[0] # [Action.STAY, Action.EAST]\nevents = world.step([Action.EAST])\nassert events[0].event_type == EventType.GEM_COLLECTED\nevents = world.step([Action.EAST])\nassert events[0].event_type == EventType.AGENT_EXIT\n```\n\nYou can also access and force the state of the world\n```python\nstate = world.get_state()\n...\nevents = world.set_state(state)\n```\n\nYou can query the world on the tiles with `world.start_pos`, `world.exit_pos`, `world.gem_pos`, ...\n\n\n\n\n## Citing our work\nThe environment has been presented at [EWRL 2023](https://openreview.net/pdf?id=IPfdjr4rIs) and at [BNAIC 2023](https://bnaic2023.tudelft.nl/static/media/BNAICBENELEARN_2023_paper_124.c9f5d29e757e5ee27c44.pdf) where it received the best paper award.\n\n```\n@inproceedings{molinghen2023lle,\n title={Laser Learning Environment: A new environment for coordination-critical multi-agent tasks},\n author={Molinghen, Yannick and Avalos, Rapha\u00ebl and Van Achter, Mark and Now\u00e9, Ann and Lenaerts, Tom},\n year={2023},\n series={BeNeLux Artificial Intelligence Conference},\n booktitle={BNAIC 2023}\n}\n```\n\n## Development\nIf you want to modify the environment, you can clone the repo, install the python dependencies then compile it with `maturin`. The below example assumes that you are using `uv` as package manager but it should work with `conda`, `poetry` or just `pip` as well.\n```\ngit clone https://github.com/yamoling/lle\nuv venv # create a virtual environment\nsource .venv/bin/activate\nuv sync # install python dependencies\nmaturin dev # build and install lle in the venv\n```\n\nYou can also re-generate the python bindings in the folder `python/lle` with\n```bash\ncargo run --bin stub-gen\n```\n\n\n## Tests\nThis project **does not** respect Rust unit tests convention and takes inspiration from [this structure](http://xion.io/post/code/rust-unit-test-placement.html). Unit tests are in the `src/unit_tests` folder and are explicitely linked to in each file with the `#path` directive. \nIntegration tests are written on the python side.\n\nRun unit tests with \n```bash\ncargo test\n```\n\nRun integration tests with\n```bash\nmaturin develop\npytest\n```\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Laser Learning Environment (LLE) for Multi-Agent Reinforcement Learning",
"version": "2.1.1",
"project_urls": {
"Homepage": "https://github.com/yamoling/lle",
"Source Code": "https://github.com/yamoling/lle"
},
"split_keywords": [
"marl",
" rl",
" lle",
" laser",
" environment"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "412b1ea5e0d86d9af4f900b12a7cda50b998b55b43122e22e290932d5501b9d1",
"md5": "7659e2e5496396894d53939350c33b86",
"sha256": "bbbe56b8ff0868f2dec670e5bfdc096bd6bb57f333b4824def391991b09c37c6"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "7659e2e5496396894d53939350c33b86",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4,>=3.10",
"size": 1558859,
"upload_time": "2024-12-31T14:25:10",
"upload_time_iso_8601": "2024-12-31T14:25:10.040137Z",
"url": "https://files.pythonhosted.org/packages/41/2b/1ea5e0d86d9af4f900b12a7cda50b998b55b43122e22e290932d5501b9d1/laser_learning_environment-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a93b1afbb07abb26aa05d2fc9668372222ffcd38fb7d070b2dbd44d8d3ec1e59",
"md5": "c59c3bba0b1bc5c6fa386b1c59b892ea",
"sha256": "71e5b33c26dc13d3cf0920e10c0247427f0d6bb5d5f26047b7cb03a75b329f3a"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "c59c3bba0b1bc5c6fa386b1c59b892ea",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4,>=3.10",
"size": 1248446,
"upload_time": "2024-12-31T14:25:24",
"upload_time_iso_8601": "2024-12-31T14:25:24.029475Z",
"url": "https://files.pythonhosted.org/packages/a9/3b/1afbb07abb26aa05d2fc9668372222ffcd38fb7d070b2dbd44d8d3ec1e59/laser_learning_environment-2.1.1-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c016311bcd0ac9ad3755a1277836f9bdc1a3336690e2651ef2e570a4d6040f18",
"md5": "5c8e3c0a9a78685a4ee1345f77017c04",
"sha256": "eeeef8b86823c6fcb97fb85cef5629d101076a0e10cb4f9ee1cfe158460394bb"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "5c8e3c0a9a78685a4ee1345f77017c04",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4,>=3.10",
"size": 1444383,
"upload_time": "2024-12-31T14:25:01",
"upload_time_iso_8601": "2024-12-31T14:25:01.649574Z",
"url": "https://files.pythonhosted.org/packages/c0/16/311bcd0ac9ad3755a1277836f9bdc1a3336690e2651ef2e570a4d6040f18/laser_learning_environment-2.1.1-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4bc3f314d77322f68fc1969bcc7e7f9b512b3382c7d8591fb5d2b04d55ef82d2",
"md5": "1165576840fee1d08e9d3f1af70f5629",
"sha256": "751a9ccaa8abc6cd67ba57a8f879187c3b92c13a8a970708ea2963688bd0a5f4"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "1165576840fee1d08e9d3f1af70f5629",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4,>=3.10",
"size": 1399856,
"upload_time": "2024-12-31T14:24:52",
"upload_time_iso_8601": "2024-12-31T14:24:52.797009Z",
"url": "https://files.pythonhosted.org/packages/4b/c3/f314d77322f68fc1969bcc7e7f9b512b3382c7d8591fb5d2b04d55ef82d2/laser_learning_environment-2.1.1-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "049ab89def5695ed1a03014d7af7b5fbff103febc532e122b54484763b9b24f1",
"md5": "a5e97e2a7a70a4faf6f77dca9c9e29c4",
"sha256": "546914282ecfb49ceed7eea058d923d880386e84ac3718414302169296b51117"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "a5e97e2a7a70a4faf6f77dca9c9e29c4",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4,>=3.10",
"size": 1558801,
"upload_time": "2024-12-31T14:25:11",
"upload_time_iso_8601": "2024-12-31T14:25:11.961624Z",
"url": "https://files.pythonhosted.org/packages/04/9a/b89def5695ed1a03014d7af7b5fbff103febc532e122b54484763b9b24f1/laser_learning_environment-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "52cc7f3f15322f12d837079f3d8218d31ba53c698dbbdf22221afb9c6b2cb3e8",
"md5": "d6cb240a7a770eb8878235cf0abdc08a",
"sha256": "86b4182b5debea7b5c7a4f3e57622a58ef32df6a8292ac396319785373c88f30"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "d6cb240a7a770eb8878235cf0abdc08a",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4,>=3.10",
"size": 1248516,
"upload_time": "2024-12-31T14:25:25",
"upload_time_iso_8601": "2024-12-31T14:25:25.879728Z",
"url": "https://files.pythonhosted.org/packages/52/cc/7f3f15322f12d837079f3d8218d31ba53c698dbbdf22221afb9c6b2cb3e8/laser_learning_environment-2.1.1-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8260ec7d0d773f7a2b1dfe49a5010747938a2ca40034f6162e5924d492c6a968",
"md5": "6811ed37a25d36ddece467d9d056b60f",
"sha256": "db1c3ca771fb890322e5da8b0025c228626c455d4e9b088aa91252218f082b06"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "6811ed37a25d36ddece467d9d056b60f",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4,>=3.10",
"size": 1427939,
"upload_time": "2024-12-31T14:25:04",
"upload_time_iso_8601": "2024-12-31T14:25:04.941072Z",
"url": "https://files.pythonhosted.org/packages/82/60/ec7d0d773f7a2b1dfe49a5010747938a2ca40034f6162e5924d492c6a968/laser_learning_environment-2.1.1-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9e7d0e393cdfc81b49d21eb7d29d23be875003a3dd64e3fa0ea43d1f340c4c57",
"md5": "84564c9fa95abdbd34610018932d3a5c",
"sha256": "939717c8e2e9d3a4d16d2ff7a5d79abc09eae23da4fecb6c2280f880ed43b7c2"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "84564c9fa95abdbd34610018932d3a5c",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4,>=3.10",
"size": 1390282,
"upload_time": "2024-12-31T14:24:56",
"upload_time_iso_8601": "2024-12-31T14:24:56.372618Z",
"url": "https://files.pythonhosted.org/packages/9e/7d/0e393cdfc81b49d21eb7d29d23be875003a3dd64e3fa0ea43d1f340c4c57/laser_learning_environment-2.1.1-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7b45907e31546dafd565f3700d5196f778f9bc989b57b4d583be31dc6f31e70d",
"md5": "f116cd0226a034d0ca0d065630ea2637",
"sha256": "706202379e840560829548e715396e6756d58a56c889b2f62b918c2f19451df4"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f116cd0226a034d0ca0d065630ea2637",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4,>=3.10",
"size": 1561221,
"upload_time": "2024-12-31T14:25:13",
"upload_time_iso_8601": "2024-12-31T14:25:13.988689Z",
"url": "https://files.pythonhosted.org/packages/7b/45/907e31546dafd565f3700d5196f778f9bc989b57b4d583be31dc6f31e70d/laser_learning_environment-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0cd3651bd31821b683679da5fd5122079cb9389f47c437efe1d2dd74b8d7bcfc",
"md5": "b48b803ec40cbf6dfe3e55ae1eba2377",
"sha256": "1af977f41264be01d1991abd02717ed96da222b41f9f8c2ce3609962da76b132"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "b48b803ec40cbf6dfe3e55ae1eba2377",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4,>=3.10",
"size": 1242336,
"upload_time": "2024-12-31T14:25:27",
"upload_time_iso_8601": "2024-12-31T14:25:27.805985Z",
"url": "https://files.pythonhosted.org/packages/0c/d3/651bd31821b683679da5fd5122079cb9389f47c437efe1d2dd74b8d7bcfc/laser_learning_environment-2.1.1-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "467cebb9ae1971489731e168031d9520cb904f01bc8917a4fa7483134fbf5bf2",
"md5": "c0d5c1f6fe0493c148565b22ebc2f1b1",
"sha256": "5d3e2faca1432dc854131f0744de0e95f94f82da724f10303d8734b7db3e594f"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp313-cp313-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "c0d5c1f6fe0493c148565b22ebc2f1b1",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<4,>=3.10",
"size": 1427583,
"upload_time": "2024-12-31T14:25:06",
"upload_time_iso_8601": "2024-12-31T14:25:06.804315Z",
"url": "https://files.pythonhosted.org/packages/46/7c/ebb9ae1971489731e168031d9520cb904f01bc8917a4fa7483134fbf5bf2/laser_learning_environment-2.1.1-cp313-cp313-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d15e5feb892b058ed1de68a94734947f9d7218722d61fcb5b4b630795281cd2b",
"md5": "49de5877545cf27804e812710e604379",
"sha256": "c329fe604ad5db9a3ae61761d1a2244ea13c7829a005ea5f0feeed6afa7fc27c"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "49de5877545cf27804e812710e604379",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<4,>=3.10",
"size": 1390109,
"upload_time": "2024-12-31T14:24:59",
"upload_time_iso_8601": "2024-12-31T14:24:59.422279Z",
"url": "https://files.pythonhosted.org/packages/d1/5e/5feb892b058ed1de68a94734947f9d7218722d61fcb5b4b630795281cd2b/laser_learning_environment-2.1.1-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "64cef4240a90caf39eaa7d9a24925984b2275b4ae1765e41c323943919347ab5",
"md5": "5133e27e622fd1d286ceb2c59912b528",
"sha256": "9f4b1619b84bda81322eb0326fa50a00b58e25afc328016c469a8984f95e6191"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "5133e27e622fd1d286ceb2c59912b528",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<4,>=3.10",
"size": 1561006,
"upload_time": "2024-12-31T14:25:18",
"upload_time_iso_8601": "2024-12-31T14:25:18.499586Z",
"url": "https://files.pythonhosted.org/packages/64/ce/f4240a90caf39eaa7d9a24925984b2275b4ae1765e41c323943919347ab5/laser_learning_environment-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b49a04653fd0f16a93c7adaddaa62e7a4e124c7661940cb9a0a289c0c661006b",
"md5": "78c364f68da1d1a15831f67d31e7fa9b",
"sha256": "408622e91956b24488ffa9efcf2be52750902b34021e77b92890cc21fd57675d"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "78c364f68da1d1a15831f67d31e7fa9b",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": "<4,>=3.10",
"size": 1559837,
"upload_time": "2024-12-31T14:25:20",
"upload_time_iso_8601": "2024-12-31T14:25:20.875702Z",
"url": "https://files.pythonhosted.org/packages/b4/9a/04653fd0f16a93c7adaddaa62e7a4e124c7661940cb9a0a289c0c661006b/laser_learning_environment-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ee889a72da6cc5a5b9f6f27434961cc200ff395517489318a05e3c28702aadd5",
"md5": "393ffe768619f7e65aba5b1dd42fba68",
"sha256": "9f583f1e63ed92d37b48614d14617560d155641dc3e55343d2a1a84f2c4936af"
},
"downloads": -1,
"filename": "laser_learning_environment-2.1.1.tar.gz",
"has_sig": false,
"md5_digest": "393ffe768619f7e65aba5b1dd42fba68",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4,>=3.10",
"size": 95625,
"upload_time": "2024-12-31T14:25:08",
"upload_time_iso_8601": "2024-12-31T14:25:08.380165Z",
"url": "https://files.pythonhosted.org/packages/ee/88/9a72da6cc5a5b9f6f27434961cc200ff395517489318a05e3c28702aadd5/laser_learning_environment-2.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-31 14:25:08",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yamoling",
"github_project": "lle",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "laser-learning-environment"
}