graph LR J["๐ฏ Hard joint problem\nmin f(x, y)"] --> A["Fix y\nmin_x f(x, y)"] J --> B["Fix x\nmin_y f(x, y)"] A --> C["Update x"] B --> D["Update y"] C --> L["๐ Repeat until convergence"] D --> L style J fill:#f44336,color:#fff style A fill:#2196f3,color:#fff style B fill:#4caf50,color:#fff style C fill:#2196f3,color:#fff style D fill:#4caf50,color:#fff style L fill:#9c27b0,color:#fff
graph LR I["Initialise x0, y0"] --> X["x โ argmin f(x, y)"] X --> Y["y โ argmin f(x, y)"] Y --> K{"Converged?"} K -- "No" --> X K -- "Yes" --> Z["Return x, y"] style I fill:#607d8b,color:#fff style X fill:#2196f3,color:#fff style Y fill:#4caf50,color:#fff style K fill:#ff9800 style Z fill:#9c27b0,color:#fff
graph LR E["E-step\nq(z) = p(z | x, ฮธโฝแตโพ)"] --> M["M-step\nฮธโฝแตโบยนโพ โ argmax Q(ฮธ)"] M --> E style E fill:#2196f3,color:#fff style M fill:#4caf50,color:#fff
graph TD LOG["log p(x | ฮธ)"] --> ELBO["ELBO L(q, ฮธ)"] LOG --> KL["KL(q || p) โฅ 0"] E["E-step:\nq = p(z | x, ฮธ) โ KL = 0"] --> ELBO M["M-step:\nmaximize L over ฮธ"] --> ELBO style LOG fill:#f44336,color:#fff style ELBO fill:#4caf50,color:#fff style KL fill:#ff9800 style E fill:#2196f3,color:#fff style M fill:#9c27b0,color:#fff
graph LR P["Prediction (time update)\nxฬ โ F xฬ + B u\nP โ F P Fแต + Q"] --> U["Update (measurement)\nK โ P Hแต(HPHแต+R)โปยน\nxฬ โ xฬ + K(z โ Hxฬ)"] U --> P style P fill:#2196f3,color:#fff style U fill:#4caf50,color:#fff
graph LR PR["๐ต Prior from dynamics\nN(F xฬ, Q)"] --> POST["๐ฃ Posterior\nN(xฬ, P)"] ME["๐ข Measurement\nN(H x, R)"] --> POST style PR fill:#2196f3,color:#fff style ME fill:#4caf50,color:#fff style POST fill:#9c27b0,color:#fff
graph LR M["๐ฌ Sparse ratings M\n(only ฮฉ observed)"] --> F["Low-rank factors\nM โ U Vแต"] F --> U["๐ต User factors U"] F --> V["๐ข Item factors V"] U --> P["Predict missing entries"] V --> P style M fill:#f44336,color:#fff style F fill:#9c27b0,color:#fff style U fill:#2196f3,color:#fff style V fill:#4caf50,color:#fff style P fill:#ff9800
graph LR U["Fix V โ solve for U\n(per-row ridge regressions)"] --> V["Fix U โ solve for V\n(per-column ridge regressions)"] V --> U style U fill:#2196f3,color:#fff style V fill:#4caf50,color:#fff
graph LR C1["Cโ : diag(C) = 1\n(set diagonal to 1)"] --> C2["Cโ : C โชฐ 0\n(clip negative eigenvalues)"] C2 --> C1 style C1 fill:#2196f3,color:#fff style C2 fill:#4caf50,color:#fff
graph LR R["R = Y โ S"] --> X["X = ฮ _Cโ(R)\ndiagonal โ 1"] X --> S["S โ X โ R\nDykstra correction"] X --> Y["Y = ฮ _Cโ(X)\nPSD projection"] Y --> R style R fill:#607d8b,color:#fff style X fill:#2196f3,color:#fff style S fill:#9c27b0,color:#fff style Y fill:#4caf50,color:#fff
graph LR H["๐ฑ Hard joint problem"] --> E["๐ฏ Easy conditional problems"] E --> S["โ Simple, closed-form steps"] S --> W["๐ Repeat to convergence"] style H fill:#f44336,color:#fff style E fill:#ff9800 style S fill:#4caf50,color:#fff style W fill:#9c27b0,color:#fff