
[](https://codecov.io/gh/aetperf/edsger)
[](https://edsger.readthedocs.io/en/latest/?badge=latest)
[](https://pypi.org/project/edsger/)
[](https://pepy.tech/project/edsger)
[](https://pypi.org/project/edsger/)
[](https://github.com/psf/black)
[](https://github.com/MarcoGorelli/cython-lint)
[](https://microsoft.github.io/pyright/)
[](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
## Breadth-First Search: Unweighted Directed Graphs
The BFS (Breadth-First Search) algorithm finds shortest paths in directed graphs where edge weights are ignored (or all edges are treated as having equal weight). It's particularly efficient for finding paths based on the minimum number of hops/edges rather than weighted distances.
```python
from edsger.path import BFS
# Create an unweighted directed graph
edges_unweighted = pd.DataFrame({
'tail': [0, 0, 1, 2, 2, 3],
'head': [1, 2, 3, 3, 4, 4]
})
edges_unweighted
```
| | tail | head |
|---:|-------:|-------:|
| 0 | 0 | 1 |
| 1 | 0 | 2 |
| 2 | 1 | 3 |
| 3 | 2 | 3 |
| 4 | 2 | 4 |
| 5 | 3 | 4 |
```python
# Initialize BFS
bfs = BFS(edges_unweighted)
# Run BFS from vertex 0 with path tracking
predecessors = bfs.run(vertex_idx=0, path_tracking=True)
print("Predecessors:", predecessors)
# Extract the path to vertex 4
path = bfs.get_path(4)
print("Path from 0 to 4:", path)
```
Predecessors: [-9999 0 0 1 2]
Path from 0 to 4: [4 2 0]
The BFS algorithm is ideal for directed graphs when:
- All edges should be treated equally (ignoring edge weights)
- You need to find paths with the minimum number of edges/hops
- You want the fastest path-finding algorithm for unweighted directed graphs (O(V + E) time complexity)
Note: The predecessor value -9999 indicates either the start vertex or an unreachable vertex. In the path output, vertices are listed from target to source.
## Installation
### Standard Installation
```bash
pip install edsger
```
### Development Installation
For development work, clone the repository and install in development mode:
```bash
git clone https://github.com/aetperf/Edsger.git
cd Edsger
pip install -r requirements-dev.txt
pip install -e .
```
## Development
This project uses several development tools to ensure code quality:
### Type Checking
We use [Pyright](https://github.com/microsoft/pyright) for static type checking:
```bash
# Run type checking
make typecheck
# Or directly with pyright
pyright
```
For more details on type checking configuration and gradual typing strategy, see [TYPING.md](TYPING.md).
### Running Tests
```bash
# Run all tests
make test
# Run with coverage
make coverage
```
### Code Formatting and Linting
```bash
# Format code with black
make format
# Check code style
make lint
```
### Pre-commit Hooks
This project uses pre-commit hooks to maintain code quality. The hooks behave differently based on the branch:
- **Protected branches (main, release*)**: All hooks run including pyright type checking
- **Feature branches**: Only formatting hooks run (black, cython-lint) for faster commits
- Run `make typecheck` or `pre-commit run --all-files` to manually check types before merging
```bash
# Install pre-commit hooks
pre-commit install
# Run all hooks manually
pre-commit run --all-files
# Skip specific hooks if needed
SKIP=pyright git commit -m "your message"
```
### Available Make Commands
```bash
make help # Show all available commands
```
## 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 me 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/c0/14/d42aa1a441ed6d9c463bdc9fb182689859038d93fa3f67f2b9af6f6e58f6/edsger-0.1.6.tar.gz",
"platform": "any",
"description": "\n\n[](https://codecov.io/gh/aetperf/edsger)\n[](https://edsger.readthedocs.io/en/latest/?badge=latest)\n[](https://pypi.org/project/edsger/)\n[](https://pepy.tech/project/edsger)\n[](https://pypi.org/project/edsger/)\n[](https://github.com/psf/black)\n[](https://github.com/MarcoGorelli/cython-lint)\n[](https://microsoft.github.io/pyright/)\n[](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## Breadth-First Search: Unweighted Directed Graphs\n\nThe BFS (Breadth-First Search) algorithm finds shortest paths in directed graphs where edge weights are ignored (or all edges are treated as having equal weight). It's particularly efficient for finding paths based on the minimum number of hops/edges rather than weighted distances.\n\n```python\nfrom edsger.path import BFS\n\n# Create an unweighted directed graph\nedges_unweighted = pd.DataFrame({\n 'tail': [0, 0, 1, 2, 2, 3],\n 'head': [1, 2, 3, 3, 4, 4]\n})\nedges_unweighted\n```\n\n| | tail | head |\n|---:|-------:|-------:|\n| 0 | 0 | 1 |\n| 1 | 0 | 2 |\n| 2 | 1 | 3 |\n| 3 | 2 | 3 |\n| 4 | 2 | 4 |\n| 5 | 3 | 4 |\n\n```python\n# Initialize BFS\nbfs = BFS(edges_unweighted)\n\n# Run BFS from vertex 0 with path tracking\npredecessors = bfs.run(vertex_idx=0, path_tracking=True)\nprint(\"Predecessors:\", predecessors)\n\n# Extract the path to vertex 4\npath = bfs.get_path(4)\nprint(\"Path from 0 to 4:\", path)\n```\n\n Predecessors: [-9999 0 0 1 2]\n Path from 0 to 4: [4 2 0]\n\nThe BFS algorithm is ideal for directed graphs when:\n- All edges should be treated equally (ignoring edge weights)\n- You need to find paths with the minimum number of edges/hops\n- You want the fastest path-finding algorithm for unweighted directed graphs (O(V + E) time complexity)\n\nNote: The predecessor value -9999 indicates either the start vertex or an unreachable vertex. In the path output, vertices are listed from target to source.\n\n## Installation\n\n### Standard Installation\n\n```bash\npip install edsger\n```\n\n### Development Installation\n\nFor development work, clone the repository and install in development mode:\n\n```bash\ngit clone https://github.com/aetperf/Edsger.git\ncd Edsger\npip install -r requirements-dev.txt\npip install -e .\n```\n\n## Development\n\nThis project uses several development tools to ensure code quality:\n\n### Type Checking\n\nWe use [Pyright](https://github.com/microsoft/pyright) for static type checking:\n\n```bash\n# Run type checking\nmake typecheck\n\n# Or directly with pyright\npyright\n```\n\nFor more details on type checking configuration and gradual typing strategy, see [TYPING.md](TYPING.md).\n\n### Running Tests\n\n```bash\n# Run all tests\nmake test\n\n# Run with coverage\nmake coverage\n```\n\n### Code Formatting and Linting\n\n```bash\n# Format code with black\nmake format\n\n# Check code style\nmake lint\n```\n\n### Pre-commit Hooks\n\nThis project uses pre-commit hooks to maintain code quality. The hooks behave differently based on the branch:\n\n- **Protected branches (main, release*)**: All hooks run including pyright type checking\n- **Feature branches**: Only formatting hooks run (black, cython-lint) for faster commits\n - Run `make typecheck` or `pre-commit run --all-files` to manually check types before merging\n\n```bash\n# Install pre-commit hooks\npre-commit install\n\n# Run all hooks manually\npre-commit run --all-files\n\n# Skip specific hooks if needed\nSKIP=pyright git commit -m \"your message\"\n```\n\n### Available Make Commands\n\n```bash\nmake help # Show all available commands\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 me 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.6",
"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": "d3ba0e7326cf55bb33922b92bbe1c10709c12bb4fe9f0bbed73a11fe0a663304",
"md5": "3e5269976624c564efd25f93f992062a",
"sha256": "ce7449e69441c62fc2e38ddaef5aa29a9f3b8291075dd3483b80e0f862f3d874"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp310-cp310-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "3e5269976624c564efd25f93f992062a",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1980097,
"upload_time": "2025-10-11T22:37:08",
"upload_time_iso_8601": "2025-10-11T22:37:08.330032Z",
"url": "https://files.pythonhosted.org/packages/d3/ba/0e7326cf55bb33922b92bbe1c10709c12bb4fe9f0bbed73a11fe0a663304/edsger-0.1.6-cp310-cp310-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "907bc252cbe01a1d4538f35f637baaa8d7e8f7ecc5225b494ef1bdf81286aa5f",
"md5": "eaf4ef90f860d51d99960b0e4b69c2e0",
"sha256": "77ac9df3bae2cceda2c03a1a4f5cd20edba7e68de332460c905e139edb907665"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "eaf4ef90f860d51d99960b0e4b69c2e0",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1914885,
"upload_time": "2025-10-11T22:37:10",
"upload_time_iso_8601": "2025-10-11T22:37:10.486576Z",
"url": "https://files.pythonhosted.org/packages/90/7b/c252cbe01a1d4538f35f637baaa8d7e8f7ecc5225b494ef1bdf81286aa5f/edsger-0.1.6-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0f763bb2dac656a15846a696184e6fe9535d6d6e065625ceef3318e71f4bce34",
"md5": "93ba3a37ce5351b805fb98c0876e7bcb",
"sha256": "7eb270fc064e66c9a2d55ed8bc02e11750d79c27684d6cbf3c038afff3ef945d"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "93ba3a37ce5351b805fb98c0876e7bcb",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 4957705,
"upload_time": "2025-10-11T22:37:12",
"upload_time_iso_8601": "2025-10-11T22:37:12.520406Z",
"url": "https://files.pythonhosted.org/packages/0f/76/3bb2dac656a15846a696184e6fe9535d6d6e065625ceef3318e71f4bce34/edsger-0.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "020d2552e02d0c76c6df5bbeb2c2128235f3f8d5eafd21cfb34f8d3cdfd71fb0",
"md5": "b301030cf94f22db52c058322a130b4f",
"sha256": "73de7aa8e7a124523ccce78a962369d6bdf1b8d5a39587ba8c50c4d81434801f"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp310-cp310-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "b301030cf94f22db52c058322a130b4f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 2479276,
"upload_time": "2025-10-11T22:37:14",
"upload_time_iso_8601": "2025-10-11T22:37:14.503392Z",
"url": "https://files.pythonhosted.org/packages/02/0d/2552e02d0c76c6df5bbeb2c2128235f3f8d5eafd21cfb34f8d3cdfd71fb0/edsger-0.1.6-cp310-cp310-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3c1d69feeb436b092d7504c8e68c062a08be74187be4160fc10d49b41481ec81",
"md5": "64fca72f0ccab72e2bd5e59ec86681ae",
"sha256": "58ef008dba584cfaee30f005dd5aad18559b4c7e8366fc1dbe2ef19210fec119"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp310-cp310-win32.whl",
"has_sig": false,
"md5_digest": "64fca72f0ccab72e2bd5e59ec86681ae",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 515297,
"upload_time": "2025-10-11T22:37:16",
"upload_time_iso_8601": "2025-10-11T22:37:16.153350Z",
"url": "https://files.pythonhosted.org/packages/3c/1d/69feeb436b092d7504c8e68c062a08be74187be4160fc10d49b41481ec81/edsger-0.1.6-cp310-cp310-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a7ed0be95c192016c9378ab02e7798ef290cd108e263695973b3ab1bf4bdfe61",
"md5": "3bc4b3f3b5fff7cc4d91476181e0ceb2",
"sha256": "1c4fdca51ce3876f92dcfc9e9f062d4e62651309e292dead613e9ca44c6bd54f"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "3bc4b3f3b5fff7cc4d91476181e0ceb2",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 607026,
"upload_time": "2025-10-11T22:37:17",
"upload_time_iso_8601": "2025-10-11T22:37:17.400090Z",
"url": "https://files.pythonhosted.org/packages/a7/ed/0be95c192016c9378ab02e7798ef290cd108e263695973b3ab1bf4bdfe61/edsger-0.1.6-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e65d25d6728fcb3090bc58f87364102bdab9b0859f775a8432434024e9193df3",
"md5": "2d4b6f743b2aa23fa9c592daa19d59f7",
"sha256": "2ad14837b2b2f8dd456b2e3cf362d95a9a1e0d1510a5532d353691a2d3554afe"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp311-cp311-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "2d4b6f743b2aa23fa9c592daa19d59f7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1977494,
"upload_time": "2025-10-11T22:37:19",
"upload_time_iso_8601": "2025-10-11T22:37:19.026604Z",
"url": "https://files.pythonhosted.org/packages/e6/5d/25d6728fcb3090bc58f87364102bdab9b0859f775a8432434024e9193df3/edsger-0.1.6-cp311-cp311-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7f07e37fd008596a891ce7fd1ca89f63071e96f59230b9937cf68394331ce988",
"md5": "aecc022325ac502345723f872c07291a",
"sha256": "12eabd08bdb57bb34ae14ab8c86d717c13cfa2845e99c36c4ce6a4b19220642a"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "aecc022325ac502345723f872c07291a",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1913595,
"upload_time": "2025-10-11T22:37:20",
"upload_time_iso_8601": "2025-10-11T22:37:20.774587Z",
"url": "https://files.pythonhosted.org/packages/7f/07/e37fd008596a891ce7fd1ca89f63071e96f59230b9937cf68394331ce988/edsger-0.1.6-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e6d75f6b04ceb005b115008da56685cfe25e984cd1965408e8a1692d9b1cbce4",
"md5": "a8e23c0440bfe2526c40d4d24396b761",
"sha256": "ba1f3088001db2a6b5f3efd0d1eca55da17f47ff103d95e7cfb636e22d9e6fb1"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "a8e23c0440bfe2526c40d4d24396b761",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 5127311,
"upload_time": "2025-10-11T22:37:22",
"upload_time_iso_8601": "2025-10-11T22:37:22.374159Z",
"url": "https://files.pythonhosted.org/packages/e6/d7/5f6b04ceb005b115008da56685cfe25e984cd1965408e8a1692d9b1cbce4/edsger-0.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c359731e0123cdeb27874ae723e775eb021036b1f44bb2290dbcd7f10a04308f",
"md5": "61515b647143a3049951c2de7cc39936",
"sha256": "78ff437ce65dbbc737278318b6d0164115a7e6878372b9637e7a35889c7f479d"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp311-cp311-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "61515b647143a3049951c2de7cc39936",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 2484452,
"upload_time": "2025-10-11T22:37:24",
"upload_time_iso_8601": "2025-10-11T22:37:24.193202Z",
"url": "https://files.pythonhosted.org/packages/c3/59/731e0123cdeb27874ae723e775eb021036b1f44bb2290dbcd7f10a04308f/edsger-0.1.6-cp311-cp311-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c97f8dc4bb067c979fdb9c5e3616fd9f5ca56001b7527945bf71b0eb2ec984c6",
"md5": "43419aca69733d7e1b0f14d91f3314b5",
"sha256": "5a37f9a6777f8971c6d10c727c1360187cbbf5ddd62993d42ee1a1b6000af9b3"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp311-cp311-win32.whl",
"has_sig": false,
"md5_digest": "43419aca69733d7e1b0f14d91f3314b5",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 515214,
"upload_time": "2025-10-11T22:37:25",
"upload_time_iso_8601": "2025-10-11T22:37:25.490019Z",
"url": "https://files.pythonhosted.org/packages/c9/7f/8dc4bb067c979fdb9c5e3616fd9f5ca56001b7527945bf71b0eb2ec984c6/edsger-0.1.6-cp311-cp311-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "905645f0ea337e91820543f3bad6f7d5e11f3bc397f8ac9482e64aa32ea37be7",
"md5": "6a22e7d1a470658199d58e62045aa9af",
"sha256": "43380282c00569ecc11899d12d469a6a050ab7a96cd5d4e3fcf0ecd82ba59db3"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "6a22e7d1a470658199d58e62045aa9af",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 609507,
"upload_time": "2025-10-11T22:37:26",
"upload_time_iso_8601": "2025-10-11T22:37:26.648422Z",
"url": "https://files.pythonhosted.org/packages/90/56/45f0ea337e91820543f3bad6f7d5e11f3bc397f8ac9482e64aa32ea37be7/edsger-0.1.6-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "990dc257cb4c6604724776300d2436828a52004cad0e3dbcb1497bad9dfb988f",
"md5": "3548ef32a8935b7ca137038bbf79c414",
"sha256": "467e3091171a1b2ce7f5518d5f1cb61b58721f0f31e8f49ccb23568ff31fb21d"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp312-cp312-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "3548ef32a8935b7ca137038bbf79c414",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1969534,
"upload_time": "2025-10-11T22:37:28",
"upload_time_iso_8601": "2025-10-11T22:37:28.271706Z",
"url": "https://files.pythonhosted.org/packages/99/0d/c257cb4c6604724776300d2436828a52004cad0e3dbcb1497bad9dfb988f/edsger-0.1.6-cp312-cp312-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6623f9d4d276f494a1d04b6e9776f6737892a730a238abdad4e7dba36f6e3eae",
"md5": "72d373bfbfd2152a1c14d45f921114fc",
"sha256": "91e41cc3c5ffc5639932c668beba6aff2f866a619418f9a3a0202c24f1f8eed7"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "72d373bfbfd2152a1c14d45f921114fc",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1907239,
"upload_time": "2025-10-11T22:37:30",
"upload_time_iso_8601": "2025-10-11T22:37:30.088661Z",
"url": "https://files.pythonhosted.org/packages/66/23/f9d4d276f494a1d04b6e9776f6737892a730a238abdad4e7dba36f6e3eae/edsger-0.1.6-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "814bdf3c43513093c2126279dbd8345fbf2f79b110a5bcf39046ec3fb89ad0fb",
"md5": "8f1c802116bee615b47b84e86eba0b85",
"sha256": "8909fe5bcb0db4d4dac898a739f93a7d3b6e147207b80120a2bd761defeaa152"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8f1c802116bee615b47b84e86eba0b85",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 5124607,
"upload_time": "2025-10-11T22:37:31",
"upload_time_iso_8601": "2025-10-11T22:37:31.934433Z",
"url": "https://files.pythonhosted.org/packages/81/4b/df3c43513093c2126279dbd8345fbf2f79b110a5bcf39046ec3fb89ad0fb/edsger-0.1.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0485eb0d80a5c12209811b73a9109aca0bab9c32bfc075ed950b97b22f3944ef",
"md5": "7300bc2efdfb6ea652b5100c7b4c5b96",
"sha256": "7643757fd61d87ac11d23c5ac837040e4e011736841abaed7111eac2fc898a8f"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp312-cp312-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "7300bc2efdfb6ea652b5100c7b4c5b96",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 2444559,
"upload_time": "2025-10-11T22:37:33",
"upload_time_iso_8601": "2025-10-11T22:37:33.759940Z",
"url": "https://files.pythonhosted.org/packages/04/85/eb0d80a5c12209811b73a9109aca0bab9c32bfc075ed950b97b22f3944ef/edsger-0.1.6-cp312-cp312-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "02f2438688a642b79b43bfd4d4f33b6d83f0af1676b0edd8d2544091a81c7b53",
"md5": "5e30578028fa040c2bea5ef42b751e55",
"sha256": "1910148ac5578f050f3a0e8b7786a4e92bee70035af760211766d7fbb3b8ce5b"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp312-cp312-win32.whl",
"has_sig": false,
"md5_digest": "5e30578028fa040c2bea5ef42b751e55",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 506382,
"upload_time": "2025-10-11T22:37:35",
"upload_time_iso_8601": "2025-10-11T22:37:35.440693Z",
"url": "https://files.pythonhosted.org/packages/02/f2/438688a642b79b43bfd4d4f33b6d83f0af1676b0edd8d2544091a81c7b53/edsger-0.1.6-cp312-cp312-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "088985195aa0f854021cf8e1e4c683e6a82df7061c816099a152334760d9a9cc",
"md5": "365282f5a04a44673bde8b719484e6e5",
"sha256": "079ffc431e9882389c66df06c55694615ff1172b3b413329214104e72b4806bd"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "365282f5a04a44673bde8b719484e6e5",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 600476,
"upload_time": "2025-10-11T22:37:37",
"upload_time_iso_8601": "2025-10-11T22:37:37.151759Z",
"url": "https://files.pythonhosted.org/packages/08/89/85195aa0f854021cf8e1e4c683e6a82df7061c816099a152334760d9a9cc/edsger-0.1.6-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "33cc2e53846ce688240f677df59901eb1533d7f0da32785d18e52d228add7e37",
"md5": "594d732b59bef29394665fac2088a2ee",
"sha256": "6c19a73ffa80080685e2b7c3d700c31e13b9ef8b0ecb1e05f59212077358ea37"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp39-cp39-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "594d732b59bef29394665fac2088a2ee",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1982770,
"upload_time": "2025-10-11T22:37:38",
"upload_time_iso_8601": "2025-10-11T22:37:38.791402Z",
"url": "https://files.pythonhosted.org/packages/33/cc/2e53846ce688240f677df59901eb1533d7f0da32785d18e52d228add7e37/edsger-0.1.6-cp39-cp39-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "07790a7f235945c6b194c181e75ade420d22c38c780ade184a40cbc5e6582056",
"md5": "d0154ef6fcf08b625b7c0be77f57524d",
"sha256": "e5f331a1d2dafa3d6c63ea4f01a7bd892f9c692d510d5406bed1eb6e4ac1a54e"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "d0154ef6fcf08b625b7c0be77f57524d",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1917063,
"upload_time": "2025-10-11T22:37:40",
"upload_time_iso_8601": "2025-10-11T22:37:40.268240Z",
"url": "https://files.pythonhosted.org/packages/07/79/0a7f235945c6b194c181e75ade420d22c38c780ade184a40cbc5e6582056/edsger-0.1.6-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f50813755e7ba856af3b6f3370b847e240d258e42fe2119a541d499ceecdbb5e",
"md5": "f5196e613fb9f68be60d296f3a845fc5",
"sha256": "2b1c8e0f918aabe3a742f55fc014bbb7ede83badcda05ab91dac3f9d5efb821a"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f5196e613fb9f68be60d296f3a845fc5",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 4946494,
"upload_time": "2025-10-11T22:37:41",
"upload_time_iso_8601": "2025-10-11T22:37:41.644755Z",
"url": "https://files.pythonhosted.org/packages/f5/08/13755e7ba856af3b6f3370b847e240d258e42fe2119a541d499ceecdbb5e/edsger-0.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6762af414410d19d0f7bc39acc9813c507ec2ce14f703a4d7364eaa80ec45d7b",
"md5": "c5f7b4b73604e6635cd31c922363faf9",
"sha256": "7fc0533e80b47f310059390e4b5cf673e792c183fd92747d5f406adc097a0559"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp39-cp39-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "c5f7b4b73604e6635cd31c922363faf9",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 2481489,
"upload_time": "2025-10-11T22:37:43",
"upload_time_iso_8601": "2025-10-11T22:37:43.530004Z",
"url": "https://files.pythonhosted.org/packages/67/62/af414410d19d0f7bc39acc9813c507ec2ce14f703a4d7364eaa80ec45d7b/edsger-0.1.6-cp39-cp39-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d93bf6c324411dc0954efa46a57f788b2de321315df23fe59cec0090479b6695",
"md5": "79757e285f9dbeec44c714ede796b22b",
"sha256": "09725fe363adc4ecad3375dc4b500c74a6955805a48239c9e09545c61a9551b5"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp39-cp39-win32.whl",
"has_sig": false,
"md5_digest": "79757e285f9dbeec44c714ede796b22b",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 516551,
"upload_time": "2025-10-11T22:37:45",
"upload_time_iso_8601": "2025-10-11T22:37:45.206118Z",
"url": "https://files.pythonhosted.org/packages/d9/3b/f6c324411dc0954efa46a57f788b2de321315df23fe59cec0090479b6695/edsger-0.1.6-cp39-cp39-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1851b62ef33c4d4ff39292237046f0caa9b9f054a3872700381d9b816595aa3f",
"md5": "940a814e06fa1f43c2f1a1f21ed2a001",
"sha256": "ad32d07b32971fdc5f9aa139118734145347e69ff6015620777daa92c8259ba3"
},
"downloads": -1,
"filename": "edsger-0.1.6-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "940a814e06fa1f43c2f1a1f21ed2a001",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 608661,
"upload_time": "2025-10-11T22:37:47",
"upload_time_iso_8601": "2025-10-11T22:37:47.103166Z",
"url": "https://files.pythonhosted.org/packages/18/51/b62ef33c4d4ff39292237046f0caa9b9f054a3872700381d9b816595aa3f/edsger-0.1.6-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c014d42aa1a441ed6d9c463bdc9fb182689859038d93fa3f67f2b9af6f6e58f6",
"md5": "15e09c164b42b49674755cc4c4c76815",
"sha256": "4e034c583e230a6eb1e327ed0b16e4110788af618e3a6273261bd6b7daddacd2"
},
"downloads": -1,
"filename": "edsger-0.1.6.tar.gz",
"has_sig": false,
"md5_digest": "15e09c164b42b49674755cc4c4c76815",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 1502790,
"upload_time": "2025-10-11T22:37:48",
"upload_time_iso_8601": "2025-10-11T22:37:48.358691Z",
"url": "https://files.pythonhosted.org/packages/c0/14/d42aa1a441ed6d9c463bdc9fb182689859038d93fa3f67f2b9af6f6e58f6/edsger-0.1.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-11 22:37:48",
"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"
}