quantrs2_sim/quantum_gravity_simulation/
quantumgravitysimulator_calculate_angle_group.rs1use crate::error::{Result, SimulatorError};
8use scirs2_core::random::prelude::*;
9
10use super::types::SpacetimeVertex;
11
12use super::quantumgravitysimulator_type::QuantumGravitySimulator;
13
14impl QuantumGravitySimulator {
15 pub(super) fn calculate_angle(
17 &self,
18 v1: &SpacetimeVertex,
19 v2: &SpacetimeVertex,
20 v3: &SpacetimeVertex,
21 ) -> Result<f64> {
22 let vec1: Vec<f64> = v1
23 .coordinates
24 .iter()
25 .zip(&v2.coordinates)
26 .map(|(a, b)| a - b)
27 .collect();
28 let vec2: Vec<f64> = v3
29 .coordinates
30 .iter()
31 .zip(&v2.coordinates)
32 .map(|(a, b)| a - b)
33 .collect();
34 let dot_product: f64 = vec1.iter().zip(&vec2).map(|(a, b)| a * b).sum();
35 let norm1: f64 = vec1.iter().map(|x| x.powi(2)).sum::<f64>().sqrt();
36 let norm2: f64 = vec2.iter().map(|x| x.powi(2)).sum::<f64>().sqrt();
37 if norm1 * norm2 == 0.0 {
38 return Ok(0.0);
39 }
40 let cos_angle = dot_product / (norm1 * norm2);
41 Ok(cos_angle.acos())
42 }
43}