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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

dagex-2026.16-cp38-none-win_amd64.whl (194.0 kB view details)

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8manylinux: glibc 2.34+ x86-64

dagex-2026.16-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.16.tar.gz.

File metadata

  • Download URL: dagex-2026.16.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.16.tar.gz
Algorithm Hash digest
SHA256 eee82e839882074aa9d876fd1a1462beb812c690117b4764c4a7faa4bbe9ea6f
MD5 131ecb18ce38bec6586aa5507054a276
BLAKE2b-256 cb2b7e9f8caf8d277cf3838c66c61104465dde9812039ae869028c605c725398

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.16-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.16-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 85628eb6de55f1daa6ce95857a6024abcffbff92e32cddebd0215aa1a3f8775f
MD5 14de869b4353e1e86c0af64fe9a8348e
BLAKE2b-256 db04cab3c0e9c91a86419ec0bf2dcf86ffcfbe5a7a019ec2614922c9da94ed06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 458d322b4f62abef9dc53d5a55774c858bf44d434b8d0e1618558c09ed375fba
MD5 f67910ca95d9e20daa2007a0c454479d
BLAKE2b-256 4bdc27b87e531b2910ce87f2972eaddbae03220e1b14b197dc0590fe6a50bd3a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9af472c3e5727f1e15cab83eed131269954339b75db960af61974ddebc1a3f1b
MD5 5ca2a13bc776b6acf0996205e8fa3163
BLAKE2b-256 4cb1c2c65e79a4d9f2abc7f23d3a3da4ccfd911237292261411d11fe3db205de

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.16-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.16-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 3427af6a528d555a72537ec07fda3e016b0125654a4de6bbd37d36744ab2d311
MD5 309c3c620dda00699a9c12563290f2e9
BLAKE2b-256 7930b44b93e14f22a64657a131f9aebe11e7583d84a54f32336b7af690259d1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 0d0092c1e32a1b1d11446950133965ec62a67a86555ad0bde62d385a21a4eb0f
MD5 b3d5418a5c5e3e801f17882c15751718
BLAKE2b-256 f16ca023e479832c28abc6115dba867d15111e428b141baac9496953974cd7cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 14d38b81b1f2544edf0cb5bb8010cfdc46255c36e62854fca56e2bb971264179
MD5 e8d1d4cbfdb711ab489f800bf14f5102
BLAKE2b-256 bb75dfe0ae06088600f95fbf42ff6e6481e1d153e293f59931d03d31e4ccdaaf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.16-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.16-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 208fb9b45bc37a55342708b965856a88bb00b8aa9b7ccc8ddae2d3c46581016e
MD5 5072cd76e3939f1e708a85b22ba12676
BLAKE2b-256 7a056c1eec5239737cf3fc84f6b524906626bcf480658db55a90dd1725f5f522

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 af83d69a6020f6d46b350ffde1caa71f71202e23cba9bd22c53dbb07e41a5500
MD5 2fe255fe94381bcedf1a588e9b9e9972
BLAKE2b-256 f5113fb56b829334cc55d3fdfac90558715852984448a2f3c99a8e314fb8883d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e5e4117198f187f4af3c39290947c01d92c7312f6ecb6539f363f73adec41a30
MD5 a7f32b0bbf8dd1d8cc1507bdc8cae7e9
BLAKE2b-256 176799bab6b1d960aa718d06786834bfb43f1c72d2733ab92070910241ccd22a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.16-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.16-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 0dd95fc1a75778a233ae14b6f150d20627c06b4c84421429c90d808e8b40027c
MD5 eeb5435fa0b523a32c4b6c5ef8ad1b7b
BLAKE2b-256 dca34e26a115b8763391549c07a3f79fedf3738990af3620229e952e5f42938d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 e2012b5ebccbb9a85758572bba812e5b88e3ed134f61fc264b5b1beecf92bc4c
MD5 5c982219b9e2f96029b1854af72f34c0
BLAKE2b-256 1f4f35bb44e3eb1d610364a2e7b4ea1801a48024525f3b516a7079e50981b411

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 07ed57c4495ef3423814ae63aaa037bf8a7c0d818850cedfe4b88885bcd4d4a1
MD5 5db0625b89826e93cf1209e9d622a58f
BLAKE2b-256 d16499c532d50e4dd7987b17621148fc5e4579edb328e0d415f7c1e97a7841bb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dagex-2026.16-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 194.0 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.16-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 6fa511e630bdd360dfef43e4daed91a58bca960a519b9fcc1a137aae89012529
MD5 badc68c67898e2953468429ac6966b05
BLAKE2b-256 fb5c49450df4efa974d38f647f95e518828687322e79ed314827bda81945e4f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 de19aa7bddea434adc8aae6782666a4e7568e66f6e17b9b8960d49e350e7896a
MD5 151f8d8bce2ac6260613f4888913e9fa
BLAKE2b-256 5a820732a2a12e57a1bafcafceefde9b0daf665cac5392b53d836a6f3c75824c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dagex-2026.16-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6edc074e65636da6fb2ead4e4d82f43e2dc782b73f4809d8aba0ee5d0f14cc0e
MD5 1cefb9ae87c3a60995cb83eb94e8398d
BLAKE2b-256 a0eb56539c7d35f2471f540e3f3fcd8ecccfbd206cb2cb9820cf844a8b7c5648

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