Basin:Rust 中高效且可扩展的数值优化
摘要
Basin 是一个面向 Rust 的数值优化库,提供广泛的求解器目录、一流的约束支持,以及默认支持 WebAssembly 的构建。
arXiv:2608.11279v1 公告类型:新
摘要:Basin 是一个面向 Rust 编程语言的数值优化库。数值优化是指寻找使函数最小化的输入,它是科学领域的基础要素:将模型拟合到数据、校准模拟、训练机器学习模型,或选择使成本最小化的工程参数。Basin 为用户提供了一种统一、一致的方式来描述和求解此类问题,并拥有广泛的求解器目录和对约束的一流支持。
查看缓存全文
缓存时间: 2026/08/13 15:33
# Basin:Rust 中高效且可扩展的数值优化
来源:https://arxiv.org/html/2608.11279 \(2026年7月11日\)
## 摘要
Basin 是一个用于 Rust (https://www.rust-lang.org/) 编程语言 \(\[https://arxiv.org/html/2608.11279#bib.bibx13 (https://arxiv.org/html/2608.11279#bib.bibx13)\]\) 的数值优化库。数值优化是寻找使函数最小化的输入的任务,它是各科学领域的基本要素:将模型拟合到数据、校准模拟、训练机器学习模型,或选择使成本最小化的工程参数。Basin 为用户提供了一种统一且一致的方式来表述和求解此类问题,并配备了广泛的求解器目录和对约束的一等支持。要使用 Basin,用户需要实现一个或多个描述其目标的小型 trait——至少是一个返回给定输入值的`CostFunction`,以及可选的导数(`Gradient`、`Jacobian` 或 `Hessian`)。然后,用户将问题、求解器和起始点交给`Executor`,由它驱动优化循环、处理停止标准并返回结果。Basin 开箱即可用于普通 Rust 向量,并且可选地,在功能标志后面提供更快的线性代数后端。默认构建可编译为 WebAssembly,这意味着 Basin 可以在浏览器中使用,无需原生工具链或 BLAS/LAPACK 支持。文档发布在 basin.rs (https://basin.rs/),其中包括用户指南、交互式可视化器,以及将 Basin 与其他优化库进行比较的基准测试套件。
## 需求陈述
Rust 越来越多地用于科学和数值计算,因为它将性能与内存安全以及强大的包生态系统相结合。然而,优化在生态系统中是分散的:大多数 crate 专攻单一方法系列,没有一个广泛使用的 Rust crate 将广泛的求解器目录与一等约束和浏览器就绪的默认构建结合起来。编写 Basin 就是为了弥补这一差距,它针对四个具体需求。
首先,Basin 包含了广泛的求解器目录。实际问题很少会提前告知需要哪种优化算法,因此 Basin 在单一一致的 API 背后提供了大量求解器。该目录包括
- •一阶和拟牛顿方法(梯度下降、SGD、BFGS、L-BFGS、L-BFGS-B,以及牛顿信赖域方法) \(\[https://arxiv.org/html/2608.11279#bib.bibx6 (https://arxiv.org/html/2608.11279#bib.bibx6)\];\[https://arxiv.org/html/2608.11279#bib.bibx19 (https://arxiv.org/html/2608.11279#bib.bibx19)\];\[https://arxiv.org/html/2608.11279#bib.bibx29 (https://arxiv.org/html/2608.11279#bib.bibx29)\]\);
- •无导数方法(Nelder–Mead \(\[https://arxiv.org/html/2608.11279#bib.bibx16 (https://arxiv.org/html/2608.11279#bib.bibx16)\]\)、一维 Brent \(\[https://arxiv.org/html/2608.11279#bib.bibx4 (https://arxiv.org/html/2608.11279#bib.bibx4)\]\) 和黄金分割搜索、NEWUOA \(\[https://arxiv.org/html/2608.11279#bib.bibx21 (https://arxiv.org/html/2608.11279#bib.bibx21)\]\)、BOBYQA \(\[https://arxiv.org/html/2608.11279#bib.bibx22 (https://arxiv.org/html/2608.11279#bib.bibx22)\]\)、LINCOA \(\[https://arxiv.org/html/2608.11279#bib.bibx23 (https://arxiv.org/html/2608.11279#bib.bibx23)\]\)、COBYLA \(\[https://arxiv.org/html/2608.11279#bib.bibx20 (https://arxiv.org/html/2608.11279#bib.bibx20)\]\),以及网格自适应直接搜索 \(\[https://arxiv.org/html/2608.11279#bib.bibx2 (https://arxiv.org/html/2608.11279#bib.bibx2)\]\)\);
- •非线性最小二乘(Gauss–Newton 和 Levenberg–Marquardt \(\[https://arxiv.org/html/2608.11279#bib.bibx18 (https://arxiv.org/html/2608.11279#bib.bibx18)\]\));
- •全局和随机方法(随机搜索 \(\[https://arxiv.org/html/2608.11279#bib.bibx5 (https://arxiv.org/html/2608.11279#bib.bibx5)\]\)、CMA-ES \(\[https://arxiv.org/html/2608.11279#bib.bibx8 (https://arxiv.org/html/2608.11279#bib.bibx8)\]\)、差分进化 \(\[https://arxiv.org/html/2608.11279#bib.bibx25 (https://arxiv.org/html/2608.11279#bib.bibx25)\]\)、稳态遗传算法 \(\[https://arxiv.org/html/2608.11279#bib.bibx14 (https://arxiv.org/html/2608.11279#bib.bibx14)\]\),以及 basin-hopping \(\[https://arxiv.org/html/2608.11279#bib.bibx27 (https://arxiv.org/html/2608.11279#bib.bibx27)\]\)\);
- •模因组合(MA-LS-Chain \(\[https://arxiv.org/html/2608.11279#bib.bibx14 (https://arxiv.org/html/2608.11279#bib.bibx14)\]\),以及 CMA-ES 和差分进化注入包装器)。
切换方法很简单,有时只需更改一行代码。
其次,设计在编译时强制执行正确性。Basin 中的求解器、终止条件和观察器绑定在它们所需的最小状态形状上,这意味着没有梯度的方法不能与基于梯度的停止规则配对——不匹配会产生编译错误而不是运行时失败。
第三,Basin 被设计为可移植的。默认构建针对 WebAssembly,既不依赖 BLAS/LAPACK,也不依赖并发,这意味着 Basin 可以在浏览器中运行,无需原生工具链。它还支持较低的最低支持 Rust 版本,以便于在 R 包和其他可以通过 Rust 扩展的科学编程语言中使用。
第四,对约束的支持是一等的。约束在问题上声明,而不是传递给求解器调用,并且需要约束的求解器不会接受无约束问题——这同样是编译错误而不是运行时错误。Basin 支持箱式边界、线性等式和不等式约束、非线性不等式约束,以及可选的适配器(对数障碍和增广拉格朗日),它们将约束问题重新表示为无约束问题,以便任何无约束求解器都可以应用于它。
目标受众是需要 Rust 中或任何可以通过 Rust 轻松扩展的科学编程语言(如 R、Julia 和 Python)中可靠优化的研究人员、工程师和学生。
## 领域现状
与 Basin 最接近的类似物是 argmin \(\[https://arxiv.org/html/2608.11279#bib.bibx10 (https://arxiv.org/html/2608.11279#bib.bibx10)\]\):一个数值优化框架,Basin 从中获得了相当大的启发,包括`Executor`驱动循环、`Solver`/`Problem` trait 拆分,以及每个求解器的`State`。但 Basin 在其他方面有所不同,带来了
- •一等、问题侧的约束,而不是求解器配置,
- •以纯 Rust 实现的更丰富的线性代数层,以及
- •求解器之间共享的通用终止条件。
gomez \(\[https://arxiv.org/html/2608.11279#bib.bibx17 (https://arxiv.org/html/2608.11279#bib.bibx17)\]\) 是另一个具有类似范围的 Rust crate,实现了一小组无导数方法和非线性最小二乘求解器,并支持约束。与 Basin 相比,它的求解器目录较小,只支持箱式约束,并且没有用于线性代数的通用后端层。
最后,nlopt crate 提供了到 NLopt C 库 \(\[https://arxiv.org/html/2608.11279#bib.bibx9 (https://arxiv.org/html/2608.11279#bib.bibx9)\]\) 的 Rust 接口。尽管 NLopt 拥有广泛的求解器目录,但它需要 C 工具链来构建,并且不兼容 WebAssembly。它还缺乏 Basin 的通用终止条件和一等约束支持。
总之,Basin 的贡献在于将广泛的目录原生地带到 Rust 和 WebAssembly,而无需在其默认配置中链接 C 或 Fortran 工具链。
## 示例
在以下示例中,我们实现了 Rosenbrock 函数及其梯度,然后用梯度下降对其最小化。`Executor`驱动循环处理迭代、停止标准和错误处理。
```rust
use basin::{BasicState, CostFunction, Executor, Gradient, GradientDescent, GradientTolerance,};
use std::convert::Infallible;
struct Rosenbrock;
impl CostFunction for Rosenbrock {
type Param = Vec<f64>;
type Output = f64;
type Error = Infallible;
fn cost(&self, x: &Vec<f64>) -> Result<f64, Self::Error> {
Ok((1.0 - x[0]).powi(2) + 100.0 * (x[1] - x[0].powi(2)).powi(2))
}
}
impl Gradient for Rosenbrock {
type Gradient = Vec<f64>;
fn gradient(&self, x: &Vec<f64>) -> Result<Vec<f64>, Self::Error> {
Ok(vec![
-2.0 * (1.0 - x[0]) - 400.0 * x[0] * (x[1] - x[0].powi(2)),
200.0 * (x[1] - x[0].powi(2)),
])
}
}
fn main() {
let result = Executor::new(
Rosenbrock,
GradientDescent::new(1e-3),
BasicState::new(vec![-1.2, 1.0]),
)
.max_iter(50_000)
.terminate_on(GradientTolerance(1e-6))
.run()
.unwrap();
}
```
## 软件设计
Basin 组织为一个通用核心,上面分层了广泛的求解器目录。该设计建立在一组我们认为使其易于扩展和维护的原则之上。
### 分层后端
参数和线性代数在后端上是通用的。一个通用的*向量层*(每个后端都很好实现的运算,如缩放加法、点积和范数)使一阶和无导数求解器在`Vec`、nalgebra \(\[https://arxiv.org/html/2608.11279#bib.bibx7 (https://arxiv.org/html/2608.11279#bib.bibx7)\]\)、ndarray \(\[https://arxiv.org/html/2608.11279#bib.bibx26 (https://arxiv.org/html/2608.11279#bib.bibx26)\]\) 和 faer \(\[https://arxiv.org/html/2608.11279#bib.bibx24 (https://arxiv.org/html/2608.11279#bib.bibx24)\]\) 之上保持后端通用。每个后端通过一个单一的 Cargo 功能激活,固定一个主版本,后端主版本升级变成 Basin 主版本升级。这不同于 argmin,后者使用带版本的后端 trait,并要求每个后端版本都有一个新的 trait。我们选择保持后端 trait 不带版本,而是对整个 crate 进行版本控制,以提高可维护性。
### 编译时正确性
通用停止条件(迭代限制、容差族、评估预算和墙上时钟限制)在`Executor`上统一配置,而不是为每个求解器重新实现,并且每个标准绑定在它所需的最小状态形状上。这就是为什么类型不匹配的配对(无梯度方法上的梯度容差)会成为编译错误。这样做的代价是更复杂的泛型签名,但好处是 Basin 用户可以确信他们的停止条件与他们的求解器和问题兼容。
### 约束
约束描述*问题*,因此在 Basin 中它们作为问题侧 trait 存在,而不是在执行器配置或状态中。求解器通过这些 trait 声明它们消费的约束,这意味着将无约束问题交给需要约束的求解器将无法编译。对于重用无约束求解器的常见情况,可选适配器(对数障碍法和增广拉格朗日法)包装*问题*;每个适配器消费约束 trait,并且只暴露`CostFunction`和`Gradient`,这正是将约束问题路由到无约束求解器的方式。
### 兼容性
Basin 默认兼容 WebAssembly。并行性和 BLAS/LAPACK 集成是可选功能,默认路径使用 WebAssembly 安全的时间垫片和可设定种子的、WebAssembly 安全的随机数生成器。最低支持 Rust 版本被刻意保持较低,以符合 R 包网络 CRAN (https://cran.r-project.org/) 的工具链要求,从而便于 Basin 在 R 包(如 eulerr (https://cran.r-project.org/package=eulerr))中使用。
### 标量泛型
接口在标量类型上是通用的,默认使用`f64`,因此现有的调用点无需更改即可解析,而`f32`可在状态、求解器、终止条件和数学层中工作。
## 研究影响声明
Basin 被用作 Rust 库 Eunoia \(\[https://arxiv.org/html/2608.11279#bib.bibx12 (https://arxiv.org/html/2608.11279#bib.bibx12)\]\) 的优化器,而 Eunoia 又被用于 R 包 eulerr \(\[https://arxiv.org/html/2608.11279#bib.bibx11 (https://arxiv.org/html/2608.11279#bib.bibx11)\]\)。¹¹¹这些包也由作者制作。它还被用于 R 包 balancing \(\[https://arxiv.org/html/2608.11279#bib.bibx3 (https://arxiv.org/html/2608.11279#bib.bibx3)\]\),该包计算基于优化的平衡权重以用于因果推断。与竞争对手的基准测试可在 basin.rs (https://basin.rs/benchmarks) 获得,表明 Basin 通常优于 argmin 和 nlopt,并且与 gomez 相当。在撰写本文时,该 crate 在过去三个月中已在 https://crates.io/crates/basin 上被下载约 30,000 次,并已在*This Week in Rust* \(\[https://arxiv.org/html/2608.11279#bib.bibx1 (https://arxiv.org/html/2608.11279#bib.bibx1)\]\) 中亮相。
## AI 使用披露
在 Basin 的开发过程中大量使用了生成式 AI 工具:Claude Code(运行 Claude Opus 4.8、Claude Opus 5 和 Fable 5)被用于代码生成和重构、编写单元测试、编写文档以及审阅本手稿。作者做出了所有核心设计决策——架构、设计原则和 API——并审查、编辑和验证了所有 AI 辅助的贡献。为了进一步验证正确性,Powell 系列求解器是针对 PRIMA \(\[https://arxiv.org/html/2608.11279#bib.bibx28 (https://arxiv.org/html/2608.11279#bib.bibx28)\]\) 开发的,并与之进行了数值交叉验证,L-BFGS-B 实现与原始 Fortran 代码 \(\[https://arxiv.org/html/2608.11279#bib.bibx29 (https://arxiv.org/html/2608.11279#bib.bibx29)\]\) 进行了数值一致性检查。其余的求解器由测试套件问题覆盖。
## 致谢
正如我们提到的,Basin 在思想上极大地归功于 argmin \(\[https://arxiv.org/html/2608.11279#bib.bibx10 (https://arxiv.org/html/2608.11279#bib.bibx10)\]\)。Powell 系列无导数求解器源自 PRIMA \(\[https://arxiv.org/html/2608.11279#bib.bibx28 (https://arxiv.org/html/2608.11279#bib.bibx28)\]\),即 Zaikun Zhang 对 M. J. D. Powell 方法的现代 Fortran 参考实现,被用作精确公式的权威来源和交叉验证预言机。带边界约束的 L-BFGS-B 求解器是 Ciyou Zhu、Richard H. Byrd、Peihuang Lu 和 Jorge Nocedal 的 L-BFGS-B 3.0 版 Fortran 代码的移植,并包含了 José Luis Morales 和 Jorge Nocedal \(\[https://arxiv.org/html/2608.11279#bib.bibx15 (https://arxiv.org/html/2608.11279#bib.bibx15)\]\) 的改进。两者均根据 BSD 3-Clause 许可证分发,其声明保留在 Basin 源代码树中。
## 参考文献
## 参考文献
- Arlynx, E. (2026, June 17). *This week in Rust 656*. This week in Rust. https://this-week-in-rust.org/blog/2026/06/17/this-week-in-rust-656/
- Audet, C., & Dennis, J. E. (2006). Mesh adaptive direct search algorithms for constrained optimization. *SIAM Journal on Optimization*, *17*(1), 188–217. https://doi.org/10.1137/040603371
- Barrett, M. (2026). *balancing: Optimization-based balancing weights for causal inference* (Version 0.0.0.9000). https://github.com/r-causal/balancing (Original work published 2026)
- Brent, R. P. (2013). *Algorithms for minimization without derivatives*. Dover Publications. ISBN: 978-0-486-41998-5
- Brooks, S. H. (1958). A discussion of random methods for seeking maxima. *Operations Research*, *6*(2), 244–251. https://doi.org/10.1287/opre.6.2.244
- Byrd, R. H., Lu, P., Nocedal, J., & Zhu, C. (1995). A limited memory algorithm for bound constrained optimization. *SIAM Journal on Scientific Computing*, *16*(5), 1190–1208. https://doi.org/10.1137/0916069
- Crozet, S. (2026). *nalgebra: Linear algebra library for Rust* (V相似文章
借助 Rust 新 API 实现更快的浮点运算
Rust 1.98 引入了一个新 API,通过允许更激进的编译器优化来加速浮点运算,同时仍让开发者控制舍入误差。
Rust Decimal 库的比较与基准测试
一篇详细的技术文章,比较和基准测试了多种 Rust Decimal 库,涵盖了定点数与浮点数、固定精度与任意精度设计。
Turbofish 的堡垒
这是 Rust 编程语言的主要源代码仓库,详细介绍了其性能、可靠性和生产力等特性,以及安装、贡献和工具信息。
Rust 中的安全 SIMD,即使内部也安全
Rust 的 SIMD 抽象现在允许在不使用 unsafe 代码的情况下安全使用,这得益于 Rust 1.87 引入的 CPU 特性令牌,从而实现了简洁且可移植的向量操作。
Rosalind: 基于Rust的基因组学工具包,可在笔记本电脑上运行全基因组流程
Rosalind 是一款基于Rust的确定性基因组学引擎,设计为以O(√t)内存运行全基因组流程,使得在笔记本电脑和边缘设备上进行生物信息学分析成为可能。