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
//! Forward-Backward Splitting algorithm
//!
//! ## About
//!
//! This module offers an implementation of the forward-backward splitting algorithm
//!
//!
//!
//! ## Example: Forward-Backward Splitting
//!
//! ```
//! use optimization_engine::{*, fbs::*};
//! use optimization_engine::constraints::Ball2;
//! use std::num::NonZeroUsize;
//!
//! fn my_cost(u: &[f64], cost: &mut f64) -> Result<(), Error> {
//!     *cost = u[0] * u[0] + 2. * u[1] * u[1] + u[0] - u[1] + 3.0;
//!     Ok(())
//! }
//!
//! fn my_gradient(u: &[f64], grad: &mut [f64]) -> Result<(), Error> {
//!     grad[0] = u[0] + u[1] + 1.0;
//!     grad[1] = u[0] + 2. * u[1] - 1.0;
//!     Ok(())
//! }
//!
//! fn main() {
//!     let radius = 0.2;
//!     let box_constraints = Ball2::new(None, radius);
//!     let problem = Problem::new(box_constraints, my_gradient, my_cost);
//!     let gamma = 0.3;
//!     let tolerance = 1e-6;
//!
//!     let mut fbs_cache = FBSCache::new(NonZeroUsize::new(2).unwrap(), gamma, tolerance);
//!     let mut u = [0.0; 2];
//!     let mut optimizer = FBSOptimizer::new(problem, &mut fbs_cache);
//!
//!     let status = optimizer.solve(&mut u);
//!
//!     assert!(status.has_converged());
//! }
//! ```

mod fbs_cache;
mod fbs_engine;
mod fbs_optimizer;

pub use fbs_cache::FBSCache;
pub use fbs_optimizer::FBSOptimizer;

/* --------------------------------------------------------------------------------------------- */
/*          TESTS                                                                                */
/* --------------------------------------------------------------------------------------------- */

#[cfg(test)]
mod tests;