Skip to main content

scirs2_optimize/proximal/
mod.rs

1//! Proximal Optimization Methods
2//!
3//! This module provides proximal operators and splitting methods for optimising
4//! non-smooth convex functions. These methods are particularly powerful for
5//! regularised learning problems (LASSO, ridge, nuclear norm, etc.) and
6//! image processing (total variation, sparsity-promoting penalties).
7//!
8//! # Structure
9//!
10//! | Submodule | Contents |
11//! |-----------|----------|
12//! | `operators` | `prox_l1`, `prox_l2`, `prox_linf`, `prox_nuclear`, `project_simplex`, `project_box` |
13//! | `ista` | `IstaOptimizer`, `FistaOptimizer`, `ista_minimize`, `fista_minimize` |
14//! | `admm` | `AdmmSolver`, `solve_lasso`, `solve_consensus` |
15//! | `splitting` | `douglas_rachford`, `peaceman_rachford`, `forward_backward`, `primal_dual_chambolle_pock` |
16//!
17//! # Quick Start
18//!
19//! ## LASSO via FISTA
20//! ```rust,no_run
21//! use scirs2_optimize::proximal::{fista_minimize, prox_l1};
22//!
23//! let f = |x: &[f64]| 0.5 * x.iter().map(|&xi| xi * xi).sum::<f64>();
24//! let grad_f = |x: &[f64]| x.to_vec();
25//! let prox = |v: &[f64]| prox_l1(v, 0.1);
26//!
27//! let result = fista_minimize(f, grad_f, prox, vec![2.0, -3.0], 0.5, 500)
28//!     .expect("FISTA failed");
29//! ```
30//!
31//! ## ADMM LASSO
32//! ```rust,no_run
33//! use scirs2_optimize::proximal::solve_lasso;
34//!
35//! let a = vec![vec![1.0, 0.0], vec![0.0, 1.0]];
36//! let b = vec![1.5, -0.5];
37//! let x = solve_lasso(&a, &b, 0.1).expect("LASSO failed");
38//! ```
39//!
40//! ## Douglas-Rachford Splitting
41//! ```rust,no_run
42//! use scirs2_optimize::proximal::{douglas_rachford, prox_l1, prox_l2};
43//!
44//! let prox_f = |v: &[f64]| prox_l1(v, 0.5);
45//! let prox_g = |v: &[f64]| prox_l2(v, 0.5);
46//! let x = douglas_rachford(&prox_f, &prox_g, vec![2.0, -1.0], 1.0, 500);
47//! ```
48
49pub mod admm;
50pub mod ista;
51pub mod operators;
52pub mod splitting;
53
54// ─── Re-exports ──────────────────────────────────────────────────────────────
55
56// Proximal operators
57pub use operators::{project_box, project_simplex, prox_l1, prox_l2, prox_linf, prox_nuclear};
58
59// ISTA / FISTA
60pub use ista::{fista_minimize, ista_minimize, FistaOptimizer, IstaOptimizer, ProxOptResult};
61
62// ADMM
63pub use admm::{solve_consensus, solve_lasso, AdmmSolver};
64
65// Splitting methods
66pub use splitting::{
67    douglas_rachford, douglas_rachford_tracked, dr_split, forward_backward, peaceman_rachford,
68    primal_dual_chambolle_pock, DRResult, SplittingResult,
69};