use super::Scalar;
pub trait VectorView<F: Scalar> {
fn len(&self) -> usize;
fn get(&self, index: usize) -> F;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn sum(&self) -> F {
(0..self.len()).map(|i| self.get(i)).sum()
}
}
pub trait VectorViewMut<F: Scalar>: VectorView<F> {
fn set(&mut self, index: usize, value: F);
}
impl<F: Scalar> VectorView<F> for [F] {
fn len(&self) -> usize {
<[F]>::len(self)
}
fn get(&self, index: usize) -> F {
self[index]
}
}
impl<F: Scalar> VectorViewMut<F> for [F] {
fn set(&mut self, index: usize, value: F) {
self[index] = value;
}
}
impl<F: Scalar> VectorView<F> for Vec<F> {
fn len(&self) -> usize {
Vec::len(self)
}
fn get(&self, index: usize) -> F {
self[index]
}
}
impl<F: Scalar> VectorViewMut<F> for Vec<F> {
fn set(&mut self, index: usize, value: F) {
self[index] = value;
}
}
impl<F: Scalar, const N: usize> VectorView<F> for [F; N] {
fn len(&self) -> usize {
N
}
fn get(&self, index: usize) -> F {
self[index]
}
}
impl<F: Scalar, const N: usize> VectorViewMut<F> for [F; N] {
fn set(&mut self, index: usize, value: F) {
self[index] = value;
}
}
pub trait DotProduct<F: Scalar> {
fn dot(&self, other: &Self) -> F;
}
pub trait L2Norm<F: Scalar> {
fn norm_l2(&self) -> F;
}
pub trait ScaledAddAssign<F: Scalar> {
fn scaled_add_assign(&mut self, alpha: F, other: &Self);
}
pub trait ScaleAssign<F: Scalar> {
fn scale_assign(&mut self, alpha: F);
}
pub trait ElemDivAssign<F: Scalar> {
fn elem_div_assign(&mut self, coeffs: &[F]);
}
pub trait DotSlice<F: Scalar> {
fn dot_slice(&self, coeffs: &[F]) -> F;
}
pub trait SubScalarAssign<F: Scalar> {
fn sub_scalar_assign(&mut self, k: F);
}
pub trait SumEntries<F: Scalar> {
fn sum_entries(&self) -> F;
}
pub trait ScaledSubSlice<F: Scalar> {
fn scaled_sub_slice(&mut self, k: F, coeffs: &[F]);
}