Research-Stack/5-Applications/scripts/manifold_visualizer.py

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()