A pure Rust DAG executor supporting implicit node connections, branching, and config sweeps
Project description
dagex - Python Edition
A pure Rust DAG executor with Python bindings for building and executing complex computational workflows.
🚀 Quick Start
pip install dagex
📖 Overview
dagex provides a powerful yet simple API for building directed acyclic graphs (DAGs) of computational tasks. Key features:
- Automatic dependency resolution based on data flow
- Parallel execution of independent nodes
- Branching for creating independent subgraphs
- Variants for parameter sweeps and A/B testing
- Mermaid diagrams for visualizing your pipeline
Python Parallel Execution & the GIL
Python's Global Interpreter Lock (GIL) means that pure Python computations cannot achieve true parallelism. However, dagex enables true parallel execution when your node functions perform operations that release the GIL, such as:
- I/O operations: File reads/writes, network calls, database queries
- NumPy/SciPy operations: Most numerical computations in these libraries release the GIL
- C extensions: Custom C/Rust extensions that release the GIL
- Sleep/wait operations: Simulating blocking operations
The examples in this package use time.sleep() to demonstrate parallelization benefits, as sleep operations release the GIL and allow other threads to run concurrently.
🎯 Basic Example
import dagex
def generate(_inputs):
return {"n": 7}
def double(inputs):
v = inputs.get("x", 0)
return {"y": v * 2}
# Build graph
g = dagex.Graph()
g.add(generate, label="Source", inputs=None, outputs=[("n", "x")])
g.add(double, label="Double", inputs=[("x", "x")], outputs=[("y", "out")])
# Execute
dag = g.build()
print(dag.to_mermaid()) # Visualize
context = dag.execute(parallel=False)
print('Result:', context.get('out')) # Result: 14
📚 Examples
All examples can be run directly:
python3 examples/py/01_minimal_pipeline.py
python3 examples/py/02_parallel_vs_sequential.py
python3 examples/py/03_branch_and_merge.py
python3 examples/py/04_variants_sweep.py
python3 examples/py/05_output_access.py
python3 examples/py/06_graphdata_large_payload_arc_or_shared_data.py
Example 01: Minimal Pipeline
The simplest possible DAG: generator → transformer → aggregator.
Description: Shows a basic 3-node pipeline where each node depends on the previous one. Demonstrates the fundamental dataflow concept.
Syntax:
import dagex
graph = dagex.Graph()
# Add nodes to the pipeline
graph.add(
generate, # Python callable
label="Generator",
inputs=None, # No inputs (source node)
outputs=[("number", "x")] # Output mapping: impl → broadcast
)
graph.add(
double,
label="Doubler",
inputs=[("x", "x")], # Input mapping: broadcast → impl
outputs=[("result", "y")]
)
# Build and execute
dag = graph.build()
context = dag.execute(parallel=False) # Sequential
context = dag.execute(parallel=True) # Parallel
Mermaid Diagram:
graph TD
0["Generator"]
1["Doubler"]
2["AddFive"]
0 -->|x → x| 1
1 -->|y → y| 2
Performance (Sequential):
⏱️ Runtime: 302.202ms
💾 Memory: Current: 0.05 KB, Peak: 0.05 KB
Performance (Parallel):
⏱️ Runtime: 304.032ms
💾 Memory: Current: 0.07 KB, Peak: 0.07 KB
Output:
Sequential execution:
Final output: 25
Time: 302.202ms
Parallel execution:
Final output: 25
Time: 304.032ms
✅ Pipeline completed successfully!
(Started with 10, doubled to 20, added 5 = 25)
Example 02: Parallel vs Sequential Execution
Demonstrates the power of parallel execution for independent tasks.
Description: Shows three independent tasks (A, B, C) that each simulate I/O-bound work. When executed sequentially, tasks run one after another. When executed in parallel, independent tasks run simultaneously, demonstrating significant speedup.
Syntax:
import dagex
# Add independent tasks
graph.add(task_a, label="TaskA", inputs=[("input", "input")], outputs=[("result_a", "a")])
graph.add(task_b, label="TaskB", inputs=[("input", "input")], outputs=[("result_b", "b")])
graph.add(task_c, label="TaskC", inputs=[("input", "input")], outputs=[("result_c", "c")])
# Build and execute
dag = graph.build()
# Sequential vs parallel
context_seq = dag.execute(parallel=False)
context_par = dag.execute(parallel=True, max_threads=4)
Mermaid Diagram:
graph TD
0["Source"]
1["TaskA"]
2["TaskB"]
3["TaskC"]
0 -->|input → input| 1
0 -->|input → input| 2
0 -->|input → input| 3
Performance (Sequential):
⏱️ Runtime: 453.869ms
💾 Memory: Current: 0.04 KB, Peak: 0.04 KB
Performance (Parallel):
⏱️ Runtime: 150.673ms
💾 Memory: Current: 0.25 KB, Peak: 1.16 KB
Output:
Sequential results:
TaskA: 110
TaskB: 120
TaskC: 130
Time: 453.869ms
Parallel results:
TaskA: 110
TaskB: 120
TaskC: 130
Time: 150.673ms
⚡ Speedup: 3.01x faster with parallel execution!
Example 03: Branch and Merge
Fan-out (branching) and fan-in (merging) patterns for complex workflows.
Description: Demonstrates creating independent branches that process data in parallel, then merging their outputs. Each branch contains its own subgraph that can have multiple nodes.
Syntax:
import dagex
# Create branches
branch_a = dagex.Graph()
branch_a.add(path_a_func, label="PathA (+10)", ...)
branch_a_id = graph.branch(branch_a)
branch_b = dagex.Graph()
branch_b.add(path_b_func, label="PathB (+20)", ...)
branch_b_id = graph.branch(branch_b)
# Merge branches
graph.merge(
merge_func,
label="Merge",
branch_inputs=[
(branch_a_id, "result", "from_a"),
(branch_b_id, "result", "from_b"),
],
outputs=[("combined", "final")]
)
Mermaid Diagram:
graph TD
0["Source"]
1["PathA (+10)"]
2["PathB (+20)"]
3["Combine"]
4["PathA (+10)"]
5["PathB (+20)"]
0 -->|x → x| 1
0 -->|x → x| 2
4 -->|a → a| 3
2 -->|b → b| 3
5 -->|b → b| 3
1 -->|a → a| 3
0 -->|x → x| 4
0 -->|x → x| 5
style 1 fill:#e1f5ff
style 2 fill:#e1f5ff
Performance (Sequential):
⏱️ Runtime: 602.807ms
💾 Memory: Current: 0.35 KB, Peak: 0.35 KB
Performance (Parallel):
⏱️ Runtime: 152.378ms
💾 Memory: Current: 0.62 KB, Peak: 1.37 KB
Output:
📊 Execution flow:
Source: 50
PathA: 50 + 10 = 60
PathB: 50 + 20 = 70
Combine: 60 + 70 = 130
Sequential execution:
Final output: 130
Time: 602.807ms
Parallel execution:
Final output: 130
Time: 152.378ms
✅ Branch and merge completed successfully!
Example 04: Variants (Parameter Sweep)
Run multiple variants in parallel—perfect for hyperparameter tuning or A/B testing.
Description: Demonstrates running multiple nodes with the same structure but different parameters. All variants execute at the same level in the DAG, enabling efficient parallel exploration of parameter spaces.
Syntax:
import dagex
# Create variant functions with different parameters
def make_multiplier(factor):
def multiplier(inputs):
value = inputs.get("x", 0)
return {"result": value * factor}
return multiplier
# Create multiple variants
factors = [2, 3, 5, 7]
variant_funcs = [make_multiplier(f) for f in factors]
# Add all variants at once
graph.variants(
variant_funcs,
label="Multiplier",
inputs=[("x", "x")],
outputs=[("result", "results")]
)
Mermaid Diagram:
graph TD
0["DataSource"]
1["Multiplier (v0)"]
2["Multiplier (v1)"]
3["Multiplier (v2)"]
4["Multiplier (v3)"]
0 -->|x → x| 1
0 -->|x → x| 2
0 -->|x → x| 3
0 -->|x → x| 4
style 1 fill:#e1f5ff
style 2 fill:#e1f5ff
style 3 fill:#e1f5ff
style 4 fill:#e1f5ff
style 1 fill:#ffe1e1
style 2 fill:#e1ffe1
style 3 fill:#ffe1ff
style 4 fill:#ffffe1
Performance (Sequential):
⏱️ Runtime: 605.985ms
💾 Memory: Current: 0.05 KB, Peak: 0.05 KB
Performance (Parallel):
⏱️ Runtime: 153.865ms
💾 Memory: Current: 0.48 KB, Peak: 1.53 KB
Output:
📊 Base value: 10
Sequential execution:
Time: 605.985ms
Parallel execution:
Time: 153.865ms
Detailed variant outputs:
Variant 0 (×2): 20
Variant 1 (×3): 30
Variant 2 (×5): 50
Variant 3 (×7): 70
✅ All 4 variants executed successfully!
Example 05: Output Access
Access intermediate results and branch outputs, not just final values.
Description:
Demonstrates how to access different levels of output: final context outputs, individual node outputs, and branch-specific outputs. Uses execute_detailed() instead of execute() to get comprehensive execution information.
Syntax:
import dagex
# Execute with detailed output
result = dag.execute_detailed(parallel=True, max_threads=4)
# Access different output levels:
# 1. Final context outputs
final_output = result.context.get("output")
# 2. Per-node outputs
for node_id, outputs in result.node_outputs.items():
print(f"Node {node_id}: {len(outputs)} outputs")
# 3. Branch-specific outputs
for branch_id, outputs in result.branch_outputs.items():
print(f"Branch {branch_id}: {outputs}")
Mermaid Diagram:
graph TD
0["Source"]
1["ProcessorA"]
2["ProcessorB"]
3["Combine"]
4["ProcessorA"]
5["ProcessorB"]
0 -->|input → input| 1
0 -->|input → input| 2
4 -->|a → a| 3
5 -->|b → b| 3
1 -->|a → a| 3
2 -->|b → b| 3
0 -->|input → input| 4
0 -->|input → input| 5
style 1 fill:#e1f5ff
style 2 fill:#e1f5ff
Performance (Sequential):
⏱️ Runtime: 603.634ms
💾 Memory: Current: 0.43 KB, Peak: 0.43 KB
Performance (Parallel):
⏱️ Runtime: 150.890ms
💾 Memory: Current: 0.70 KB, Peak: 1.55 KB
Output:
📊 Accessing outputs:
Sequential execution:
Time: 603.634ms
Parallel execution:
Time: 150.890ms
Final context outputs:
output: 351
Execution flow:
Source: 100
ProcessorA (branch A): 100 × 2 = 200
ProcessorB (branch B): 100 + 50 = 150
Combine: 200 + 150 + 1 = 351
✅ Successfully accessed outputs!
Example 06: Zero-Copy Data Sharing
Large data is automatically wrapped in Arc for efficient sharing without copying.
Description: Demonstrates efficient memory handling for large datasets. GraphData automatically wraps large vectors (int_vec, float_vec) in Arc, enabling multiple nodes to read the same data without duplication.
Syntax:
import dagex
import numpy as np
# Create large data
def create_large_data(_inputs):
# Large numpy array - efficiently shared
large_array = list(range(1_000_000))
return {"large_data": large_array}
graph.add(create_large_data, label="CreateLargeData", ...)
# Multiple consumers access the same data - minimal copying
graph.add(consumer_a, label="ConsumerA", ...)
graph.add(consumer_b, label="ConsumerB", ...)
graph.add(consumer_c, label="ConsumerC", ...)
Mermaid Diagram:
graph TD
0["CreateLargeData"]
1["ConsumerA"]
2["ConsumerB"]
3["ConsumerC"]
0 -->|data → data| 1
0 -->|data → data| 2
0 -->|data → data| 3
Performance (Sequential):
⏱️ Runtime: 597.179ms
💾 Memory: Current: 39054.78 KB, Peak: 39062.48 KB
Performance (Parallel):
⏱️ Runtime: 542.189ms
💾 Memory: Current: 39054.81 KB, Peak: 39062.76 KB
Output:
📊 Consumer outputs (each processes different segments):
ConsumerA (first 1000): sum = 499500
ConsumerB (next 1000): sum = 1499500
ConsumerC (next 1000): sum = 2499500
Sequential execution:
Time: 597.179ms
Parallel execution:
Time: 542.189ms
✅ Reference-based data sharing successful!
Memory benefit: Data shared by reference, not copied
🔧 Python API
Building a Graph
import dagex
# Create graph
graph = dagex.Graph()
# Add a node
graph.add(
function, # Python callable
label="NodeLabel", # Optional label
inputs=[("broadcast", "impl")], # Input mapping
outputs=[("impl", "broadcast")] # Output mapping
)
# Create branches
branch_graph = dagex.Graph()
# ... add nodes to branch_graph ...
branch_id = graph.branch(branch_graph)
# Merge branches
graph.merge(
merge_function,
label="Merge",
branch_inputs=[
(branch_id_a, "out_a", "in_a"),
(branch_id_b, "out_b", "in_b")
],
outputs=[("result", "final")]
)
# Add variants
graph.variants(
[func1, func2, func3],
label="Variants",
inputs=[("input", "x")],
outputs=[("output", "results")]
)
# Build and execute
dag = graph.build()
context = dag.execute(parallel=False)
context = dag.execute(parallel=True, max_threads=4)
Data Types
Python values are automatically converted to GraphData:
# Return Python dictionaries from node functions
def my_node(inputs):
value = inputs.get("x", 0) # Access inputs
return {
"int_val": 42,
"float_val": 3.14,
"str_val": "hello",
"list_val": [1, 2, 3],
"nested": {"a": 1, "b": 2}
}
Execution
# Simple execution
context = dag.execute(parallel=False) # Sequential
context = dag.execute(parallel=True, max_threads=4) # Parallel
# Access results
result = context.get("output_name")
# Detailed execution
result = dag.execute_detailed(parallel=True, max_threads=4)
final_context = result.context
node_outputs = result.node_outputs
branch_outputs = result.branch_outputs
📄 License
MIT License
🔗 Links
- Python Package: https://pypi.org/project/dagex
- Documentation: https://docs.rs/dagex
- Repository: https://github.com/briday1/graph-sp
- Rust Crate: https://crates.io/crates/dagex
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dagex-2026.21.tar.gz.
File metadata
- Download URL: dagex-2026.21.tar.gz
- Upload date:
- Size: 94.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35c7bbe68fb6a85bd48eceee27cccb86c4e59d20c18d998ea788f86b9be6a1b0
|
|
| MD5 |
b583a1e9535fe656304c813dfa2f90b7
|
|
| BLAKE2b-256 |
b0a6620bcf469d88d6b8f436a492f66fde6f1b137d4dfe97ec0728f581ac7ad2
|
File details
Details for the file dagex-2026.21-cp312-none-win_amd64.whl.
File metadata
- Download URL: dagex-2026.21-cp312-none-win_amd64.whl
- Upload date:
- Size: 317.0 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04baffdc60cd599383aea35790d7d10930c57b6cdf858543f0113037e02fe934
|
|
| MD5 |
e618b87dba947a7a8e9ba3bd7a2970a7
|
|
| BLAKE2b-256 |
bac088dc3aac39bdf7c5cb513314e0b5fcf475d58bb48a28b288a4c0a9bfdf5f
|
File details
Details for the file dagex-2026.21-cp312-cp312-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: dagex-2026.21-cp312-cp312-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 483.4 kB
- Tags: CPython 3.12, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac1cc91c62f741f091cfaa6a899e2ad9d39fe3bea665003884ce34ce5f117d0b
|
|
| MD5 |
b2e9023278a7a0d04644fb84291ab3d4
|
|
| BLAKE2b-256 |
3bd5748e22e85d14bc5bf9db9a974a19eb6ba826b100708a19215e6611e336d4
|
File details
Details for the file dagex-2026.21-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: dagex-2026.21-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 366.7 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab80f87d59920ce54b359dd30d01199d5dafa8eac6bd362af82df0c95f1ec1f7
|
|
| MD5 |
e600c2fdbf9bf5d06600f3a421a85968
|
|
| BLAKE2b-256 |
c4e7044f79de6fa37f17ee442f518a8e2ee0a2f09f58ef48e56c081a1da0f407
|
File details
Details for the file dagex-2026.21-cp311-none-win_amd64.whl.
File metadata
- Download URL: dagex-2026.21-cp311-none-win_amd64.whl
- Upload date:
- Size: 317.1 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d651a1c86bb9021fd02b2f4dcfb26bbef6793f188403f931d893e8cd70db6c58
|
|
| MD5 |
908344093b1ed689ae43d84103fba85e
|
|
| BLAKE2b-256 |
1f9099909f9e2f51288db6ee98a8a1c1fedaf468f8be4265205deb57b990a701
|
File details
Details for the file dagex-2026.21-cp311-cp311-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: dagex-2026.21-cp311-cp311-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 483.3 kB
- Tags: CPython 3.11, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e8a37333a148993f603f20c989098fd3fd10bcb4185a745dd802c8d70f568c7
|
|
| MD5 |
0316ae75dd2194600e1d0c73bf19280b
|
|
| BLAKE2b-256 |
0ed310da8ed1fc94847a3f9f7008415dc9dab5b697dbc77e2a8721357f6c73c6
|
File details
Details for the file dagex-2026.21-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: dagex-2026.21-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 366.5 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6b560fe03559ee75f07a654ab1e39f4c45576ed44ce57ebbe46928c5b37039d
|
|
| MD5 |
1c4c99034373dd97d20429105e1f701f
|
|
| BLAKE2b-256 |
cd6dfdb7b6776eaf4dfa1149722ac0e6b698aba224dcc69de26e622fb161ce9d
|
File details
Details for the file dagex-2026.21-cp310-none-win_amd64.whl.
File metadata
- Download URL: dagex-2026.21-cp310-none-win_amd64.whl
- Upload date:
- Size: 317.1 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
769ed2a05218baff28f076286f76e116747551f02a956068f057d2c199aae3eb
|
|
| MD5 |
7f4aeed795a05be07b50e3b7ca9f8357
|
|
| BLAKE2b-256 |
bd40081e1a66c87229ac9b746119315e551a55a20c8e5046bac6c0fc98bba697
|
File details
Details for the file dagex-2026.21-cp310-cp310-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: dagex-2026.21-cp310-cp310-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 483.3 kB
- Tags: CPython 3.10, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b03cfebb45528693a58a500d956430939287980dd72065744973fbf73a366db5
|
|
| MD5 |
fc292235aec14a5eb44d130dafb118bc
|
|
| BLAKE2b-256 |
e68e4f1556e337735857cae1a05a41184b05b5db57d5ffe58baada85a7123f0a
|
File details
Details for the file dagex-2026.21-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: dagex-2026.21-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 366.5 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23299dd85c311301041fc05f7f7a7b70e796d6cff7334481d7ad2ebd09e65d3c
|
|
| MD5 |
57dddb2b3d868b9c4b9fe66cb627392e
|
|
| BLAKE2b-256 |
ed408f112d7ee6b9d1a8aa03f5f272e1c0cef99fa0cec90888cd7147f0f8f46c
|
File details
Details for the file dagex-2026.21-cp39-none-win_amd64.whl.
File metadata
- Download URL: dagex-2026.21-cp39-none-win_amd64.whl
- Upload date:
- Size: 317.3 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7518a63b3575cdfaf0afb283dac802bcd681b48f69198982d2dd8f65fa1b7f88
|
|
| MD5 |
89bbec537268ba7d25d83046427c100c
|
|
| BLAKE2b-256 |
faff0e48ef24f2fcf042bdd58765b1aebcb5a57c1afd1560e1cea3c85ceca7ea
|
File details
Details for the file dagex-2026.21-cp39-cp39-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: dagex-2026.21-cp39-cp39-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 483.7 kB
- Tags: CPython 3.9, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51770ee3f357d4c84e7609a06d130a55fa302147a269c4bf11364b94ce578133
|
|
| MD5 |
12df376e032041a4d944f42cec65e246
|
|
| BLAKE2b-256 |
3d4a084f4d29f16a544ea4865eed0fb5d9f13dbcbfe50a2e1f5b18c505d3db25
|
File details
Details for the file dagex-2026.21-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: dagex-2026.21-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 366.8 kB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0083123b6da7406e3da29a797bfc70414847f6056a909da618561da892d701e2
|
|
| MD5 |
901448f1f2ac0c1f4412f35a5a030ea9
|
|
| BLAKE2b-256 |
1c932f59ce817c237441ec99c9b324f22167cde16e8f70853e311ccb27ce0e76
|
File details
Details for the file dagex-2026.21-cp38-none-win_amd64.whl.
File metadata
- Download URL: dagex-2026.21-cp38-none-win_amd64.whl
- Upload date:
- Size: 317.5 kB
- Tags: CPython 3.8, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4608902a4342c5952e25c3c777f785371c11b43cd3feb5bdf26d21a3dd28d4bb
|
|
| MD5 |
57a8b1e111403d49496fad32dcbf6248
|
|
| BLAKE2b-256 |
8c01821daeb49b8d1fe477012e1b1ded682cb6edcf2c2fe11ea625af84a9bad5
|
File details
Details for the file dagex-2026.21-cp38-cp38-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: dagex-2026.21-cp38-cp38-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 484.2 kB
- Tags: CPython 3.8, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d02bf23b3e23740d61fed6beb44736f562e8a36ced4cbfb9db857a1f2f47b5b
|
|
| MD5 |
4124e489a72e702d160f99d075be6a6c
|
|
| BLAKE2b-256 |
58e6f47063ad614739c974c8acf8cbf9f7f5581e9c27857a4a8770e54da6de4c
|
File details
Details for the file dagex-2026.21-cp38-cp38-macosx_11_0_arm64.whl.
File metadata
- Download URL: dagex-2026.21-cp38-cp38-macosx_11_0_arm64.whl
- Upload date:
- Size: 367.0 kB
- Tags: CPython 3.8, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e89f981fbee20e3892e25db6f8bed6abaee9e33e5fbf90466a4f2c5b94a58ac
|
|
| MD5 |
0c5c3775d39b537c882579bf4774b1c5
|
|
| BLAKE2b-256 |
b4a8b385c89841c271918bf0a5888723b0b60c2f14e2267e46fb16ee3706efd1
|