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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

dagex-2026.21-cp312-cp312-macosx_11_0_arm64.whl (366.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

dagex-2026.21-cp311-cp311-macosx_11_0_arm64.whl (366.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

dagex-2026.21-cp310-cp310-macosx_11_0_arm64.whl (366.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

dagex-2026.21-cp39-cp39-manylinux_2_34_x86_64.whl (483.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

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

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8manylinux: glibc 2.34+ x86-64

dagex-2026.21-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.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

Hashes for dagex-2026.21.tar.gz
Algorithm Hash digest
SHA256 35c7bbe68fb6a85bd48eceee27cccb86c4e59d20c18d998ea788f86b9be6a1b0
MD5 b583a1e9535fe656304c813dfa2f90b7
BLAKE2b-256 b0a6620bcf469d88d6b8f436a492f66fde6f1b137d4dfe97ec0728f581ac7ad2

See more details on using hashes here.

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

Hashes for dagex-2026.21-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 04baffdc60cd599383aea35790d7d10930c57b6cdf858543f0113037e02fe934
MD5 e618b87dba947a7a8e9ba3bd7a2970a7
BLAKE2b-256 bac088dc3aac39bdf7c5cb513314e0b5fcf475d58bb48a28b288a4c0a9bfdf5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ac1cc91c62f741f091cfaa6a899e2ad9d39fe3bea665003884ce34ce5f117d0b
MD5 b2e9023278a7a0d04644fb84291ab3d4
BLAKE2b-256 3bd5748e22e85d14bc5bf9db9a974a19eb6ba826b100708a19215e6611e336d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ab80f87d59920ce54b359dd30d01199d5dafa8eac6bd362af82df0c95f1ec1f7
MD5 e600c2fdbf9bf5d06600f3a421a85968
BLAKE2b-256 c4e7044f79de6fa37f17ee442f518a8e2ee0a2f09f58ef48e56c081a1da0f407

See more details on using hashes here.

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

Hashes for dagex-2026.21-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 d651a1c86bb9021fd02b2f4dcfb26bbef6793f188403f931d893e8cd70db6c58
MD5 908344093b1ed689ae43d84103fba85e
BLAKE2b-256 1f9099909f9e2f51288db6ee98a8a1c1fedaf468f8be4265205deb57b990a701

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8e8a37333a148993f603f20c989098fd3fd10bcb4185a745dd802c8d70f568c7
MD5 0316ae75dd2194600e1d0c73bf19280b
BLAKE2b-256 0ed310da8ed1fc94847a3f9f7008415dc9dab5b697dbc77e2a8721357f6c73c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e6b560fe03559ee75f07a654ab1e39f4c45576ed44ce57ebbe46928c5b37039d
MD5 1c4c99034373dd97d20429105e1f701f
BLAKE2b-256 cd6dfdb7b6776eaf4dfa1149722ac0e6b698aba224dcc69de26e622fb161ce9d

See more details on using hashes here.

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

Hashes for dagex-2026.21-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 769ed2a05218baff28f076286f76e116747551f02a956068f057d2c199aae3eb
MD5 7f4aeed795a05be07b50e3b7ca9f8357
BLAKE2b-256 bd40081e1a66c87229ac9b746119315e551a55a20c8e5046bac6c0fc98bba697

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b03cfebb45528693a58a500d956430939287980dd72065744973fbf73a366db5
MD5 fc292235aec14a5eb44d130dafb118bc
BLAKE2b-256 e68e4f1556e337735857cae1a05a41184b05b5db57d5ffe58baada85a7123f0a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 23299dd85c311301041fc05f7f7a7b70e796d6cff7334481d7ad2ebd09e65d3c
MD5 57dddb2b3d868b9c4b9fe66cb627392e
BLAKE2b-256 ed408f112d7ee6b9d1a8aa03f5f272e1c0cef99fa0cec90888cd7147f0f8f46c

See more details on using hashes here.

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

Hashes for dagex-2026.21-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 7518a63b3575cdfaf0afb283dac802bcd681b48f69198982d2dd8f65fa1b7f88
MD5 89bbec537268ba7d25d83046427c100c
BLAKE2b-256 faff0e48ef24f2fcf042bdd58765b1aebcb5a57c1afd1560e1cea3c85ceca7ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 51770ee3f357d4c84e7609a06d130a55fa302147a269c4bf11364b94ce578133
MD5 12df376e032041a4d944f42cec65e246
BLAKE2b-256 3d4a084f4d29f16a544ea4865eed0fb5d9f13dbcbfe50a2e1f5b18c505d3db25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0083123b6da7406e3da29a797bfc70414847f6056a909da618561da892d701e2
MD5 901448f1f2ac0c1f4412f35a5a030ea9
BLAKE2b-256 1c932f59ce817c237441ec99c9b324f22167cde16e8f70853e311ccb27ce0e76

See more details on using hashes here.

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

Hashes for dagex-2026.21-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 4608902a4342c5952e25c3c777f785371c11b43cd3feb5bdf26d21a3dd28d4bb
MD5 57a8b1e111403d49496fad32dcbf6248
BLAKE2b-256 8c01821daeb49b8d1fe477012e1b1ded682cb6edcf2c2fe11ea625af84a9bad5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5d02bf23b3e23740d61fed6beb44736f562e8a36ced4cbfb9db857a1f2f47b5b
MD5 4124e489a72e702d160f99d075be6a6c
BLAKE2b-256 58e6f47063ad614739c974c8acf8cbf9f7f5581e9c27857a4a8770e54da6de4c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.21-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6e89f981fbee20e3892e25db6f8bed6abaee9e33e5fbf90466a4f2c5b94a58ac
MD5 0c5c3775d39b537c882579bf4774b1c5
BLAKE2b-256 b4a8b385c89841c271918bf0a5888723b0b60c2f14e2267e46fb16ee3706efd1

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