1 个不稳定版本
0.1.0 | 2022 年 11 月 30 日 |
---|
#598 in 科学
在 einsum-derive 中使用
44KB
833 行
einsum-derive
基于 proc-macro 的 ndarray crate 的 einsum 实现
use ndarray::array;
use einsum_derive::einsum;
let a = array![
[1.0, 2.0],
[3.0, 4.0]
];
let b = array![
[1.0, 2.0],
[3.0, 4.0]
];
let c = einsum!("ij,jk->ik", a, b);
assert_eq!(c, array![
[6.0, 8.0],
[12.0, 16.0]
]);
此 proc-macro 将输入子脚本的子字符串 "ij,jk->ik"
编译成执行相应操作的 Rust 代码。
状态 / 路线图
- 通过记住部分求和以减少计算顺序来优化收缩。
- 例如,三个矩阵乘法
ij,jk,kl->il
被分解为两个连续的 einsumij,jk->ik
和ik,kl->il
。
- 例如,三个矩阵乘法
- 如果可能,调用 BLAS 例程
- 省略号
...
支持
架构
- einsum-derive crate 是一个 proc-macro crate,提供上述
einsum!
宏。 - einsum-codegen crate 实现了解析 einsum 子脚本的解析器,如
ij,jk->ik
并生成 Rust 代码。
链接
- numpy.einsum 是 Python 中著名的 einsum 实现。
- opt_einsum 是用于优化 NumPy 和其他线性代数包中 einsum 计算的实现。
- oracleofnj/einsum 是 rust-ndarray 的基于运行时的 einsum 实现。
许可证
© 2022 Toshiki Teramura (@termoshtt)
该项目受以下任一许可证的许可:
- Apache 许可证第 2 版 (LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
依赖项
~2.5MB
~57K SLoC