|
| 1 | +digraph SystemPipeline { |
| 2 | + rankdir=LR; |
| 3 | + graph [compound=true, splines=ortho, ranksep="1.0", nodesep="0.5"]; |
| 4 | + node [shape=box, fontsize=10, margin="0.08,0.05"]; |
| 5 | + edge [fontsize=9, arrowsize=0.7]; |
| 6 | + |
| 7 | + // Input Layer |
| 8 | + subgraph cluster_input { |
| 9 | + label="Input"; labeljust="l"; style="rounded,dashed"; |
| 10 | + yaml [label="Scenario YAML"]; |
| 11 | + parse [label="Parse & Validate"]; |
| 12 | + expand [label="DSL Expansion"]; |
| 13 | + yaml -> parse -> expand; |
| 14 | + } |
| 15 | + |
| 16 | + // Python Layer - Model |
| 17 | + subgraph cluster_python { |
| 18 | + label="Python Layer"; labeljust="l"; style="rounded,dashed"; |
| 19 | + |
| 20 | + subgraph cluster_model { |
| 21 | + label=""; style=invis; |
| 22 | + scenario [label="Scenario\n·Network\n·FailurePolicySet\n·TrafficMatrixSet\n·Workflow", shape=box]; |
| 23 | + } |
| 24 | + |
| 25 | + subgraph cluster_exec { |
| 26 | + label=""; style=invis; |
| 27 | + engine [label="Scenario.run()"]; |
| 28 | + steps [label="WorkflowSteps"]; |
| 29 | + exec [label="Execution\n·FailureManager\n·DemandBuilder\n·Flow Solvers"]; |
| 30 | + engine -> steps -> exec; |
| 31 | + } |
| 32 | + |
| 33 | + adapter [label="Core Adapter\n(build_graph, mappers)"]; |
| 34 | + |
| 35 | + scenario -> engine; |
| 36 | + exec -> adapter; |
| 37 | + } |
| 38 | + |
| 39 | + // C++ Core Layer |
| 40 | + subgraph cluster_core { |
| 41 | + label="NetGraph-Core (C++)"; labeljust="l"; style="rounded,filled"; fillcolor="#f0f0f0"; |
| 42 | + |
| 43 | + subgraph cluster_graph { |
| 44 | + label=""; style=invis; |
| 45 | + core_backend [label="Backend"]; |
| 46 | + core_graph [label="StrictMultiDiGraph"]; |
| 47 | + { rank=same; core_backend; core_graph; } |
| 48 | + } |
| 49 | + |
| 50 | + subgraph cluster_algs { |
| 51 | + label=""; style=invis; |
| 52 | + core_algs [label="Algorithms"]; |
| 53 | + core_spf [label="SPF"]; |
| 54 | + core_ksp [label="K-SP"]; |
| 55 | + core_maxf [label="Max-Flow"]; |
| 56 | + core_algs -> core_spf; |
| 57 | + core_algs -> core_ksp; |
| 58 | + core_algs -> core_maxf; |
| 59 | + { rank=same; core_spf; core_ksp; core_maxf; } |
| 60 | + } |
| 61 | + |
| 62 | + core_backend -> core_algs; |
| 63 | + core_graph -> core_algs [style=invis]; |
| 64 | + } |
| 65 | + |
| 66 | + // Results Layer |
| 67 | + subgraph cluster_results { |
| 68 | + label="Results"; labeljust="l"; style="rounded,dashed"; |
| 69 | + results [label="Results Store"]; |
| 70 | + } |
| 71 | + |
| 72 | + // Main flow |
| 73 | + expand -> scenario [lhead=cluster_python, ltail=cluster_input]; |
| 74 | + adapter -> core_backend [lhead=cluster_core, ltail=cluster_python, xlabel="GIL released"]; |
| 75 | + core_maxf -> results [ltail=cluster_core, lhead=cluster_results]; |
| 76 | +} |
0 commit comments