Skip to main content

quantrs2_sim/quantum_gravity_simulation/
quantumgravitysimulator_calculate_angle_group.rs

1//! # QuantumGravitySimulator - calculate_angle_group Methods
2//!
3//! This module contains method implementations for `QuantumGravitySimulator`.
4//!
5//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
6
7use crate::error::{Result, SimulatorError};
8use scirs2_core::random::prelude::*;
9
10use super::types::SpacetimeVertex;
11
12use super::quantumgravitysimulator_type::QuantumGravitySimulator;
13
14impl QuantumGravitySimulator {
15    /// Calculate angle between three vertices
16    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}