scirs2_optimize/dro/mod.rs
1//! Distributionally Robust Optimization (DRO).
2//!
3//! This module provides optimization algorithms that are robust against
4//! distributional uncertainty. Rather than assuming that the true data
5//! distribution is exactly the empirical distribution P_N, DRO seeks a
6//! decision that minimises the worst-case expected loss over an
7//! *ambiguity set* of plausible distributions.
8//!
9//! # Sub-modules
10//!
11//! - [`types`]: shared configuration and result types
12//! - [`wasserstein_dro`]: Wasserstein-ball DRO (Esfahani & Kuhn 2018)
13//! - [`cvar_dro`]: CVaR-based DRO (Rockafellar & Uryasev 2000)
14//!
15//! # Quick start
16//!
17//! ```rust
18//! use scirs2_optimize::dro::{portfolio_dro, solve_cvar_dro, DroConfig};
19//!
20//! // Synthetic return data (3 assets, 20 observations).
21//! let returns: Vec<Vec<f64>> = (0..20)
22//! .map(|i| vec![0.01 * i as f64, 0.02, -0.005 * i as f64])
23//! .collect();
24//!
25//! // Wasserstein DRO portfolio (ε = 0.05).
26//! let result = portfolio_dro(&returns, 0.05, None).expect("dro ok");
27//! println!("Robust weights: {:?}", result.optimal_weights);
28//! println!("Worst-case loss: {:.4}", result.worst_case_loss);
29//!
30//! // CVaR-DRO with α = 0.9.
31//! let samples: Vec<Vec<f64>> = (0..20).map(|i| vec![0.01 * i as f64, 0.02]).collect();
32//! let cvar_result = solve_cvar_dro(2, &samples, 0.9, 0.1, None).expect("cvar dro ok");
33//! println!("CVaR-DRO weights: {:?}", cvar_result.optimal_weights);
34//! ```
35//!
36//! # References
37//!
38//! - Esfahani, P. M. & Kuhn, D. (2018). "Data-driven distributionally robust
39//! optimization using the Wasserstein metric." *Mathematical Programming*.
40//! - Rockafellar, R. T. & Uryasev, S. (2000). "Optimization of conditional
41//! value-at-risk." *Journal of Risk*.
42
43pub mod cvar_dro;
44#[cfg(test)]
45mod tests;
46pub mod types;
47pub mod wasserstein_dro;
48
49// Re-exports
50pub use cvar_dro::{solve_cvar_dro, CvarDro, CvarEstimator};
51pub use types::{DroConfig, DroResult, DroSolver, RobustObjective, WassersteinBall};
52pub use wasserstein_dro::{portfolio_dro, portfolio_erm, WassersteinDro};