feat: adds serialization/deserialization methods

This commit is contained in:
Volodymyr Orlov
2020-04-03 11:12:15 -07:00
parent 5766364311
commit eb0c36223f
16 changed files with 555 additions and 159 deletions
+29 -10
View File
@@ -1,20 +1,39 @@
use serde::{Serialize, Deserialize};
use crate::math::num::FloatExt;
pub fn distance<T: FloatExt>(x: &Vec<T>, y: &Vec<T>) -> T {
return squared_distance(x, y).sqrt();
use super::Distance;
#[derive(Serialize, Deserialize, Debug)]
pub struct Euclidian {
}
pub fn squared_distance<T: FloatExt>(x: &Vec<T>,y: &Vec<T>) -> T {
if x.len() != y.len() {
panic!("Input vector sizes are different.");
impl Euclidian {
pub fn squared_distance<T: FloatExt>(x: &Vec<T>,y: &Vec<T>) -> T {
if x.len() != y.len() {
panic!("Input vector sizes are different.");
}
let mut sum = T::zero();
for i in 0..x.len() {
sum = sum + (x[i] - y[i]).powf(T::two());
}
sum
}
let mut sum = T::zero();
for i in 0..x.len() {
sum = sum + (x[i] - y[i]).powf(T::two());
pub fn distance<T: FloatExt>(x: &Vec<T>, y: &Vec<T>) -> T {
Euclidian::squared_distance(x, y).sqrt()
}
}
impl<T: FloatExt> Distance<Vec<T>, T> for Euclidian {
fn distance(x: &Vec<T>, y: &Vec<T>) -> T {
Self::distance(x, y)
}
return sum;
}
@@ -27,7 +46,7 @@ mod tests {
let a = vec![1., 2., 3.];
let b = vec![4., 5., 6.];
let d_arr: f64 = distance(&a, &b);
let d_arr: f64 = Euclidian::distance(&a, &b);
assert!((d_arr - 5.19615242).abs() < 1e-8);
}
+16 -1
View File
@@ -1 +1,16 @@
pub mod euclidian;
pub mod euclidian;
use crate::math::num::FloatExt;
pub trait Distance<T, F: FloatExt>{
fn distance(a: &T, b: &T) -> F;
}
pub struct Distances{
}
impl Distances {
pub fn euclidian() -> euclidian::Euclidian{
euclidian::Euclidian {}
}
}