graph LR subgraph Pioneers["1970s Pioneers"] S[Shor\n1960s-70s] N[Nemirovski\n& Yudin\n1972] end subgraph Breakthrough["Late 1970s"] K[Khachiyan\n1979] end subgraph Impact["Impact"] LP[LP in P ๐] CVX[Convex Opt.\nPolynomial-time] end S --> K N --> K K --> LP K --> CVX style Pioneers fill:#e3f2fd style Breakthrough fill:#e8f5e9 style Impact fill:#fff9c4 style S fill:#bbdefb style N fill:#bbdefb style K fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px style LP fill:#fff9c4 style CVX fill:#fff9c4
graph LR A[Problem] --> B{Need to evaluate\nall constraints?} B -->|"Yes โ "| C[IPM / Simplex] B -->|"No โ have oracle ๐ฎ"| D[Ellipsoid Method] D --> E["Few vars, many constraints\nDiscrete vars\nSDP with structure"] style A fill:#ff9800 style B fill:#f44336 style C fill:#2196f3 style D fill:#4caf50 style E fill:#9c27b0
graph LR subgraph K["Convex Set K"] center(("x*")) end outside(("xโ")) center -.- outside style K fill:#e3f2fd,stroke:#1565c0 style center fill:#4caf50,stroke:#2e7d32 style outside fill:#f44336,stroke:#c62828
graph LR subgraph K["Convex Set K"] center(("x*")) end x0(("xโ")) sep((" ")) x0 ---|"g (normal)"| sep style K fill:#e3f2fd,stroke:#1565c0 style center fill:#4caf50,stroke:#2e7d32 style x0 fill:#f44336,stroke:#c62828 style sep fill:#ff9800 linkStyle 0 stroke:#f44336,stroke-width:3px,stroke-dasharray: 5 5
graph LR E["Ellipsoid"] --> H["Half-space\neliminated"] E --> H2["Half-space\nkept"] style E fill:#e3f2fd style H fill:#fce4ec style H2 fill:#e8f5e9
graph LR E2["Ellipsoid"] --> H3["More than half\neliminated โ๏ธ"] E2 --> H4["Less than half\nkept"] style E2 fill:#e3f2fd style H3 fill:#fce4ec style H4 fill:#c8e6c9
graph LR subgraph Epi["Epigraph of f"] line("f(xโ) + g'(x-xโ)") f("f(x)") end x0(("xโ")) f --- x0 line --- x0 style Epi fill:#f3e5f5 style f fill:#4caf50 style line fill:#f44336 style x0 fill:#ff9800
graph LR subgraph 2D["2D Ellipsoid"] center(("xc โ center")) axis1[" "] axis2[" "] end center --- axis1 center --- axis2 style 2D fill:#e3f2fd,stroke:#1565c0 style center fill:#f44336,stroke:#c62828 style axis1 fill:none style axis2 fill:none linkStyle 0 stroke:#ff9800,stroke-width:3px linkStyle 1 stroke:#ff9800,stroke-width:3px
graph LR subgraph K["Feasible Region K"] center(("x*")) end E0["Initial\nEllipsoid"] --- K style K fill:#e8f5e9,stroke:#2e7d32 style center fill:#4caf50 style E0 fill:#e3f2fd,stroke:#1565c0,stroke-dasharray: 5 5
graph TD Init["Initialize Ellipsoid\nEโ โ K"] --> Query["Query Oracle at xc"] Query --> Check{"Feasible?"} Check -->|"Yes โ "| Done["Return xc"] Check -->|"No โ got cut (g, ฮฒ)"| Update["Update Ellipsoid\nE โ smaller E"] Update --> Check2{"Volume small\nor empty?"} Check2 -->|"No"| Query Check2 -->|"Yes"| Fail["Return infeasible"] style Init fill:#ff9800 style Query fill:#2196f3 style Check fill:#f44336 style Done fill:#4caf50 style Update fill:#9c27b0 style Check2 fill:#f44336 style Fail fill:#f44336
sequenceDiagram participant CP as CuttingPlane participant SS as SearchSpace participant OF as OracleFeas loop Cutting Plane Iterations CP->>SS: request xc() SS-->>CP: return xc CP->>OF: assess_feas(xc) alt Feasible (cut is None) OF-->>CP: return None CP-->>CP: Return solution else Infeasible OF-->>CP: return cut (g, ฮฒ) CP->>SS: update_bias_cut(cut) alt Success SS-->>CP: continue else Failed SS-->>CP: status CP-->>CP: Return None end end end
graph LR A["Volume\nshrinks by\ne^(-1/2n)"] -->|"After k iterations"| B["Volume\nreduced by\ne^(-k/2n)"] style A fill:#e3f2fd style B fill:#e8f5e9
graph LR subgraph E["Ellipsoid"] center(("xc")) cut0[" "] cut1[" "] end center --- cut0 center --- cut1 style E fill:#e3f2fd,stroke:#1565c0 style center fill:#f44336 style cut0 fill:#4caf50 style cut1 fill:#4caf50 linkStyle 0 stroke:#4caf50,stroke-width:3px linkStyle 1 stroke:#4caf50,stroke-width:3px
graph LR subgraph Before["Before"] E1["Ellipsoid"] -->|"Single cut"| E2["Smaller"] E1 -->|"Parallel cut"| E3["Much smaller ๐"] end style Before fill:#f3e5f5 style E1 fill:#e3f2fd style E2 fill:#bbdefb style E3 fill:#81d4fa
graph LR subgraph Iteration["Iteration k"] xk(("xc")) gk(("ฮณ")) end xk -->|"assess_optim"| Check2{"fโ(xc) โค ฮณ?"} Check2 -->|"Yes โ shrink ฮณ โ๏ธ"| Central["Central Cut\n(ฮฒ=0)"] Check2 -->|"No"| Deep["Deep Cut\n(ฮฒ = fโ(xc) - ฮณ)"] Central -->|"New xc', smaller ฮณ'"| Next["Next iteration"] Deep -->|"New xc'"| Next style xk fill:#ff9800 style gk fill:#f44336 style Check2 fill:#2196f3 style Central fill:#4caf50 style Deep fill:#9c27b0 style Next fill:#e3f2fd
graph LR subgraph Continuous["Continuous Space"] xc(("xc")) xq(("xq โ nearest")) end xc --- xq style Continuous fill:#e3f2fd style xc fill:#f44336 style xq fill:#4caf50 linkStyle 0 stroke:#ff9800,stroke-width:3px,stroke-dasharray: 5 5
graph LR A["Assemble\nA(x)"] --> B["LDLT\nFactorization"] B --> C{"A(x) โป 0?"} C -->|"Yes โ "| D["Feasible"] C -->|"No โ"| E["Witness\nVector w"] E --> F["g_i = w'F_i w\nฮฒ = -w'A(x)w"] style A fill:#ff9800 style B fill:#2196f3 style C fill:#f44336 style D fill:#4caf50 style E fill:#9c27b0 style F fill:#e3f2fd
graph LR subgraph Normal["Normal Update"] P["Update\nP matrix"] -->|"O(nยฒ)"| P2["New P"] end subgraph Stable["Stable Update"] L["Update\nLDL^T factors"] -->|"O(nยฒ)"| L2["New L, D"] end style Normal fill:#fce4ec style Stable fill:#e8f5e9 style P fill:#ef9a9a style P2 fill:#ef9a9a style L fill:#a5d6a7 style L2 fill:#a5d6a7
graph LR A["Without Parallel\nCuts"] --> B["200-300\niterations"] C["With Parallel\nCuts"] --> D["80-120\niterations ๐"] style A fill:#fce4ec style B fill:#ef9a9a style C fill:#e8f5e9 style D fill:#a5d6a7
graph LR P1["Problem\n(paramsโ)"] --> S1["Solve โ Eโ"] P2["Problem\n(paramsโ)"] --> S2["Warm-start\nfrom Eโ โ Eโ"] P3["Problem\n(paramsโ)"] --> S3["Warm-start\nfrom Eโ โ Eโ"] style P1 fill:#ff9800 style P2 fill:#ff9800 style P3 fill:#ff9800 style S1 fill:#2196f3 style S2 fill:#4caf50 style S3 fill:#4caf50
graph TD Start["Convex Problem"] --> Oracle["Separation\nOracle ๐ฎ"] Oracle --> Cut{"Cut or\nFeasible?"} Cut -->|"Feasible โ "| Done["Solution Found!"] Cut -->|"Cut (g, ฮฒ)"| Ellipsoid["Update\nEllipsoid ๐ฅ"] Ellipsoid --> Loop{"Volume\nsmall?"} Loop -->|"No"| Oracle Loop -->|"Yes"| Fail["Infeasible โ"] style Start fill:#ff9800 style Oracle fill:#2196f3 style Cut fill:#f44336 style Done fill:#4caf50 style Ellipsoid fill:#9c27b0 style Loop fill:#f44336 style Fail fill:#f44336