use std::ops::{Index, IndexMut, Add, Sub, Mul};
use std::cmp::{PartialEq};
use std::fmt::{self, Display};
use std::marker::Copy;
use crate::types::matrix::Matrix;
#[derive(Clone)]
pub struct Vector {
m_data: Matrix,
m_len: usize,
}
impl Vector {
pub fn new(len: usize) -> Vector{
let n: usize = len;
let m : Vector = Vector {
m_data: Matrix::new(n,1),
m_len : n,
};
return m;
}
}
impl Index<usize> for Vector {
type Output = f64;
fn index(&self, i: usize) -> &Self::Output {
return &self.m_data[(i,0)];
}
}
impl IndexMut<usize> for Vector {
fn index_mut(&mut self, i: usize) -> &mut Self::Output {
return &mut self.m_data[(i,0)];
}
}
impl fmt::Display for Vector {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for row in 0..self.m_len {
write!(f, "{:?}\n", self[row]);
}
Ok(())
}
}
impl PartialEq for Vector {
fn eq(&self, other: &Vector) -> bool {
return self.m_data == other.m_data;
}
}
impl Mul<f64> for &Vector {
type Output = Vector;
fn mul(self, rhs: f64) -> Self::Output {
let mut m: Vector = Vector::new(self.m_len);
for i in 0..self.m_len {
m[i] = self[i] * rhs;
}
return m;
}
}
impl Mul<&Vector> for f64 {
type Output = Vector;
fn mul(self, rhs: &Vector) -> Self::Output {
let mut m: Vector = Vector::new(rhs.m_len);
for i in 0..rhs.m_len {
m[i] = rhs[i] * self;
}
return m;
}
}
impl Add for &Vector {
type Output = Vector;
fn add(self, other: &Vector) -> Vector {
let mut m: Vector = Vector::new(self.m_len);
for i in 0..self.m_len {
m[i] = self[i] + other[i];
}
return m;
}
}
impl Sub for &Vector {
type Output = Vector;
fn sub(self, other: &Vector) -> Vector {
let mut m: Vector = Vector::new(self.m_len);
m = self + &(-1.0f64 * other);
return m;
}
}