deglib


Namedeglib JSON
Version 0.1.5 PyPI version JSON
download
home_pageNone
SummaryPython bindings for the Dynamic Exploration Graph library by Nico Hezel
upload_time2025-08-07 16:39:47
maintainerNone
docs_urlNone
authorNico Hezel
requires_python>=3.10
licenseNone
keywords anns-search graph python
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # deglib: Python bindings for the Dynamic Exploration Graph

Python bindings for the C++ library Dynamic Exploration Graph (DEG) and its predecessor continuous refining Exploration Graph (crEG).

## Table of Contents
- [Installation](#installation)
- [Examples](#examples)
- [Naming](#naming)
- [Limitations](#limitations)
- [Troubleshooting](#troubleshooting)

## Installation

### Using pip
```shell
pip install deglib
```
This will install a source package, that needs to compile the C++ code in order to create an optimized version for your system.

### Compiling from Source

**Create Virtual Environment**
```shell
# create virtualenv with virtualenvwrapper or venv
mkvirtualenv deglib
# or
python -m venv /path/to/deglib_env && . /path/to/deglib_env/bin/activate
```

**Get the Source**
```shell
# clone git repository
git clone https://github.com/Visual-Computing/DynamicExplorationGraph.git
cd DynamicExplorationGraph/python
```

**Install the Package from Source**
Make sure a C++ compiler is configured on your system (e.g. g++ under Linux, [Build Tools for Visual Studio](https://visualstudio.microsoft.com/downloads/) under Windows, [XCode](https://developer.apple.com/xcode/) under macOS).

```shell
pip install setuptools>=77.0 pybind11 build
python setup.py copy_build_files  # copy c++ library to ./lib/
pip install .
```
This will compile the C++ code and install deglib into your virtual environment, so it may take a while.

**Testing**

To execute all tests.
```shell
pip install pytest
pytest
```

**Building Packages**

Build packages (sdist and wheels):
```shell
python -m build
```

Note: If you want to publish linux wheels to pypi you have to convert
the wheel to musllinux-/manylinux-wheels.
This can be easily done using `cibuildwheel` (if docker is installed):

```shell
cibuildwheel --archs auto64 --output-dir dist
```

## Examples
### Loading Data
To load a dataset formatted like the [TexMex-Datasets](http://corpus-texmex.irisa.fr/):
```python
import deglib
import numpy as np

dataset: np.ndarray = deglib.repository.fvecs_read("path/to/data.fvecs")
num_samples, dims = dataset.shape
```
The dataset is a numpy array with shape (N, D), where N is the number of feature
vectors and D is the number of dimensions of each feature vector.

### Building a Graph

```python
graph = deglib.builder.build_from_data(dataset, edges_per_vertex=30, callback="progress")
graph.save_graph("/path/to/graph.deg")
rd_graph = deglib.graph.load_readonly_graph("/path/to/graph.deg")
```

*Note: Threaded building is not supported for lid == OptimizationTarget.LowLID (the default). Use `lid=deglib.builder.LID.High` or `lid=deglib.builder.LID.Low` in `build_from_data()` for multithreaded building*

### Searching the Graph
```python
# query can have shape (D,) or (Q, D), where
# D is the dimensionality of the dataset and
# Q is the number of queries.
query = np.random.random((dims,)).astype(np.float32)
result, dists = graph.search(query, eps=0.1, k=10)  # get 10 nearest features to query
print('best dataset index:', result[0])
best_match = dataset[result[0]]
```

For more examples see [tests](tests).

### Referencing C++ memory
Consider the following example:
```python
feature_vector = graph.get_feature_vector(42)
del graph
print(feature_vector)
```
This will crash as `feature_vector` is holding a reference to memory that is owned by `graph`. This can lead to undefined behaviour (most likely segmentation fault).
Be careful to keep objects in memory that are referenced. If you need it use the `copy=True` option:

```python
feature_vector = graph.get_feature_vector(10, copy=True)
del graph
print(feature_vector)  # no problem
```

Copying feature vectors will be slower.

## Naming
### Vertex = Feature Vector
Each vertex in the graph corresponds to a feature vector of the dataset.

### Internal Index vs External Label
There are two kinds of indices used in a graph: `internal_index` and `external_label`. Both are integers and specify
a vertex in a graph.

Internal Indices are dense, which means that every `internal_index < len(graph)` can be used.
For example: If you add 100 vertices and remove the vertex with internal_index 42, the last vertex in the graph will
be moved to index 42.

In contrast, external label is a user defined identifier for each added vertex
(see `builder.add_entry(external_label, feature_vector)`). Adding or Removing vertices to the graph will keep the
connection between external labels and associated feature vector.

When you create the external labels by starting with `0` and increasing it for each entry by `1` and don't remove
elements from the graph, external labels and internal indices are equal.

```python
# as long as no elements are removed
# external labels and internal indices are equal
for i, vec in enumerate(data):
    builder.add_entry(i, vec)
```

### Eps
The eps-search-parameter controls how many nodes are checked during search.
Lower eps values like 0.001 are faster but less accurate.
Higher eps values like 0.1 are slower but more accurate. Should always be greater 0.

### LID.Unknown vs LID.High or LID.Low
The crEG paper introduces an additional parameter, *LIDType*, to determine whether a dataset exhibits high complexity and Local Intrinsic Dimensionality (LID) or if it is relatively low. In contrast, the DEG paper presents a new algorithm that does not rely on this information. Consequently, DEG defaults to *LID.Unknown*. However, if the LID is known, utilizing it can be beneficial, as multi-threaded graph construction is only possible with these parameters.




## Limitations
- The python wrapper at the moment only supports `float32` and `uint8` feature vectors.
- Threaded building is not supported for `lid=LID.Unknown`. Use `LID.High` or `LID.Low` instead.

## Troubleshooting

### BuildError: `pybind11/typing.h:104:58: error: ‘copy_n’ is not a member of ‘std’`

This is a pybind11 bug, that occurs when compiling it with gcc-14. Change the pybind version to 2.12.

## How to publish a new version
- Run `git checkout main` and `git pull` to be sure, all updates are fetched
- Edit version number in `python/src/deglib/__init__.py` to `x.y.z`
- Run `git add -A`, `git commit -m 'vx.y.z'` and `git tag -a vx.y.z -m 'vx.y.z'`
- Run `git push` and `git push origin --tags`

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "deglib",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "anns-search, graph, python",
    "author": "Nico Hezel",
    "author_email": "Bruno Schilling <bruno.schilling@htw-berlin.de>",
    "download_url": "https://files.pythonhosted.org/packages/8c/9c/ad8f6af48afd23d35b8afe5ae78a83262d5993fbaa9f8d0cbb9f476651b4/deglib-0.1.5.tar.gz",
    "platform": null,
    "description": "# deglib: Python bindings for the Dynamic Exploration Graph\n\nPython bindings for the C++ library Dynamic Exploration Graph (DEG) and its predecessor continuous refining Exploration Graph (crEG).\n\n## Table of Contents\n- [Installation](#installation)\n- [Examples](#examples)\n- [Naming](#naming)\n- [Limitations](#limitations)\n- [Troubleshooting](#troubleshooting)\n\n## Installation\n\n### Using pip\n```shell\npip install deglib\n```\nThis will install a source package, that needs to compile the C++ code in order to create an optimized version for your system.\n\n### Compiling from Source\n\n**Create Virtual Environment**\n```shell\n# create virtualenv with virtualenvwrapper or venv\nmkvirtualenv deglib\n# or\npython -m venv /path/to/deglib_env && . /path/to/deglib_env/bin/activate\n```\n\n**Get the Source**\n```shell\n# clone git repository\ngit clone https://github.com/Visual-Computing/DynamicExplorationGraph.git\ncd DynamicExplorationGraph/python\n```\n\n**Install the Package from Source**\nMake sure a C++ compiler is configured on your system (e.g. g++ under Linux, [Build Tools for Visual Studio](https://visualstudio.microsoft.com/downloads/) under Windows, [XCode](https://developer.apple.com/xcode/) under macOS).\n\n```shell\npip install setuptools>=77.0 pybind11 build\npython setup.py copy_build_files  # copy c++ library to ./lib/\npip install .\n```\nThis will compile the C++ code and install deglib into your virtual environment, so it may take a while.\n\n**Testing**\n\nTo execute all tests.\n```shell\npip install pytest\npytest\n```\n\n**Building Packages**\n\nBuild packages (sdist and wheels):\n```shell\npython -m build\n```\n\nNote: If you want to publish linux wheels to pypi you have to convert\nthe wheel to musllinux-/manylinux-wheels.\nThis can be easily done using `cibuildwheel` (if docker is installed):\n\n```shell\ncibuildwheel --archs auto64 --output-dir dist\n```\n\n## Examples\n### Loading Data\nTo load a dataset formatted like the [TexMex-Datasets](http://corpus-texmex.irisa.fr/):\n```python\nimport deglib\nimport numpy as np\n\ndataset: np.ndarray = deglib.repository.fvecs_read(\"path/to/data.fvecs\")\nnum_samples, dims = dataset.shape\n```\nThe dataset is a numpy array with shape (N, D), where N is the number of feature\nvectors and D is the number of dimensions of each feature vector.\n\n### Building a Graph\n\n```python\ngraph = deglib.builder.build_from_data(dataset, edges_per_vertex=30, callback=\"progress\")\ngraph.save_graph(\"/path/to/graph.deg\")\nrd_graph = deglib.graph.load_readonly_graph(\"/path/to/graph.deg\")\n```\n\n*Note: Threaded building is not supported for lid == OptimizationTarget.LowLID (the default). Use `lid=deglib.builder.LID.High` or `lid=deglib.builder.LID.Low` in `build_from_data()` for multithreaded building*\n\n### Searching the Graph\n```python\n# query can have shape (D,) or (Q, D), where\n# D is the dimensionality of the dataset and\n# Q is the number of queries.\nquery = np.random.random((dims,)).astype(np.float32)\nresult, dists = graph.search(query, eps=0.1, k=10)  # get 10 nearest features to query\nprint('best dataset index:', result[0])\nbest_match = dataset[result[0]]\n```\n\nFor more examples see [tests](tests).\n\n### Referencing C++ memory\nConsider the following example:\n```python\nfeature_vector = graph.get_feature_vector(42)\ndel graph\nprint(feature_vector)\n```\nThis will crash as `feature_vector` is holding a reference to memory that is owned by `graph`. This can lead to undefined behaviour (most likely segmentation fault).\nBe careful to keep objects in memory that are referenced. If you need it use the `copy=True` option:\n\n```python\nfeature_vector = graph.get_feature_vector(10, copy=True)\ndel graph\nprint(feature_vector)  # no problem\n```\n\nCopying feature vectors will be slower.\n\n## Naming\n### Vertex = Feature Vector\nEach vertex in the graph corresponds to a feature vector of the dataset.\n\n### Internal Index vs External Label\nThere are two kinds of indices used in a graph: `internal_index` and `external_label`. Both are integers and specify\na vertex in a graph.\n\nInternal Indices are dense, which means that every `internal_index < len(graph)` can be used.\nFor example: If you add 100 vertices and remove the vertex with internal_index 42, the last vertex in the graph will\nbe moved to index 42.\n\nIn contrast, external label is a user defined identifier for each added vertex\n(see `builder.add_entry(external_label, feature_vector)`). Adding or Removing vertices to the graph will keep the\nconnection between external labels and associated feature vector.\n\nWhen you create the external labels by starting with `0` and increasing it for each entry by `1` and don't remove\nelements from the graph, external labels and internal indices are equal.\n\n```python\n# as long as no elements are removed\n# external labels and internal indices are equal\nfor i, vec in enumerate(data):\n    builder.add_entry(i, vec)\n```\n\n### Eps\nThe eps-search-parameter controls how many nodes are checked during search.\nLower eps values like 0.001 are faster but less accurate.\nHigher eps values like 0.1 are slower but more accurate. Should always be greater 0.\n\n### LID.Unknown vs LID.High or LID.Low\nThe crEG paper introduces an additional parameter, *LIDType*, to determine whether a dataset exhibits high complexity and Local Intrinsic Dimensionality (LID) or if it is relatively low. In contrast, the DEG paper presents a new algorithm that does not rely on this information. Consequently, DEG defaults to *LID.Unknown*. However, if the LID is known, utilizing it can be beneficial, as multi-threaded graph construction is only possible with these parameters.\n\n\n\n\n## Limitations\n- The python wrapper at the moment only supports `float32` and `uint8` feature vectors.\n- Threaded building is not supported for `lid=LID.Unknown`. Use `LID.High` or `LID.Low` instead.\n\n## Troubleshooting\n\n### BuildError: `pybind11/typing.h:104:58: error: \u2018copy_n\u2019 is not a member of \u2018std\u2019`\n\nThis is a pybind11 bug, that occurs when compiling it with gcc-14. Change the pybind version to 2.12.\n\n## How to publish a new version\n- Run `git checkout main` and `git pull` to be sure, all updates are fetched\n- Edit version number in `python/src/deglib/__init__.py` to `x.y.z`\n- Run `git add -A`, `git commit -m 'vx.y.z'` and `git tag -a vx.y.z -m 'vx.y.z'`\n- Run `git push` and `git push origin --tags`\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Python bindings for the Dynamic Exploration Graph library by Nico Hezel",
    "version": "0.1.5",
    "project_urls": {
        "Homepage": "https://github.com/Visual-Computing/DynamicExplorationGraph"
    },
    "split_keywords": [
        "anns-search",
        " graph",
        " python"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9f1b5a173d4f0ece2c788e441880670df509b13337b282ce77d5c4aded9aa5d8",
                "md5": "ca452f66a022b4e7406128e3065d1a74",
                "sha256": "de945ada4020e1837bb642b8f1cd6e7bfa940662894a002ebf728deced65b839"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "ca452f66a022b4e7406128e3065d1a74",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 264967,
            "upload_time": "2025-08-07T16:39:21",
            "upload_time_iso_8601": "2025-08-07T16:39:21.035985Z",
            "url": "https://files.pythonhosted.org/packages/9f/1b/5a173d4f0ece2c788e441880670df509b13337b282ce77d5c4aded9aa5d8/deglib-0.1.5-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f9222153a9b3b49ea1610a75116408f7470bdb6b63e90184770ce5ad3b8e7c49",
                "md5": "a8add203067cedb7fe709d21cced36a5",
                "sha256": "fb590fa48060a773c336e60186fd1395980d2585913c8080347fce6351019acb"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp310-cp310-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a8add203067cedb7fe709d21cced36a5",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 279914,
            "upload_time": "2025-08-07T16:39:22",
            "upload_time_iso_8601": "2025-08-07T16:39:22.640745Z",
            "url": "https://files.pythonhosted.org/packages/f9/22/2153a9b3b49ea1610a75116408f7470bdb6b63e90184770ce5ad3b8e7c49/deglib-0.1.5-cp310-cp310-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "237e52d06fd499b9013106dcac1c1bb07f53dd2ad2d9d21c19c69a3068a8480f",
                "md5": "3bdc52144cf43a566b0d4134f111f5d8",
                "sha256": "d72821a826b60b03df8ce07936509cfccc00706085efb8b75f1389ab8649ed96"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3bdc52144cf43a566b0d4134f111f5d8",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 537277,
            "upload_time": "2025-08-07T16:39:24",
            "upload_time_iso_8601": "2025-08-07T16:39:24.075296Z",
            "url": "https://files.pythonhosted.org/packages/23/7e/52d06fd499b9013106dcac1c1bb07f53dd2ad2d9d21c19c69a3068a8480f/deglib-0.1.5-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5221e8494bb61e4929b4606e2d1df8fc0b52f5e9fd8abb7b7c316973a578b160",
                "md5": "3f048fb79ab5dc879449b6b52eee86b2",
                "sha256": "9f97e85b66828ed12e4633f4829e1a5cfab79dee187cfd56c781100b547dae62"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp310-cp310-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3f048fb79ab5dc879449b6b52eee86b2",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 1505337,
            "upload_time": "2025-08-07T16:39:25",
            "upload_time_iso_8601": "2025-08-07T16:39:25.369367Z",
            "url": "https://files.pythonhosted.org/packages/52/21/e8494bb61e4929b4606e2d1df8fc0b52f5e9fd8abb7b7c316973a578b160/deglib-0.1.5-cp310-cp310-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8675bdc63f76fb7c1102b9238270f3507474720ecd90697cb28d1fc41babf7c2",
                "md5": "5177c4e6c63847c4db358cd86e286897",
                "sha256": "4765679c2be4003557ba0bb69b9186149816858a267f1fd72356cacfdcfb46e0"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "5177c4e6c63847c4db358cd86e286897",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 289964,
            "upload_time": "2025-08-07T16:39:27",
            "upload_time_iso_8601": "2025-08-07T16:39:27.032486Z",
            "url": "https://files.pythonhosted.org/packages/86/75/bdc63f76fb7c1102b9238270f3507474720ecd90697cb28d1fc41babf7c2/deglib-0.1.5-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b13d85b9ee8cd8d5e0a75dee3fb626e00ac9a61441fd1b621cafd0a70d78f68b",
                "md5": "80afbc387a9f0512dbf53a6e7f7e89d0",
                "sha256": "98226fd006d5b1eda4ebb8593753da889cc0e1c052df8e1ba812e3cc5a6ee38f"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "80afbc387a9f0512dbf53a6e7f7e89d0",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 266463,
            "upload_time": "2025-08-07T16:39:28",
            "upload_time_iso_8601": "2025-08-07T16:39:28.524321Z",
            "url": "https://files.pythonhosted.org/packages/b1/3d/85b9ee8cd8d5e0a75dee3fb626e00ac9a61441fd1b621cafd0a70d78f68b/deglib-0.1.5-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "979e4bfcbcc9d037e3d1602aed64f97eadf8f6ade6f997a61f16dc523d0dc72a",
                "md5": "1ce2557fbd292e722f715f81e372e600",
                "sha256": "ef68ef3573bc210024cd93a507c791d35b0132f464c7de1e0c481f98bfe33980"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp311-cp311-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1ce2557fbd292e722f715f81e372e600",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 281138,
            "upload_time": "2025-08-07T16:39:30",
            "upload_time_iso_8601": "2025-08-07T16:39:30.293436Z",
            "url": "https://files.pythonhosted.org/packages/97/9e/4bfcbcc9d037e3d1602aed64f97eadf8f6ade6f997a61f16dc523d0dc72a/deglib-0.1.5-cp311-cp311-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "416f886cc2416b77b22a0240427f127cbccb1eef81678183332d087b6699dda5",
                "md5": "34e457f1c585d60c99ad39cef51919cd",
                "sha256": "3c2a7d8de6dc2597abb73565a0be2949287acd65e711133f858affbe961bd5c3"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "34e457f1c585d60c99ad39cef51919cd",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 538627,
            "upload_time": "2025-08-07T16:39:31",
            "upload_time_iso_8601": "2025-08-07T16:39:31.579577Z",
            "url": "https://files.pythonhosted.org/packages/41/6f/886cc2416b77b22a0240427f127cbccb1eef81678183332d087b6699dda5/deglib-0.1.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "45093b2b1645903e4f9eddf59b919c9415ae079d23b99e4ca8496027f68e4201",
                "md5": "657f2be0e7cc33c9f30d4a265e5b547e",
                "sha256": "ae9c90fec96727730846cfc789f546dcb03f79df31008261ab61d395fa9ff025"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp311-cp311-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "657f2be0e7cc33c9f30d4a265e5b547e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 1506409,
            "upload_time": "2025-08-07T16:39:32",
            "upload_time_iso_8601": "2025-08-07T16:39:32.769605Z",
            "url": "https://files.pythonhosted.org/packages/45/09/3b2b1645903e4f9eddf59b919c9415ae079d23b99e4ca8496027f68e4201/deglib-0.1.5-cp311-cp311-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2d12a0d8fdbc747a98d6ec3a261e483f2def5e8e8c9427b4d4c897608e9e3b62",
                "md5": "2e92e7db174ff10cd564a3891f9fff0e",
                "sha256": "34e10fc0b31c5278da46096502720cfc3479e4f1038f38dcafb4081e48859b03"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2e92e7db174ff10cd564a3891f9fff0e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 290559,
            "upload_time": "2025-08-07T16:39:34",
            "upload_time_iso_8601": "2025-08-07T16:39:34.187106Z",
            "url": "https://files.pythonhosted.org/packages/2d/12/a0d8fdbc747a98d6ec3a261e483f2def5e8e8c9427b4d4c897608e9e3b62/deglib-0.1.5-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dc6f6f2d2d362aeabd64464c6af10133a3147c87dce143d8f39f285a0a1db637",
                "md5": "073b1441eb509c753fd881197bfc41c9",
                "sha256": "de18da8aed6977289ffc371270922119f6927251b896c96fdcb75eb16e5fc266"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "073b1441eb509c753fd881197bfc41c9",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 267184,
            "upload_time": "2025-08-07T16:39:35",
            "upload_time_iso_8601": "2025-08-07T16:39:35.271985Z",
            "url": "https://files.pythonhosted.org/packages/dc/6f/6f2d2d362aeabd64464c6af10133a3147c87dce143d8f39f285a0a1db637/deglib-0.1.5-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "db90ec993886352d1be97dabcdae867515f3d87005888bc19e93c60894f4a77f",
                "md5": "7e8eb41b30df63180dbda590e45a2de9",
                "sha256": "52f8cfda99946fac4c213f635da4b645acee206d1fcb9e7c6562c5eb615ca32e"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp312-cp312-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7e8eb41b30df63180dbda590e45a2de9",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 282857,
            "upload_time": "2025-08-07T16:39:36",
            "upload_time_iso_8601": "2025-08-07T16:39:36.469932Z",
            "url": "https://files.pythonhosted.org/packages/db/90/ec993886352d1be97dabcdae867515f3d87005888bc19e93c60894f4a77f/deglib-0.1.5-cp312-cp312-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f64e492945e0d98a769409f7037f953840f4ca633a949d65e99272b96484cab0",
                "md5": "060e67982710881b497d0c3345544ed9",
                "sha256": "fe515efe9395ac23738086c54536b240775c848bb2332a2e03794a0d2eecfc2e"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "060e67982710881b497d0c3345544ed9",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 538809,
            "upload_time": "2025-08-07T16:39:38",
            "upload_time_iso_8601": "2025-08-07T16:39:38.012755Z",
            "url": "https://files.pythonhosted.org/packages/f6/4e/492945e0d98a769409f7037f953840f4ca633a949d65e99272b96484cab0/deglib-0.1.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "07b4a903981afb2cabe88489345385b672b8e5db41d18a3879efdd301bece369",
                "md5": "43abbbeda573f58dbf588ce995fccba8",
                "sha256": "03bb7465080af2356827206e6a67cce4727e7dc6a45ff14628dff24045b2472b"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp312-cp312-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "43abbbeda573f58dbf588ce995fccba8",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 1507293,
            "upload_time": "2025-08-07T16:39:39",
            "upload_time_iso_8601": "2025-08-07T16:39:39.195960Z",
            "url": "https://files.pythonhosted.org/packages/07/b4/a903981afb2cabe88489345385b672b8e5db41d18a3879efdd301bece369/deglib-0.1.5-cp312-cp312-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d6a3f8be5d8a9eb7f758365fc78fc3f1db7e191c63a00607e8bb49848cb082d4",
                "md5": "1431eea3ea92a26b2afc4c54bbd7e848",
                "sha256": "32e4b7e356a4891ea46bdb2038510e9263b616941b12eee985d4a0d38b45b90d"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "1431eea3ea92a26b2afc4c54bbd7e848",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 291538,
            "upload_time": "2025-08-07T16:39:40",
            "upload_time_iso_8601": "2025-08-07T16:39:40.460909Z",
            "url": "https://files.pythonhosted.org/packages/d6/a3/f8be5d8a9eb7f758365fc78fc3f1db7e191c63a00607e8bb49848cb082d4/deglib-0.1.5-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "04c8cf7d4a9ca8f97187acc7935e9457585cb7e2e38b0b9bb07f69eff2c7d903",
                "md5": "d8d946b643549fe7a0a7e1aa38586e6d",
                "sha256": "8f9002491e1ba42f806f5e0dbf86d3002bd8c9311f8bf1ca4e1e2e265bde355d"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp313-cp313-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "d8d946b643549fe7a0a7e1aa38586e6d",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 267205,
            "upload_time": "2025-08-07T16:39:41",
            "upload_time_iso_8601": "2025-08-07T16:39:41.594969Z",
            "url": "https://files.pythonhosted.org/packages/04/c8/cf7d4a9ca8f97187acc7935e9457585cb7e2e38b0b9bb07f69eff2c7d903/deglib-0.1.5-cp313-cp313-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d9aa7db0f1dd89ab7206e68308ce966b10b18d13aa3857dfca4ccdcae57f34a4",
                "md5": "0aada9b086299cb6c0084965656f04b0",
                "sha256": "6d42485438846a23b8e23f0e9644c17cc2328ac8b0818304d00519bacc3c8a72"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp313-cp313-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0aada9b086299cb6c0084965656f04b0",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 282850,
            "upload_time": "2025-08-07T16:39:42",
            "upload_time_iso_8601": "2025-08-07T16:39:42.764754Z",
            "url": "https://files.pythonhosted.org/packages/d9/aa/7db0f1dd89ab7206e68308ce966b10b18d13aa3857dfca4ccdcae57f34a4/deglib-0.1.5-cp313-cp313-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fe97dd52c4682664b4eb7285532a4ffe31e0b5eb8c0492d0f403f0fbb2a001d9",
                "md5": "a0dc87a620695677353cdaf13d361dbc",
                "sha256": "86d0c3b60062d468fd6d66c64be60c5ae7e186545961f0fef19c11b2a951c406"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a0dc87a620695677353cdaf13d361dbc",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 538817,
            "upload_time": "2025-08-07T16:39:44",
            "upload_time_iso_8601": "2025-08-07T16:39:44.010106Z",
            "url": "https://files.pythonhosted.org/packages/fe/97/dd52c4682664b4eb7285532a4ffe31e0b5eb8c0492d0f403f0fbb2a001d9/deglib-0.1.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "268850b350571f74452ed9a8eb7ba3b4ac4e21703b6032122ce0be82596e6a58",
                "md5": "c740db5976ff9893d1a2e38df3a889b8",
                "sha256": "0000948e694f2fa8dec959a363c2a26f40009b59d8002ba4a61ef8a49d6e32c6"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp313-cp313-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c740db5976ff9893d1a2e38df3a889b8",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 1507351,
            "upload_time": "2025-08-07T16:39:45",
            "upload_time_iso_8601": "2025-08-07T16:39:45.202202Z",
            "url": "https://files.pythonhosted.org/packages/26/88/50b350571f74452ed9a8eb7ba3b4ac4e21703b6032122ce0be82596e6a58/deglib-0.1.5-cp313-cp313-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8fe5e4f1de6117edd4b917c3b2cd3bf053f83584c73bd1bb9de6fd0db853f979",
                "md5": "2c014285abfa9beb8d0ec9461b436850",
                "sha256": "7de5c35c3e5cb8c34afc372160f6551a23e2a4e85487f256a4ec7947e640095f"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2c014285abfa9beb8d0ec9461b436850",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.10",
            "size": 291579,
            "upload_time": "2025-08-07T16:39:46",
            "upload_time_iso_8601": "2025-08-07T16:39:46.397780Z",
            "url": "https://files.pythonhosted.org/packages/8f/e5/e4f1de6117edd4b917c3b2cd3bf053f83584c73bd1bb9de6fd0db853f979/deglib-0.1.5-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8c9cad8f6af48afd23d35b8afe5ae78a83262d5993fbaa9f8d0cbb9f476651b4",
                "md5": "533c3e0649c605a044440654015a13cc",
                "sha256": "1bd851e9a64242f748e677dec4a20fd2b9b06295e8b4b2c2527efd12f80d3cd2"
            },
            "downloads": -1,
            "filename": "deglib-0.1.5.tar.gz",
            "has_sig": false,
            "md5_digest": "533c3e0649c605a044440654015a13cc",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 76287,
            "upload_time": "2025-08-07T16:39:47",
            "upload_time_iso_8601": "2025-08-07T16:39:47.795890Z",
            "url": "https://files.pythonhosted.org/packages/8c/9c/ad8f6af48afd23d35b8afe5ae78a83262d5993fbaa9f8d0cbb9f476651b4/deglib-0.1.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-07 16:39:47",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Visual-Computing",
    "github_project": "DynamicExplorationGraph",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "deglib"
}
        
Elapsed time: 1.18468s