1use thiserror::Error;
4
5#[derive(Debug, Clone, PartialEq, Eq, Error)]
7pub enum UtilError {
8 #[error("Vectors must have the same length")]
10 VectorLengthMismatch,
11}
12
13pub fn cosine_similarity(vector1: &[f64], vector2: &[f64]) -> Result<f64, UtilError> {
26 if vector1.len() != vector2.len() {
27 return Err(UtilError::VectorLengthMismatch);
28 }
29
30 let n = vector1.len();
31 if n == 0 {
32 return Ok(0.0);
33 }
34
35 let mut magnitude_squared_1 = 0.0;
36 let mut magnitude_squared_2 = 0.0;
37 let mut dot_product = 0.0;
38
39 for i in 0..n {
40 let value1 = vector1[i];
41 let value2 = vector2[i];
42 magnitude_squared_1 += value1 * value1;
43 magnitude_squared_2 += value2 * value2;
44 dot_product += value1 * value2;
45 }
46
47 if magnitude_squared_1 == 0.0 || magnitude_squared_2 == 0.0 {
48 Ok(0.0)
49 } else {
50 Ok(dot_product / (magnitude_squared_1.sqrt() * magnitude_squared_2.sqrt()))
51 }
52}