1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//! 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
//! ```rust,no_run
//! 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
//! ```rust,no_run
//! 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
//! ```rust,no_run
//! 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 ──────────────────────────────────────────────────────────────
// Proximal operators
pub use ;
// ISTA / FISTA
pub use ;
// ADMM
pub use ;
// Splitting methods
pub use ;