diff --git a/src/matrix_vector/ops.rs b/src/matrix_vector/ops.rs index 6ca1053..d4239bd 100644 --- a/src/matrix_vector/ops.rs +++ b/src/matrix_vector/ops.rs @@ -12,6 +12,9 @@ use pointer::CPtr; use scalar::Scalar; use vector::Vector; +/// General multiply with vector +/// +/// A ← αAOPx + βy pub trait Gemv: Sized { fn gemv, W: ?Sized + Vector>(trans: Transpose, alpha: &Self, a: &Matrix, x: &V, beta: &Self, y: &mut W); } @@ -86,10 +89,16 @@ mod gemv_tests { } } +/// Symmetric multiply with vector +/// +/// A ← αAx + βy pub trait Symv: Sized { fn symv, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, a: &Matrix, x: &V, beta: &Self, y: &mut W); } +/// Hermitian multiply with vector +/// +/// A ← αAx + βy pub trait Hemv: Sized { fn hemv, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, a: &Matrix, x: &V, beta: &Self, y: &mut W); } @@ -158,10 +167,16 @@ mod symv_tests { } } +/// General rank-1 update +/// +/// A ← A + αxyT pub trait Ger: Sized { fn ger, W: ?Sized + Vector>(alpha: &Self, x: &V, y: &W, a: &mut Matrix); } +/// General rank-1 update (using hermitian conjugate) +/// +/// A ← A + αxyH pub trait Gerc: Ger { fn gerc, W: ?Sized + Vector>(alpha: &Self, x: &V, y: &W, a: &mut Matrix) { Ger::ger(alpha, x, y, a); @@ -214,10 +229,16 @@ mod ger_tests { } } +/// Symmetric rank-1 update +/// +/// A ← A + αxxT pub trait Syr: Sized { fn syr>(symmetry: Symmetry, alpha: &Self, x: &V, a: &mut Matrix); } +/// Hermitian rank-1 update +/// +/// A ← A + αxxH pub trait Her: Sized { fn her>>(symmetry: Symmetry, alpha: &Self, x: &V, a: &mut Matrix>); } @@ -258,10 +279,16 @@ macro_rules! syr_impl(($($t: ident), +) => ( syr_impl!(f32, f64); +/// Symmetric rank-2 update +/// +/// A ← A + αxyT + αyxT pub trait Syr2: Sized { fn syr2, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, x: &V, y: &W, a: &mut Matrix); } +/// Hermitian rank-2 update +/// +/// A ← A + αxyH + y(αx)H pub trait Her2: Sized { fn her2, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, x: &V, y: &W, a: &mut Matrix); } @@ -286,6 +313,9 @@ macro_rules! syr2_impl(($trait_name: ident, $fn_name: ident, $($t: ident), +) => syr2_impl!(Syr2, syr2, f32, f64); syr2_impl!(Her2, her2, Complex32, Complex64); +/// General band matrix multiply with vector. +/// +/// A ← αAOPx + βy pub trait Gbmv: Sized { fn gbmv, W: ?Sized + Vector>(trans: Transpose, alpha: &Self, a: &BandMatrix, x: &V, beta: &Self, y: &mut W); } @@ -311,10 +341,16 @@ macro_rules! gbmv_impl(($($t: ident), +) => ( gbmv_impl!(f32, f64, Complex32, Complex64); +/// Symmetric band matrix multiply with vector +/// +/// A ← αAx + βy pub trait Sbmv: Sized { fn sbmv, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, a: &BandMatrix, x: &V, beta: &Self, y: &mut W); } +/// Hermitian band matrix multiply with vector +/// +/// A ← αAx + βy pub trait Hbmv: Sized { fn hbmv, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, a: &BandMatrix, x: &V, beta: &Self, y: &mut W); } @@ -340,10 +376,16 @@ macro_rules! sbmv_impl(($trait_name: ident, $fn_name: ident, $($t: ident), +) => sbmv_impl!(Sbmv, sbmv, f32, f64); sbmv_impl!(Hbmv, hbmv, Complex32, Complex64); +/// Triangular band matrix multiply with vector +/// +/// A ← AOPx pub trait Tbmv: Sized { fn tbmv>(symmetry: Symmetry, trans: Transpose, diagonal: Diagonal, a: &BandMatrix, x: &mut V); } +/// Solve triangular band matrix system +/// +/// A ← A-1 OPx pub trait Tbsv: Sized { fn tbsv>(symmetry: Symmetry, trans: Transpose, diagonal: Diagonal, a: &BandMatrix, x: &mut V); } @@ -367,10 +409,16 @@ macro_rules! tbmv_impl(($trait_name: ident, $fn_name: ident, $($t: ident), +) => tbmv_impl!(Tbmv, tbmv, f32, f64, Complex32, Complex64); tbmv_impl!(Tbsv, tbsv, f32, f64, Complex32, Complex64); +/// Symmetric packed matrix multiply with vector +/// +/// A ← αAx + βy pub trait Spmv: Sized { fn spmv, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, a: &Matrix, x: &V, beta: &Self, y: &mut W); } +/// Hermitian packed matrix multiply with vector +/// +/// A ← αAx + βy pub trait Hpmv: Sized { fn hpmv, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, a: &Matrix, x: &V, beta: &Self, y: &mut W); } @@ -396,10 +444,16 @@ macro_rules! spmv_impl(($trait_name: ident, $fn_name: ident, $($t: ident), +) => spmv_impl!(Spmv, spmv, f32, f64); spmv_impl!(Hpmv, hpmv, Complex32, Complex64); +/// Triangular packed matrix multiply with vector +/// +/// A ← AOPx pub trait Tpmv: Sized { fn tpmv>(symmetry: Symmetry, trans: Transpose, diagonal: Diagonal, a: &Matrix, x: &mut V); } +/// Solve triangular packed matrix system +/// +/// A ← A-1 OPx pub trait Tpsv: Sized { fn tpsv>(symmetry: Symmetry, trans: Transpose, diagonal: Diagonal, a: &Matrix, x: &mut V); } @@ -423,6 +477,9 @@ macro_rules! tpmv_impl(($trait_name: ident, $fn_name: ident, $($t: ident), +) => tpmv_impl!(Tpmv, tpmv, f32, f64, Complex32, Complex64); tpmv_impl!(Tpsv, tpsv, f32, f64, Complex32, Complex64); +/// Hermitian packed matrix rank-1 update +/// +/// A ← A + αxxH pub trait Hpr: Sized { fn hpr>>(symmetry: Symmetry, alpha: &Self, x: &V, a: &mut Matrix>); } @@ -445,6 +502,9 @@ macro_rules! hpr_impl(($($t: ident), +) => ( hpr_impl!(f32, f64); +/// Symmetric packed matrix rank-1 update +/// +/// A ← A + αxxT pub trait Spr: Sized { fn spr>(symmetry: Symmetry, alpha: &Self, x: &V, a: &mut Matrix); } @@ -467,10 +527,16 @@ macro_rules! spr_impl(($($t: ident), +) => ( spr_impl!(f32, f64); +/// Symmetric packed matrix rank-2 update +/// +/// A ← A + αxyT + αyxT pub trait Spr2: Sized { fn spr2, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, x: &V, y: &W, a: &mut Matrix); } +/// Hermitian packed matrix rank-2 update +/// +/// A ← A + αxyH + y(αx)H pub trait Hpr2: Sized { fn hpr2, W: ?Sized + Vector>(symmetry: Symmetry, alpha: &Self, x: &V, y: &W, a: &mut Matrix); }