graph TD PY["๐ py2cpp"] --> MW["โ๏ธ mywheel"] MW --> XN["๐ธ๏ธ xnetwork"] XN --> NL["๐ฆ netlistx"] NL --> CK["๐ ckpttn"] XN --> NO["๐ netoptim"] LD["๐ฒ lds / lds-gen"] --> SP["๐ฎ sphere-n"] LD --> GI["๐ฑ ginger"] LD --> PD["๐ physdes"] FR["โ fractions"] --> RT["๐ rat-trig"] FR --> PG["๐ projgeom"] EL["๐งฎ ellalgo"] --> CS["๐ corr-solver"] EL --> LM["๐ lmi-solver"] CSD["๐ข csd"] --> ML["๐๏ธ multiplierless"] style EL fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px style CK fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style PD fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style XN fill:#e8eaf6,stroke:#283593,color:#2e3440,stroke-width:3px style LD fill:#ffe0b2,stroke:#e65100,color:#2e3440,stroke-width:3px style FR fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px
graph TD S["Design Patterns"] --> ST["Strategy\n+ Policy"] S --> CR["CRTP /\nTemplate Method"] S --> BD["Builder"] S --> CP["Composite"] S --> AD["Adapter"] S --> ME["Memento"] S --> CM["Command"] S --> FC["Factory"] S --> IT["Iterator"] S --> VS["Visitor"] style ST fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style CR fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style BD fill:#e8eaf6,stroke:#283593,color:#2e3440,stroke-width:3px style CP fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px style AD fill:#ffe0b2,stroke:#e65100,color:#2e3440,stroke-width:3px style ME fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px
graph LR XC["Current center x_c"] --> OR["Oracle\nassess_feas(xc)"] OR -->|"no cut"| F["Feasible โ"] OR -->|"has cut"| CU["Cut\ng'(x-xc)+ฮฒ โค 0"] CU --> UP["Update ellipsoid"] UP --> CH{"tsq < tol?"} CH -->|"No"| XC CH -->|"Yes"| FL["Fail โ"] style OR fill:#a9cce3,stroke:#1565c0,color:#2e3440,stroke-width:3px style CU fill:#fadbd8,stroke:#c62828,color:#2e3440,stroke-width:3px style UP fill:#d4e6f1,stroke:#1565c0,color:#2e3440,stroke-width:3px style F fill:#d5f5e3,stroke:#2e7d32,color:#2e3440,stroke-width:3px style FL fill:#fadbd8,stroke:#c62828,color:#2e3440,stroke-width:3px
graph TD LM["LmiOracle"] --> CP["cutting_plane_feas"] PR["ProfitOracle"] --> CP LP["LowpassOracle"] --> CP NW["NetworkOracle\n(netoptim)"] --> CP QM["QmiOracle\n(corr-solver)"] --> CP EL["๐งฎ ellalgo\n(feas / optim / bsearch)"] --> CP style CP fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px style LM fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style PR fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style NW fill:#e8eaf6,stroke:#283593,color:#2e3440,stroke-width:3px style LP fill:#ffe0b2,stroke:#e65100,color:#2e3440,stroke-width:3px style QM fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style EL fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px
graph LR B["Builder\nadd_edge() ร N"] -->|"build()"| C["CSRGraph\noffsets + targets + weights"] B -->|"add_edge"| B style B fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px style C fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px
graph TD R["Root"] --> A["Child A"] R --> B["Child B"] A --> A1["leaf"] A --> A2["leaf"] B --> B1["leaf"] style R fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style A fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style B fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style A1 fill:#e8eaf6,stroke:#283593,color:#2e3440,stroke-width:3px style A2 fill:#e8eaf6,stroke:#283593,color:#2e3440,stroke-width:3px style B1 fill:#e8eaf6,stroke:#283593,color:#2e3440,stroke-width:3px
graph LR BS["bsearch()"] -->|"assess_bs(gamma)"| AD["BSearchAdaptor"] AD -->|"cutting_plane_feas"| CP["cutting_plane_feas()"] AD -->|"update(gamma)"| OR["Oracle"] style AD fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px style CP fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style OR fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style BS fill:#e8eaf6,stroke:#283593,color:#2e3440,stroke-width:3px
graph LR V["std::variant\nSphere3 | SphereN"] -->|"std::visit"| H["Visitor lambda"] V -->|"get_if"| A["get_if<Sphere3>"] V -->|"holds_alternative"| B["holds_alternative<SphereN>"] style V fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px style H fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style A fill:#e8eaf6,stroke:#283593,color:#2e3440,stroke-width:3px style B fill:#e8eaf6,stroke:#283593,color:#2e3440,stroke-width:3px
graph LR M["Make move"] --> G{"gain โฅ 0?"} G -->|"Yes"| K["Keep move\n(snapshot)"] G -->|"No"| R["Rollback\n(restore_part)"] K --> M style M fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style G fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px style K fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style R fill:#fadbd8,stroke:#c62828,color:#2e3440,stroke-width:3px
graph LR P["Producer\nenqueue(fn)"] --> Q["๐จ Task Queue\nstd::function<void()>"] Q --> W1["Workers"] style Q fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px style W1 fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px
graph LR subgraph "Compile-time" CR["CRTP\nFMGainMgr"] PL["Policy\nPartMgrBase"] OR["Concept Oracle\ncutting_plane_feas"] end subgraph "Runtime" ST["Virtual Strategy\nDelayCalculator"] AD["Adapter\nBSearchAdaptor"] V["Variant + visit\nsphere-n"] end style CR fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style PL fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style OR fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style ST fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style AD fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style V fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px