# Gradient Boosting Reinforcement Learning (GBRL)
GBRL is a Python-based Gradient Boosting Trees (GBT) library, similar to popular packages such as [XGBoost](https://xgboost.readthedocs.io/en/stable/), [CatBoost](https://catboost.ai/), but specifically designed and optimized for reinforcement learning (RL). GBRL is implemented in C++/CUDA aimed to seamlessly integrate within popular RL libraries.
[](https://github.com/NVlabs/gbrl/blob/master/LICENSE)
[](https://badge.fury.io/py/gbrl)
## Overview
GBRL adapts the power of Gradient Boosting Trees to the unique challenges of RL environments, including non-stationarity and the absence of predefined targets. The following diagram illustrates how GBRL uses gradient boosting trees in RL:

GBRL features a shared tree-based structure for policy and value functions, significantly reducing memory and computational overhead, enabling it to tackle complex, high-dimensional RL problems.
## Key Features:
- GBT Tailored for RL: GBRL adapts the power of Gradient Boosting Trees to the unique challenges of RL environments, including non-stationarity and the absence of predefined targets.
- Optimized Actor-Critic Architecture: GBRL features a shared tree-based structure for policy and value functions. This significantly reduces memory and computational overhead, enabling it to tackle complex, high-dimensional RL problems.
- Hardware Acceleration: GBRL leverages CUDA for hardware-accelerated computation, ensuring efficiency and speed.
- Seamless Integration: GBRL is designed for easy integration with popular RL libraries. We implemented GBT-based actor-critic algorithm implementations (A2C, PPO, and AWR) in stable_baselines3 [GBRL_SB3](https://github.com/NVlabs/gbrl_sb3).
## Performance
The following results, obtained using the `GBRL_SB3` repository, demonstrate the performance of PPO with GBRL compared to neural-networks across various scenarios and environments:

## Getting started
### Dependencies
- Python 3.9 or higher
### Installation
GBRL provides pre-compiled binaries for easy installation. Choose **one** of the following options:
**CPU-only installation** (default):
```pip install gbrl```
**GPU-enabled installation** (requires CUDA 12 runtime libraries):
```pip install gbrl-gpu```
For further installation details and dependencies see the documentation.
### Usage Example
For a detailed usage example, see `tutorial.ipynb`
## Current Supported Features
### Tree Fitting
- Greedy (Depth-wise) tree building - (CPU/GPU)
- Oblivious (Symmetric) tree building - (CPU/GPU)
- L2 split score - (CPU/GPU)
- Cosine split score - (CPU/GPU)
- Uniform based candidate generation - (CPU/GPU)
- Quantile based candidate generation - (CPU/GPU)
- Supervised learning fitting / Multi-iteration fitting - (CPU/GPU)
- MultiRMSE loss (only)
- Categorical inputs
- Input feature weights - (CPU/GPU)
### GBT Inference
- SGD optimizer - (CPU/GPU)
- ADAM optimizer - (CPU only)
- Control Variates (gradient variance reduction technique) - (CPU only)
- Shared Tree for policy and value function - (CPU/GPU)
- Linear and constant learning rate scheduler - (CPU/GPU only constant)
- Support for up to two different optimizers (e.g, policy/value) - **(CPU/GPU if both are SGD)
- SHAP value calculation
# Documentation
For comprehensive documentation, visit the [GBRL documentation](https://nvlabs.github.io/gbrl/).
# Contributing
To contribute to GBRL, please review and sign the Contributor License Agreement (CLA) available at: [https://github.com/NVlabs/gbrl/blob/master/CLA.md](https://github.com/NVlabs/gbrl/blob/master/CLA.md)
# Citation
```
@inproceedings{
fuhrer2025gradient,
title={Gradient Boosting Reinforcement Learning},
author={Benjamin Fuhrer and Chen Tessler and Gal Dalal},
booktitle={Forty-second International Conference on Machine Learning},
year={2025},
url={https://arxiv.org/abs/2407.08250}
}
```
# Licenses
Copyright © 2024-2025, NVIDIA Corporation. All rights reserved.
This work is made available under the NVIDIA The MIT License. Click [here](https://github.com/NVlabs/gbrl/blob/master/LICENSE). to view a copy of this license.
Raw data
{
"_id": null,
"home_page": null,
"name": "gbrl",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": null,
"author": "Benjamin Fuhrer, Chen Tessler, Gal Dalal",
"author_email": "Benjamin Fuhrer <bfuhrer@nvidia.com>, Chen Tessler <ctessler@nvidia.com>, Gal Dalal <galal@nvidia.com>",
"download_url": "https://files.pythonhosted.org/packages/2f/1b/bf396e64b223743f8fe334cb0dab64a39b91c737015fc8809177f6f63ad5/gbrl-1.1.4.tar.gz",
"platform": null,
"description": "# Gradient Boosting Reinforcement Learning (GBRL)\nGBRL is a Python-based Gradient Boosting Trees (GBT) library, similar to popular packages such as [XGBoost](https://xgboost.readthedocs.io/en/stable/), [CatBoost](https://catboost.ai/), but specifically designed and optimized for reinforcement learning (RL). GBRL is implemented in C++/CUDA aimed to seamlessly integrate within popular RL libraries. \n\n[](https://github.com/NVlabs/gbrl/blob/master/LICENSE)\n[](https://badge.fury.io/py/gbrl)\n\n## Overview\n\nGBRL adapts the power of Gradient Boosting Trees to the unique challenges of RL environments, including non-stationarity and the absence of predefined targets. The following diagram illustrates how GBRL uses gradient boosting trees in RL:\n\n\n\nGBRL features a shared tree-based structure for policy and value functions, significantly reducing memory and computational overhead, enabling it to tackle complex, high-dimensional RL problems.\n\n## Key Features: \n- GBT Tailored for RL: GBRL adapts the power of Gradient Boosting Trees to the unique challenges of RL environments, including non-stationarity and the absence of predefined targets.\n- Optimized Actor-Critic Architecture: GBRL features a shared tree-based structure for policy and value functions. This significantly reduces memory and computational overhead, enabling it to tackle complex, high-dimensional RL problems.\n- Hardware Acceleration: GBRL leverages CUDA for hardware-accelerated computation, ensuring efficiency and speed.\n- Seamless Integration: GBRL is designed for easy integration with popular RL libraries. We implemented GBT-based actor-critic algorithm implementations (A2C, PPO, and AWR) in stable_baselines3 [GBRL_SB3](https://github.com/NVlabs/gbrl_sb3). \n\n## Performance\n\nThe following results, obtained using the `GBRL_SB3` repository, demonstrate the performance of PPO with GBRL compared to neural-networks across various scenarios and environments:\n\n\n\n## Getting started\n### Dependencies\n- Python 3.9 or higher\n\n### Installation\nGBRL provides pre-compiled binaries for easy installation. Choose **one** of the following options:\n\n**CPU-only installation** (default): \n```pip install gbrl```\n\n**GPU-enabled installation** (requires CUDA 12 runtime libraries): \n```pip install gbrl-gpu```\n\nFor further installation details and dependencies see the documentation. \n\n### Usage Example\nFor a detailed usage example, see `tutorial.ipynb`\n\n## Current Supported Features\n### Tree Fitting\n- Greedy (Depth-wise) tree building - (CPU/GPU) \n- Oblivious (Symmetric) tree building - (CPU/GPU) \n- L2 split score - (CPU/GPU) \n- Cosine split score - (CPU/GPU) \n- Uniform based candidate generation - (CPU/GPU)\n- Quantile based candidate generation - (CPU/GPU)\n- Supervised learning fitting / Multi-iteration fitting - (CPU/GPU)\n - MultiRMSE loss (only)\n- Categorical inputs\n- Input feature weights - (CPU/GPU)\n### GBT Inference\n- SGD optimizer - (CPU/GPU)\n- ADAM optimizer - (CPU only)\n- Control Variates (gradient variance reduction technique) - (CPU only)\n- Shared Tree for policy and value function - (CPU/GPU)\n- Linear and constant learning rate scheduler - (CPU/GPU only constant)\n- Support for up to two different optimizers (e.g, policy/value) - **(CPU/GPU if both are SGD)\n- SHAP value calculation\n\n# Documentation \nFor comprehensive documentation, visit the [GBRL documentation](https://nvlabs.github.io/gbrl/).\n\n# Contributing\nTo contribute to GBRL, please review and sign the Contributor License Agreement (CLA) available at: [https://github.com/NVlabs/gbrl/blob/master/CLA.md](https://github.com/NVlabs/gbrl/blob/master/CLA.md)\n\n# Citation\n``` \n@inproceedings{\nfuhrer2025gradient,\ntitle={Gradient Boosting Reinforcement Learning},\nauthor={Benjamin Fuhrer and Chen Tessler and Gal Dalal},\nbooktitle={Forty-second International Conference on Machine Learning},\nyear={2025},\nurl={https://arxiv.org/abs/2407.08250}\n}\n```\n# Licenses\nCopyright \u00a9 2024-2025, NVIDIA Corporation. All rights reserved.\n\nThis work is made available under the NVIDIA The MIT License. Click [here](https://github.com/NVlabs/gbrl/blob/master/LICENSE). to view a copy of this license.\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Gradient Boosted Trees for RL",
"version": "1.1.4",
"project_urls": {
"Documentation": "https://nvlabs.github.io/gbrl/",
"Homepage": "https://github.com/NVlabs/gbrl",
"Repository": "https://github.com/NVlabs/gbrl"
},
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "53e938a64493e7e8e1b7ebfe4af190c430e377e527be29f3dc0ddaff29b95220",
"md5": "617814acb236112486733e6d58cfafc3",
"sha256": "25480a65b6062dd4e4a6a121b0a0a59f6288516db7cec8f2b043b6b81ffede07"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp310-cp310-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "617814acb236112486733e6d58cfafc3",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 405942,
"upload_time": "2025-11-06T18:37:57",
"upload_time_iso_8601": "2025-11-06T18:37:57.857340Z",
"url": "https://files.pythonhosted.org/packages/53/e9/38a64493e7e8e1b7ebfe4af190c430e377e527be29f3dc0ddaff29b95220/gbrl-1.1.4-cp310-cp310-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c0281bb6de15658b0b8e9f8bfd9eb58ac1845adbef460702f1a745e23d1e4778",
"md5": "815805c248a54d6610da8f669ba7e86f",
"sha256": "88e0cc78a10fe8355d59f7ffcaff0ee7fa8c3db9ecac0aba0f8cad3acbfe631e"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp310-cp310-macosx_15_0_arm64.whl",
"has_sig": false,
"md5_digest": "815805c248a54d6610da8f669ba7e86f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1139534,
"upload_time": "2025-11-06T18:37:59",
"upload_time_iso_8601": "2025-11-06T18:37:59.661736Z",
"url": "https://files.pythonhosted.org/packages/c0/28/1bb6de15658b0b8e9f8bfd9eb58ac1845adbef460702f1a745e23d1e4778/gbrl-1.1.4-cp310-cp310-macosx_15_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bac4aa78f056648a0432f88cba5abda5ce5f136e0d010fe72583a8c121bb2c31",
"md5": "3d2adaa89dc58ba6c0601161a65e9964",
"sha256": "a8fc86e393fd2156735111e50ba497fa98b5fd0b02023a33b2664c182d7ce41f"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "3d2adaa89dc58ba6c0601161a65e9964",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 678795,
"upload_time": "2025-11-06T18:45:54",
"upload_time_iso_8601": "2025-11-06T18:45:54.752252Z",
"url": "https://files.pythonhosted.org/packages/ba/c4/aa78f056648a0432f88cba5abda5ce5f136e0d010fe72583a8c121bb2c31/gbrl-1.1.4-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d6f69c612c6416c8aa16f5326ba46a7f62abcebecf47ef942bcfcf756ff3a867",
"md5": "09de7af475e77917ebb0e258f58621a6",
"sha256": "36899b597addabd1c03b248b61336ea14c79082fdec9f4139686c3c1b93c91aa"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp311-cp311-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "09de7af475e77917ebb0e258f58621a6",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 407482,
"upload_time": "2025-11-06T18:38:00",
"upload_time_iso_8601": "2025-11-06T18:38:00.801681Z",
"url": "https://files.pythonhosted.org/packages/d6/f6/9c612c6416c8aa16f5326ba46a7f62abcebecf47ef942bcfcf756ff3a867/gbrl-1.1.4-cp311-cp311-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "94d5249f349cfb7768fc5232b32413dc2acbc00e54a886022cc1604df864fefc",
"md5": "c3b9c731ed0ce725cee52b8ffd48e041",
"sha256": "9eff7ad4322a6db2ff2dc56fefbea47c7020400fd321ab85f895be58faa6e3d1"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp311-cp311-macosx_15_0_arm64.whl",
"has_sig": false,
"md5_digest": "c3b9c731ed0ce725cee52b8ffd48e041",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1140877,
"upload_time": "2025-11-06T18:38:02",
"upload_time_iso_8601": "2025-11-06T18:38:02.206660Z",
"url": "https://files.pythonhosted.org/packages/94/d5/249f349cfb7768fc5232b32413dc2acbc00e54a886022cc1604df864fefc/gbrl-1.1.4-cp311-cp311-macosx_15_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a0e287cd444e1bb47e06be8d1e5b50379660238d16c7e274016b99e1c6fe6126",
"md5": "edfcb21291eca8da65c9f43ba6f135b7",
"sha256": "290d6e13e7d2439fc4244a55020f779c95be8489d9af3e11f19e1c2cf6a3b9a3"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "edfcb21291eca8da65c9f43ba6f135b7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 679636,
"upload_time": "2025-11-06T18:45:56",
"upload_time_iso_8601": "2025-11-06T18:45:56.455602Z",
"url": "https://files.pythonhosted.org/packages/a0/e2/87cd444e1bb47e06be8d1e5b50379660238d16c7e274016b99e1c6fe6126/gbrl-1.1.4-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8112df37534ea636542110118e0f01434db75926d14bb05541f09227d024e336",
"md5": "6decf05094279c17c38183f358853471",
"sha256": "00b2ba9cd05d4ddcb57c6f1e9137b4350e87c6e3117e8ba362d6d5b8d9917574"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp312-cp312-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "6decf05094279c17c38183f358853471",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 407176,
"upload_time": "2025-11-06T18:38:03",
"upload_time_iso_8601": "2025-11-06T18:38:03.655814Z",
"url": "https://files.pythonhosted.org/packages/81/12/df37534ea636542110118e0f01434db75926d14bb05541f09227d024e336/gbrl-1.1.4-cp312-cp312-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "33d50c1fae762105baf4a234c7b2ec4b62f405a53eb097740ba102f3cd885f03",
"md5": "5bcdd86ab4d20c4b955cabf1af2f17c5",
"sha256": "b7e733d1c43ce66c4a0cf8af655d4c71858603bd7360c41404b897b972cd5e6d"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp312-cp312-macosx_15_0_arm64.whl",
"has_sig": false,
"md5_digest": "5bcdd86ab4d20c4b955cabf1af2f17c5",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1139901,
"upload_time": "2025-11-06T18:38:04",
"upload_time_iso_8601": "2025-11-06T18:38:04.915465Z",
"url": "https://files.pythonhosted.org/packages/33/d5/0c1fae762105baf4a234c7b2ec4b62f405a53eb097740ba102f3cd885f03/gbrl-1.1.4-cp312-cp312-macosx_15_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2882bb063cd534bd402c9247e0a86af8ce8be7ae87e503bec74262ef4219da35",
"md5": "29bf703b55d7deed41c539ef2a6051ad",
"sha256": "853c1e263027d547d53a5224f91667d7d0546a0245a4acade87a18a5bbcfc942"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "29bf703b55d7deed41c539ef2a6051ad",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 680286,
"upload_time": "2025-11-06T18:45:57",
"upload_time_iso_8601": "2025-11-06T18:45:57.931116Z",
"url": "https://files.pythonhosted.org/packages/28/82/bb063cd534bd402c9247e0a86af8ce8be7ae87e503bec74262ef4219da35/gbrl-1.1.4-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e42e42d3f4d0d8ead8bd4337caba7c202b7813828cfd769ff78568cb8546933f",
"md5": "27eb6a3b836a4c1273079ece6a00e0a5",
"sha256": "420b52f79d316a6618433fc8606db41fd306e54c873022abbb10bb39c2c95cd9"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp39-cp39-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "27eb6a3b836a4c1273079ece6a00e0a5",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 405812,
"upload_time": "2025-11-06T18:38:06",
"upload_time_iso_8601": "2025-11-06T18:38:06.383309Z",
"url": "https://files.pythonhosted.org/packages/e4/2e/42d3f4d0d8ead8bd4337caba7c202b7813828cfd769ff78568cb8546933f/gbrl-1.1.4-cp39-cp39-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4f000484106b841867f063438dd5c3945776239dec3833146985001062defc4e",
"md5": "4b5a8973a13508f23711c5eb681cd554",
"sha256": "1b12d7fc3043884f20151e746d1488d2fd135ed68d3f9bfe06bf28c45c53dd4b"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp39-cp39-macosx_15_0_arm64.whl",
"has_sig": false,
"md5_digest": "4b5a8973a13508f23711c5eb681cd554",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1139386,
"upload_time": "2025-11-06T18:38:07",
"upload_time_iso_8601": "2025-11-06T18:38:07.424827Z",
"url": "https://files.pythonhosted.org/packages/4f/00/0484106b841867f063438dd5c3945776239dec3833146985001062defc4e/gbrl-1.1.4-cp39-cp39-macosx_15_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "aefaaf04f974ecbc516fdc871a9aec1972563f98bc643b27e54fab7bf2a112ca",
"md5": "45a4a037a87c1a5df8f217aa1ffcef57",
"sha256": "23c806377d2f80d579be8c29453744972e5c89247849475286d8366af0607890"
},
"downloads": -1,
"filename": "gbrl-1.1.4-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "45a4a037a87c1a5df8f217aa1ffcef57",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 674430,
"upload_time": "2025-11-06T18:45:59",
"upload_time_iso_8601": "2025-11-06T18:45:59.536778Z",
"url": "https://files.pythonhosted.org/packages/ae/fa/af04f974ecbc516fdc871a9aec1972563f98bc643b27e54fab7bf2a112ca/gbrl-1.1.4-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2f1bbf396e64b223743f8fe334cb0dab64a39b91c737015fc8809177f6f63ad5",
"md5": "8704fcb24307abde81bdc2c3b9eb331c",
"sha256": "111a06fe2997c5bfa54e31ee172e57245f4cb74e643ca224074b90c47c63b79d"
},
"downloads": -1,
"filename": "gbrl-1.1.4.tar.gz",
"has_sig": false,
"md5_digest": "8704fcb24307abde81bdc2c3b9eb331c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 170059,
"upload_time": "2025-11-06T18:20:37",
"upload_time_iso_8601": "2025-11-06T18:20:37.742733Z",
"url": "https://files.pythonhosted.org/packages/2f/1b/bf396e64b223743f8fe334cb0dab64a39b91c737015fc8809177f6f63ad5/gbrl-1.1.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-11-06 18:20:37",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "NVlabs",
"github_project": "gbrl",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "numpy",
"specs": [
[
">=",
"1.21.0"
]
]
},
{
"name": "cmake",
"specs": [
[
">=",
"3.18"
]
]
},
{
"name": "torch",
"specs": [
[
">=",
"1.13.1"
]
]
},
{
"name": "scikit-learn",
"specs": [
[
">=",
"1.5.0"
]
]
},
{
"name": "scipy",
"specs": [
[
">=",
"1.7.0"
]
]
},
{
"name": "shap",
"specs": [
[
">=",
"0.40.0"
]
]
},
{
"name": "matplotlib",
"specs": [
[
">=",
"3.5.0"
]
]
},
{
"name": "pybind11",
"specs": [
[
"==",
"2.13.1"
]
]
},
{
"name": "jinja2",
"specs": [
[
">=",
"3.1.6"
]
]
},
{
"name": "setuptools",
"specs": [
[
">=",
"78.1.1"
]
]
}
],
"lcname": "gbrl"
}