| Name | lkauto JSON |
| Version |
0.1.1
JSON |
| download |
| home_page | https://github.com/ISG-Siegen/lenskit-auto |
| Summary | LensKit-Auto is built as a wrapper around the Python LensKit recommender-system library. It automates algorithm selection and hyper parameter optimization an can build ensemble models based on the LensKit models. |
| upload_time | 2023-10-23 13:17:02 |
| maintainer | |
| docs_url | None |
| author | Tobias Vente |
| requires_python | >=3.8, <=3.9 |
| license | Copyright (c) 2018–2022 Boise State University Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| keywords |
|
| VCS |
 |
| bugtrack_url |
|
| requirements |
No requirements were recorded.
|
| Travis-CI |
No Travis.
|
| coveralls test coverage |
No coveralls.
|
# LensKit-Auto




LensKit-Auto is built as a wrapper around the Python [LensKit](https://lkpy.readthedocs.io/en/stable/)
recommender-system library. It automates algorithm selection and hyper parameter optimization an can build ensemble
models based on the LensKit models.
## Resources
- Documentation: [LensKit-Auto Documenatation](https://lenskit-auto.readthedocs.io/en/latest/index.html)
- RecSys23 Demo: [RecSys23 Demo](https://lenskit-auto.readthedocs.io/en/latest/RecSys23-Demo.html)
- RecSys23 Demo Video: [RecSys23 Demo Video](https://youtu.be/OTZAb8E_IZI)
## Install
### Pip Install:
```bash
pip install lkauto
```
### Conda Install
1. Create conda environment
2. Install pip
3. Follow the Pip Install subchapter to install lenskit-Auto in your conda environment
## Getting Started
LensKit-Auto is built as a wrapper around the Python [LensKit](https://lkpy.readthedocs.io/en/stable/)
recommender-system library. It automates algorithm selection and hyper parameter optimization an can build ensemble
models based on LensKit models.
### Standard use-case
In the standard use-case you just need to call a single function to get the best performing model for your dataset. It
is either
```python
from lkauto.lkauto import get_best_recommender_model
get_best_recommender_model()(train=train_split)
```
for the recommendation use-case or
```python
from lkauto.lkauto import get_best_prediction_model
get_best_prediction_model(train=train_split)
```
for the prediction use-case
### Examples and Advanced Use-Cases
LensKit-Auto allows three application scenarios:
Note: All application scenarios apply to Top-N ranking prediction and rating prediction use-cases.
* **Scenario 1:** LensKit-Auto performs combined algorithm selection and hyperparameter optimization for a given
dataset.
* **Scenario 2:** LensKit-Auto performs hyperparameter optimization on a single algorithm for a given dataset.
* **Scenario 3:** LensKit-Auto performs combined algorithm selection and hyperparameter optimization for a specified set
of algorithms and/or different hyperparameter ranges for the provided dataset.
In order to take advantage of LensKit-Auto, a developer needs to read in a dataset.
```python
from lenskit.datasets import ML100K
ml100k = ML100K('path_to_file')
ratings = ml100k.ratings
ratings.name = 'ml_100k'
```
Furthermore, it is suggested, that we take advantage of the Filer to control the LensKit-Auto output
```python
from lkauto.utils.filer import Filer
filer = Filer('output/')
```
### Top-N ranking prediction
First, we need to split the data in a train and test split to evaluate our model. The train-test splits can be performed
based on data rows or user data. For the rating prediction example we are splitting the data based on user data.
```python
import lenskit.crossfold as xf
from lenskit.batch import recommend
from lenskit import topn
from lkauto.lkauto import get_best_recommender_model
# User based data-split
for i, tp in enumerate(xf.partition_users(ratings, 1, xf.SampleN(5))):
train_split = tp.train.copy()
test_split = tp.test.copy()
# Fixme: INSERT SCENARIO CODE HERE
# fit
model.fit(train_split)
# recommend
recs = recommend(algo=model, users=test_split['user'].unique(), n=5, n_jobs=1)
# initialize RecListAnalysis
rla = topn.RecListAnalysis()
# add precision metric
rla.add_metric(topn.ndcg)
# compute scores
scores = rla.compute(recs, test_split, include_missing=True)
```
### Rating Prediction
First, we need to split the data in a train and test split to evaluate our model. The train-test splits can be performed
based on data rows or user data. For the rating prediction example we are splitting the data based on the data rows. The
Top-N ranking predicion example showcases the data-split based on user data.
```python
from lenskit.metrics.predict import rmse
from lenskit.crossfold import sample_rows
from lkauto.lkauto import get_best_prediction_model
train_split, test_split = sample_rows(ratings, None, 25000)
# Fixme: INSERT SCENARIO CODE HERE
model.fit(train_split)
predictions = model.predict(test_split)
root_mean_square_error = rmse(predictions, test_split['rating'])
```
#### Scenario 1
Scenario 1 describes the fully automated combined algorithm selection and hyperparameter optimization (CASH problem).
This scenario is recommended for inexperienced developers who have no or little experience in model selection.
LensKit-Auto performs the combined algorithm selection and hyperparameter optimization with a single function call.
```python
model, config = get_best_recommender_model(train=train_split, filer=filer)
```
Note: As described above, the *get_best_recommender_model()* is used for Top-N ranking prediction. If you want to find a
predictor instead of a recommender, replace the function call with *get_best_prediction_model()*
The *get_best_recommender_model()* or *get_best_prediction_model()* function call will return the best performing model,
with tuned hyperparameters and a configuration dictionary that contains all information about the model. In the Scenario
1 use-case the model is chosen out of all LensKit algorithms with hyperparameters within the LensKit-Auto default
hyperparameter range. We can use the model in the exact same way like a regular LensKit model.
#### Scenario 2
In Senario 2 we are going to perform hyperparameter optimization on a single algorithm. First we need to define our
custom configuration space with just a single algorithm included.
```python
from ConfigSpace import Constant
from lkauto.algorithms.item_knn import ItemItem
# initialize ItemItem ConfigurationSpace
cs = ItemItem.get_default_configspace()
cs.add_hyperparameters([Constant("algo", "ItemItem")])
# set a random seed for reproducible results
cs.seed(42)
# Provide the ItemItem ConfigurationSpace to the get_best_recommender_model function.
model, config = get_best_recommender_model(train=train_split, filer=filer, cs=cs)
```
Note: As described above, the *get_best_recommender_model()* is used for Top-N ranking prediction. If you want to find a
predictor instead of a recommender, replace the function call with *get_best_prediction_model()*
The *get_best_recommender_model()* or *get_best_prediction_model()* function call will return the best performing
ItemItem model. Besides the model, the *get_best_recommender_model()* function returns a configuration dictionary with
all information about the model.
#### Scenario 3
Scenario 3 describes the automated combined algorithm selection and hyperparameter optimization of a custom
configuration space. A developer that wants to use Scenario 3 needs to provide hyperparameter ranges for the
hyperparameter optimization process.
First, a parent-ConfigurationSpace needs to be initialized. All algorithm names need to be added to the
parent-ConfigurationSpace categorical *algo* hyperparameter.
```python
from ConfigSpace import ConfigurationSpace, Categorical
# initialize ItemItem ConfigurationSpace
parent_cs = ConfigurationSpace()
# set a random seed for reproducible results
parent_cs.seed(42)
# add algorithm names as a constant
parent_cs.add_hyperparameters([Categorical("algo", ["ItemItem", "UserUser"])])
```
Afterward, we need to build the *ItemItem* and *UserUser* sub-ConfigurationSpace.
We can use the default sub-ConfigurationSpace from LensKit-Auto and add it to the parent-ConfigurationSpace:
```python
from lkauto.algorithms.item_knn import ItemItem
# get default ItemItem ConfigurationSpace
item_item_cs = ItemItem.get_default_configspace()
# Add sub-ConfigurationSpace to parent-ConfigurationSpace
parent_cs.add_configuration_space(
prefix="ItemItem",
delimiter=":",
configuration_space=item_item_cs,
parent_hyperparameter={"parent": parent_cs["algo"], "value": "ItemItem"},
)
```
Or we can build our own ConfigurationSpace for a specific algorithm.
```python
from ConfigSpace import ConfigurationSpace
from ConfigSpace import Integer, Float, Constant
# first we initialize hyperparameter objects for all hyperparameters that we want to optimize
nnbrs = Constant('nnbrs', 1000)
min_nbrs = Integer('min_nbrs', bounds=(1, 50), default=1)
min_sim = Float('min_sim', bounds=(0, 0.1), default=0)
# Then, we initialize the sub-ConfigurationSpace and add the hyperparameters to it
user_user_cs = ConfigurationSpace()
user_user_cs.add_hyperparameters([nnbrs, min_nbrs, min_sim])
# Last, we add the user_user_cs to the parent-ConfigurationSpace
parent_cs.add_configuration_space(
prefix="UserUser",
delimiter=":",
configuration_space=user_user_cs,
parent_hyperparameter={"parent": parent_cs["algo"], "value": "UserUser"},
)
```
After creating the parent-ConfigurationSpace, we can use it in the same way like Scenario 2
```python
# Provide the parent-ConfigurationSpace to the get_best_recommender_model function.
model, config = get_best_recommender_model(train=train_split, filer=filer, cs=parent_cs)
```
Note: As described above, the *get_best_recommender_model()* is used for Top-N ranking prediction. If you want to find a
predictor instead of a recommender, replace the function call with *get_best_prediction_model()*
## Experiments on Default Configurations
The experiments to gather some hyperparameters for LensKit-Autos default configuration are described here:
[Experiments](https://lenskit-auto.readthedocs.io/en/latest/Experiments.html?highlight=experiments)
Raw data
{
"_id": null,
"home_page": "https://github.com/ISG-Siegen/lenskit-auto",
"name": "lkauto",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8, <=3.9",
"maintainer_email": "",
"keywords": "",
"author": "Tobias Vente",
"author_email": "Tobias Vente <tobias.vente@uni-siegen.de>, Youssef Fayad <youssef.fayad@student.uni-siegen.de>, Michael Ekstrand <michaelekstrand@boisestate.edu>",
"download_url": "https://files.pythonhosted.org/packages/8b/fa/97f2b32ad3f4097199bf0c2326665136b2ad4ff756b21e3753bc5bb42b6d/lkauto-0.1.1.tar.gz",
"platform": null,
"description": "# LensKit-Auto\n\n\n\n\n\n\nLensKit-Auto is built as a wrapper around the Python [LensKit](https://lkpy.readthedocs.io/en/stable/)\nrecommender-system library. It automates algorithm selection and hyper parameter optimization an can build ensemble\nmodels based on the LensKit models.\n\n## Resources\n\n- Documentation: [LensKit-Auto Documenatation](https://lenskit-auto.readthedocs.io/en/latest/index.html)\n- RecSys23 Demo: [RecSys23 Demo](https://lenskit-auto.readthedocs.io/en/latest/RecSys23-Demo.html)\n- RecSys23 Demo Video: [RecSys23 Demo Video](https://youtu.be/OTZAb8E_IZI)\n\n## Install\n\n### Pip Install:\n\n```bash\npip install lkauto\n```\n\n### Conda Install\n\n1. Create conda environment\n2. Install pip\n3. Follow the Pip Install subchapter to install lenskit-Auto in your conda environment\n\n## Getting Started\n\nLensKit-Auto is built as a wrapper around the Python [LensKit](https://lkpy.readthedocs.io/en/stable/)\nrecommender-system library. It automates algorithm selection and hyper parameter optimization an can build ensemble\nmodels based on LensKit models.\n\n\n\n### Standard use-case\n\nIn the standard use-case you just need to call a single function to get the best performing model for your dataset. It\nis either\n\n```python\nfrom lkauto.lkauto import get_best_recommender_model\n\nget_best_recommender_model()(train=train_split)\n```\n\nfor the recommendation use-case or\n\n```python\nfrom lkauto.lkauto import get_best_prediction_model\n\nget_best_prediction_model(train=train_split)\n```\n\nfor the prediction use-case\n\n### Examples and Advanced Use-Cases\n\nLensKit-Auto allows three application scenarios:\n\nNote: All application scenarios apply to Top-N ranking prediction and rating prediction use-cases.\n\n* **Scenario 1:** LensKit-Auto performs combined algorithm selection and hyperparameter optimization for a given\n dataset.\n* **Scenario 2:** LensKit-Auto performs hyperparameter optimization on a single algorithm for a given dataset.\n* **Scenario 3:** LensKit-Auto performs combined algorithm selection and hyperparameter optimization for a specified set\n of algorithms and/or different hyperparameter ranges for the provided dataset.\n\nIn order to take advantage of LensKit-Auto, a developer needs to read in a dataset.\n\n```python\nfrom lenskit.datasets import ML100K\n\nml100k = ML100K('path_to_file')\nratings = ml100k.ratings\nratings.name = 'ml_100k'\n```\n\nFurthermore, it is suggested, that we take advantage of the Filer to control the LensKit-Auto output\n\n```python\nfrom lkauto.utils.filer import Filer\n\nfiler = Filer('output/')\n```\n\n### Top-N ranking prediction\n\nFirst, we need to split the data in a train and test split to evaluate our model. The train-test splits can be performed\nbased on data rows or user data. For the rating prediction example we are splitting the data based on user data.\n\n```python\nimport lenskit.crossfold as xf\nfrom lenskit.batch import recommend\nfrom lenskit import topn\nfrom lkauto.lkauto import get_best_recommender_model\n\n# User based data-split\nfor i, tp in enumerate(xf.partition_users(ratings, 1, xf.SampleN(5))):\n train_split = tp.train.copy()\n test_split = tp.test.copy()\n\n # Fixme: INSERT SCENARIO CODE HERE\n\n # fit\n model.fit(train_split)\n # recommend\n recs = recommend(algo=model, users=test_split['user'].unique(), n=5, n_jobs=1)\n\n # initialize RecListAnalysis\n rla = topn.RecListAnalysis()\n # add precision metric\n rla.add_metric(topn.ndcg)\n\n # compute scores\n scores = rla.compute(recs, test_split, include_missing=True)\n```\n\n### Rating Prediction\n\nFirst, we need to split the data in a train and test split to evaluate our model. The train-test splits can be performed\nbased on data rows or user data. For the rating prediction example we are splitting the data based on the data rows. The\nTop-N ranking predicion example showcases the data-split based on user data.\n\n```python\nfrom lenskit.metrics.predict import rmse\nfrom lenskit.crossfold import sample_rows\nfrom lkauto.lkauto import get_best_prediction_model\n\ntrain_split, test_split = sample_rows(ratings, None, 25000)\n\n# Fixme: INSERT SCENARIO CODE HERE\n\nmodel.fit(train_split)\npredictions = model.predict(test_split)\nroot_mean_square_error = rmse(predictions, test_split['rating'])\n```\n\n#### Scenario 1\n\nScenario 1 describes the fully automated combined algorithm selection and hyperparameter optimization (CASH problem).\nThis scenario is recommended for inexperienced developers who have no or little experience in model selection.\n\nLensKit-Auto performs the combined algorithm selection and hyperparameter optimization with a single function call.\n\n```python\nmodel, config = get_best_recommender_model(train=train_split, filer=filer)\n```\n\nNote: As described above, the *get_best_recommender_model()* is used for Top-N ranking prediction. If you want to find a\npredictor instead of a recommender, replace the function call with *get_best_prediction_model()*\n\nThe *get_best_recommender_model()* or *get_best_prediction_model()* function call will return the best performing model,\nwith tuned hyperparameters and a configuration dictionary that contains all information about the model. In the Scenario\n1 use-case the model is chosen out of all LensKit algorithms with hyperparameters within the LensKit-Auto default \nhyperparameter range. We can use the model in the exact same way like a regular LensKit model.\n\n#### Scenario 2\n\nIn Senario 2 we are going to perform hyperparameter optimization on a single algorithm. First we need to define our\ncustom configuration space with just a single algorithm included.\n\n```python\nfrom ConfigSpace import Constant\nfrom lkauto.algorithms.item_knn import ItemItem\n\n# initialize ItemItem ConfigurationSpace\ncs = ItemItem.get_default_configspace()\ncs.add_hyperparameters([Constant(\"algo\", \"ItemItem\")])\n# set a random seed for reproducible results\ncs.seed(42)\n\n# Provide the ItemItem ConfigurationSpace to the get_best_recommender_model function. \nmodel, config = get_best_recommender_model(train=train_split, filer=filer, cs=cs)\n```\n\nNote: As described above, the *get_best_recommender_model()* is used for Top-N ranking prediction. If you want to find a\npredictor instead of a recommender, replace the function call with *get_best_prediction_model()*\n\nThe *get_best_recommender_model()* or *get_best_prediction_model()* function call will return the best performing\nItemItem model. Besides the model, the *get_best_recommender_model()* function returns a configuration dictionary with\nall information about the model.\n\n#### Scenario 3\n\nScenario 3 describes the automated combined algorithm selection and hyperparameter optimization of a custom\nconfiguration space. A developer that wants to use Scenario 3 needs to provide hyperparameter ranges for the\nhyperparameter optimization process.\n\nFirst, a parent-ConfigurationSpace needs to be initialized. All algorithm names need to be added to the\nparent-ConfigurationSpace categorical *algo* hyperparameter.\n\n```python\nfrom ConfigSpace import ConfigurationSpace, Categorical\n\n# initialize ItemItem ConfigurationSpace\nparent_cs = ConfigurationSpace()\n# set a random seed for reproducible results\nparent_cs.seed(42)\n# add algorithm names as a constant\nparent_cs.add_hyperparameters([Categorical(\"algo\", [\"ItemItem\", \"UserUser\"])])\n```\n\nAfterward, we need to build the *ItemItem* and *UserUser* sub-ConfigurationSpace.\n\nWe can use the default sub-ConfigurationSpace from LensKit-Auto and add it to the parent-ConfigurationSpace:\n\n```python\nfrom lkauto.algorithms.item_knn import ItemItem\n\n# get default ItemItem ConfigurationSpace\nitem_item_cs = ItemItem.get_default_configspace()\n\n# Add sub-ConfigurationSpace to parent-ConfigurationSpace\nparent_cs.add_configuration_space(\n prefix=\"ItemItem\",\n delimiter=\":\",\n configuration_space=item_item_cs,\n parent_hyperparameter={\"parent\": parent_cs[\"algo\"], \"value\": \"ItemItem\"},\n)\n```\n\nOr we can build our own ConfigurationSpace for a specific algorithm.\n\n```python\nfrom ConfigSpace import ConfigurationSpace\nfrom ConfigSpace import Integer, Float, Constant\n\n# first we initialize hyperparameter objects for all hyperparameters that we want to optimize\nnnbrs = Constant('nnbrs', 1000)\nmin_nbrs = Integer('min_nbrs', bounds=(1, 50), default=1)\nmin_sim = Float('min_sim', bounds=(0, 0.1), default=0)\n\n# Then, we initialize the sub-ConfigurationSpace and add the hyperparameters to it\nuser_user_cs = ConfigurationSpace()\nuser_user_cs.add_hyperparameters([nnbrs, min_nbrs, min_sim])\n\n# Last, we add the user_user_cs to the parent-ConfigurationSpace \n\nparent_cs.add_configuration_space(\n prefix=\"UserUser\",\n delimiter=\":\",\n configuration_space=user_user_cs,\n parent_hyperparameter={\"parent\": parent_cs[\"algo\"], \"value\": \"UserUser\"},\n)\n```\n\nAfter creating the parent-ConfigurationSpace, we can use it in the same way like Scenario 2\n\n```python\n# Provide the parent-ConfigurationSpace to the get_best_recommender_model function. \nmodel, config = get_best_recommender_model(train=train_split, filer=filer, cs=parent_cs)\n```\n\nNote: As described above, the *get_best_recommender_model()* is used for Top-N ranking prediction. If you want to find a\npredictor instead of a recommender, replace the function call with *get_best_prediction_model()*\n\n\n## Experiments on Default Configurations\nThe experiments to gather some hyperparameters for LensKit-Autos default configuration are described here: \n[Experiments](https://lenskit-auto.readthedocs.io/en/latest/Experiments.html?highlight=experiments)\n",
"bugtrack_url": null,
"license": "Copyright (c) 2018\u20132022 Boise State University Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
"summary": "LensKit-Auto is built as a wrapper around the Python LensKit recommender-system library. It automates algorithm selection and hyper parameter optimization an can build ensemble models based on the LensKit models.",
"version": "0.1.1",
"project_urls": {
"Homepage": "https://github.com/ISG-Siegen/lenskit-auto",
"homepage": "https://lenskit-auto.readthedocs.io/en/latest/",
"source": "https://github.com/ISG-Siegen/lenskit-auto"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "2b37c709c57b7cc5a8fd378ca5f85f508beb2dc798eb806597e2e8d29fb37cdb",
"md5": "6768917453d05935bba4d6d8514961ad",
"sha256": "165291f8d14e10e81ea60596836d1a3c47c8a76b4cf13c5fc3b1d53fe354e34c"
},
"downloads": -1,
"filename": "lkauto-0.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "6768917453d05935bba4d6d8514961ad",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8, <=3.9",
"size": 44700,
"upload_time": "2023-10-23T13:17:00",
"upload_time_iso_8601": "2023-10-23T13:17:00.572699Z",
"url": "https://files.pythonhosted.org/packages/2b/37/c709c57b7cc5a8fd378ca5f85f508beb2dc798eb806597e2e8d29fb37cdb/lkauto-0.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8bfa97f2b32ad3f4097199bf0c2326665136b2ad4ff756b21e3753bc5bb42b6d",
"md5": "2e2c37e17306e7db48ed6f6638586ac0",
"sha256": "36c0fd282f94ed166361c30332fff06c7c059f6b185774e403ae188bb53ab59b"
},
"downloads": -1,
"filename": "lkauto-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "2e2c37e17306e7db48ed6f6638586ac0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8, <=3.9",
"size": 32666,
"upload_time": "2023-10-23T13:17:02",
"upload_time_iso_8601": "2023-10-23T13:17:02.336800Z",
"url": "https://files.pythonhosted.org/packages/8b/fa/97f2b32ad3f4097199bf0c2326665136b2ad4ff756b21e3753bc5bb42b6d/lkauto-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-10-23 13:17:02",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ISG-Siegen",
"github_project": "lenskit-auto",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "lkauto"
}