1use std::ops:: {Add, Sub, Mul};
2use serde::{Serialize, Deserialize};
3
4#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
5pub struct Vector {
6 pub values : Vec<f64>
7}
8
9impl Vector {
10 pub fn len(&self) -> usize {
11 self.values.len()
12 }
13
14 pub fn is_empty(&self) -> bool {
15 self.values.is_empty()
16 }
17
18 pub fn norm(&self) -> f64 {
19 let mut sum = 0.;
20 for x in self.values.iter() {
21 sum += x*x;
22 }
23 sum.sqrt()
24 }
25
26 pub fn null(n : usize) -> Vector {
27 Vector { values : vec![0.;n] }
28 }
29}
30
31impl Add for &Vector {
32 type Output = Result<Vector, &'static str>;
33
34 fn add(self, other: Self) -> Self::Output {
35 if self.values.len() == other.values.len() {
36 let mut result = vec![];
37 for i in 0..self.values.len() {
38 result.push(self.values[i] + other.values[i])
39 }
40 Ok(Vector { values: result })
41 } else {
42 Err("Wrong shapes")
43 }
44 }
45}
46
47impl Sub for &Vector {
48 type Output = Result<Vector, &'static str>;
49
50 fn sub(self, other: Self) -> Self::Output {
51 if self.values.len() == other.values.len() {
52 let mut result = vec![];
53 for i in 0..self.values.len() {
54 result.push(self.values[i] - other.values[i])
55 }
56 Ok(Vector { values: result })
57 } else {
58 Err("Wrong shapes")
59 }
60 }
61}
62
63impl Mul for &Vector {
64 type Output = Result<f64, &'static str>;
65
66 fn mul(self, other: Self) -> Self::Output {
67 if self.values.len() == other.values.len() {
68 let mut result = 0.;
69 for i in 0..self.values.len() {
70 result += self.values[i] * other.values[i];
71 }
72 Ok(result)
73 } else {
74 Err("Wrong shapes")
75 }
76 }
77}
78
79impl Mul<f64> for &Vector {
80 type Output = Vector;
81
82 fn mul(self, other: f64) -> Self::Output {
83 let mut result = self.clone();
84 for i in 0..self.len() {
85 result.values[i] *= other;
86 }
87 result
88 }
89}