qualia_core_db/tensor/
topology.rs1use serde::{Deserialize, Serialize};
4
5#[repr(C)]
7#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
8pub enum TopologyClass {
9 Euclidean = 0,
11 Cyclic = 1,
13 Hyperbolic = 2,
15 BoundaryCliques = 3,
17}
18
19impl Default for TopologyClass {
20 fn default() -> Self {
21 TopologyClass::Euclidean
22 }
23}
24
25impl TopologyClass {
26 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 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 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 if p1 == p2 {
52 0.0
53 } else {
54 1.0
55 }
56 }
57 }
58 }
59}