Skip to main content

qualia_core_db/tensor/
topology.rs

1//! Topological classes (v) for geometric physics rules
2
3use serde::{Deserialize, Serialize};
4
5/// Topological class variants
6#[repr(C)]
7#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
8pub enum TopologyClass {
9    /// Euclidean (flat semantic proximity, standard distance)
10    Euclidean = 0,
11    /// Cyclic / Toroidal (feedback loops, circadian rhythms, periodic states)
12    Cyclic = 1,
13    /// Hyperbolic / Tree (hierarchies, family trees, taxonomies)
14    Hyperbolic = 2,
15    /// Self-contained Boundary Cliques / Community Classes
16    BoundaryCliques = 3,
17}
18
19impl Default for TopologyClass {
20    fn default() -> Self {
21        TopologyClass::Euclidean
22    }
23}
24
25impl TopologyClass {
26    /// Calculate distance between two points based on topology class
27    pub fn calculate_distance(&self, p1: (f32, f32, f32), p2: (f32, f32, f32)) -> f32 {
28        match self {
29            TopologyClass::Euclidean => {
30                let dx = p1.0 - p2.0;
31                let dy = p1.1 - p2.1;
32                let dz = p1.2 - p2.2;
33                (dx * dx + dy * dy + dz * dz).sqrt()
34            }
35            TopologyClass::Cyclic => {
36                // Modulo-based distance for cyclic topology
37                let dx = (p1.0 - p2.0).abs().min(1.0 - (p1.0 - p2.0).abs());
38                let dy = (p1.1 - p2.1).abs().min(1.0 - (p1.1 - p2.1).abs());
39                let dz = (p1.2 - p2.2).abs().min(1.0 - (p1.2 - p2.2).abs());
40                (dx * dx + dy * dy + dz * dz).sqrt()
41            }
42            TopologyClass::Hyperbolic => {
43                // Exponential distance for tree/hierarchy topology
44                let dx = (p1.0 - p2.0).abs();
45                let dy = (p1.1 - p2.1).abs();
46                let dz = (p1.2 - p2.2).abs();
47                (dx.exp() + dy.exp() + dz.exp()).ln()
48            }
49            TopologyClass::BoundaryCliques => {
50                // Byte comparison for clique membership
51                if p1 == p2 {
52                    0.0
53                } else {
54                    1.0
55                }
56            }
57        }
58    }
59}