7个版本
0.1.0-beta.5 | 2022年11月23日 |
---|---|
0.1.0-beta.3 | 2022年11月21日 |
0.1.0-beta | 2022年11月20日 |
0.1.0-alpha | 2022年11月16日 |
#968 in 算法
56KB
1.5K SLoC
可微分浮点运算
⚠ 此crate正在开发中,不应直接使用!
如果您想贡献或提问,请通过GitHub issues与我联系。
DFO crate旨在通过自动微分使您现有的代码可微分。
crate结构
至于自动微分,此crate由两个独立的部分组成
正如其名所示,前者实现的是 前向 模式自动微分,而后者实现的是 反向 模式。
注意:如果您对自动微分不熟悉,我建议您阅读Max Slater博客上的这篇优秀的文章这篇优秀的文章。
接下来,每个模块都分为(至少)两个子模块: 原始 和 泛型。
原始模块在原始类型上实现特定的微分模式,例如,使用forward::DFloat32
的[f32
]。
示例 - 原始类型的正向自动微分
use dfo::forward::primitive::*;
let f = |x| { x * x + 1.0 - x };
let df = |x| { 2.0 * x - 1.0 };
let x = DFloat32::var(4.0);
assert_eq!(f(x).deriv(), df(x).value());
泛型模块在泛型类型上实现特定的微分模式。对于后者,我们建议使用num_traits::Float
特质,例如。原始类型通常优化得更好(没有无用的复制,编译时间更快),除非您想使用外部crate,例如ndarray
。
crate功能标志
以下crate功能标志可用。它们配置在您的Cargo.toml
中。
libm
:启用num-traits/libm
功能num-traits
:支持(大多数)在num-traits
中定义的特质(默认启用)std
:使用Rust标准库的功能(默认启用)serde
:为serde
1.x 提供序列化支持
库目标
DFO 有两个主要目标。它必须是
- 快速,即在可能的情况下减少计算和复制,大量使用代码内联,以及其他方式;
- 并且 易于使用,利用泛型类型,并且需要非常少的修改来计算导数。
库状态
总结:这个库稳定吗?它是否已准备好投入生产?
不,可能需要很长时间才会。
目前,以下模块已实现
- 正向
- 原始
- 泛型
- 反向
- 原始
- 泛型
以下是我想要工作的一个小型 待办事项列表
- 为
原始
、正向
和反向
创建功能 - 创建多个输入、多个输出、ndarrays 等 的示例
- 实现反向自动微分
类似库
依赖关系
~94–395KB