dagex 2026.14__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,319 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "autocfg"
7
+ version = "1.5.0"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
10
+
11
+ [[package]]
12
+ name = "bitflags"
13
+ version = "2.10.0"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
16
+
17
+ [[package]]
18
+ name = "cfg-if"
19
+ version = "1.0.4"
20
+ source = "registry+https://github.com/rust-lang/crates.io-index"
21
+ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
22
+
23
+ [[package]]
24
+ name = "dagex"
25
+ version = "2026.14.0"
26
+ dependencies = [
27
+ "ndarray",
28
+ "num-complex",
29
+ "pyo3",
30
+ "rustfft",
31
+ ]
32
+
33
+ [[package]]
34
+ name = "indoc"
35
+ version = "1.0.9"
36
+ source = "registry+https://github.com/rust-lang/crates.io-index"
37
+ checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
38
+
39
+ [[package]]
40
+ name = "libc"
41
+ version = "0.2.180"
42
+ source = "registry+https://github.com/rust-lang/crates.io-index"
43
+ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
44
+
45
+ [[package]]
46
+ name = "lock_api"
47
+ version = "0.4.14"
48
+ source = "registry+https://github.com/rust-lang/crates.io-index"
49
+ checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
50
+ dependencies = [
51
+ "scopeguard",
52
+ ]
53
+
54
+ [[package]]
55
+ name = "matrixmultiply"
56
+ version = "0.3.10"
57
+ source = "registry+https://github.com/rust-lang/crates.io-index"
58
+ checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08"
59
+ dependencies = [
60
+ "autocfg",
61
+ "rawpointer",
62
+ ]
63
+
64
+ [[package]]
65
+ name = "memoffset"
66
+ version = "0.8.0"
67
+ source = "registry+https://github.com/rust-lang/crates.io-index"
68
+ checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
69
+ dependencies = [
70
+ "autocfg",
71
+ ]
72
+
73
+ [[package]]
74
+ name = "ndarray"
75
+ version = "0.15.6"
76
+ source = "registry+https://github.com/rust-lang/crates.io-index"
77
+ checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32"
78
+ dependencies = [
79
+ "matrixmultiply",
80
+ "num-complex",
81
+ "num-integer",
82
+ "num-traits",
83
+ "rawpointer",
84
+ ]
85
+
86
+ [[package]]
87
+ name = "num-complex"
88
+ version = "0.4.6"
89
+ source = "registry+https://github.com/rust-lang/crates.io-index"
90
+ checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
91
+ dependencies = [
92
+ "num-traits",
93
+ ]
94
+
95
+ [[package]]
96
+ name = "num-integer"
97
+ version = "0.1.46"
98
+ source = "registry+https://github.com/rust-lang/crates.io-index"
99
+ checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
100
+ dependencies = [
101
+ "num-traits",
102
+ ]
103
+
104
+ [[package]]
105
+ name = "num-traits"
106
+ version = "0.2.19"
107
+ source = "registry+https://github.com/rust-lang/crates.io-index"
108
+ checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
109
+ dependencies = [
110
+ "autocfg",
111
+ ]
112
+
113
+ [[package]]
114
+ name = "once_cell"
115
+ version = "1.21.3"
116
+ source = "registry+https://github.com/rust-lang/crates.io-index"
117
+ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
118
+
119
+ [[package]]
120
+ name = "parking_lot"
121
+ version = "0.12.5"
122
+ source = "registry+https://github.com/rust-lang/crates.io-index"
123
+ checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
124
+ dependencies = [
125
+ "lock_api",
126
+ "parking_lot_core",
127
+ ]
128
+
129
+ [[package]]
130
+ name = "parking_lot_core"
131
+ version = "0.9.12"
132
+ source = "registry+https://github.com/rust-lang/crates.io-index"
133
+ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
134
+ dependencies = [
135
+ "cfg-if",
136
+ "libc",
137
+ "redox_syscall",
138
+ "smallvec",
139
+ "windows-link",
140
+ ]
141
+
142
+ [[package]]
143
+ name = "primal-check"
144
+ version = "0.3.4"
145
+ source = "registry+https://github.com/rust-lang/crates.io-index"
146
+ checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08"
147
+ dependencies = [
148
+ "num-integer",
149
+ ]
150
+
151
+ [[package]]
152
+ name = "proc-macro2"
153
+ version = "1.0.105"
154
+ source = "registry+https://github.com/rust-lang/crates.io-index"
155
+ checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
156
+ dependencies = [
157
+ "unicode-ident",
158
+ ]
159
+
160
+ [[package]]
161
+ name = "pyo3"
162
+ version = "0.18.3"
163
+ source = "registry+https://github.com/rust-lang/crates.io-index"
164
+ checksum = "e3b1ac5b3731ba34fdaa9785f8d74d17448cd18f30cf19e0c7e7b1fdb5272109"
165
+ dependencies = [
166
+ "cfg-if",
167
+ "indoc",
168
+ "libc",
169
+ "memoffset",
170
+ "parking_lot",
171
+ "pyo3-build-config",
172
+ "pyo3-ffi",
173
+ "pyo3-macros",
174
+ "unindent",
175
+ ]
176
+
177
+ [[package]]
178
+ name = "pyo3-build-config"
179
+ version = "0.18.3"
180
+ source = "registry+https://github.com/rust-lang/crates.io-index"
181
+ checksum = "9cb946f5ac61bb61a5014924910d936ebd2b23b705f7a4a3c40b05c720b079a3"
182
+ dependencies = [
183
+ "once_cell",
184
+ "target-lexicon",
185
+ ]
186
+
187
+ [[package]]
188
+ name = "pyo3-ffi"
189
+ version = "0.18.3"
190
+ source = "registry+https://github.com/rust-lang/crates.io-index"
191
+ checksum = "fd4d7c5337821916ea2a1d21d1092e8443cf34879e53a0ac653fbb98f44ff65c"
192
+ dependencies = [
193
+ "libc",
194
+ "pyo3-build-config",
195
+ ]
196
+
197
+ [[package]]
198
+ name = "pyo3-macros"
199
+ version = "0.18.3"
200
+ source = "registry+https://github.com/rust-lang/crates.io-index"
201
+ checksum = "a9d39c55dab3fc5a4b25bbd1ac10a2da452c4aca13bb450f22818a002e29648d"
202
+ dependencies = [
203
+ "proc-macro2",
204
+ "pyo3-macros-backend",
205
+ "quote",
206
+ "syn",
207
+ ]
208
+
209
+ [[package]]
210
+ name = "pyo3-macros-backend"
211
+ version = "0.18.3"
212
+ source = "registry+https://github.com/rust-lang/crates.io-index"
213
+ checksum = "97daff08a4c48320587b5224cc98d609e3c27b6d437315bd40b605c98eeb5918"
214
+ dependencies = [
215
+ "proc-macro2",
216
+ "quote",
217
+ "syn",
218
+ ]
219
+
220
+ [[package]]
221
+ name = "quote"
222
+ version = "1.0.43"
223
+ source = "registry+https://github.com/rust-lang/crates.io-index"
224
+ checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
225
+ dependencies = [
226
+ "proc-macro2",
227
+ ]
228
+
229
+ [[package]]
230
+ name = "rawpointer"
231
+ version = "0.2.1"
232
+ source = "registry+https://github.com/rust-lang/crates.io-index"
233
+ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
234
+
235
+ [[package]]
236
+ name = "redox_syscall"
237
+ version = "0.5.18"
238
+ source = "registry+https://github.com/rust-lang/crates.io-index"
239
+ checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
240
+ dependencies = [
241
+ "bitflags",
242
+ ]
243
+
244
+ [[package]]
245
+ name = "rustfft"
246
+ version = "6.4.1"
247
+ source = "registry+https://github.com/rust-lang/crates.io-index"
248
+ checksum = "21db5f9893e91f41798c88680037dba611ca6674703c1a18601b01a72c8adb89"
249
+ dependencies = [
250
+ "num-complex",
251
+ "num-integer",
252
+ "num-traits",
253
+ "primal-check",
254
+ "strength_reduce",
255
+ "transpose",
256
+ ]
257
+
258
+ [[package]]
259
+ name = "scopeguard"
260
+ version = "1.2.0"
261
+ source = "registry+https://github.com/rust-lang/crates.io-index"
262
+ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
263
+
264
+ [[package]]
265
+ name = "smallvec"
266
+ version = "1.15.1"
267
+ source = "registry+https://github.com/rust-lang/crates.io-index"
268
+ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
269
+
270
+ [[package]]
271
+ name = "strength_reduce"
272
+ version = "0.2.4"
273
+ source = "registry+https://github.com/rust-lang/crates.io-index"
274
+ checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82"
275
+
276
+ [[package]]
277
+ name = "syn"
278
+ version = "1.0.109"
279
+ source = "registry+https://github.com/rust-lang/crates.io-index"
280
+ checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
281
+ dependencies = [
282
+ "proc-macro2",
283
+ "quote",
284
+ "unicode-ident",
285
+ ]
286
+
287
+ [[package]]
288
+ name = "target-lexicon"
289
+ version = "0.12.16"
290
+ source = "registry+https://github.com/rust-lang/crates.io-index"
291
+ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
292
+
293
+ [[package]]
294
+ name = "transpose"
295
+ version = "0.2.3"
296
+ source = "registry+https://github.com/rust-lang/crates.io-index"
297
+ checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e"
298
+ dependencies = [
299
+ "num-integer",
300
+ "strength_reduce",
301
+ ]
302
+
303
+ [[package]]
304
+ name = "unicode-ident"
305
+ version = "1.0.22"
306
+ source = "registry+https://github.com/rust-lang/crates.io-index"
307
+ checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
308
+
309
+ [[package]]
310
+ name = "unindent"
311
+ version = "0.1.11"
312
+ source = "registry+https://github.com/rust-lang/crates.io-index"
313
+ checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
314
+
315
+ [[package]]
316
+ name = "windows-link"
317
+ version = "0.2.1"
318
+ source = "registry+https://github.com/rust-lang/crates.io-index"
319
+ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
@@ -0,0 +1,102 @@
1
+ [package]
2
+ name = "dagex"
3
+ version = "2026.14.0"
4
+ edition = "2021"
5
+ authors = ["briday1 <your-email@example.com>"]
6
+ description = "A pure Rust DAG executor supporting implicit node connections, branching, and config sweeps"
7
+ license = "MIT"
8
+ repository = "https://github.com/briday1/dagex"
9
+ homepage = "https://github.com/briday1/dagex"
10
+ documentation = "https://docs.rs/dagex"
11
+ keywords = ["dag", "graph", "execution", "pipeline", "workflow"]
12
+ categories = ["data-structures", "algorithms"]
13
+ readme = "README.md"
14
+ exclude = [".venv*", "venv", ".github", "examples/py"]
15
+ include = ["src/**/*", "Cargo.toml", "README.md", "LICENSE", "assets/*.png"]
16
+
17
+ [dependencies]
18
+ pyo3 = { version = "=0.18.3", optional = true, default-features = false, features = ["extension-module", "macros"] }
19
+ ndarray = { version = "0.15", optional = true }
20
+ num-complex = { version = "0.4", optional = true }
21
+ rustfft = { version = "6.1", optional = true }
22
+
23
+ [features]
24
+ python = ["pyo3"]
25
+ radar_examples = ["ndarray", "num-complex", "rustfft"]
26
+
27
+ [lib]
28
+ name = "dagex"
29
+ crate-type = ["cdylib", "rlib"]
30
+
31
+ [[example]]
32
+ name = "comprehensive_demo"
33
+ path = "examples/rs/comprehensive_demo.rs"
34
+
35
+ [[example]]
36
+ name = "data_types_demo"
37
+ path = "examples/rs/data_types_demo.rs"
38
+
39
+ [[example]]
40
+ name = "output_access_demo"
41
+ path = "examples/rs/output_access_demo.rs"
42
+
43
+ [[example]]
44
+ name = "parallel_execution_demo"
45
+ path = "examples/rs/parallel_execution_demo.rs"
46
+
47
+ [[example]]
48
+ name = "per_node_output_access"
49
+ path = "examples/rs/per_node_output_access.rs"
50
+
51
+ [[example]]
52
+ name = "radar_demo"
53
+ path = "examples/rs/radar_demo.rs"
54
+
55
+ [[example]]
56
+ name = "radar_demo_with_plots"
57
+ path = "examples/rs/radar_demo_with_plots.rs"
58
+ required-features = ["radar_examples"]
59
+
60
+ [[example]]
61
+ name = "tuple_api_demo"
62
+ path = "examples/rs/tuple_api_demo.rs"
63
+
64
+ [[example]]
65
+ name = "variant_demo"
66
+ path = "examples/rs/variant_demo.rs"
67
+
68
+ [[example]]
69
+ name = "variant_behavior_test"
70
+ path = "examples/rs/variant_behavior_test.rs"
71
+
72
+ [[example]]
73
+ name = "simple_frontier_test"
74
+ path = "examples/rs/simple_frontier_test.rs"
75
+
76
+ [[example]]
77
+ name = "parallel_timing_demo"
78
+ path = "examples/rs/parallel_timing_demo.rs"
79
+
80
+ [[example]]
81
+ name = "dynamic_variants_demo"
82
+ path = "examples/rs/dynamic_variants_demo.rs"
83
+
84
+ [[example]]
85
+ name = "pointer_tracking_demo"
86
+ path = "examples/rs/pointer_tracking_demo.rs"
87
+
88
+ [[example]]
89
+ name = "memory_tracking_demo"
90
+ path = "examples/rs/memory_tracking_demo.rs"
91
+
92
+ [[example]]
93
+ name = "selective_data_demo"
94
+ path = "examples/rs/selective_data_demo.rs"
95
+
96
+ [[example]]
97
+ name = "arc_graphdata_demo"
98
+ path = "examples/rs/arc_graphdata_demo.rs"
99
+
100
+ [[example]]
101
+ name = "arc_benchmark_demo"
102
+ path = "examples/rs/arc_benchmark_demo.rs"
dagex-2026.14/PKG-INFO ADDED
@@ -0,0 +1,265 @@
1
+ Metadata-Version: 2.1
2
+ Name: dagex
3
+ Version: 2026.14
4
+ Summary: A pure Rust DAG executor supporting implicit node connections, branching, and config sweeps
5
+ Keywords: dag,graph,execution,pipeline,workflow
6
+ Home-Page: https://github.com/briday1/dagex
7
+ Author: briday1 <your-email@example.com>
8
+ Author-email: briday1 <your-email@example.com>
9
+ License: MIT
10
+ Requires-Python: >=3.8
11
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
12
+ Project-URL: Source Code, https://github.com/briday1/dagex
13
+
14
+ <div align="center">
15
+ <img src="https://raw.githubusercontent.com/briday1/graph-sp/main/assets/logo-banner.png" alt="dagex" width="600"/>
16
+ <p><em>A pure Rust DAG executor with Python bindings</em></p>
17
+ </div>
18
+
19
+ # dagex
20
+
21
+ A pure Rust DAG (Directed Acyclic Graph) executor with Python bindings for building and executing computational pipelines.
22
+
23
+ ## Features
24
+
25
+ - **Implicit Node Connections**: Nodes automatically connect based on execution order
26
+ - **Parallel Branching**: Create fan-out execution paths with `.branch()`
27
+ - **Configuration Variants**: Use `.variant()` to create parameter sweeps
28
+ - **Mermaid Visualization**: Generate diagrams with `.to_mermaid()`
29
+ - **Parallel Execution**: Execute independent branches concurrently
30
+ - **Native Performance**: Rust-powered execution with Python convenience
31
+ - **Memory Efficient**: Zero-copy data sharing between nodes using Arc (18x performance improvement for large datasets)
32
+
33
+ ## Installation
34
+
35
+ ```bash
36
+ pip install dagex
37
+ ```
38
+
39
+ No Rust toolchain required - prebuilt wheels are available for all major platforms.
40
+
41
+ ## Quick Start
42
+
43
+ ### Basic Pipeline
44
+
45
+ ```python
46
+ import dagex
47
+
48
+ def data_source(inputs, variant_params):
49
+ """Generate initial data"""
50
+ return {"value": 42}
51
+
52
+ def multiply(inputs, variant_params):
53
+ """Process the data"""
54
+ val = inputs.get("x", 0)
55
+ return {"doubled": val * 2}
56
+
57
+ # Create graph
58
+ graph = dagex.Graph()
59
+
60
+ # Add nodes
61
+ graph.add(
62
+ function=data_source,
63
+ label="DataSource",
64
+ inputs=None,
65
+ outputs=[("value", "data")]
66
+ )
67
+
68
+ graph.add(
69
+ function=multiply,
70
+ label="Multiply",
71
+ inputs=[("data", "x")],
72
+ outputs=[("doubled", "result")]
73
+ )
74
+
75
+ # Build and execute
76
+ dag = graph.build()
77
+ context = dag.execute()
78
+
79
+ print(f"Result: {context['result']}") # Output: Result: 84
80
+ ```
81
+
82
+ ### Parallel Branching
83
+
84
+ Create multiple parallel processing paths:
85
+
86
+ ```python
87
+ import dagex
88
+ import time
89
+
90
+ def source(inputs, variant_params):
91
+ return {"data": 100}
92
+
93
+ def branch_a(inputs, variant_params):
94
+ time.sleep(0.1) # Simulate work
95
+ return {"result_a": inputs["x"] * 2}
96
+
97
+ def branch_b(inputs, variant_params):
98
+ time.sleep(0.1) # Simulate work
99
+ return {"result_b": inputs["x"] * 3}
100
+
101
+ def branch_c(inputs, variant_params):
102
+ time.sleep(0.1) # Simulate work
103
+ return {"result_c": inputs["x"] + 50}
104
+
105
+ graph = dagex.Graph()
106
+
107
+ # Source node
108
+ graph.add(source, label="Source", outputs=[("data", "shared_data")])
109
+
110
+ # Create parallel branches
111
+ graph.branch()
112
+ graph.add(branch_a, label="BranchA", inputs=[("shared_data", "x")], outputs=[("result_a", "a")])
113
+
114
+ graph.branch()
115
+ graph.add(branch_b, label="BranchB", inputs=[("shared_data", "x")], outputs=[("result_b", "b")])
116
+
117
+ graph.branch()
118
+ graph.add(branch_c, label="BranchC", inputs=[("shared_data", "x")], outputs=[("result_c", "c")])
119
+
120
+ dag = graph.build()
121
+ result = dag.execute(parallel=True)
122
+
123
+ print(f"Branch A (100*2): {result['a']}") # 200
124
+ print(f"Branch B (100*3): {result['b']}") # 300
125
+ print(f"Branch C (100+50): {result['c']}") # 150
126
+ ```
127
+
128
+ ### Visualization
129
+
130
+ Generate Mermaid diagrams to visualize your pipeline:
131
+
132
+ ```python
133
+ print(dag.to_mermaid())
134
+ ```
135
+
136
+ Output:
137
+ ```mermaid
138
+ graph TD
139
+ 0["Source"]
140
+ 1["BranchA"]
141
+ 2["BranchB"]
142
+ 3["BranchC"]
143
+ 0 -->|shared_data → x| 1
144
+ 0 -->|shared_data → x| 2
145
+ 0 -->|shared_data → x| 3
146
+ style 1 fill:#e1f5ff
147
+ style 2 fill:#e1f5ff
148
+ style 3 fill:#e1f5ff
149
+ ```
150
+
151
+ ## Working with NumPy Arrays
152
+
153
+ dagex seamlessly handles NumPy arrays and complex numbers:
154
+
155
+ ```python
156
+ import dagex
157
+ import numpy as np
158
+
159
+ def generate_signal(inputs, variant_params):
160
+ """Generate a complex signal"""
161
+ samples = 256
162
+ t = np.linspace(0, 1, samples)
163
+ signal = np.exp(2j * np.pi * 10 * t) # 10 Hz complex exponential
164
+ return {
165
+ "signal": signal, # numpy array passed directly
166
+ "num_samples": samples
167
+ }
168
+
169
+ def process_signal(inputs, variant_params):
170
+ """Process with FFT"""
171
+ signal = np.array(inputs["signal"], dtype=complex)
172
+ spectrum = np.fft.fft(signal)
173
+ magnitude = np.abs(spectrum)
174
+ peak_freq = np.argmax(magnitude)
175
+
176
+ return {
177
+ "spectrum": spectrum,
178
+ "peak_frequency": int(peak_freq)
179
+ }
180
+
181
+ graph = dagex.Graph()
182
+
183
+ graph.add(
184
+ generate_signal,
185
+ label="GenerateSignal",
186
+ outputs=[("signal", "sig"), ("num_samples", "n")]
187
+ )
188
+
189
+ graph.add(
190
+ process_signal,
191
+ label="ProcessSignal",
192
+ inputs=[("sig", "signal")],
193
+ outputs=[("spectrum", "spec"), ("peak_frequency", "peak")]
194
+ )
195
+
196
+ dag = graph.build()
197
+ result = dag.execute()
198
+
199
+ print(f"Peak frequency bin: {result['peak']}")
200
+ ```
201
+
202
+ ### Data Types
203
+
204
+ dagex supports any Python data type:
205
+
206
+ - **Primitives**: int, float, str, bool
207
+ - **Complex numbers**: Built-in `complex` and `numpy.complex128`
208
+ - **Collections**: list, dict, tuple
209
+ - **NumPy arrays**: All dtypes including complex arrays
210
+ - **Custom objects**: Any Python object can be passed through the graph
211
+
212
+ The framework doesn't impose type restrictions - your node functions determine what data flows through the pipeline.
213
+
214
+ ## API Reference
215
+
216
+ ### Graph
217
+
218
+ - `Graph()` - Create a new graph builder
219
+ - `graph.add(function, label=None, inputs=None, outputs=None)` - Add a node
220
+ - `function`: Callable with signature `(inputs: dict, variant_params: dict) -> dict`
221
+ - `label`: Optional node name (str)
222
+ - `inputs`: List of `(broadcast_var, node_input_var)` tuples
223
+ - `outputs`: List of `(node_output_var, broadcast_var)` tuples
224
+ - `graph.branch(subgraph=None)` - Create a parallel branch
225
+ - `graph.build()` - Build the DAG and return a `Dag` object
226
+
227
+ ### Dag
228
+
229
+ - `dag.execute(parallel=False, max_threads=None)` - Execute the graph
230
+ - `parallel`: Enable parallel execution of independent nodes
231
+ - `max_threads`: Limit concurrent threads (None = unlimited)
232
+ - Returns: `dict` with all broadcast variables
233
+ - `dag.to_mermaid()` - Generate Mermaid diagram (str)
234
+
235
+ ## Examples
236
+
237
+ The package includes several example scripts:
238
+
239
+ - **`python_demo.py`** - Basic pipeline construction
240
+ - **`python_comprehensive_demo.py`** - Multiple pipeline patterns
241
+ - **`python_parallel_demo.py`** - Parallel execution examples
242
+ - **`python_data_types_demo.py`** - Working with various data types
243
+ - **`python_radar_demo.py`** - Signal processing pipeline with NumPy
244
+
245
+ Find them in the [examples/py directory](https://github.com/briday1/dagex/tree/main/examples/py) on GitHub.
246
+
247
+ ## Performance Notes
248
+
249
+ - The DAG executor is written in Rust for performance
250
+ - Python functions are called from Rust with proper GIL handling
251
+ - Parallel execution releases the GIL during graph traversal
252
+ - For CPU-bound Python code, use libraries like NumPy that release the GIL internally
253
+ - Best performance gains with parallel execution of I/O-bound or NumPy-based operations
254
+
255
+ ## License
256
+
257
+ MIT License - see [LICENSE](https://github.com/briday1/dagex/blob/main/LICENSE) for details.
258
+
259
+ ## Links
260
+
261
+ - **GitHub**: https://github.com/briday1/dagex
262
+ - **Documentation**: https://docs.rs/dagex
263
+ - **PyPI**: https://pypi.org/project/dagex
264
+ - **Crates.io**: https://crates.io/crates/dagex
265
+