Fix TROP nuclear norm solver step size + FISTA acceleration#187
Fix TROP nuclear norm solver step size + FISTA acceleration#187
Conversation
…ISTA acceleration The soft-thresholding threshold for the L matrix was λ_nn/max(δ) when the correct value is λ_nn/(2·max(δ)), derived from the Lipschitz constant L_f = 2·max(δ) of the quadratic gradient. This over-shrinking caused singular values to be reduced too aggressively. Fix applied to all four code paths: Python joint, Python twostep, Rust joint, Rust twostep. Also adds FISTA/Nesterov acceleration to the twostep inner solver for faster L convergence (O(1/k²) vs O(1/k)). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Overall assessment: Executive summary
Methodology
Code Quality
Performance
Maintainability
Tech Debt
Security
Documentation/Tests
Tests not run (not requested). |
…ghts The proximal threshold was hardcoded as λ/(2) which is only correct when W_max=1. Changed to λ/(2·W_max) to match the joint solver and Rust backend. Added test with non-uniform weights and updated REGISTRY.md algorithm docs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
/ai-review |
|
🔁 AI review rerun (requested by @igerber) Head SHA: Overall Assessment: Executive Summary
Methodology
Code Quality Performance Maintainability Tech Debt Security Documentation/Tests
|
…rings - Add conditional threshold when W_max==0 to prevent ZeroDivisionError, matching Rust backend behavior (trop.rs:665) - Update Python and Rust docstrings to reflect correct FISTA/Nesterov acceleration formulas (L_f = 2·max(W), η = 1/(2·max(W))) - Add regression test for all-zero weights edge case Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
/ai-review |
|
🔁 AI review rerun (requested by @igerber) Head SHA: Overall assessment: ✅ Looks good Executive summary:
Methodology
Code Quality
Performance
Maintainability
Tech Debt
Security
Documentation/Tests
|
|
Closing, additional work being done instead at #195 |
Summary
λ_nn/max(δ)→λ_nn/(2·max(δ)), derived from Lipschitz constant L_f = 2·max(δ)Methodology references (required if estimator / math changes)
Validation
tests/test_trop.py— addedTestTROPNuclearNormSolverwith:test_proximal_step_size_correctness: verifies convergence to analytical prox_{λ/2}(R) for uniform weightstest_lowrank_objective_decreases: verifies objective monotonicity across iterationsanalysis/(not committed) shows L Frobenius norm difference vs CVXPY decreases significantlySecurity / privacy
Generated with Claude Code