rust_tensors/
addressable.rs1use 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}