Expand description
Proximal Optimization Methods
This module provides proximal operators and splitting methods for optimising non-smooth convex functions. These methods are particularly powerful for regularised learning problems (LASSO, ridge, nuclear norm, etc.) and image processing (total variation, sparsity-promoting penalties).
§Structure
| Submodule | Contents |
|---|---|
operators | prox_l1, prox_l2, prox_linf, prox_nuclear, project_simplex, project_box |
ista | IstaOptimizer, FistaOptimizer, ista_minimize, fista_minimize |
admm | AdmmSolver, solve_lasso, solve_consensus |
splitting | douglas_rachford, peaceman_rachford, forward_backward, primal_dual_chambolle_pock |
§Quick Start
§LASSO via FISTA
use scirs2_optimize::proximal::{fista_minimize, prox_l1};
let f = |x: &[f64]| 0.5 * x.iter().map(|&xi| xi * xi).sum::<f64>();
let grad_f = |x: &[f64]| x.to_vec();
let prox = |v: &[f64]| prox_l1(v, 0.1);
let result = fista_minimize(f, grad_f, prox, vec![2.0, -3.0], 0.5, 500)
.expect("FISTA failed");§ADMM LASSO
use scirs2_optimize::proximal::solve_lasso;
let a = vec![vec![1.0, 0.0], vec![0.0, 1.0]];
let b = vec![1.5, -0.5];
let x = solve_lasso(&a, &b, 0.1).expect("LASSO failed");§Douglas-Rachford Splitting
use scirs2_optimize::proximal::{douglas_rachford, prox_l1, prox_l2};
let prox_f = |v: &[f64]| prox_l1(v, 0.5);
let prox_g = |v: &[f64]| prox_l2(v, 0.5);
let x = douglas_rachford(&prox_f, &prox_g, vec![2.0, -1.0], 1.0, 500);Re-exports§
pub use operators::project_box;pub use operators::project_simplex;pub use operators::prox_l1;pub use operators::prox_l2;pub use operators::prox_linf;pub use operators::prox_nuclear;pub use ista::fista_minimize;pub use ista::ista_minimize;pub use ista::FistaOptimizer;pub use ista::IstaOptimizer;pub use ista::ProxOptResult;pub use admm::solve_consensus;pub use admm::solve_lasso;pub use admm::AdmmSolver;pub use splitting::douglas_rachford;pub use splitting::douglas_rachford_tracked;pub use splitting::dr_split;pub use splitting::forward_backward;pub use splitting::peaceman_rachford;pub use splitting::primal_dual_chambolle_pock;pub use splitting::DRResult;pub use splitting::SplittingResult;