graph LR A["Omega_k\ncurrent iterate"] --> B["M_k = Omega_k^{-1}\nlinearize log det"] B --> C["Convex surrogate\nTr(Omega^{-1}Y) + Tr(M_k Omega)"] C --> D["cutting_plane_optim\nsolve subproblem"] D --> E["Omega_{k+1}"] E --> F{"converged ?"} F -->|"no"| A F -->|"yes"| G["stationary point"] style A fill:#e3f2fd,stroke:#1565c0,stroke-width:3px style B fill:#d1c4e9,stroke:#6a1b9a,stroke-width:3px style C fill:#fff9c4,stroke:#f57f17,stroke-width:3px style D fill:#e3f2fd,stroke:#1565c0,stroke-width:3px style G fill:#d5f5e3,stroke:#2e7d32,stroke-width:3px
graph TB PY["Python\nnp.linalg.inv(R)\ntrue inverse"] --> FIX RS["Rust\ninv_upper_tri\nback-substitution"] --> FIX CPP["C++\ninv(R)\ncholesky-based"] --> FIX FIX["inv_upper_tri()\nback substitution"] --> OK["MLE c0: 5.549 -> 4.162\nobj: 113.692 -> 113.120"] style PY fill:#d5f5e3,stroke:#2e7d32,stroke-width:3px style RS fill:#d5f5e3,stroke:#2e7d32,stroke-width:3px style CPP fill:#fadbd8,stroke:#c0392b,stroke-width:4px style FIX fill:#fff9c4,stroke:#f57f17,stroke-width:3px style OK fill:#e3f2fd,stroke:#1565c0,stroke-width:3px