mirror of
https://github.com/allaunthefox/Research-Stack.git
synced 2026-07-31 03:05:21 +00:00
162 lines
5.5 KiB
Python
162 lines
5.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Manifold Shape Visualizer for Research Stack
|
|
Maps PIST/SVQF/FAMM structures from quaternion/braid formalism.
|
|
"""
|
|
|
|
import numpy as np
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Add infrastructure paths
|
|
sys.path.insert(0, str(Path("/home/allaun/Documents/Research Stack/4-Infrastructure/shims")))
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Tuple, List
|
|
import json
|
|
|
|
|
|
@dataclass
|
|
class QuaternionField:
|
|
"""S³ manifold point with quaternion coordinates."""
|
|
w: float
|
|
x: float
|
|
y: float
|
|
z: float
|
|
|
|
def normalize(self):
|
|
norm = np.sqrt(self.w**2 + self.x**2 + self.y**2 + self.z**2)
|
|
return QuaternionField(self.w/norm, self.x/norm, self.y/norm, self.z/norm)
|
|
|
|
def to_cartesian(self) -> Tuple[float, float, float]:
|
|
"""Stereographic projection to R³."""
|
|
return (
|
|
self.x / (1 - self.w + 1e-10),
|
|
self.y / (1 - self.w + 1e-10),
|
|
self.z / (1 - self.w + 1e-10)
|
|
)
|
|
|
|
|
|
class ManifoldMapper:
|
|
"""
|
|
Maps high-dimensional search space to visualizable manifold.
|
|
Uses quaternion sieve + braid bracket topology.
|
|
"""
|
|
|
|
def __init__(self, resolution: int = 64):
|
|
self.resolution = resolution
|
|
self.points: List[QuaternionField] = []
|
|
self.trajectories: List[List[QuaternionField]] = []
|
|
|
|
def generate_pist_shell(self, k: int, t: int, mass: int) -> np.ndarray:
|
|
"""
|
|
Generate PIST shell coordinates.
|
|
PIST: Perfectly Imperfect Square Theory
|
|
Shell index: (k, t, mass=a*b)
|
|
"""
|
|
# Integer-based shell as per NES-compatible fixed-point design
|
|
a = int(np.sqrt(mass)) if mass > 0 else 1
|
|
b = mass // a if a > 0 else 1
|
|
|
|
theta = 2 * np.pi * k / self.resolution
|
|
phi = np.pi * t / self.resolution
|
|
|
|
# Quaternion from spherical coordinates
|
|
w = np.cos(theta/2) * np.cos(phi/2)
|
|
x = np.sin(theta/2) * np.cos(phi/2)
|
|
y = np.sin(theta/2) * np.sin(phi/2)
|
|
z = np.cos(theta/2) * np.sin(phi/2)
|
|
|
|
return np.array([w, x, y, z])
|
|
|
|
def sieve_filter(self, points: np.ndarray, threshold: float = 0.5) -> np.ndarray:
|
|
"""
|
|
Quaternion sieve: counter-rotation band-pass filter.
|
|
Only points with specific phase alignment survive.
|
|
"""
|
|
# Apply counter-rotation filter (q at layer N, q⁻¹ at layer N-1)
|
|
phases = np.arctan2(points[:, 2], points[:, 1]) # y/x phase
|
|
aligned = np.abs(np.sin(phases * 2)) > threshold
|
|
return points[aligned]
|
|
|
|
def compute_frustration(self, point: np.ndarray, neighbors: np.ndarray) -> float:
|
|
"""
|
|
FAMM frustration calculation on stress tensor.
|
|
Φ > 1 regions are discarded (pruned search space).
|
|
"""
|
|
if len(neighbors) == 0:
|
|
return 0.0
|
|
|
|
# Stress tensor: deviation from local manifold smoothness
|
|
center = point[:3] / (point[0] + 1e-10) # Stereographic
|
|
neigh_centers = neighbors[:, :3] / (neighbors[:, 0:1] + 1e-10)
|
|
|
|
deltas = neigh_centers - center
|
|
stress = np.mean(np.linalg.norm(deltas, axis=1))
|
|
|
|
# Frustration metric Φ
|
|
phi = stress / (np.linalg.norm(center) + 1e-10)
|
|
return float(phi)
|
|
|
|
def map_manifold(self, output_path: str = None) -> dict:
|
|
"""Generate complete manifold map with all layers."""
|
|
print("Generating manifold shape map...")
|
|
|
|
all_points = []
|
|
|
|
# Layer 0: Core PIST shells
|
|
for k in range(self.resolution):
|
|
for t in range(self.resolution//2):
|
|
mass = (k + 1) * (t + 1)
|
|
q = self.generate_pist_shell(k, t, mass)
|
|
all_points.append(q)
|
|
|
|
points_array = np.array(all_points)
|
|
|
|
# Layer 1: Quaternion sieve (band-pass)
|
|
filtered = self.sieve_filter(points_array, threshold=0.3)
|
|
|
|
# Layer 2: FAMM frustration pruning
|
|
survivors = []
|
|
for i, pt in enumerate(filtered[:1000]): # Sample for performance
|
|
neighbors = filtered[max(0, i-5):min(len(filtered), i+5)]
|
|
frustration = self.compute_frustration(pt, neighbors)
|
|
if frustration <= 1.0: # Keep only low-frustration regions
|
|
survivors.append(pt)
|
|
|
|
result = {
|
|
"total_points": len(all_points),
|
|
"post_sieve": len(filtered),
|
|
"post_famm": len(survivors),
|
|
"resolution": self.resolution,
|
|
"manifold_type": "S3_quaternion_braid",
|
|
"compression_ratio": len(survivors) / len(all_points) if all_points else 0,
|
|
"sample_points": [p.tolist() for p in survivors[:20]]
|
|
}
|
|
|
|
if output_path:
|
|
Path(output_path).parent.mkdir(parents=True, exist_ok=True)
|
|
with open(output_path, 'w') as f:
|
|
json.dump(result, f, indent=2)
|
|
print(f"Manifold map saved to {output_path}")
|
|
|
|
print(f" Total: {result['total_points']}")
|
|
print(f" Post-sieve: {result['post_sieve']}")
|
|
print(f" Post-FAMM: {result['post_famm']}")
|
|
print(f" Compression: {result['compression_ratio']:.3f}")
|
|
|
|
return result
|
|
|
|
|
|
def main():
|
|
mapper = ManifoldMapper(resolution=32)
|
|
|
|
output = "/home/allaun/Documents/Research Stack/shared-data/manifold_map.json"
|
|
result = mapper.map_manifold(output)
|
|
|
|
print("\nManifold shape mapping complete.")
|
|
print("Use with: jupyter notebook 5-Applications/scripts/manifold_viz.ipynb")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|