3个不稳定版本
0.1.0 | 2022年8月8日 |
---|---|
0.0.16 | 2020年11月13日 |
0.0.15 | 2020年2月10日 |
#434 in 算法
每月46次下载
用于 2 crates
77KB
1K SLoC
LBFGS
从Naoaki Okazaki的C库libLBFGS移植的LBFGS和OWL-QN算法的快速且安全的Rust实现。
查看rust-liblbfgs以获取原始C代码的工作包装器。
动机
- 将本地的LBFGS实现引入Rust社区。
- 了解一个优秀的优化算法如何在现实中实现。
- 了解如何“在飞行中更换喷气发动机” URL
- 通过Rust高级抽象使其更易于维护。
- 改进以满足我在计算化学方面的需求。
待办事项
- 与rayon并行
- 支持SIMD
- 添加选项以禁用仅梯度优化的线搜索
- 修复从liblbfgs继承的问题 URL
特性
- 干净且安全的Rust实现。
- OWL-QN算法。
- 基于闭包的回调接口。
- 阻尼L-BFGS算法。
用法
// 0. Import the lib
use liblbfgs::lbfgs;
const N: usize = 100;
// 1. Initialize data
let mut x = [0.0 as f64; N];
for i in (0..N).step_by(2) {
x[i] = -1.2;
x[i + 1] = 1.0;
}
// 2. Defining how to evaluate function and gradient
let evaluate = |x: &[f64], gx: &mut [f64]| {
let n = x.len();
let mut fx = 0.0;
for i in (0..n).step_by(2) {
let t1 = 1.0 - x[i];
let t2 = 10.0 * (x[i + 1] - x[i] * x[i]);
gx[i + 1] = 20.0 * t2;
gx[i] = -2.0 * (x[i] * gx[i + 1] + t1);
fx += t1 * t1 + t2 * t2;
}
Ok(fx)
};
let prb = lbfgs()
.with_max_iterations(5)
.with_orthantwise(1.0, 0, 99) // enable OWL-QN
.minimize(
&mut x, // input variables
evaluate, // define how to evaluate function
|prgr| { // define progress monitor
println!("iter: {:}", prgr.niter);
false // returning true will cancel optimization
}
)
.expect("lbfgs owlqn minimize");
println!("fx = {:}", prb.fx);
回调函数是本地的Rust FnMut闭包,可以捕获/更改环境中的变量。
完整的带注释的代码在examples/sample.rs中可用。
运行示例
cargo run --example sample
依赖项
~220KB