graph TD NPHD["NPO-hard\nโ No constant-factor\napproximation possible"] -->|"hardest"| APX["APX-hard\nโ ๏ธ Approximable within\nsome constant factor"] APX -->|"hard"| PTAS["PTAS\nโ (1+ฮต)-approximation\nfor any ฮต > 0"] PTAS -->|"easier"| FPTAS["FPTAS\nโ Polynomial in both\ninput size and 1/ฮต"] FPTAS -->|"easiest"| P["P\nโ Exact solution\nin polynomial time"] style NPHD fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style APX fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style PTAS fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style FPTAS fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style P fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px
graph TD subgraph Networks["Network Types"] A1["Circuit\nVLSI"] --- A2["Internet\nWeb"] A2 --- A3["Social\nNetworks"] A3 --- A4["Neural\nNetworks"] A4 --- A1 end B["Combinatorial\nOptimization"] --> Networks style Networks fill:#e3f2fd,stroke:#1565c0,stroke-width:3px style B fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style A1 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px style A2 fill:#e3f2fd,stroke:#1565c0,stroke-width:3px style A3 fill:#fff3e0,stroke:#e65100,stroke-width:3px style A4 fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px
graph LR A[("s")] -->|"3"| B[("a")] A -->|"5"| C[("b")] B -->|"2"| D[("c")] C -->|"1"| D D -->|"4"| E[("t")] B -->|"-1"| E style A fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style E fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style B fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style C fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style D fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px
graph TD NCF["Negative Cycle\nFinder (NCF)"] --> SP["Shortest\nPath"] NCF --> FEAS["Feasibility\nCheck"] NCF --> OPT["Optimality\n(Cycle Cancel)"] NCF --> CUT["Cutting Plane\nGeneration"] NCF --> PARAM["Parametric\nSearch"] style NCF fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style SP fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style FEAS fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style OPT fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style CUT fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style PARAM fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px
graph LR X0["Initial flow xโ"] -->|"Find negative\ncycle p"| NCF["NCF Engine"] NCF -->|"p found"| UPDATE["x โ x + ฮฑยทp\n(improvement)"] UPDATE -->|"iterate"| NCF NCF -->|"no cycles"| OPTIMAL["Optimal! โ "] style X0 fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style NCF fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style UPDATE fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style OPTIMAL fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px
graph LR S[("s")] -->|"12"| A[("a")] S -->|"10"| B[("b")] A -->|"5"| B A -->|"8"| T[("t")] B -->|"15"| T style S fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style T fill:#ffcdd2,stroke:#c62828,color:#2e3440,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
graph LR R0["Guess rโ"] --> W["Compute\nwแตฃ(e) = c(e) - rยทt(e)"] W --> NCF{"NCF: Negative\nCycle?"} NCF -->|"Yes โ r too high"| DEC["Decrease r"] NCF -->|"No โ r feasible"| INC["Increase r"] DEC --> W INC --> W style R0 fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style W fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style NCF fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style DEC fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style INC fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px
graph TD START["Start: initial rโ,\ndist = 0"] --> RELAX["Edge Relaxation\nupdate dist along edges"] RELAX --> CYCLE{"Find cycle in\npredecessor graph?"} CYCLE -->|"Yes"| VERIFY{"New ratio\nbetter than r?"} VERIFY -->|"Yes"| UPDATE["r โ ratio(C)\nUpdate dist along C"] VERIFY -->|"No"| RELAX CYCLE -->|"No"| DONE["Done! r* is optimal ๐ฏ"] UPDATE --> RELAX style START fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style RELAX fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style CYCLE fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style VERIFY fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style UPDATE fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style DONE fill:#eceff1,stroke:#455a64,color:#2e3440,stroke-width:3px
graph TD A(("Problem\nInstance")) --> B("ILP Formulation\n๐") B --> C("LP Relaxation + Dual\nโ๏ธ") C --> D{"Iterative\nTightening"} D -->|"Increase dual yโ\nuntil tight"| E("Add tight vertex\nor edge โ") D -->|"Update\ngaps"| F("Reduce gaps\nfor all in set") E --> G{"All constraints\nsatisfied?"} F --> G G -->|"No"| D G -->|"Yes"| H("Prune unnecessary\nelements โ๏ธ") H --> I("ฮฑ-Approximate\nSolution โ ") C -.->|"Dual solution"| J("Lower bound\non OPT ๐") J -.-> I 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 style F fill:#e0f7fa,stroke:#00838f,color:#2e3440,stroke-width:3px style G fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style H fill:#efebe9,stroke:#4e342e,color:#2e3440,stroke-width:3px style I fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style J fill:#eceff1,stroke:#455a64,color:#2e3440,stroke-width:3px
graph LR FF1["FFโ\narrival uโ"] -->|"D_max, D_min"| FF2["FFโ\narrival uโ"] C1["uโ - uโ โค T_clk - D_max\nuโ - uโ โค D_min - T_hold"] FF1 --> C1 FF2 --> C1 style FF1 fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style FF2 fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style C1 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 TD subgraph Ecosystem["Network Optimization Ecosystem"] P1["digraphx\n(Python NCF/MCR)"] --> P2["netoptim-cpp\n(C++ Oracles)"] P2 --> P3["digraphx-cpp\n(C++ NCF Engine)"] P3 --> P4["ellalgo-cpp\n(Cutting-Plane)"] P1 --> P5["networkx\n(Python Graphs)"] P3 --> P6["LEMON\n(C++ Graphs)"] P2 --> P7["netlistx\n(PD Covering)"] end style Ecosystem fill:#e3f2fd,stroke:#1565c0,stroke-width:3px style P1 fill:#e3f2fd,stroke:#1565c0,color:#2e3440,stroke-width:3px style P2 fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style P3 fill:#fff3e0,stroke:#e65100,color:#2e3440,stroke-width:3px style P4 fill:#f3e5f5,stroke:#7b1fa2,color:#2e3440,stroke-width:3px style P5 fill:#c8e6c9,stroke:#2e7d32,color:#2e3440,stroke-width:3px style P6 fill:#ffcdd2,stroke:#c62828,color:#2e3440,stroke-width:3px style P7 fill:#e0f7fa,stroke:#00838f,color:#2e3440,stroke-width:3px