// Copyright (C) 2026 Kiyotsugu Arai // SPDX-License-Identifier: LGPL-3.0-or-later // ConvexOptimization.hpp — convex optimization solvers // // ADMM, proximal gradient methods (ISTA/FISTA), interior-point method (QP). #ifndef SANGI_MATH_OPTIMIZATION_CONVEX_HPP #define SANGI_MATH_OPTIMIZATION_CONVEX_HPP #include #include #include #include #include #include #include namespace sangi { // ================================================================ // Proximal Operators // ================================================================ /// Soft thresholding: prox_{λ||·||_1}(v) = sign(v) * max(|v| - λ, 0) template Vector proxL1(const BaseVector& v, T lambda); /// Nonnegative projection: prox_{I_{x≥0}}(v) = max(v, 0) template Vector proxNonneg(const BaseVector& v); // ================================================================ // ISTA / FISTA (proximal gradient methods) // ================================================================ /// FISTA result template struct FISTAResult { Vector x; // solution T objective; // final objective value size_t iterations; // number of iterations }; /// FISTA (Fast Iterative Shrinkage-Thresholding Algorithm) /// minimize f(x) + g(x) /// f: differentiable convex function, ∇f Lipschitz continuous (Lipschitz constant L) /// g: convex function with a computable proximal operator /// /// @param gradF gradient function of f /// @param proxG proximal operator of g /// @param x0 initial value /// @param L Lipschitz constant (step size = 1/L) /// @param maxIter maximum number of iterations /// @param tol convergence threshold template FISTAResult fista( std::function(const Vector&)> gradF, std::function(const Vector&, T)> proxG, const Vector& x0, T L, size_t maxIter = 1000, T tol = T{1e-8}); /// Lasso via FISTA: minimize 0.5 ||Ax - b||² + λ||x||₁ template FISTAResult lassoFISTA(const BaseMatrix& A, const BaseVector& b, T lambda, size_t maxIter = 1000, T tol = T{1e-8}); // ================================================================ // ADMM (Alternating Direction Method of Multipliers) // ================================================================ /// ADMM result template struct ADMMResult { Vector x; // solution size_t iterations; }; /// ADMM for Lasso: minimize 0.5 ||Ax - b||² + λ||z||₁ /// split: x = z, penalty ρ template ADMMResult admmLasso(const BaseMatrix& A, const BaseVector& b, T lambda, T rho = T{1}, size_t maxIter = 1000, T tol = T{1e-6}); // ================================================================ // Interior-point method — quadratic programming (QP) // ================================================================ /// QP result template struct QPResult { Vector x; // solution T objective; // objective value size_t iterations; }; /// QP: minimize 0.5 x^T Q x + c^T x subject to Ax ≤ b /// Mehrotra predictor-corrector method (simplified version) template QPResult solveQP(const BaseMatrix& Q, const BaseVector& c, const BaseMatrix& A, const BaseVector& b, size_t maxIter = 100, T tol = T{1e-8}); // Implementation is separated into ConvexOptimization_impl.hpp. } // namespace sangi #endif // SANGI_MATH_OPTIMIZATION_CONVEX_HPP