Skip to main content

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dagex-2026.20.tar.gz (94.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dagex-2026.20-cp312-none-win_amd64.whl (316.9 kB view details)

Uploaded CPython 3.12Windows x86-64

dagex-2026.20-cp312-cp312-manylinux_2_34_x86_64.whl (483.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

dagex-2026.20-cp312-cp312-macosx_11_0_arm64.whl (366.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

dagex-2026.20-cp311-none-win_amd64.whl (317.1 kB view details)

Uploaded CPython 3.11Windows x86-64

dagex-2026.20-cp311-cp311-manylinux_2_34_x86_64.whl (483.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

dagex-2026.20-cp311-cp311-macosx_11_0_arm64.whl (366.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

dagex-2026.20-cp310-none-win_amd64.whl (317.1 kB view details)

Uploaded CPython 3.10Windows x86-64

dagex-2026.20-cp310-cp310-manylinux_2_34_x86_64.whl (483.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

dagex-2026.20-cp310-cp310-macosx_11_0_arm64.whl (366.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

dagex-2026.20-cp39-none-win_amd64.whl (317.3 kB view details)

Uploaded CPython 3.9Windows x86-64

dagex-2026.20-cp39-cp39-manylinux_2_34_x86_64.whl (483.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

dagex-2026.20-cp39-cp39-macosx_11_0_arm64.whl (366.7 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

dagex-2026.20-cp38-none-win_amd64.whl (317.5 kB view details)

Uploaded CPython 3.8Windows x86-64

dagex-2026.20-cp38-cp38-manylinux_2_34_x86_64.whl (484.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.34+ x86-64

dagex-2026.20-cp38-cp38-macosx_11_0_arm64.whl (366.9 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

File details

Details for the file dagex-2026.20.tar.gz.

File metadata

  • Download URL: dagex-2026.20.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

Hashes for dagex-2026.20.tar.gz
Algorithm Hash digest
SHA256 2d545aca2bf10fbd5c4029a0a1b7fe67f2a7d4c57910dec7d1a6d818eff4b9f7
MD5 7ecc0d6d3dc3f89c3295bd11b6b994af
BLAKE2b-256 8fa27c6263226ba3a5885171981300ffd0fd17812f6475bd35f8e9a54bc5c6f0

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp312-none-win_amd64.whl.

File metadata

  • Download URL: dagex-2026.20-cp312-none-win_amd64.whl
  • Upload date:
  • Size: 316.9 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

Hashes for dagex-2026.20-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 456491d895ca4c09eb67771e433ddaad42957b6e1a628eacbe856aecd6d6c3ab
MD5 20a0cf99aedb3f519733c05867b070ca
BLAKE2b-256 2f7d8e5dfe31b2a72c4c8f22cf6aa4487e580fa76ea1d6b2c4565a48fa3c5771

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 271a7a425c7b0ffbfd8243f7debc531b1f5b0d5334fcb674541d7e667abb6b13
MD5 ade96b1ca632593830b4e1bb43b7bc4b
BLAKE2b-256 768a0ed5e776c45f97d43984c626693346c34a82dc1050d6920d2969c2b020cb

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 07613bc9228107d76dfcae786d152ee41d385d5a6f4757b6ff08b289407263c6
MD5 90225374bbe027a029b3204d74641e37
BLAKE2b-256 bc273202ae2caef272179fdb31e1258def2dae87840826a4a0aea877094f848b

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp311-none-win_amd64.whl.

File metadata

  • Download URL: dagex-2026.20-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

Hashes for dagex-2026.20-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 3c8860eb5107d2094117124314ea0059f9fb8310e128cd412ed2447f3869aae2
MD5 56d762e2ea434f4cf704b6ff018a5bba
BLAKE2b-256 b1f45c7d0252aa4c0e8832a8c944bb292c3f4b2823b06966a9057bfca3ab842f

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 6af29da7b7dadee4d1926467915298024d70ef998b981163353853b8f9600d0c
MD5 e14ea4156e5af15bca230c7d12619916
BLAKE2b-256 61b7f0e8bf95901afc55fe4f58b1db541f7c789ba16efb3f0dccceed30d7836c

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e2f7f0194ffc8bec456222e5b962aaae737bde1082c8278297fd4dc942211896
MD5 d95e7b944c8f2a057642e14143c75017
BLAKE2b-256 c9a9f9513e6287703d2f492118175dd843dc3f06eb5cd93c6e569add1df8e075

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp310-none-win_amd64.whl.

File metadata

  • Download URL: dagex-2026.20-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

Hashes for dagex-2026.20-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 dc6e4d1691bd23e0eda59d1986c7f03cb1ee7dc538d4c5daa4191322ee348683
MD5 c10f6492c5b7ec6bc8ab9c8468868731
BLAKE2b-256 9c06856ab8429cec6984e77bee3e19128510e6aebb659d8ee4257ca43f8aeb53

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 6c8c6145634d91afe51048d5a2b4fad26af8019d5b571c54ea8faff6cec9f492
MD5 7ddaf9bf859c95e5b59ad31d3f2aaa93
BLAKE2b-256 6ab18c1079b8ca175b0950c7dfb0cf08cad7d2e37edd0318952b5f1d91660bd2

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0835fec0c692a749b1b21a56b31a719f0093d5652ebd6dd50ebbf06ea09e6339
MD5 23a672fc02c6e3ddee2fac532852a224
BLAKE2b-256 6d84059206c7404198412927c235b248d9bea4f504e41f9f445a3a33b4dcda52

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp39-none-win_amd64.whl.

File metadata

  • Download URL: dagex-2026.20-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

Hashes for dagex-2026.20-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 ccbdf1a0ffd2dfb24c9cbfc4ff91386a604746485c8a2ef1bf93d519ef562a08
MD5 b65247a7922b8ce5405b6f297de8edec
BLAKE2b-256 4cc1ce1bfbc1b9e1d39526299abee9823b732e5b098d7f12adaabaf18fa0c26f

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp39-cp39-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 0367505539caad7e2cd74ad0e44510bd30380c12d85c26d6a6aaf94765d15be5
MD5 403327f012dd78cc28646c56e6ac1d81
BLAKE2b-256 2542a65367cb0a50ca895cb175c7825a3e6ee43950ac41b9021b33e307682106

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4819bf9edf67b7e967d4201b58cf9a25ec81edbc82e5bf6e419e580b2190f37
MD5 cbda534b54affc73dc0bc738be0fc8cd
BLAKE2b-256 73f9336e7950bb19e0c96ac8f2fb25c51a1c8e73cc17f23ef920f716289c3235

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp38-none-win_amd64.whl.

File metadata

  • Download URL: dagex-2026.20-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

Hashes for dagex-2026.20-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 3c3b723e1652a85952b81b516ca4a45418ce46963a670e2eb6ee23eed64038e2
MD5 b0b2e9c5a1fd23ee489297b6d5269227
BLAKE2b-256 e95b985f8a3b409e17f9f43a75450ea706939e1e662165066db63ad5a118ad4c

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp38-cp38-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c75c1340ffc6e92809ea7c3af548e8491c2ce37479dce0c1a1a67f41e8a2b028
MD5 f9a42aaf70517f33b2ab84284081129d
BLAKE2b-256 a1dcf4990954902239cda2dd3d5d817b7809869f847cee0c58aef8698abbbf3d

See more details on using hashes here.

File details

Details for the file dagex-2026.20-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dagex-2026.20-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bfd1fc1c4f47e791d4c0ffe5feb0c94d99ac90c69a43d39935023d6fa49e4a44
MD5 838ddbb896123ae2e9d2f9d095c554fd
BLAKE2b-256 033ee4cd65d9dbb1fc11e0346827cbc9a361b96890e7e81fd30830693ca4b44e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page