Skip to main content

quantrs2_sim/quantum_gravity_simulation/
quantumgravitysimulator_measure_quantum_geometry_group.rs

1//! # QuantumGravitySimulator - measure_quantum_geometry_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::*;
9use std::f64::consts::PI;
10
11use super::types::{GeometryMeasurements, SpinNetwork, TopologyMeasurements};
12
13use super::quantumgravitysimulator_type::QuantumGravitySimulator;
14
15impl QuantumGravitySimulator {
16    /// Measure quantum geometry properties
17    pub(super) fn measure_quantum_geometry(
18        &self,
19        spin_network: &SpinNetwork,
20    ) -> Result<GeometryMeasurements> {
21        let area_spectrum: Vec<f64> = spin_network
22            .edges
23            .iter()
24            .map(|edge| (edge.spin * (edge.spin + 1.0)).sqrt() * self.config.planck_length.powi(2))
25            .collect();
26        let volume_spectrum: Vec<f64> = spin_network
27            .nodes
28            .iter()
29            .map(|node| {
30                node.quantum_numbers.iter().sum::<f64>().sqrt() * self.config.planck_length.powi(3)
31            })
32            .collect();
33        let length_spectrum: Vec<f64> = spin_network.edges.iter().map(|edge| edge.length).collect();
34        let discrete_curvature = self.calculate_discrete_curvature(spin_network)?;
35        let topology_measurements = TopologyMeasurements {
36            euler_characteristic: (spin_network.nodes.len() as i32)
37                - (spin_network.edges.len() as i32)
38                + 1,
39            betti_numbers: vec![1, 0, 0],
40            homology_groups: vec!["Z".to_string(), "0".to_string(), "0".to_string()],
41            fundamental_group: "trivial".to_string(),
42        };
43        Ok(GeometryMeasurements {
44            area_spectrum,
45            volume_spectrum,
46            length_spectrum,
47            discrete_curvature,
48            topology_measurements,
49        })
50    }
51    /// Calculate discrete curvature from spin network
52    pub(super) fn calculate_discrete_curvature(&self, spin_network: &SpinNetwork) -> Result<f64> {
53        let mut total_curvature = 0.0;
54        for node in &spin_network.nodes {
55            let expected_angle = 2.0 * PI;
56            let actual_angle: f64 = node
57                .quantum_numbers
58                .iter()
59                .map(|&j| 2.0 * (j * PI / node.valence as f64))
60                .sum();
61            let curvature = (expected_angle - actual_angle) / self.config.planck_length.powi(2);
62            total_curvature += curvature;
63        }
64        Ok(total_curvature / spin_network.nodes.len() as f64)
65    }
66}