SilverSight/tests/test_nuvmap_equivalence.py

288 lines
10 KiB
Python

#!/usr/bin/env python3
"""
NUVMAP Equivalence Test — SilverSight vs Research Stack Archive
Compares the Q16_16 SilverSight port against the original float-based
Research Stack implementation.
Key difference accounted for:
Original: epsilon = 1e-12 (unphysically small)
Ported: Q16_EPSILON = 1 ≈ 1.5e-5 (smallest Q16_16 step)
This creates a systematic ~±1 Q16_16 step divergence in E_i.
All other divergence is pure Q16_16 quantization (±0.5 LSB).
Run: python -m tests.test_nuvmap_equivalence
"""
import sys
import importlib.util
# Import original (float) from Research Stack
spec_orig = importlib.util.spec_from_file_location(
"original_nuvmap",
"/home/allaun/Research Stack/5-Applications/cff/nuvmap/projection_engine.py"
)
orig_mod = importlib.util.module_from_spec(spec_orig)
spec_orig.loader.exec_module(orig_mod)
OriginalEngine = orig_mod.NUVMAPProjectionEngine
OriginalSurface = orig_mod.NUVMAPSurface
# Import ported (Q16_16) from SilverSight
spec_ptd = importlib.util.spec_from_file_location(
"ported_nuvmap",
"/home/allaun/SilverSight/python/nuvmap/projection_engine.py"
)
ptd_mod = importlib.util.module_from_spec(spec_ptd)
spec_ptd.loader.exec_module(ptd_mod)
PortedEngine = ptd_mod.NUVMAPProjectionEngine
PortedSurface = ptd_mod.NUVMAPSurface
Q16_ONE = ptd_mod.Q16_ONE
Q16_HALF = ptd_mod.Q16_HALF
Q16_PCT1 = ptd_mod.Q16_PCT1
Q16_EPSILON = ptd_mod.Q16_EPSILON
SCALE = ptd_mod.SCALE
# ── helpers ──────────────────────────────────────────────────────────
def f2q(f: float) -> int:
import math
if math.isnan(f) or math.isinf(f):
return 0
return max(-2147483648, min(2147483647, round(f * SCALE)))
def q2f(q: int) -> float:
return q / SCALE
TEST_DATA = [
{"equation_id": 1, "amvr": 0.8, "avmr": 0.75, "chiral_residual": 0.05, "chiral_state": "achiral_stable"},
{"equation_id": 2, "amvr": 0.3, "avmr": 0.4, "chiral_residual": 0.2, "chiral_state": "left_handed_mass_bias"},
{"equation_id": 3, "amvr": 0.1, "avmr": 0.15, "chiral_residual": 0.6, "chiral_state": "chiral_scarred"},
{"equation_id": 4, "amvr": 0.5, "avmr": 0.5, "chiral_residual": 0.1, "chiral_state": "right_handed_vector_bias"},
{"equation_id": 5, "amvr": 0.9, "avmr": 0.85, "chiral_residual": 0.02, "chiral_state": "achiral_stable"},
]
def to_q16(data: list) -> list:
return [{
"equation_id": d["equation_id"],
"amvr_q16": f2q(d["amvr"]),
"avmr_q16": f2q(d["avmr"]),
"chiral_residual_q16": f2q(d["chiral_residual"]),
"chiral_state": d["chiral_state"],
} for d in data]
# ── Comparators ─────────────────────────────────────────────────────
def cmp_float_vs_q16(oc, pc, label="", rel_tol=0.02) -> bool:
"""Compare float cell with Q16_16 cell. Tolerates ε quantization."""
fields = [
("E_i", oc.E_i, pc.E_i),
("R_i", oc.R_i, pc.R_i),
("chi_i", oc.chi_i, pc.chi_i),
("S_i", oc.S_i, pc.S_i),
("L_i", oc.L_i, pc.L_i),
]
ok = True
for name, fval, qval in fields:
f2 = q2f(qval)
if fval == 0.0:
diff = abs(f2)
else:
diff = abs(f2 - fval)
reld = diff / max(abs(fval), 1e-12)
if reld > rel_tol and diff > 2 / SCALE:
print(f" {label}{name}: float={fval:.6f} q16={f2:.6f} diff={diff:.6f} rel={reld:.4f}")
ok = False
q_diff = abs(pc.q_i - oc.q_i)
q_reld = q_diff / max(oc.q_i, 1)
if q_diff > 1 and q_reld > 0.01:
print(f" {label}q_i: float={oc.q_i} q16={pc.q_i} rel={q_reld:.4f}")
ok = False
if oc.admissible != pc.admissible:
print(f" {label}admissible: float={oc.admissible} q16={pc.admissible}")
ok = False
return ok
def cmp_q16_vs_q16(a, b, label="", tol=0) -> bool:
"""Compare two Q16_16 cells (exact match for round-trip)."""
for name in ("u_i", "v_i", "k_i", "E_i", "R_i", "chi_i", "S_i", "L_i", "q_i", "equation_id"):
va, vb = getattr(a, name), getattr(b, name)
if abs(va - vb) > tol:
print(f" {label}{name}: {va} vs {vb}")
return False
if a.admissible != b.admissible:
print(f" {label}admissible: {a.admissible} vs {b.admissible}")
return False
if a.fingerprint != b.fingerprint:
print(f" {label}fingerprint: {a.fingerprint[:16]} vs {b.fingerprint[:16]}")
return False
return True
def cmp_surface_float_vs_q16(o, p, rel_tol=0.02) -> bool:
if len(o.cells) != len(p.cells):
print(f"Cell count: float={len(o.cells)} q16={len(p.cells)}")
return False
ok = True
for i, (oc, pc) in enumerate(zip(o.cells, p.cells)):
if not cmp_float_vs_q16(oc, pc, f"cell[{i}] ", rel_tol):
ok = False
if o.total_qubits != p.total_qubits:
reld = abs(p.total_qubits - o.total_qubits) / max(o.total_qubits, 1)
if reld > 0.01:
print(f"total_qubits: float={o.total_qubits} q16={p.total_qubits} rel={reld:.4f}")
ok = False
for name in ("bekenstein_bound", "area_utilization"):
fv = getattr(o, name)
qv = q2f(getattr(p, name))
reld = abs(qv - fv) / max(abs(fv), 1e-12)
if reld > rel_tol:
print(f"{name}: float={fv:.6f} q16={qv:.6f} rel={reld:.4f}")
ok = False
return ok
def cmp_surface_q16_vs_q16(a, b, tol=0) -> bool:
if len(a.cells) != len(b.cells):
print(f"Cell count: {len(a.cells)} vs {len(b.cells)}")
return False
ok = True
for i, (ac, bc) in enumerate(zip(a.cells, b.cells)):
if not cmp_q16_vs_q16(ac, bc, f"cell[{i}] ", tol):
ok = False
for name in ("total_qubits", "bekenstein_bound", "area_utilization", "root_fingerprint"):
if getattr(a, name) != getattr(b, name):
print(f"{name}: {getattr(a, name)} vs {getattr(b, name)}")
ok = False
return ok
# ── Tests ───────────────────────────────────────────────────────────
def test_equivalence():
print("═══ Equivalence: float vs Q16_16 ═══")
data_q16 = to_q16(TEST_DATA)
oe = OriginalEngine(total_qubit_budget=0, chi_max=0.5, R_max=0.5, landauer_threshold=0.1)
os = oe.project(TEST_DATA)
pe = PortedEngine(total_qubit_budget=0,
chi_max_q16=Q16_HALF,
R_max_q16=Q16_HALF,
landauer_threshold_q16=Q16_ONE // 10)
ps = pe.project(data_q16)
print(f" Float: cells={len(os.cells)} qubits={os.total_qubits} B={os.bekenstein_bound:.4f} U={os.area_utilization:.4f}")
print(f" Q16_16: cells={len(ps.cells)} qubits={ps.total_qubits} B={q2f(ps.bekenstein_bound):.4f} U={q2f(ps.area_utilization):.4f}")
# rel_tol=0.02 = 2% — eps is 1e-12 vs 1.5e-5 which propagates through E_i formula
ok = cmp_surface_float_vs_q16(os, ps, rel_tol=0.02)
print(f"{'PASS' if ok else 'FAIL'}")
return ok
def test_cbor_roundtrip():
print("═══ CBOR round-trip ═══")
data_q16 = to_q16(TEST_DATA)
engine = PortedEngine(total_qubit_budget=100)
s1 = engine.project(data_q16)
blob = s1.to_cbor()
print(f" Size: {len(blob)} bytes")
s2 = PortedSurface.from_cbor(blob)
ok = cmp_surface_q16_vs_q16(s1, s2, tol=0)
print(f"{'PASS' if ok else 'FAIL'}")
return ok
def test_file_roundtrip():
import tempfile, os
print("═══ File round-trip ═══")
data_q16 = to_q16(TEST_DATA)
engine = PortedEngine(total_qubit_budget=100)
s1 = engine.project(data_q16)
with tempfile.NamedTemporaryFile(suffix='.cbor', delete=False) as f:
path = f.name
try:
s1.to_file(path)
s2 = PortedSurface.from_file(path)
ok = cmp_surface_q16_vs_q16(s1, s2, tol=0)
print(f"{'PASS' if ok else 'FAIL'}")
return ok
finally:
os.unlink(path)
def test_admissibility_gate():
print("═══ Admissibility gate ═══")
data_q16 = to_q16(TEST_DATA)
oe = OriginalEngine(chi_max=0.5, R_max=0.5, landauer_threshold=0.1)
oe.project(TEST_DATA)
pe = PortedEngine(chi_max_q16=Q16_HALF, R_max_q16=Q16_HALF,
landauer_threshold_q16=Q16_ONE // 10)
pe.project(data_q16)
ok = True
for i in range(len(TEST_DATA)):
r1 = oe.quantum_storage_admissible(i, 1.0)
r2 = pe.quantum_storage_admissible(i, Q16_ONE)
if r1 != r2:
print(f" Gate mismatch cell[{i}]: float={r1} q16={r2}")
ok = False
print(f"{'PASS' if ok else 'FAIL'}")
return ok
def test_numerical_analysis():
"""Detailed breakdown of what diverges and why."""
print("═══ Numerical analysis ═══")
data_q16 = to_q16(TEST_DATA)
oe = OriginalEngine(total_qubit_budget=0, chi_max=0.5, R_max=0.5, landauer_threshold=0.1)
os = oe.project(TEST_DATA)
pe = PortedEngine(total_qubit_budget=0,
chi_max_q16=Q16_HALF,
R_max_q16=Q16_HALF,
landauer_threshold_q16=Q16_ONE // 10)
ps = pe.project(data_q16)
print(f" epsilon float: {oe.epsilon} (unphysically small)")
print(f" epsilon Q16_16: {Q16_EPSILON} = {q2f(Q16_EPSILON):.8f}")
print(f" E_i formula: lam * v_abs * S * L / (R + ε)")
print()
chiral_states = [d["chiral_state"] for d in TEST_DATA]
for i, (oc, pc) in enumerate(zip(os.cells, ps.cells)):
cs = chiral_states[i]
print(f" cell[{i}] eq={oc.equation_id} {cs}")
print(f" float: E_i={oc.E_i:.6f} R_i={oc.R_i:.6f} L_i={oc.L_i:.6f} q_i={oc.q_i}")
print(f" q16: E_i={pc.E_i} ({q2f(pc.E_i):.6f}) R_i={pc.R_i} ({q2f(pc.R_i):.6f}) L_i={pc.L_i} ({q2f(pc.L_i):.6f}) q_i={pc.q_i}")
r_q16 = q2f(pc.R_i) + q2f(Q16_EPSILON)
r_float = oc.R_i + oe.epsilon
print(f" R+ε: float={r_float:.8f} q16={r_q16:.8f}")
print()
return True
if __name__ == "__main__":
results = {}
results["equivalence"] = test_equivalence()
results["cbor"] = test_cbor_roundtrip()
results["file"] = test_file_roundtrip()
results["gate"] = test_admissibility_gate()
results["analysis"] = test_numerical_analysis()
print()
n_pass = sum(1 for v in results.values() if v)
n_total = len(results)
print(f"{n_pass}/{n_total} passed")
if all(results.values()):
sys.exit(0)
else:
sys.exit(1)