pub struct GemmPlan<'a> { /* private fields */ }Expand description
Read-only GEMM decomposition plan for a pairwise contraction step.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.lhs_gemm_shape(), &[2, 3]);Implementations§
Source§impl<'a> GemmPlan<'a>
impl<'a> GemmPlan<'a>
Sourcepub fn left_only_modes(&self) -> &'a [u32]
pub fn left_only_modes(&self) -> &'a [u32]
Return modes present only on the left operand and output.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.left_only_modes(), &[0]);Sourcepub fn left_only_shape(&self) -> &'a [usize]
pub fn left_only_shape(&self) -> &'a [usize]
Return dimension sizes for Self::left_only_modes.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.left_only_shape(), &[2]);Sourcepub fn right_only_modes(&self) -> &'a [u32]
pub fn right_only_modes(&self) -> &'a [u32]
Return modes present only on the right operand and output.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.right_only_modes(), &[2]);Sourcepub fn right_only_shape(&self) -> &'a [usize]
pub fn right_only_shape(&self) -> &'a [usize]
Return dimension sizes for Self::right_only_modes.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.right_only_shape(), &[4]);Sourcepub fn contracted_modes(&self) -> &'a [u32]
pub fn contracted_modes(&self) -> &'a [u32]
Return modes contracted between the pairwise operands.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.contracted_modes(), &[1]);Sourcepub fn contracted_shape(&self) -> &'a [usize]
pub fn contracted_shape(&self) -> &'a [usize]
Return dimension sizes for Self::contracted_modes.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1, 2], &[1, 2, 3]], &[0, 3]);
let tree = ContractionTree::from_pairs(
&subs,
&[&[2, 3, 4], &[3, 4, 5]],
&[(0, 1)],
)
.unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.contracted_shape(), &[3, 4]);Sourcepub fn batch_modes(&self) -> &'a [u32]
pub fn batch_modes(&self) -> &'a [u32]
Return modes shared by both operands and preserved in the output.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[3, 0, 1], &[1, 2, 3]], &[3, 0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[5, 2, 3], &[3, 4, 5]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.batch_modes(), &[3]);Sourcepub fn batch_shape(&self) -> &'a [usize]
pub fn batch_shape(&self) -> &'a [usize]
Return dimension sizes for Self::batch_modes.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[3, 0, 1], &[1, 2, 3]], &[3, 0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[5, 2, 3], &[3, 4, 5]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.batch_shape(), &[5]);Sourcepub fn lhs_target_modes(&self) -> &'a [u32]
pub fn lhs_target_modes(&self) -> &'a [u32]
Return target mode order for preparing the left GEMM operand.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.lhs_target_modes(), &[0, 1]);Sourcepub fn rhs_target_modes(&self) -> &'a [u32]
pub fn rhs_target_modes(&self) -> &'a [u32]
Return target mode order for preparing the right GEMM operand.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.rhs_target_modes(), &[1, 2]);Sourcepub fn canonical_output_modes(&self) -> &'a [u32]
pub fn canonical_output_modes(&self) -> &'a [u32]
Return canonical output mode order before any final permutation.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[2, 0]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.canonical_output_modes(), &[0, 2]);Sourcepub fn m(&self) -> usize
pub fn m(&self) -> usize
Return fused left-only dimension size.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.m(), 2);Sourcepub fn n(&self) -> usize
pub fn n(&self) -> usize
Return fused right-only dimension size.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.n(), 4);Sourcepub fn k(&self) -> usize
pub fn k(&self) -> usize
Return fused contracted dimension size.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.k(), 3);Sourcepub fn lhs_gemm_shape(&self) -> &'a [usize]
pub fn lhs_gemm_shape(&self) -> &'a [usize]
Return prepared left operand GEMM shape.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.lhs_gemm_shape(), &[2, 3]);Sourcepub fn rhs_gemm_shape(&self) -> &'a [usize]
pub fn rhs_gemm_shape(&self) -> &'a [usize]
Return prepared right operand GEMM shape.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.rhs_gemm_shape(), &[3, 4]);Sourcepub fn output_gemm_shape(&self) -> &'a [usize]
pub fn output_gemm_shape(&self) -> &'a [usize]
Return GEMM output shape before expanding fused dimensions.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.output_gemm_shape(), &[2, 4]);Sourcepub fn expanded_output_shape(&self) -> &'a [usize]
pub fn expanded_output_shape(&self) -> &'a [usize]
Return expanded output shape in canonical output mode order.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[0, 2]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert_eq!(gemm.expanded_output_shape(), &[2, 4]);Sourcepub fn needs_final_permute(&self) -> bool
pub fn needs_final_permute(&self) -> bool
Return whether canonical output requires a final permutation.
§Examples
use tenferro_einsum::{ContractionTree, Subscripts};
let subs = Subscripts::new(&[&[0, 1], &[1, 2]], &[2, 0]);
let tree = ContractionTree::from_pairs(&subs, &[&[2, 3], &[3, 4]], &[(0, 1)]).unwrap();
let gemm = tree.step_plan(0).unwrap().gemm();
assert!(gemm.needs_final_permute());Trait Implementations§
impl<'a> Copy for GemmPlan<'a>
Auto Trait Implementations§
impl<'a> Freeze for GemmPlan<'a>
impl<'a> RefUnwindSafe for GemmPlan<'a>
impl<'a> Send for GemmPlan<'a>
impl<'a> Sync for GemmPlan<'a>
impl<'a> Unpin for GemmPlan<'a>
impl<'a> UnsafeUnpin for GemmPlan<'a>
impl<'a> UnwindSafe for GemmPlan<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> Twhere
Self: Distribution<T>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more