graph LR A[("vโ")] -->|"-2"| B[("vโ")] B -->|"1"| C[("vโ")] C -->|"1"| A style A fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style B fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style C fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px
graph LR subgraph Input["Input Constraints"] A1("Edge Weights\nw(i,j)") end subgraph Detection["Cycle Detection"] B1{"Negative\nCycle?"} end subgraph Output["Result"] C1("Feasible โ ") C2("Infeasible โ\nโ Cutting Plane") end Input --> Detection Detection -->|"No"| C1 Detection -->|"Yes"| C2 style Input fill:#e3f2fd,stroke:#1565c0,stroke-width:3px style Detection fill:#fff3e0,stroke:#e65100,stroke-width:3px style Output fill:#e8f5e9,stroke:#2e7d32,stroke-width:3px
graph LR Start("Initialize\ndist = 0") --> Relax{"Relaxation\nchanged dist?"} Relax -->|"Yes"| FindCycle{"Find cycle\nin predecessor\ngraph"} FindCycle -->|"Cycle found"| Verify{"Is cycle\nnegative?"} Verify -->|"Yes"| Yield("Yield cycle ๐ค") Yield --> Relax Verify -->|"No"| Relax FindCycle -->|"No cycle"| Done("Done โ ") Relax -->|"No"| Done style Start fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style Relax fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style FindCycle fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style Verify fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style Yield fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style Done fill:#eceff1,stroke:#455a64,color:#2e3440,stroke-width:3px
graph LR A[("a")] -->|"cost=2\ntime=1"| B[("b")] B -->|"cost=3\ntime=2"| C[("c")] C -->|"cost=1\ntime=1"| A style A fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style B fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style C fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px
graph LR Guess("Guess r") --> Weights("Compute\nwแตฃ(e) = c(e) - rยทt(e)") Weights --> NCF{"Negative\nCycle?"} NCF -->|"Yes โ r is too low"| Raise("Increase r") NCF -->|"No โ r is feasible"| Lower("Decrease r") Raise --> Weights Lower --> Weights style Guess fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style Weights fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style NCF fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style Raise fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style Lower fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px
graph LR A[("a")] -->|"d(5,r)"| B[("b")] A -->|"d(2,r)"| C[("c")] B -->|"d(3,r)"| D[("d")] C -->|"d(4,r)"| D style A fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style B fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style C fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style D fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px
graph LR Input("Current point x") --> Oracle("NetworkOracle") Oracle --> Decision{"Negative\nCycle?"} Decision -->|"No โ Feasible โ "| Done("Return empty") Decision -->|"Yes โ Infeasible โ"| Cut("Build cutting plane\n(gradient, intercept)") Cut --> Return("Return cut\nfor ellipsoid update") style Input fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style Oracle fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style Decision fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style Done fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style Cut fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style Return fill:#fce4ec,stroke:#ad1457,color:#2e3440,stroke-width:3px
graph LR A[("vโ")] -->|"|aโโ|"| B[("vโ")] B -->|"|aโโ|"| A A -->|"|aโโ|"| C[("vโ")] C -->|"|aโโ|"| A B -->|"|aโโ|"| C C -->|"|aโโ|"| B style A fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style B fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style C fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px
graph LR A("Matrix A") --> B("Graph\n(sparsity)") B --> C("OptScaling\nOracle") C --> D("Cutting-Plane\n(Ellipsoid)") D --> E("Optimal\nScaling โ ") style A fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style B fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style C fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style D fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style E fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px
graph LR FF1["FFโ\n(clk at tโ)"] -->|"D_max"| FF2["FFโ\n(clk at tโ)"] subgraph Constraints["Timing Constraints"] C1("tโ - tโ โค T_clk - D_max") C2("tโ - tโ โค D_min - T_hold") end FF1 --> Constraints FF2 --> Constraints style FF1 fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style FF2 fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style Constraints fill:#e3f2fd,stroke:#1565c0,stroke-width:3px
graph LR A["Rโ"] -->|"2ns"| B["Rโ"] B -->|"3ns"| C["Rโ"] C -->|"1ns"| D["Rโ"] D -->|"2ns"| A B -->|"1ns"| D style A fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style B fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style C fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style D fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px
graph LR subgraph Before["Before Scaling"] M1["|aโโ| |aโโ| |aโโ|\n|aโโ| |aโโ| |aโโ|\n|aโโ| |aโโ| |aโโ|"] end subgraph After["After Scaling"] M2["uโยท|aโโ|ยทuโโปยน uโยท|aโโ|ยทuโโปยน uโยท|aโโ|ยทuโโปยน\nuโยท|aโโ|ยทuโโปยน uโยท|aโโ|ยทuโโปยน uโยท|aโโ|ยทuโโปยน\nuโยท|aโโ|ยทuโโปยน uโยท|aโโ|ยทuโโปยน uโยท|aโโ|ยทuโโปยน"] end Before -->|"Find uแตข\nto minimize\nฯ/ฯ"| After style Before fill:#fff3e0,stroke:#e65100,stroke-width:3px style After fill:#e8f5e9,stroke:#2e7d32,stroke-width:3px
graph TD NETOPTIM["netoptim-cpp\n๐๏ธ Network Oracles"] --> DIGRAPHX["digraphx-cpp\n๐ NegCycleFinder"] NETOPTIM --> ELLALGO["ellalgo-cpp\n๐ฏ Ellipsoid Method"] DIGRAPHX --> PY2CPP["py2cpp\n๐ฆ Python-like containers"] DIGRAPHX --> CPPCORO["cppcoro\n๐ Coroutine generators"] NETOPTIM --> XNETWORK["xnetwork-cpp\n๐ Graph structures"] style NETOPTIM fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style DIGRAPHX fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style ELLALGO fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style PY2CPP fill:#fff9c4,stroke:#f57f17,color:#2e3440,stroke-width:3px style CPPCORO fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style XNETWORK fill:#e0f2f1,stroke:#00695c,color:#2e3440,stroke-width:3px
graph TD subgraph Cost["Cost Breakdown"] A("Parametric Search\n5-20 iterations") --> B("NCF per iteration\nO(VยทEยทC)") B --> C("Total O(VยทEยทCยทiters)") end style Cost fill:#e3f2fd,stroke:#1565c0,stroke-width:3px style A fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style B fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style C fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px
graph LR A[("2")] -->|"eโ: 2.0"| B[("0")] A -->|"eโ: 1.0"| B style A fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style B fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px
graph TD subgraph Fast["โก Fast Variants"] FAST_NET["netoptim-fast\n๐๏ธ Network Oracles"] --> FAST_DIGRAPH["digraphx-fast\n๐ CSR NegCycleFinder"] FAST_NET -.->|"runtime"| ELLALGO["ellalgo-cpp\n๐ฏ Ellipsoid Method"] end subgraph Original["๐ฆ Original"] NETOPTIM["netoptim-cpp\n๐๏ธ Network Oracles"] --> DIGRAPHX["digraphx-cpp\n๐ NegCycleFinder (generator)"] DIGRAPHX --> CPPCORO["cppcoro\n๐ Coroutines"] end FAST_DIGRAPH -->|"no deps"| STL["C++20 STL only"] NETOPTIM --> ELLALGO DIGRAPHX --> PY2CPP["py2cpp\n๐ฆ Containers"] NETOPTIM --> XNETWORK["xnetwork-cpp\n๐ Graph structures"] style FAST_NET fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style FAST_DIGRAPH fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style NETOPTIM fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style DIGRAPHX fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style ELLALGO fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style STL fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px