#优化 #科学 #测试

gkls-rs

纯Rust实现的GKLS函数发生器

1个不稳定版本

0.1.0 2023年11月19日

#1850 in 数学

MIT 许可证

205KB
2.5K SLoC

Rust 1.5K SLoC // 0.0% comments C 840 SLoC // 0.4% comments

gkls-rs

gkls-rs 是在 《用于全局优化的具有已知局部和全局最小值的测试函数类生成软件》 中描述的算法的纯Rust实现。

尽管大部分代码都是从原始的C实现翻译而来,但在这个实现中,可以定义独立的问题,而无需修改任何全局状态。这一点使得在基准测试中尝试运行并行代码时,原始的实现相当难以使用。

原始实现位于 ACM Collected Algorithms 仓库 的第829条目。文件夹 gkls 是这些内容的副本,用于测试Rust实现。

通过功能 test_cbinding,构建了原始的C实现和测试套件。测试套件比较了Rust和C实现的输出。输出必须等效。因此,原始论文和每个函数后续研究中的函数编号仍然有效。

以下是使用 gkls-rs 复制的原始论文中的函数:D型函数的9号函数

该图是使用 examples/plot_function 中的二进制文件生成的。

cargo run --example plot_function --features examples

有关简单使用示例,请参阅 examples/single_evaluation.rs

// Generate a problem
let problem = Problem::new(9, Options::default(), 2, 10, -1.0, 1. / 3., 2. / 3.)
    .expect("Problem has to be valid");
// Evaluate the proble with the appropiate function
let x = [0.23, 0.44];
let y = problem.d_func(&x);
let dy = problem.d_gradient(&x);
println!("f({x:?})={y}");
println!("f'({x:?})={dy:?}");

运行示例

cargo run --example single_evaluation --features examples

您应该得到类似以下内容

f([0.23, 0.44])=0.8938503184432863
f'([0.23, 0.44])=Some([1.8828658375478264, 0.17383184854469846])

依赖项

~0.7–3MB
~56K SLoC