quantrs2_sim/quantum_gravity_simulation/
quantumgravitysimulator_measure_quantum_geometry_group.rs1use 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 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 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}