Einsum (Einstein Summation) for Rust ndarray
This library is a fork of:
https://github.com/oracleofnj/einsum
which isn't actively being developed anymore. This fork of that library was
created to keep the tool up to date with Rust, ndarray, etc.
Minimal example
Cargo.toml:
ndarray_einsum = "0.9.0"
src/main.rs:
use ndarray::prelude::*;
use ndarray_einsum::*;
fn main() {
let m1 = arr1(&[1, 2]);
let m2 = arr2(&[[1, 2], [3, 4]]);
println!("{:?}", einsum("i,ij->j", &[&m1, &m2]));
}
Documentation
Documentation Site
Better documentation to follow
General algorithm description in semi-Rust pseudocode
FirstStep = Singleton({
contraction: Contraction,
}) | Pair({
contraction: Contraction,
lhs: usize,
rhs: usize
})
IntermediateStep = {
contraction: Contraction,
rhs: usize
}
ContractionOrder = {
first_step: FirstStep,
remaining_steps: Vec<IntermediateStep>,
}
path: ContractionOrder = Optimize(&Contraction, &[OperandShapes]);
result: ArrayD<A> = einsum_path<A>(Path, &[&ArrayLike<A>]);
einsum_path() {
let mut result = match first_step {
Singleton => einsum_singleton(contraction, operands[0]),
Pair => einsum_pair(contraction, operands[lhs], operands[rhs])
}
for step in remaining_steps.iter() {
result = einsum_pair(contraction, &result, operands[rhs])
}
result
}
einsum_singleton() {
}
einsum_pair() {
}
einsum_pair_base() {
}
tensordot() {
}
tensordot_fixed_order() {
}