Skip to main content

quantrs2_sim/quantum_gravity_simulation/
quantumgravitysimulator_measure_cdt_geometry_group.rs

1//! # QuantumGravitySimulator - measure_cdt_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::*;
9
10use super::types::{GeometryMeasurements, SimplicialComplex, TopologyMeasurements};
11
12use super::quantumgravitysimulator_type::QuantumGravitySimulator;
13
14impl QuantumGravitySimulator {
15    /// Measure CDT geometry properties
16    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    /// Calculate Euler characteristic of simplicial complex
61    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}