
[](https://pypi.org/project/neuroptimiser/)

[](https://pypi.org/project/neuroptimiser/)
[](https://pypi.org/project/neuroptimiser/)

[](https://arxiv.org/abs/2507.08320)
[](https://doi.org/10.5281/zenodo.15592900)
[](https://doi.org/10.5281/zenodo.15858610)
# NeurOptimiser
**NeurOptimiser** is a neuromorphic optimisation framework in which metaheuristic search emerges from asynchronous spiking dynamics. It defines optimisation as a decentralised process executed by interconnected Neuromorphic Heuristic Units (NHUs), each embedding a spiking neuron model and a spike-triggered heuristic rule.
This framework enables fully event-driven, low-power optimisation by integrating spiking computation with local heuristic adaptation. It supports multiple neuron models, perturbation operators, and network topologies.
---
## β¨ Key Features
- Modular and extensible architecture using **Intelβs Lava**.
- Supports **linear** and **Izhikevich** neuron dynamics.
- Implements **random**, **fixed**, **directional**, and **Differential Evolution** operators as spike-triggered perturbations.
- Includes asynchronous **neighbourhood management**, **tensor contraction layers**, and **greedy selectors**.
- Compatible with **BBOB (COCO)** suite.
- Designed for **scalability**, **reusability**, and **future deployment** on **Loihi-class neuromorphic hardware**.
---
## π Documentation
For detailed documentation, examples, and API reference, please visit the [Neuroptimiser Documentation](https://neuroptimiser.github.io/).
## π¦ Installation
```bash
pip install -e .
```
Ensure you have Python β₯ 3.10 and the Lava-NC environment configured.
You can also clone the repository and install it. Check the Makefile for additional options.
## π Example Usage
```python
from neuroptimiser import NeuroOptimiser
import numpy as np
problem_function = lambda x: np.linalg.norm(x)
problem_bounds = np.array([[-5.0, 5.0], [-5.0, 5.0]])
optimiser = NeurOptimiser()
optimiser.solve(
obj_func=problem_function,
search_space=problem_bounds,
debug_mode=True,
num_iterations=1000,
)
```
For more examples, please, visit [Neuroptimiser Usage](https://neuroptimiser.github.io/usage.html)
## π Benchmarking
Neuroptimiser has been validated over the [BBOB suite](https://github.com/numbbo/coco), showing:
* Competitive convergence versus Random Search
* Consistent results across function types and dimensions
* Linear runtime scaling with number of units and problem size
## π¬ Citation
```bibtex
@misc{neuroptimiser2025,
author={Cruz-Duarte, Jorge M. and Talbi, El-Ghazali},
title = {Neuroptimiser: A neuromorphic optimisation framework},
year = {2025},
url = {https://github.com/neuroptimiser/neuroptimiser},
note = {Version 1.0.X, accessed on 20XX-XX-XX}
}
```
## π Resources
* π [Documentation](https://neuroptimiser.github.io)
* π [Paper](https://doi.org/10.48550/arXiv.2507.08320)
* π§ [Intel Lava-NC](https://github.com/lava-nc/lava)
* π§ͺ [COCO Platform](https://github.com/numbbo/coco)
## π οΈ License
MIT License β [see LICENSE](LICENSE)
## π§βπ» Authors
* [Jorge M. Cruz-Duarte](https://github.com/jcrvz) β University of Lille
* El-Ghazali Talbi β University of Lille
{
"_id": null,
"home_page": null,
"name": "neuroptimiser",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "neuromorphic, spiking, optimisation, lava-nc",
"author": null,
"author_email": "Jorge Mario Cruz-Duarte <jorge.cruz-duarte@univ-lille.fr>, El-Ghazali Talbi <el-ghazali.talbi@univ-lille.fr>",
"download_url": "https://files.pythonhosted.org/packages/ac/3f/1610d1275b97f280062925df0632f9e5179f718038ef74e5771977184934/neuroptimiser-1.0.1.post1.tar.gz",
"platform": null,
"description": "\n[](https://pypi.org/project/neuroptimiser/)\n\n[](https://pypi.org/project/neuroptimiser/)\n[](https://pypi.org/project/neuroptimiser/)\n\n[](https://arxiv.org/abs/2507.08320)\n[](https://doi.org/10.5281/zenodo.15592900)\n[](https://doi.org/10.5281/zenodo.15858610)\n\n# NeurOptimiser\n\n**NeurOptimiser** is a neuromorphic optimisation framework in which metaheuristic search emerges from asynchronous spiking dynamics. It defines optimisation as a decentralised process executed by interconnected Neuromorphic Heuristic Units (NHUs), each embedding a spiking neuron model and a spike-triggered heuristic rule.\n\nThis framework enables fully event-driven, low-power optimisation by integrating spiking computation with local heuristic adaptation. It supports multiple neuron models, perturbation operators, and network topologies.\n\n---\n\n## \u2728 Key Features\n\n- Modular and extensible architecture using **Intel\u2019s Lava**.\n- Supports **linear** and **Izhikevich** neuron dynamics.\n- Implements **random**, **fixed**, **directional**, and **Differential Evolution** operators as spike-triggered perturbations.\n- Includes asynchronous **neighbourhood management**, **tensor contraction layers**, and **greedy selectors**.\n- Compatible with **BBOB (COCO)** suite.\n- Designed for **scalability**, **reusability**, and **future deployment** on **Loihi-class neuromorphic hardware**.\n\n---\n\n## \ud83d\udcd6 Documentation\nFor detailed documentation, examples, and API reference, please visit the [Neuroptimiser Documentation](https://neuroptimiser.github.io/).\n\n## \ud83d\udce6 Installation\n\n```bash\npip install -e .\n```\nEnsure you have Python \u2265 3.10 and the Lava-NC environment configured.\n\nYou can also clone the repository and install it. Check the Makefile for additional options.\n\n\n## \ud83d\ude80 Example Usage\n```python\nfrom neuroptimiser import NeuroOptimiser\nimport numpy as np\n\nproblem_function = lambda x: np.linalg.norm(x)\nproblem_bounds = np.array([[-5.0, 5.0], [-5.0, 5.0]])\n\noptimiser = NeurOptimiser()\n\noptimiser.solve(\n obj_func=problem_function,\n search_space=problem_bounds,\n debug_mode=True,\n num_iterations=1000,\n)\n```\n\nFor more examples, please, visit [Neuroptimiser Usage](https://neuroptimiser.github.io/usage.html)\n\n## \ud83d\udcca Benchmarking\nNeuroptimiser has been validated over the [BBOB suite](https://github.com/numbbo/coco), showing:\n* Competitive convergence versus Random Search\n* Consistent results across function types and dimensions\n* Linear runtime scaling with number of units and problem size\n\n## \ud83d\udd2c Citation\n```bibtex\n@misc{neuroptimiser2025,\n author={Cruz-Duarte, Jorge M. and Talbi, El-Ghazali},\n title = {Neuroptimiser: A neuromorphic optimisation framework},\n year = {2025},\n url = {https://github.com/neuroptimiser/neuroptimiser},\n note = {Version 1.0.X, accessed on 20XX-XX-XX}\n}\n```\n\n## \ud83d\udd17 Resources\n* \ud83d\udcd8 [Documentation](https://neuroptimiser.github.io)\n* \ud83d\udcdc [Paper](https://doi.org/10.48550/arXiv.2507.08320)\n* \ud83e\udde0 [Intel Lava-NC](https://github.com/lava-nc/lava)\n* \ud83e\uddea [COCO Platform](https://github.com/numbbo/coco)\n\n## \ud83d\udee0\ufe0f License\nMIT License \u2014 [see LICENSE](LICENSE)\n\n## \ud83e\uddd1\u200d\ud83d\udcbb Authors\n* [Jorge M. Cruz-Duarte](https://github.com/jcrvz) \u2014 University of Lille\n* El-Ghazali Talbi \u2014 University of Lille\n",
"bugtrack_url": null,
"license": null,
"summary": "A modular and asynchronous framework for neuromorphic optimisation using spike-driven metaheuristics and heuristic-controlled spiking dynamics.",
"version": "1.0.1.post1",
"project_urls": {
"Documentation": "https://neuroptimiser.github.io",
"Homepage": "https://neuroptimiser.github.io",
"Source": "https://github.com/neuroptimiser/neuroptimiser"
},
"split_keywords": [
"neuromorphic",
" spiking",
" optimisation",
" lava-nc"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "2e7255f37092dd0803b5a6378e712fe13f114d32c43d5c3e8f153b3d746f7f1d",
"md5": "054b9481aed5c44e061b34e6b8ec42bd",
"sha256": "6ce3b0bd47c865831e40a1b59df459056429a046ae41f464c905b1f523eda537"
},
"downloads": -1,
"filename": "neuroptimiser-1.0.1.post1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "054b9481aed5c44e061b34e6b8ec42bd",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 33562,
"upload_time": "2025-08-29T15:32:08",
"upload_time_iso_8601": "2025-08-29T15:32:08.418823Z",
"url": "https://files.pythonhosted.org/packages/2e/72/55f37092dd0803b5a6378e712fe13f114d32c43d5c3e8f153b3d746f7f1d/neuroptimiser-1.0.1.post1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ac3f1610d1275b97f280062925df0632f9e5179f718038ef74e5771977184934",
"md5": "520d089964e0d0b8c27ee670f429a21e",
"sha256": "d581eb20edc798e05f6e7f42c589e2b27042cd77f2652b519349a7a33aa5fa60"
},
"downloads": -1,
"filename": "neuroptimiser-1.0.1.post1.tar.gz",
"has_sig": false,
"md5_digest": "520d089964e0d0b8c27ee670f429a21e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 37654,
"upload_time": "2025-08-29T15:32:09",
"upload_time_iso_8601": "2025-08-29T15:32:09.731492Z",
"url": "https://files.pythonhosted.org/packages/ac/3f/1610d1275b97f280062925df0632f9e5179f718038ef74e5771977184934/neuroptimiser-1.0.1.post1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-29 15:32:09",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "neuroptimiser",
"github_project": "neuroptimiser",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "alabaster",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "alembic",
"specs": [
[
"==",
"1.16.1"
]
]
},
{
"name": "anyio",
"specs": [
[
"==",
"4.9.0"
]
]
},
{
"name": "appnope",
"specs": [
[
"==",
"0.1.4"
]
]
},
{
"name": "argon2-cffi",
"specs": [
[
"==",
"23.1.0"
]
]
},
{
"name": "argon2-cffi-bindings",
"specs": [
[
"==",
"21.2.0"
]
]
},
{
"name": "arrow",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "asteval",
"specs": [
[
"==",
"0.9.33"
]
]
},
{
"name": "asttokens",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "async-lru",
"specs": [
[
"==",
"2.0.5"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"25.3.0"
]
]
},
{
"name": "babel",
"specs": [
[
"==",
"2.17.0"
]
]
},
{
"name": "beautifulsoup4",
"specs": [
[
"==",
"4.13.4"
]
]
},
{
"name": "bleach",
"specs": [
[
"==",
"6.2.0"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2025.4.26"
]
]
},
{
"name": "cffi",
"specs": [
[
"==",
"1.17.1"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.4.2"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.2.1"
]
]
},
{
"name": "cmaes",
"specs": [
[
"==",
"0.11.1"
]
]
},
{
"name": "coco-experiment",
"specs": [
[
"==",
"2.8.1"
]
]
},
{
"name": "cocopp",
"specs": [
[
"==",
"2.7.3"
]
]
},
{
"name": "colorlog",
"specs": [
[
"==",
"6.9.0"
]
]
},
{
"name": "comm",
"specs": [
[
"==",
"0.2.2"
]
]
},
{
"name": "contourpy",
"specs": [
[
"==",
"1.3.2"
]
]
},
{
"name": "cryptography",
"specs": [
[
"==",
"45.0.3"
]
]
},
{
"name": "customhys",
"specs": [
[
"==",
"1.1.6"
]
]
},
{
"name": "cycler",
"specs": [
[
"==",
"0.12.1"
]
]
},
{
"name": "debugpy",
"specs": [
[
"==",
"1.8.14"
]
]
},
{
"name": "decorator",
"specs": [
[
"==",
"5.2.1"
]
]
},
{
"name": "defusedxml",
"specs": [
[
"==",
"0.7.1"
]
]
},
{
"name": "deprecated",
"specs": [
[
"==",
"1.2.18"
]
]
},
{
"name": "docutils",
"specs": [
[
"==",
"0.21.2"
]
]
},
{
"name": "exceptiongroup",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "executing",
"specs": [
[
"==",
"2.2.0"
]
]
},
{
"name": "fastjsonschema",
"specs": [
[
"==",
"2.21.1"
]
]
},
{
"name": "filelock",
"specs": [
[
"==",
"3.18.0"
]
]
},
{
"name": "fonttools",
"specs": [
[
"==",
"4.58.0"
]
]
},
{
"name": "fqdn",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "fsspec",
"specs": [
[
"==",
"2025.5.1"
]
]
},
{
"name": "furo",
"specs": [
[
"==",
"2024.8.6"
]
]
},
{
"name": "ga4mp",
"specs": [
[
"==",
"2.0.4"
]
]
},
{
"name": "graphviz",
"specs": [
[
"==",
"0.20.3"
]
]
},
{
"name": "h11",
"specs": [
[
"==",
"0.16.0"
]
]
},
{
"name": "httpcore",
"specs": [
[
"==",
"1.0.9"
]
]
},
{
"name": "httpx",
"specs": [
[
"==",
"0.28.1"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.10"
]
]
},
{
"name": "imagesize",
"specs": [
[
"==",
"1.4.1"
]
]
},
{
"name": "importlib-metadata",
"specs": [
[
"==",
"8.7.0"
]
]
},
{
"name": "iniconfig",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "ioh",
"specs": [
[
"==",
"0.3.18"
]
]
},
{
"name": "ipykernel",
"specs": [
[
"==",
"6.29.5"
]
]
},
{
"name": "ipython",
"specs": [
[
"==",
"8.36.0"
]
]
},
{
"name": "isoduration",
"specs": [
[
"==",
"20.11.0"
]
]
},
{
"name": "jedi",
"specs": [
[
"==",
"0.19.2"
]
]
},
{
"name": "jinja2",
"specs": [
[
"==",
"3.1.6"
]
]
},
{
"name": "joblib",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "json5",
"specs": [
[
"==",
"0.12.0"
]
]
},
{
"name": "jsonpointer",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "jsonschema",
"specs": [
[
"==",
"4.24.0"
]
]
},
{
"name": "jsonschema-specifications",
"specs": [
[
"==",
"2025.4.1"
]
]
},
{
"name": "kiwisolver",
"specs": [
[
"==",
"1.4.8"
]
]
},
{
"name": "lava-nc",
"specs": [
[
"==",
"0.10.0"
]
]
},
{
"name": "mako",
"specs": [
[
"==",
"1.3.10"
]
]
},
{
"name": "markdown-it-py",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "markupsafe",
"specs": [
[
"==",
"3.0.2"
]
]
},
{
"name": "matplotlib",
"specs": [
[
"==",
"3.10.3"
]
]
},
{
"name": "matplotlib-inline",
"specs": [
[
"==",
"0.1.7"
]
]
},
{
"name": "mdit-py-plugins",
"specs": [
[
"==",
"0.4.2"
]
]
},
{
"name": "mdurl",
"specs": [
[
"==",
"0.1.2"
]
]
},
{
"name": "mistune",
"specs": [
[
"==",
"3.1.3"
]
]
},
{
"name": "mpmath",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "myst-nb",
"specs": [
[
"==",
"1.2.0"
]
]
},
{
"name": "myst-parser",
"specs": [
[
"==",
"4.0.1"
]
]
},
{
"name": "nbclient",
"specs": [
[
"==",
"0.10.2"
]
]
},
{
"name": "nbconvert",
"specs": [
[
"==",
"7.16.6"
]
]
},
{
"name": "nbformat",
"specs": [
[
"==",
"5.10.4"
]
]
},
{
"name": "nest-asyncio",
"specs": [
[
"==",
"1.6.0"
]
]
},
{
"name": "networkx",
"specs": [
[
"==",
"2.8.7"
]
]
},
{
"name": "notebook",
"specs": [
[
"==",
"7.4.3"
]
]
},
{
"name": "notebook-shim",
"specs": [
[
"==",
"0.2.4"
]
]
},
{
"name": "numpy",
"specs": [
[
"==",
"1.25.0"
]
]
},
{
"name": "optuna",
"specs": [
[
"==",
"4.3.0"
]
]
},
{
"name": "optunahub",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "overrides",
"specs": [
[
"==",
"7.7.0"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"25.0"
]
]
},
{
"name": "pandas",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "pandocfilters",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "parso",
"specs": [
[
"==",
"0.8.4"
]
]
},
{
"name": "pexpect",
"specs": [
[
"==",
"4.9.0"
]
]
},
{
"name": "pillow",
"specs": [
[
"==",
"11.2.1"
]
]
},
{
"name": "pip",
"specs": [
[
"==",
"25.1.1"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"4.3.8"
]
]
},
{
"name": "pluggy",
"specs": [
[
"==",
"1.6.0"
]
]
},
{
"name": "pockets",
"specs": [
[
"==",
"0.9.1"
]
]
},
{
"name": "prometheus-client",
"specs": [
[
"==",
"0.22.0"
]
]
},
{
"name": "prompt-toolkit",
"specs": [
[
"==",
"3.0.51"
]
]
},
{
"name": "psutil",
"specs": [
[
"==",
"7.0.0"
]
]
},
{
"name": "ptyprocess",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "pure-eval",
"specs": [
[
"==",
"0.2.3"
]
]
},
{
"name": "pycparser",
"specs": [
[
"==",
"2.22"
]
]
},
{
"name": "pygithub",
"specs": [
[
"==",
"2.6.1"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.19.1"
]
]
},
{
"name": "pyjwt",
"specs": [
[
"==",
"2.10.1"
]
]
},
{
"name": "pynacl",
"specs": [
[
"==",
"1.5.0"
]
]
},
{
"name": "pyparsing",
"specs": [
[
"==",
"3.2.3"
]
]
},
{
"name": "pyqt5",
"specs": [
[
"==",
"5.15.11"
]
]
},
{
"name": "pyqt5-qt5",
"specs": [
[
"==",
"5.15.17"
]
]
},
{
"name": "pyqt5-sip",
"specs": [
[
"==",
"12.17.0"
]
]
},
{
"name": "pytest",
"specs": [
[
"==",
"8.3.5"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.9.0.post0"
]
]
},
{
"name": "python-json-logger",
"specs": [
[
"==",
"3.3.0"
]
]
},
{
"name": "pytz",
"specs": [
[
"==",
"2025.2"
]
]
},
{
"name": "pyyaml",
"specs": [
[
"==",
"6.0.2"
]
]
},
{
"name": "pyzmq",
"specs": [
[
"==",
"26.4.0"
]
]
},
{
"name": "referencing",
"specs": [
[
"==",
"0.36.2"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.3"
]
]
},
{
"name": "rfc3339-validator",
"specs": [
[
"==",
"0.1.4"
]
]
},
{
"name": "rfc3986-validator",
"specs": [
[
"==",
"0.1.1"
]
]
},
{
"name": "rpds-py",
"specs": [
[
"==",
"0.25.1"
]
]
},
{
"name": "schema",
"specs": [
[
"==",
"0.7.7"
]
]
},
{
"name": "scikit-learn",
"specs": [
[
"==",
"1.6.1"
]
]
},
{
"name": "scipy",
"specs": [
[
"==",
"1.15.3"
]
]
},
{
"name": "seaborn",
"specs": [
[
"==",
"0.13.2"
]
]
},
{
"name": "send2trash",
"specs": [
[
"==",
"1.8.3"
]
]
},
{
"name": "setuptools",
"specs": [
[
"==",
"80.9.0"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.17.0"
]
]
},
{
"name": "sniffio",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "snowballstemmer",
"specs": [
[
"==",
"3.0.1"
]
]
},
{
"name": "soupsieve",
"specs": [
[
"==",
"2.7"
]
]
},
{
"name": "sqlalchemy",
"specs": [
[
"==",
"2.0.41"
]
]
},
{
"name": "stack-data",
"specs": [
[
"==",
"0.6.3"
]
]
},
{
"name": "sympy",
"specs": [
[
"==",
"1.14.0"
]
]
},
{
"name": "tabulate",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "terminado",
"specs": [
[
"==",
"0.18.1"
]
]
},
{
"name": "threadpoolctl",
"specs": [
[
"==",
"3.6.0"
]
]
},
{
"name": "tikzpy",
"specs": [
[
"==",
"0.0.4"
]
]
},
{
"name": "tinycss2",
"specs": [
[
"==",
"1.4.0"
]
]
},
{
"name": "tomli",
"specs": [
[
"==",
"2.2.1"
]
]
},
{
"name": "torch",
"specs": [
[
"==",
"2.7.0"
]
]
},
{
"name": "tornado",
"specs": [
[
"==",
"6.5.1"
]
]
},
{
"name": "tqdm",
"specs": [
[
"==",
"4.67.1"
]
]
},
{
"name": "traitlets",
"specs": [
[
"==",
"5.14.3"
]
]
},
{
"name": "types-python-dateutil",
"specs": [
[
"==",
"2.9.0.20250516"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.13.2"
]
]
},
{
"name": "tzdata",
"specs": [
[
"==",
"2025.2"
]
]
},
{
"name": "uri-template",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.4.0"
]
]
},
{
"name": "wcwidth",
"specs": [
[
"==",
"0.2.13"
]
]
},
{
"name": "webcolors",
"specs": [
[
"==",
"24.11.1"
]
]
},
{
"name": "webencodings",
"specs": [
[
"==",
"0.5.1"
]
]
},
{
"name": "websocket-client",
"specs": [
[
"==",
"1.8.0"
]
]
},
{
"name": "wrapt",
"specs": [
[
"==",
"1.17.2"
]
]
},
{
"name": "zipp",
"specs": [
[
"==",
"3.22.0"
]
]
}
],
"lcname": "neuroptimiser"
}