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.19.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.19-cp312-none-win_amd64.whl (316.9 kB view details)

Uploaded CPython 3.12Windows x86-64

dagex-2026.19-cp312-cp312-manylinux_2_34_x86_64.whl (483.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

dagex-2026.19-cp312-cp312-macosx_11_0_arm64.whl (366.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

dagex-2026.19-cp311-cp311-manylinux_2_34_x86_64.whl (483.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

dagex-2026.19-cp311-cp311-macosx_11_0_arm64.whl (366.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

dagex-2026.19-cp310-cp310-manylinux_2_34_x86_64.whl (483.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

dagex-2026.19-cp310-cp310-macosx_11_0_arm64.whl (366.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

dagex-2026.19-cp39-cp39-macosx_11_0_arm64.whl (366.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

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

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8manylinux: glibc 2.34+ x86-64

dagex-2026.19-cp38-cp38-macosx_11_0_arm64.whl (367.0 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: dagex-2026.19.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.19.tar.gz
Algorithm Hash digest
SHA256 0151c3929e9ed57ef1a4376daa18fee965a8830f1bdd9b85d5cca6bb465c7f2e
MD5 43e087ae686fd5c1f961c8651e612926
BLAKE2b-256 4b49dcf8f6d7f25c0a271b1b7ab213f567143589e78d60218c0ee5a755740a6c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.19-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.19-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 6bf0c6ec52416436ac12cb7678339384ec6513f543853b2eb2d1b69b917313fa
MD5 6bffc767eb1798c5d7e8492724610e1b
BLAKE2b-256 e76986624181de10e58a57c8b1338842b823592cbd02e71572e2c93fbd1df6ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 0d14bd8129044fdfef051743165135769949f19580a91f7e60b07a9f278d39d7
MD5 46934e4dc2e80fd31b742b6cc3d97695
BLAKE2b-256 56404d50b5075535242e65288701621bce9f5232a50de5808a4086300bc7bd0d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 446bdcf21a4792b5b7854da6d81cf2c0547ff7c1f6094dce3a349fd887cc6f42
MD5 efa11bc8fe0e3ac4f6090c4933541fa7
BLAKE2b-256 4363a932460336ce37ec5e1a2d38b1dd0ebecb26d36d6cb7251cb94099ff3b81

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.19-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.19-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 d246fa6380a4761fc98f033d1e39a24c1dd09b5629769dc2e4bda2d4c823321d
MD5 d04236010366012c81546c1bd42f9284
BLAKE2b-256 3a3a940ac9819902ec745c0f2fec13ea8b0ef0d4087097c8014e8144b0fb0719

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 65bade93ae9ef68ef6b0273901680768504b92d264454a8cdcda1fe874e8f92e
MD5 084c353f4df82ed4e4c9f8dec83a2736
BLAKE2b-256 d0dc8020ace128e3bb8dafbfd92635ace44c258478d671ae5c00870799a09879

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 837c2c7bd27c80bf34151f1d02e8ece7b7bcf308156c4585f3e2a623d80d19f6
MD5 0af2d18b48a219669df1a2c740aa7baf
BLAKE2b-256 82f4db181fffbd8be0fdaf3c35e37487c72bf3d7193107013b34c849335675fb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.19-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.19-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 b563b2c496260916a9442d2460e34cad9a8e7551f722baa916b747586b0c97b9
MD5 e63a6995bdc5f12f1069127e934e9c4b
BLAKE2b-256 72033dfde9b81c4645706d2eb29cf7680b72baa27a2bdd8481b8611988062d13

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 20197f28a37bf16b48950879e5f8fd3cfcc26becfe803d635b5a0acc8de6901e
MD5 64a9164d7e60e5d3b9c616f6bf138dcf
BLAKE2b-256 6a8d07405862880942b483b8f3c63be6eda52fbead05b8f2b9106acc142bd016

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a803c1b6b6931b2624344d494dede3f7d013b0e14dbdab7155ce8cdecba7275
MD5 5572b5bf073361497a7dc92954d071da
BLAKE2b-256 b577c8e425eae7da85d38726b473c7f4548e65d9a370901bad2811dcd6c9c428

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.19-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.19-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 b86179ead4bd013778a3b5ef72927ebbe8d29c2f18e08420ce944abfeb1995e7
MD5 ad23a9b6844c448c44beebafaaf2cf84
BLAKE2b-256 559930c5b8a36ab49a38a74c570f73ca6536d56ecc3c6cd20caf7da9fd043b80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5e32ff35badf8c2605f4fdcb42ae61befde073f81b9a3c0e5db6db75d3c7ba70
MD5 8c8ef9be43eb3513c8f33205ea2a0525
BLAKE2b-256 b170575706b9670d99662f9d0565edbdc1e10f80f8bc159eb9aae2a37b802760

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3bbb25a2bb11b9a8e4f52df63a3d1d6ac26788b43d320f71a93e13fe8145ffba
MD5 13ce0981a2cb81c608426b05862a5927
BLAKE2b-256 136f4ecd49213513414d54f57a77b18f90214462ba7a8f1650cb8a4a50010ded

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.19-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.19-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 78325df382452efe82c2f7f9e311f265f85d9ee89b815eba41095f832dc2bb0b
MD5 a6cfc1f72cb967d4549744a7e4361f28
BLAKE2b-256 8877bcca6303b33d9855fcd3137cf96bb20a9f83bff8a1e4d7075044ef653e70

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 78421e48ba39d032d4c02d575f8cbd9bb3de0a53f19022e91d7f9c86a76b7771
MD5 63d9aaf4f7598fae542b0d0fecb54055
BLAKE2b-256 9a172707d81978c112ed4c5404a528a2e8b3518b5077f958ab7c82348037ccac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.19-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 94af7ded0d4ee65802ef808ff0d7aaf05b8dbdd74c7a96cee2cb22f5985b397d
MD5 64f35c7e49457db977e292208e1583fc
BLAKE2b-256 a1c1d45e17569df0a6b676cbecd1f02b1c0a0100591d3d4a4501d0f64b131762

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