edsger


Nameedsger JSON
Version 0.1.5 PyPI version JSON
download
home_pageNone
SummaryGraph algorithms in Cython.
upload_time2025-08-22 11:33:08
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT License
keywords python graph shortest path dijkstra
VCS
bugtrack_url
requirements setuptools setuptools_scm numpy Cython pandas
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
![Tests Status](https://github.com/aetperf/edsger/actions/workflows/tests.yml/badge.svg?branch=release)
[![codecov](https://codecov.io/gh/aetperf/edsger/branch/release/graph/badge.svg)](https://codecov.io/gh/aetperf/edsger)
[![Documentation Status](https://readthedocs.org/projects/edsger/badge/?version=latest)](https://edsger.readthedocs.io/en/latest/?badge=latest)
[![PyPI version](https://img.shields.io/pypi/v/edsger.svg?refresh=1)](https://pypi.org/project/edsger/)
[![Downloads](https://static.pepy.tech/badge/edsger)](https://pepy.tech/project/edsger)
[![Python 3.9 | 3.10 | 3.11 | 3.12 | 3.13](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)](https://pypi.org/project/edsger/)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Cython lint: cython-lint](https://img.shields.io/badge/cython--lint-enabled-brightgreen.svg)](https://github.com/MarcoGorelli/cython-lint)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

# Edsger

*Graph algorithms in Cython*

Welcome to our Python library for graph algorithms. The library includes both Dijkstra's and Bellman-Ford's algorithms, with plans to add more common path algorithms later. It is also open-source and easy to integrate with other Python libraries. To get started, simply install the library using pip, and import it into your Python project.

Documentation : [https://edsger.readthedocs.io/en/latest/](https://edsger.readthedocs.io/en/latest/)

## Small example : Dijkstra's Algorithm

To use Dijkstra's algorithm, you can import the `Dijkstra` class from the `path` module. The function takes a graph and a source node as input, and returns the shortest path from the source node to all other nodes in the graph.

```python
import pandas as pd

from edsger.path import Dijkstra

# Create a DataFrame with the edges of the graph
edges = pd.DataFrame({
    'tail': [0, 0, 1, 2, 2, 3],
    'head': [1, 2, 2, 3, 4, 4],
    'weight': [1, 4, 2, 1.5, 3, 1]
})
edges
```

|    |   tail |   head |   weight |
|---:|-------:|-------:|---------:|
|  0 |      0 |      1 |      1.0 |
|  1 |      0 |      2 |      4.0 |
|  2 |      1 |      2 |      2.0 |
|  3 |      2 |      3 |      1.5 |
|  4 |      2 |      4 |      3.0 |
|  5 |      3 |      4 |      1.0 |

```python
# Initialize the Dijkstra object
dijkstra = Dijkstra(edges)

# Run the algorithm from a source vertex
shortest_paths = dijkstra.run(vertex_idx=0)
print("Shortest paths:", shortest_paths)
```

    Shortest paths: [0.  1.  3.  4.5 5.5]

We get the shortest paths from the source node 0 to all other nodes in the graph. The output is an array with the shortest path length to each node. A path length is the sum of the weights of the edges in the path.

## Bellman-Ford Algorithm: Handling Negative Weights

The Bellman-Ford algorithm can handle graphs with negative edge weights and detect negative cycles, making it suitable for more complex scenarios than Dijkstra's algorithm.

```python
from edsger.path import BellmanFord

# Create a graph with negative weights
edges_negative = pd.DataFrame({
    'tail': [0, 0, 1, 1, 2, 3],
    'head': [1, 2, 2, 3, 3, 4],
    'weight': [1, 4, -2, 5, 1, 3]  # Note the negative weight
})
edges_negative
```

|    |   tail |   head |   weight |
|---:|-------:|-------:|---------:|
|  0 |      0 |      1 |      1.0 |
|  1 |      0 |      2 |      4.0 |
|  2 |      1 |      2 |     -2.0 |
|  3 |      1 |      3 |      5.0 |
|  4 |      2 |      3 |      1.0 |
|  5 |      3 |      4 |      3.0 |

```python
# Initialize and run Bellman-Ford
bf = BellmanFord(edges_negative)
shortest_paths = bf.run(vertex_idx=0)
print("Shortest paths:", shortest_paths)
```

    Shortest paths: [ 0.  1. -1.  0.  3.]

The Bellman-Ford algorithm finds the optimal path even with negative weights. In this example, the shortest path from node 0 to node 2 has length -1 (going 0→1→2 with weights 1 + (-2) = -1), which is shorter than the direct path 0→2 with weight 4.

### Negative Cycle Detection

Bellman-Ford can also detect negative cycles, which indicate that no shortest path exists:

```python
# Create a graph with a negative cycle
edges_cycle = pd.DataFrame({
    'tail': [0, 1, 2],
    'head': [1, 2, 0],
    'weight': [1, -2, -1]  # Cycle 0→1→2→0 has total weight -2
})

bf_cycle = BellmanFord(edges_cycle)
try:
    bf_cycle.run(vertex_idx=0)
except ValueError as e:
    print("Error:", e)
```

    Error: Negative cycle detected in the graph

## Installation

### Standard Installation

```bash
pip install edsger
```

## Why Use Edsger?

Edsger is designed to be **dataframe-friendly**, providing seamless integration with pandas workflows for graph algorithms. Also it is rather efficient on Linux. Our benchmarks on the USA road network (23.9M vertices, 57.7M edges) demonstrate nice performance:

<img src="https://raw.githubusercontent.com/aetperf/edsger/release/docs/source/assets/dijkstra_benchmark_comparison.png" alt="Dijkstra Performance Comparison" width="700">

## Contributing

We welcome contributions to the Edsger library. If you have any suggestions, bug reports, or feature requests, please open an issue on our [GitHub repository](https://github.com/aetperf/Edsger).

## License

Edsger is licensed under the MIT License. See the LICENSE file for more details.

## Contact

For any questions or inquiries, please contact François Pacull at [francois.pacull@architecture-performance.fr](mailto:francois.pacull@architecture-performance.fr).

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "edsger",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "Fran\u00e7ois Pacull <francois.pacull@architecture-performance.fr>",
    "keywords": "python, graph, shortest path, Dijkstra",
    "author": null,
    "author_email": "Fran\u00e7ois Pacull <francois.pacull@architecture-performance.fr>",
    "download_url": "https://files.pythonhosted.org/packages/20/b2/b54ca4ae0652ac87be64e0c4a70d4d748733f8cbd98a2ae71b5cdb015355/edsger-0.1.5.tar.gz",
    "platform": "any",
    "description": "\n![Tests Status](https://github.com/aetperf/edsger/actions/workflows/tests.yml/badge.svg?branch=release)\n[![codecov](https://codecov.io/gh/aetperf/edsger/branch/release/graph/badge.svg)](https://codecov.io/gh/aetperf/edsger)\n[![Documentation Status](https://readthedocs.org/projects/edsger/badge/?version=latest)](https://edsger.readthedocs.io/en/latest/?badge=latest)\n[![PyPI version](https://img.shields.io/pypi/v/edsger.svg?refresh=1)](https://pypi.org/project/edsger/)\n[![Downloads](https://static.pepy.tech/badge/edsger)](https://pepy.tech/project/edsger)\n[![Python 3.9 | 3.10 | 3.11 | 3.12 | 3.13](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)](https://pypi.org/project/edsger/)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![Cython lint: cython-lint](https://img.shields.io/badge/cython--lint-enabled-brightgreen.svg)](https://github.com/MarcoGorelli/cython-lint)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n# Edsger\n\n*Graph algorithms in Cython*\n\nWelcome to our Python library for graph algorithms. The library includes both Dijkstra's and Bellman-Ford's algorithms, with plans to add more common path algorithms later. It is also open-source and easy to integrate with other Python libraries. To get started, simply install the library using pip, and import it into your Python project.\n\nDocumentation : [https://edsger.readthedocs.io/en/latest/](https://edsger.readthedocs.io/en/latest/)\n\n## Small example : Dijkstra's Algorithm\n\nTo use Dijkstra's algorithm, you can import the `Dijkstra` class from the `path` module. The function takes a graph and a source node as input, and returns the shortest path from the source node to all other nodes in the graph.\n\n```python\nimport pandas as pd\n\nfrom edsger.path import Dijkstra\n\n# Create a DataFrame with the edges of the graph\nedges = pd.DataFrame({\n    'tail': [0, 0, 1, 2, 2, 3],\n    'head': [1, 2, 2, 3, 4, 4],\n    'weight': [1, 4, 2, 1.5, 3, 1]\n})\nedges\n```\n\n|    |   tail |   head |   weight |\n|---:|-------:|-------:|---------:|\n|  0 |      0 |      1 |      1.0 |\n|  1 |      0 |      2 |      4.0 |\n|  2 |      1 |      2 |      2.0 |\n|  3 |      2 |      3 |      1.5 |\n|  4 |      2 |      4 |      3.0 |\n|  5 |      3 |      4 |      1.0 |\n\n```python\n# Initialize the Dijkstra object\ndijkstra = Dijkstra(edges)\n\n# Run the algorithm from a source vertex\nshortest_paths = dijkstra.run(vertex_idx=0)\nprint(\"Shortest paths:\", shortest_paths)\n```\n\n    Shortest paths: [0.  1.  3.  4.5 5.5]\n\nWe get the shortest paths from the source node 0 to all other nodes in the graph. The output is an array with the shortest path length to each node. A path length is the sum of the weights of the edges in the path.\n\n## Bellman-Ford Algorithm: Handling Negative Weights\n\nThe Bellman-Ford algorithm can handle graphs with negative edge weights and detect negative cycles, making it suitable for more complex scenarios than Dijkstra's algorithm.\n\n```python\nfrom edsger.path import BellmanFord\n\n# Create a graph with negative weights\nedges_negative = pd.DataFrame({\n    'tail': [0, 0, 1, 1, 2, 3],\n    'head': [1, 2, 2, 3, 3, 4],\n    'weight': [1, 4, -2, 5, 1, 3]  # Note the negative weight\n})\nedges_negative\n```\n\n|    |   tail |   head |   weight |\n|---:|-------:|-------:|---------:|\n|  0 |      0 |      1 |      1.0 |\n|  1 |      0 |      2 |      4.0 |\n|  2 |      1 |      2 |     -2.0 |\n|  3 |      1 |      3 |      5.0 |\n|  4 |      2 |      3 |      1.0 |\n|  5 |      3 |      4 |      3.0 |\n\n```python\n# Initialize and run Bellman-Ford\nbf = BellmanFord(edges_negative)\nshortest_paths = bf.run(vertex_idx=0)\nprint(\"Shortest paths:\", shortest_paths)\n```\n\n    Shortest paths: [ 0.  1. -1.  0.  3.]\n\nThe Bellman-Ford algorithm finds the optimal path even with negative weights. In this example, the shortest path from node 0 to node 2 has length -1 (going 0\u21921\u21922 with weights 1 + (-2) = -1), which is shorter than the direct path 0\u21922 with weight 4.\n\n### Negative Cycle Detection\n\nBellman-Ford can also detect negative cycles, which indicate that no shortest path exists:\n\n```python\n# Create a graph with a negative cycle\nedges_cycle = pd.DataFrame({\n    'tail': [0, 1, 2],\n    'head': [1, 2, 0],\n    'weight': [1, -2, -1]  # Cycle 0\u21921\u21922\u21920 has total weight -2\n})\n\nbf_cycle = BellmanFord(edges_cycle)\ntry:\n    bf_cycle.run(vertex_idx=0)\nexcept ValueError as e:\n    print(\"Error:\", e)\n```\n\n    Error: Negative cycle detected in the graph\n\n## Installation\n\n### Standard Installation\n\n```bash\npip install edsger\n```\n\n## Why Use Edsger?\n\nEdsger is designed to be **dataframe-friendly**, providing seamless integration with pandas workflows for graph algorithms. Also it is rather efficient on Linux. Our benchmarks on the USA road network (23.9M vertices, 57.7M edges) demonstrate nice performance:\n\n<img src=\"https://raw.githubusercontent.com/aetperf/edsger/release/docs/source/assets/dijkstra_benchmark_comparison.png\" alt=\"Dijkstra Performance Comparison\" width=\"700\">\n\n## Contributing\n\nWe welcome contributions to the Edsger library. If you have any suggestions, bug reports, or feature requests, please open an issue on our [GitHub repository](https://github.com/aetperf/Edsger).\n\n## License\n\nEdsger is licensed under the MIT License. See the LICENSE file for more details.\n\n## Contact\n\nFor any questions or inquiries, please contact Fran\u00e7ois Pacull at [francois.pacull@architecture-performance.fr](mailto:francois.pacull@architecture-performance.fr).\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "Graph algorithms in Cython.",
    "version": "0.1.5",
    "project_urls": {
        "Documentation": "https://edsger.readthedocs.io",
        "Repository": "https://github.com/aetperf/Edsger"
    },
    "split_keywords": [
        "python",
        " graph",
        " shortest path",
        " dijkstra"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "910815d3c98846331439593f0710414dfdb6721fc2c8e133560eef5cf60a37c6",
                "md5": "c602ecafc049a86432f1c287300ea548",
                "sha256": "494ccd567eb31854cec0e4a78d943466ad15fef2e171cb1eeab515ef9eeb1caf"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c602ecafc049a86432f1c287300ea548",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1674454,
            "upload_time": "2025-08-22T11:32:24",
            "upload_time_iso_8601": "2025-08-22T11:32:24.814303Z",
            "url": "https://files.pythonhosted.org/packages/91/08/15d3c98846331439593f0710414dfdb6721fc2c8e133560eef5cf60a37c6/edsger-0.1.5-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "af40d9634c4083aa7a2b3557fae5a4c58c4e49ee9b3c51eeb085740308c1d4ad",
                "md5": "9f53d0395c7f6240cc047adb6028e295",
                "sha256": "235aad979486545f4e147b2101d8a8de1549e09ae6b371671a009532d7b6f93d"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "9f53d0395c7f6240cc047adb6028e295",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1637377,
            "upload_time": "2025-08-22T11:32:27",
            "upload_time_iso_8601": "2025-08-22T11:32:27.159832Z",
            "url": "https://files.pythonhosted.org/packages/af/40/d9634c4083aa7a2b3557fae5a4c58c4e49ee9b3c51eeb085740308c1d4ad/edsger-0.1.5-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e4b448039a3f9c6cf018021947e09d522b08f32a37eb9b698fa4f59c465fea58",
                "md5": "0a824554e289e536315d2a094f1b83f4",
                "sha256": "0f77c55180ae5b245bdb4040ee0e71db09cdfa12f5e3d8a4c4008e7bda3c8868"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0a824554e289e536315d2a094f1b83f4",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 4221803,
            "upload_time": "2025-08-22T11:32:29",
            "upload_time_iso_8601": "2025-08-22T11:32:29.353871Z",
            "url": "https://files.pythonhosted.org/packages/e4/b4/48039a3f9c6cf018021947e09d522b08f32a37eb9b698fa4f59c465fea58/edsger-0.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "286751f5d1c5bdfb51603d4501dfb826179795be99dafb8fab518770dd6d1b6b",
                "md5": "3146d202df13d469749810572d2027c1",
                "sha256": "ee3a76aff95dc9ffa92895c987fe2c66ca4669d9d4d19316e8d816c7b0216c45"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp310-cp310-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3146d202df13d469749810572d2027c1",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 2146990,
            "upload_time": "2025-08-22T11:32:32",
            "upload_time_iso_8601": "2025-08-22T11:32:32.494659Z",
            "url": "https://files.pythonhosted.org/packages/28/67/51f5d1c5bdfb51603d4501dfb826179795be99dafb8fab518770dd6d1b6b/edsger-0.1.5-cp310-cp310-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8b26234462a449aa65d837227b4237eb7f94070e72e5fc746135924d5385e31b",
                "md5": "4fcb439488395f5fcffc159e799bf8d9",
                "sha256": "4a6341c5c27324d7c3e4c7def937544a32bbdb22ed7354ba681e6c8a216febf1"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp310-cp310-win32.whl",
            "has_sig": false,
            "md5_digest": "4fcb439488395f5fcffc159e799bf8d9",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 438984,
            "upload_time": "2025-08-22T11:32:34",
            "upload_time_iso_8601": "2025-08-22T11:32:34.278210Z",
            "url": "https://files.pythonhosted.org/packages/8b/26/234462a449aa65d837227b4237eb7f94070e72e5fc746135924d5385e31b/edsger-0.1.5-cp310-cp310-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aec22be26632bb280ef4a0bf2623209e56bc4ea5a8a623110988312412820985",
                "md5": "f81320407a1922c51cae0a1d9f287829",
                "sha256": "e6e39c21b28a081fdd483914162dd66401c2d687f467e66ce22c16e5ca0335da"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "f81320407a1922c51cae0a1d9f287829",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 529581,
            "upload_time": "2025-08-22T11:32:35",
            "upload_time_iso_8601": "2025-08-22T11:32:35.747719Z",
            "url": "https://files.pythonhosted.org/packages/ae/c2/2be26632bb280ef4a0bf2623209e56bc4ea5a8a623110988312412820985/edsger-0.1.5-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d2d01177faf8b458f5b4a1543143ff221cd9cab13abf634f91cd8839fef7a020",
                "md5": "c996a2ab154fed19766485aa83ccc5bf",
                "sha256": "e72f92ce49337304b5281b8f88a9d0a93dea599462a83be86ebaceca049e5453"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c996a2ab154fed19766485aa83ccc5bf",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1672794,
            "upload_time": "2025-08-22T11:32:37",
            "upload_time_iso_8601": "2025-08-22T11:32:37.459357Z",
            "url": "https://files.pythonhosted.org/packages/d2/d0/1177faf8b458f5b4a1543143ff221cd9cab13abf634f91cd8839fef7a020/edsger-0.1.5-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fa8d8387212b30240dc3f23a9ec9316483a9a9cbe1ec29c15dc2503d04f7a088",
                "md5": "97794757a633d29607367d9c40c03e03",
                "sha256": "864c7f6138516130b49cacd6d556a4713d326332482aa44660a25cca5986a5b9"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "97794757a633d29607367d9c40c03e03",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1636750,
            "upload_time": "2025-08-22T11:32:39",
            "upload_time_iso_8601": "2025-08-22T11:32:39.424456Z",
            "url": "https://files.pythonhosted.org/packages/fa/8d/8387212b30240dc3f23a9ec9316483a9a9cbe1ec29c15dc2503d04f7a088/edsger-0.1.5-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ee8bebb6da28af99a14a7ae288af90105454bcf343ce86fb81b3b255ea51bc2f",
                "md5": "5f034bf7bc653c46745c8e8393d859d9",
                "sha256": "29a55f913bf6e33bb0caa55f9cb76ee891f49ff187fa02146e372ebfce7ee9ed"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5f034bf7bc653c46745c8e8393d859d9",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 4359341,
            "upload_time": "2025-08-22T11:32:41",
            "upload_time_iso_8601": "2025-08-22T11:32:41.337834Z",
            "url": "https://files.pythonhosted.org/packages/ee/8b/ebb6da28af99a14a7ae288af90105454bcf343ce86fb81b3b255ea51bc2f/edsger-0.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "25f5129ea01c0b7ae243f24faf38edee84643708d13d9ee917136feea72c3844",
                "md5": "a266d1bbd98e531253bc044c8046eba1",
                "sha256": "13886ecfb4bc8211470eecf5a46ebb3fd69641fb9744095abc7a78ccdb9b89d8"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp311-cp311-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a266d1bbd98e531253bc044c8046eba1",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 2154080,
            "upload_time": "2025-08-22T11:32:42",
            "upload_time_iso_8601": "2025-08-22T11:32:42.920666Z",
            "url": "https://files.pythonhosted.org/packages/25/f5/129ea01c0b7ae243f24faf38edee84643708d13d9ee917136feea72c3844/edsger-0.1.5-cp311-cp311-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "23bc0a1ec83fb3e4a429d64ec5eaf1cd606ea3c66dcc09904acaffcd72deb5fe",
                "md5": "510998585ecfaf67c5cf5a47ab8a4a50",
                "sha256": "ed7b119ddc2ce02354e6e449ccc68da367ef2d10674c0785c1833b01908b4071"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp311-cp311-win32.whl",
            "has_sig": false,
            "md5_digest": "510998585ecfaf67c5cf5a47ab8a4a50",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 436686,
            "upload_time": "2025-08-22T11:32:44",
            "upload_time_iso_8601": "2025-08-22T11:32:44.387760Z",
            "url": "https://files.pythonhosted.org/packages/23/bc/0a1ec83fb3e4a429d64ec5eaf1cd606ea3c66dcc09904acaffcd72deb5fe/edsger-0.1.5-cp311-cp311-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "471282bf84936cec4707236010c4b74fd860efdfc10355bd81f6d36a55530ab5",
                "md5": "005fb498e233946fdda59a1ac60008e5",
                "sha256": "341f8980ceb6db7a12ea1a7cb9a6240e7fbdf6ac6104104a0a478a4726a10931"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "005fb498e233946fdda59a1ac60008e5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 528254,
            "upload_time": "2025-08-22T11:32:45",
            "upload_time_iso_8601": "2025-08-22T11:32:45.763048Z",
            "url": "https://files.pythonhosted.org/packages/47/12/82bf84936cec4707236010c4b74fd860efdfc10355bd81f6d36a55530ab5/edsger-0.1.5-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2fad32478db05c747819742a599e5e2d282802383c369df71d97ae24c7eb3c62",
                "md5": "2a95a9f690c9e58693da3be78d5a445d",
                "sha256": "f220850beba012bd845160f496d4babf31b47108be83d185888c495443e64733"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp312-cp312-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2a95a9f690c9e58693da3be78d5a445d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1663009,
            "upload_time": "2025-08-22T11:32:47",
            "upload_time_iso_8601": "2025-08-22T11:32:47.674892Z",
            "url": "https://files.pythonhosted.org/packages/2f/ad/32478db05c747819742a599e5e2d282802383c369df71d97ae24c7eb3c62/edsger-0.1.5-cp312-cp312-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e10e71ff1d297bfb41a4244d95bc7e1509eb0182776c62cb382c00f66e4f9ec0",
                "md5": "dd879462cb7d72554fcf4100140904b3",
                "sha256": "2530ab78d2eb9cbce478bf5f1cde1986a394c860e0462ac83ee4015a90f6e0e8"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "dd879462cb7d72554fcf4100140904b3",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1629749,
            "upload_time": "2025-08-22T11:32:49",
            "upload_time_iso_8601": "2025-08-22T11:32:49.379788Z",
            "url": "https://files.pythonhosted.org/packages/e1/0e/71ff1d297bfb41a4244d95bc7e1509eb0182776c62cb382c00f66e4f9ec0/edsger-0.1.5-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aa863870ae155f1cba45f1438ac09b8a572950a8afcd768bb4488b6ca656ec65",
                "md5": "652ab54b52c28f453d38f4feb1930fdb",
                "sha256": "b28fe9eaa9c7e0427d1983c59521a0f57d07e58ea15a1daba96c5bb61e33fcd8"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "652ab54b52c28f453d38f4feb1930fdb",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 4344691,
            "upload_time": "2025-08-22T11:32:51",
            "upload_time_iso_8601": "2025-08-22T11:32:51.157460Z",
            "url": "https://files.pythonhosted.org/packages/aa/86/3870ae155f1cba45f1438ac09b8a572950a8afcd768bb4488b6ca656ec65/edsger-0.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c8822fcf299d1e7ab0fdf67d7945b67aa4e66918c598ff55ac912cc1d98f250b",
                "md5": "9b501bb0ec89eef1fd98801cb49eb554",
                "sha256": "4afdca59ebd668a21ed23a050da4a5acb98dbdd7368e6f68d0efad81f4e15f3b"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp312-cp312-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9b501bb0ec89eef1fd98801cb49eb554",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 2109412,
            "upload_time": "2025-08-22T11:32:53",
            "upload_time_iso_8601": "2025-08-22T11:32:53.159169Z",
            "url": "https://files.pythonhosted.org/packages/c8/82/2fcf299d1e7ab0fdf67d7945b67aa4e66918c598ff55ac912cc1d98f250b/edsger-0.1.5-cp312-cp312-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "81bc4d1f78a54a7ca35ec6794067985d8d021d0e9a42376e1216533b9d2b51ad",
                "md5": "a554cbddc69993fbab93d7b3eff78231",
                "sha256": "63ca46de0cbbee2c6cd5fb83e37b054773b3765ec1f7b5a166988a6b3745d88f"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp312-cp312-win32.whl",
            "has_sig": false,
            "md5_digest": "a554cbddc69993fbab93d7b3eff78231",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 429961,
            "upload_time": "2025-08-22T11:32:54",
            "upload_time_iso_8601": "2025-08-22T11:32:54.518193Z",
            "url": "https://files.pythonhosted.org/packages/81/bc/4d1f78a54a7ca35ec6794067985d8d021d0e9a42376e1216533b9d2b51ad/edsger-0.1.5-cp312-cp312-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "33f1ef87bae92b91ad1fc1506230afd7e7dcf0fc1c569e0d3add7a90af066487",
                "md5": "e34bbabe39105fa4700428c656e66a8e",
                "sha256": "b1fecb92acf8ec087938eb9b9656f873da44d252bb15bfd8298962188d0114be"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e34bbabe39105fa4700428c656e66a8e",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 520890,
            "upload_time": "2025-08-22T11:32:55",
            "upload_time_iso_8601": "2025-08-22T11:32:55.977297Z",
            "url": "https://files.pythonhosted.org/packages/33/f1/ef87bae92b91ad1fc1506230afd7e7dcf0fc1c569e0d3add7a90af066487/edsger-0.1.5-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dd471181d4f1e32ae42f3aec02ba52ae6eca3ffca8468fce3c48bd5500d512db",
                "md5": "0f6aa2e97a0e9419b65f3033c91a3793",
                "sha256": "a6d61ac0d09e63b0d536bfa17e316acb728319e18c05a2d48dd58608ba83d30d"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0f6aa2e97a0e9419b65f3033c91a3793",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1676733,
            "upload_time": "2025-08-22T11:32:57",
            "upload_time_iso_8601": "2025-08-22T11:32:57.682523Z",
            "url": "https://files.pythonhosted.org/packages/dd/47/1181d4f1e32ae42f3aec02ba52ae6eca3ffca8468fce3c48bd5500d512db/edsger-0.1.5-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6513dbcfc771f3d41c59dde86e96362cf0fa732bb799ca3751f2ea1df2a042b2",
                "md5": "a3267ac3f4e0e51150a4aac058a820c5",
                "sha256": "b86cf4c55cc8a8abe96eb52e4656e6a50402faba996af4d40792a53445a4b310"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "a3267ac3f4e0e51150a4aac058a820c5",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1639294,
            "upload_time": "2025-08-22T11:32:59",
            "upload_time_iso_8601": "2025-08-22T11:32:59.785161Z",
            "url": "https://files.pythonhosted.org/packages/65/13/dbcfc771f3d41c59dde86e96362cf0fa732bb799ca3751f2ea1df2a042b2/edsger-0.1.5-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8c0696a769da877c00d8b1f2d97e6067af8bf922f1d77cd3b78c4f9685e2ea5c",
                "md5": "644ef744cbdaebb2916c585f34bf8cbe",
                "sha256": "ab4d34a4322c0b6f8d7eb7645bdb1a19a0360bb3f497307074dc7c3d989f50b8"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "644ef744cbdaebb2916c585f34bf8cbe",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 4206583,
            "upload_time": "2025-08-22T11:33:01",
            "upload_time_iso_8601": "2025-08-22T11:33:01.591098Z",
            "url": "https://files.pythonhosted.org/packages/8c/06/96a769da877c00d8b1f2d97e6067af8bf922f1d77cd3b78c4f9685e2ea5c/edsger-0.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dd5dd48553d7cc105948abd8a0f8e90577edd30184d4b8a815d184e2e770cc49",
                "md5": "e221c41ce5c21cf18d8080198699e834",
                "sha256": "0c8f92a0748caef81f8c228bfe37bfe00167a42cd9fd4413f23e19e3bc1adeb9"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp39-cp39-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e221c41ce5c21cf18d8080198699e834",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 2148882,
            "upload_time": "2025-08-22T11:33:03",
            "upload_time_iso_8601": "2025-08-22T11:33:03.175127Z",
            "url": "https://files.pythonhosted.org/packages/dd/5d/d48553d7cc105948abd8a0f8e90577edd30184d4b8a815d184e2e770cc49/edsger-0.1.5-cp39-cp39-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "de13f7f8f48c03310af786b2e844b0ee4cbae5793bbe2bdcd4aa98a40732727e",
                "md5": "1867870009f61bcf7b6c3c2836db41cd",
                "sha256": "8f4c2bb01df59132aefe3ca96d732d1f53defcd377d187b8ccf03b9b22a248ce"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp39-cp39-win32.whl",
            "has_sig": false,
            "md5_digest": "1867870009f61bcf7b6c3c2836db41cd",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 440020,
            "upload_time": "2025-08-22T11:33:05",
            "upload_time_iso_8601": "2025-08-22T11:33:05.053937Z",
            "url": "https://files.pythonhosted.org/packages/de/13/f7f8f48c03310af786b2e844b0ee4cbae5793bbe2bdcd4aa98a40732727e/edsger-0.1.5-cp39-cp39-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ae81370b741ba5aaf4f83b24f888ae8f0efe94c4492000e05aea00f4a4341bda",
                "md5": "986905210bd09280a607e8ddedc63374",
                "sha256": "b7c00849c2bd89bd018b61336e751c2f7576a4b62ab028852baf3d06d4f52027"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "986905210bd09280a607e8ddedc63374",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 530638,
            "upload_time": "2025-08-22T11:33:06",
            "upload_time_iso_8601": "2025-08-22T11:33:06.681749Z",
            "url": "https://files.pythonhosted.org/packages/ae/81/370b741ba5aaf4f83b24f888ae8f0efe94c4492000e05aea00f4a4341bda/edsger-0.1.5-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "20b2b54ca4ae0652ac87be64e0c4a70d4d748733f8cbd98a2ae71b5cdb015355",
                "md5": "7e83647627d08ee2f9bf8c5abba1e21a",
                "sha256": "19f94c566f4aa38c41dd1fc74ee382cf7824dde34a90150ebf4e52475a0ff06e"
            },
            "downloads": -1,
            "filename": "edsger-0.1.5.tar.gz",
            "has_sig": false,
            "md5_digest": "7e83647627d08ee2f9bf8c5abba1e21a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 1285736,
            "upload_time": "2025-08-22T11:33:08",
            "upload_time_iso_8601": "2025-08-22T11:33:08.197991Z",
            "url": "https://files.pythonhosted.org/packages/20/b2/b54ca4ae0652ac87be64e0c4a70d4d748733f8cbd98a2ae71b5cdb015355/edsger-0.1.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-22 11:33:08",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "aetperf",
    "github_project": "Edsger",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "setuptools",
            "specs": []
        },
        {
            "name": "setuptools_scm",
            "specs": []
        },
        {
            "name": "numpy",
            "specs": [
                [
                    ">=",
                    "1.26"
                ]
            ]
        },
        {
            "name": "Cython",
            "specs": [
                [
                    ">=",
                    "3"
                ]
            ]
        },
        {
            "name": "pandas",
            "specs": []
        }
    ],
    "lcname": "edsger"
}
        
Elapsed time: 4.43393s