use std::cmp::Ordering;
pub use crate::traits::{Number, Signed};
pub use crate::vector::Vector;
impl<T: std::cmp::PartialEq> Vector<T> {
#[inline]
pub fn find(&self, value: T ) -> usize {
let index = self.vec.iter().position( |x| *x == value );
match index {
Some(index) => return index,
None => self.size() - 1, }
}
}
impl<T: Copy> Vector<T> {
#[inline]
pub fn assign(&mut self, elem: T ) {
for i in 0..self.size() {
self.vec[i] = elem;
}
}
}
impl<T: std::default::Default> Vector<T> {
#[inline]
pub fn resize(&mut self, new_size: usize ) {
self.vec.resize_with( new_size, Default::default );
}
}
impl<T: Copy + Number> Vector<T> {
#[inline]
pub fn dot(&self, w: &Vector<T>) -> T {
if self.size() != w.size() { panic!( "Vector sizes do not agree dot()." ); }
let mut result: T = T::zero();
for i in 0..self.size() {
result += self.vec[i] * w.vec[i];
}
result
}
#[inline]
pub fn sum(&self) -> T {
self.sum_slice( 0, self.size() - 1 )
}
#[inline]
pub fn sum_slice(&self, start: usize, end: usize) -> T {
if start > end { panic!( "Vector sum: start > end." ); }
if self.size() <= start { panic!( "Vector range error." ); }
if self.size() <= end { panic!( "Vector range error." ); }
let mut result: T = T::zero();
for i in start..=end {
result += self.vec[i].clone();
}
result
}
#[inline]
pub fn product(&self) -> T {
self.product_slice( 0, self.size() - 1 )
}
#[inline]
pub fn product_slice(&self, start: usize, end: usize) -> T {
if start > end { panic!( "Vector sum: start > end." ); }
if self.size() <= start { panic!( "Vector range error." ); }
if self.size() <= end { panic!( "Vector range error." ); }
let mut result: T = self.vec[start].clone();
for i in start+1..=end {
result *= self.vec[i].clone();
}
result
}
}
impl<T: Clone + Signed + Number> Vector<T> {
#[inline]
pub fn abs(&self) -> Self {
let size = self.size();
let mut vec = vec![ T::zero(); size ];
for i in 0..size {
vec[i] = self.vec[i].abs();
}
Vector { vec } }
#[inline]
pub fn norm_1(&self) -> T {
let mut result = T::zero();
for i in 0..self.size() {
result += self.vec[i].abs();
}
result
}
}
impl<T: Ord + PartialEq + PartialOrd> Vector<T>
{
pub fn sort(&mut self) {
self.vec.sort_unstable();
}
}
impl<T: PartialEq + PartialOrd> Vector<T>
{
pub fn sort_by<F>(&mut self, compare: F )
where
F: FnMut(&T, &T) -> Ordering,
{
self.vec.sort_unstable_by( compare );
}
}