rust_tensors/
addressable.rs

1use std::hash::Hash;
2
3pub trait Addressable: PartialEq + Ord + Sized + Copy + Hash {
4    fn get_dimension_count() -> u32;
5    fn new_from_value_vec(values: Vec<i64>) -> Self;
6    fn get_item_at_dimension_index(&self, dimension_index: u32) -> &i64;
7    fn add(&self, other: &Self) -> Self {
8        Self::new_from_value_vec(
9            (0..Self::get_dimension_count())
10                .into_iter()
11                .map(|dimension_index: u32| {
12                    self.get_item_at_dimension_index(dimension_index)
13                        + other.get_item_at_dimension_index(dimension_index)
14                })
15                .collect(),
16        )
17    }
18    fn subtract(&self, other: &Self) -> Self {
19        Self::new_from_value_vec(
20            (0..Self::get_dimension_count())
21                .into_iter()
22                .map(|dimension_index: u32| {
23                    self.get_item_at_dimension_index(dimension_index)
24                        - other.get_item_at_dimension_index(dimension_index)
25                })
26                .collect(),
27        )
28    }
29    fn difference(&self, other: &Self) -> Self {
30        Self::new_from_value_vec(
31            (0..Self::get_dimension_count())
32                .into_iter()
33                .map(|dimension_index: u32| {
34                    (self.get_item_at_dimension_index(dimension_index)
35                        - other.get_item_at_dimension_index(dimension_index))
36                    .abs()
37                })
38                .collect(),
39        )
40    }
41    fn distance(&self, other: &Self) -> f64 {
42        ((0..Self::get_dimension_count())
43            .into_iter()
44            .map(|dimension_index: u32| {
45                (self.get_item_at_dimension_index(dimension_index)
46                    - other.get_item_at_dimension_index(dimension_index))
47                .pow(2)
48            })
49            .reduce(|acc, e| acc + e)
50            .unwrap() as f64)
51            .sqrt()
52    }
53    fn scale(&self, scalar: f64) -> Self {
54        Self::new_from_value_vec(
55            (0..Self::get_dimension_count())
56                .into_iter()
57                .map(|dimension_index: u32| {
58                    ((*self.get_item_at_dimension_index(dimension_index) as f64) * scalar) as i64
59                })
60                .collect(),
61        )
62    }
63}