use crate::{base_types::TransMode, traits::base_operations::BaseItem};
pub use num::traits::MulAdd;
pub use std::ops::{Add, Mul, Sub};
pub trait MultInto<First, Second>: BaseItem {
fn simple_mult_into(self, arr_a: First, arr_b: Second) -> Self
where
Self: Sized,
Self::Item: num::One,
Self::Item: num::Zero,
{
self.mult_into(
TransMode::NoTrans,
TransMode::NoTrans,
<Self::Item as num::One>::one(),
arr_a,
arr_b,
<Self::Item as num::Zero>::zero(),
)
}
fn mult_into(
self,
transa: TransMode,
transb: TransMode,
alpha: Self::Item,
arr_a: First,
arr_b: Second,
beta: Self::Item,
) -> Self;
}
pub trait Gemm: Sized {
#[allow(clippy::too_many_arguments)]
fn gemm(
transa: TransMode,
transb: TransMode,
m: usize,
n: usize,
k: usize,
alpha: Self,
a: &[Self],
rsa: usize,
csa: usize,
b: &[Self],
rsb: usize,
csb: usize,
beta: Self,
c: &mut [Self],
rsc: usize,
csc: usize,
);
}
pub trait MultIntoResize<First, Second>: BaseItem {
fn simple_mult_into_resize(self, arr_a: First, arr_b: Second) -> Self
where
Self: Sized,
Self::Item: num::One,
Self::Item: num::Zero,
{
self.mult_into_resize(
TransMode::NoTrans,
TransMode::NoTrans,
<Self::Item as num::One>::one(),
arr_a,
arr_b,
<Self::Item as num::Zero>::zero(),
)
}
fn mult_into_resize(
self,
transa: TransMode,
transb: TransMode,
alpha: Self::Item,
arr_a: First,
arr_b: Second,
beta: Self::Item,
) -> Self;
}
pub trait AsMatrixApply<OtherX, OtherY>: BaseItem {
fn apply(&self, alpha: Self::Item, x: &OtherX, beta: Self::Item, y: &mut OtherY);
}
pub trait Inner<Other = Self> {
type Output;
fn inner(&self, other: &Other) -> Self::Output;
}
pub trait Norm {
type Output;
fn norm(&self) -> Self::Output;
}
pub trait NormSup {
type Output;
fn norm_sup(&self) -> Self::Output;
}
pub trait NormOne {
type Output;
fn norm_1(&self) -> Self::Output;
}
pub trait NormTwo {
type Output;
fn norm_2(&self) -> Self::Output;
}