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.17.tar.gz (71.8 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.17-cp312-none-win_amd64.whl (194.0 kB view details)

Uploaded CPython 3.12Windows x86-64

dagex-2026.17-cp312-cp312-manylinux_2_34_x86_64.whl (348.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

dagex-2026.17-cp312-cp312-macosx_11_0_arm64.whl (255.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

dagex-2026.17-cp311-none-win_amd64.whl (194.0 kB view details)

Uploaded CPython 3.11Windows x86-64

dagex-2026.17-cp311-cp311-manylinux_2_34_x86_64.whl (349.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

dagex-2026.17-cp311-cp311-macosx_11_0_arm64.whl (256.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

dagex-2026.17-cp310-none-win_amd64.whl (194.0 kB view details)

Uploaded CPython 3.10Windows x86-64

dagex-2026.17-cp310-cp310-manylinux_2_34_x86_64.whl (349.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

dagex-2026.17-cp310-cp310-macosx_11_0_arm64.whl (256.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

dagex-2026.17-cp39-none-win_amd64.whl (194.2 kB view details)

Uploaded CPython 3.9Windows x86-64

dagex-2026.17-cp39-cp39-manylinux_2_34_x86_64.whl (349.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

dagex-2026.17-cp39-cp39-macosx_11_0_arm64.whl (256.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

dagex-2026.17-cp38-none-win_amd64.whl (194.1 kB view details)

Uploaded CPython 3.8Windows x86-64

dagex-2026.17-cp38-cp38-manylinux_2_34_x86_64.whl (349.7 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.34+ x86-64

dagex-2026.17-cp38-cp38-macosx_11_0_arm64.whl (256.1 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: dagex-2026.17.tar.gz
  • Upload date:
  • Size: 71.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for dagex-2026.17.tar.gz
Algorithm Hash digest
SHA256 a345ed57eceb70c5a1641ba79d620fb1bc21d3ba2b6c9e5234aeb9e25617384f
MD5 55ef77d873f75d9cd7079a6524d05836
BLAKE2b-256 5271c26c1732aed41cd92749980805147666ebf4424fef1d30afaf51a1125a81

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.17-cp312-none-win_amd64.whl
  • Upload date:
  • Size: 194.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.17-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 963a6a5395046254793c191edf8db0a9f34208c233f50a5dd11bbaa90dfb9b06
MD5 df361d2e4a0d7593cc7afc5d16fffbe0
BLAKE2b-256 4df8ea569f991da5bda1e1fbefeae587b080c51dabb62fc4a7b5aa4b33b22b39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 21a97c338a031285836ec0270a3622cbb06afd06e22fc310733ecc1d2d2114e3
MD5 91815c5da6df2db36de427bdc43627e3
BLAKE2b-256 69dcc92053845e4de434a04e8f19474375fa8e1c17669c748a10986dfc443a9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 882f0c04921f919e81b2e45c77ea9911110ec815b739a34ebaa8df066b18502a
MD5 ffb48b33cf9ee7817dd11459e16b0396
BLAKE2b-256 38ab54b283abe46de3ec405352ad90947d7fc7ba7442c90cc4481ec16081d632

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.17-cp311-none-win_amd64.whl
  • Upload date:
  • Size: 194.0 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.17-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 8ff59d8a39440205497a7d8b6c62af28abfa8ccc32449eafe896783fe43a84fd
MD5 9329fdb659f1e72b89a2e0ebcbc91a81
BLAKE2b-256 9f03cbb80a992a9e8ec7fb4e6f55dd33c85b823e9a5413f447a115034baf3e03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 65577a252266d3ab9310f25816aafedb8c140fd853fac3dbf2069f21ba7ba2cf
MD5 8ddfb284fe51b47d0b5d8f212b0e8aab
BLAKE2b-256 3c6ed9e65c17c26237eef666e05aa590f5aaa5cdaf6fb1c3325be31e85f1cd05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a5bfb60b00acacd34df1f1ca1cf85d24bf73ba5fb53b3338fe6dac2fbfc5d264
MD5 ad2551122fe395eb9eeb7abf40d554c7
BLAKE2b-256 9fcf087bb77ef6a36294c068899492d7c64d070786d16b8f750114d2df420a97

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.17-cp310-none-win_amd64.whl
  • Upload date:
  • Size: 194.0 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.17-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 cfc7410e0d9411000cab6550296e2d37d5a33115974a6639aeda1192502fedb6
MD5 b9aa7ae8f3afd0e8f25be0ba6a4600b3
BLAKE2b-256 7f71ec4dc3befc5bd8c1e0d617f04dd0c9ca26124cd5c3fd6dfd03579b109f50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5c1c70787868f51db6643e070004783c6544aab828396e2eea4074ac364b82df
MD5 d66ee97bcad73dd985bad26076267c00
BLAKE2b-256 0efcdc505036c0a574d84e003d9f68e88ca7d433a173a3d348f863caec7f079d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd2df537177550effbe2ed52b3e6919b082c34f34926e0ad93080641195105e7
MD5 448132eb7181ddbc67eb5bafeeaf3c3b
BLAKE2b-256 8462ce4023c64778bb617585608a85d007aae6f85548c8aa588741fbb4b2cac6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.17-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 194.2 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.17-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 1ea2155c439b0d0ba4c249c49c47029599466a9c1846d7a9a42ea00ba4d9583d
MD5 931dfd11e0308ccbe26f25c26cc5afda
BLAKE2b-256 f3bd02fe3f0e2346f27b4588bf755f06d511de0833120b60664e45263b5cb5d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 262f4e5f64771eba5c3ad0c03fd75ef748b028461c7cae2e2a9a118793925767
MD5 fc1c46cb95934a6c83972ae3dcad3fc8
BLAKE2b-256 eb61d55021abaf9a2d9059f2dacbe1656d07ffdb016cefd0e1ea7a8c84b8dfe9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3dc6fdc7557b7b3c723c436feff87c8987b0363c4fe02463902045171aea4931
MD5 3a1d0916a918404f4824897183398f66
BLAKE2b-256 8b2ecbf840d99a2c6d62076bf2f5eeaf032c0488d0bcd4407273a5e5f0c6baa7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.17-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 194.1 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.17-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 a468ce8727be30506755186e1a3904eb8a6fa52f4291531da022b6e171083866
MD5 bb4bd44670e6dc29000ac55b133cc09b
BLAKE2b-256 ef6ec1a91720140e67e9a27d00206a0202764482ffd082eb7bbe70e8c14659b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b6a7248ade9d8937de4c5c38d53e8e1b8dcf54ff3333d4969d3f0f7cea6e203f
MD5 bae701c4f91827e05cc0f8cff007b4ae
BLAKE2b-256 81dc53f7cc4c89ca059222021beaf240cd0563e54bb52639dba53e74e770d492

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.17-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ae51951e64a8e101bdbca59a7ebe27e8788ccf9e74c2108ff48dd0bacecb29aa
MD5 f6adc7c0e62cde06f521e74713563dda
BLAKE2b-256 29d42874ac0997d566e9a4c249206e72a70bab2e6ac57839fee0d45e4549329f

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