quantrs2_sim/quantum_gravity_simulation/
quantumgravitysimulator_measure_cdt_geometry_group.rs1use crate::error::{Result, SimulatorError};
8use scirs2_core::random::prelude::*;
9
10use super::types::{GeometryMeasurements, SimplicialComplex, TopologyMeasurements};
11
12use super::quantumgravitysimulator_type::QuantumGravitySimulator;
13
14impl QuantumGravitySimulator {
15 pub(super) fn measure_cdt_geometry(
17 &self,
18 complex: &SimplicialComplex,
19 ) -> Result<GeometryMeasurements> {
20 let area_spectrum: Vec<f64> = complex
21 .time_slices
22 .iter()
23 .map(|slice| slice.spatial_volume.powf(2.0 / 3.0))
24 .collect();
25 let volume_spectrum: Vec<f64> = complex
26 .time_slices
27 .iter()
28 .map(|slice| slice.spatial_volume)
29 .collect();
30 let length_spectrum: Vec<f64> = complex
31 .simplices
32 .iter()
33 .map(|_| self.config.planck_length)
34 .collect();
35 let discrete_curvature: f64 = complex
36 .time_slices
37 .iter()
38 .map(|slice| slice.curvature)
39 .sum::<f64>()
40 / complex.time_slices.len() as f64;
41 let topology_measurements = TopologyMeasurements {
42 euler_characteristic: self.calculate_euler_characteristic(complex)?,
43 betti_numbers: vec![1, 0, 0, 1],
44 homology_groups: vec![
45 "Z".to_string(),
46 "0".to_string(),
47 "0".to_string(),
48 "Z".to_string(),
49 ],
50 fundamental_group: "trivial".to_string(),
51 };
52 Ok(GeometryMeasurements {
53 area_spectrum,
54 volume_spectrum,
55 length_spectrum,
56 discrete_curvature,
57 topology_measurements,
58 })
59 }
60 pub(super) fn calculate_euler_characteristic(
62 &self,
63 complex: &SimplicialComplex,
64 ) -> Result<i32> {
65 let vertices = complex.vertices.len() as i32;
66 let edges = complex
67 .simplices
68 .iter()
69 .map(|s| s.vertices.len() * (s.vertices.len() - 1) / 2)
70 .sum::<usize>() as i32;
71 let faces = complex.simplices.len() as i32;
72 Ok(vertices - edges + faces)
73 }
74}