1个不稳定版本
0.1.0 | 2022年11月30日 |
---|
#879 in 科学
55KB
1K SLoC
einsum-derive
为ndarray crate提供的基于proc-macro的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实现了类似于
ij,jk->ik
的einsum子脚本的解析器,并生成Rust代码。
链接
- numpy.einsum是Python中知名的einsum实现。
- opt_einsum是针对NumPy和其他线性代数包的einsum计算优化实现。
- oracleofnj/einsum是rust-ndarray的基于运行时的einsum实现。
许可
© 2022 Teramura Toshiki (@termoshtt)
本项目许可为以下之一
- Apache License, Version 2.0, (LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可 (LICENSE-MIT或https://opensource.org/licenses/MIT)
任选其一。
依赖
~2.5MB
~58K SLoC