SilverSight/tests/test_nuvmap_julia.jl

131 lines
4.9 KiB
Julia

# SilverSight NUVMAP — Julia Cross-Validation Test
#
# Runs the same test data as tests/test_nuvmap_equivalence.py and
# tests/test_nuvmap_r_ref.R, then asserts the Julia Q16_16 output
# matches Python/R within Q16_16 quantization tolerance.
include("/home/allaun/SilverSight/julia/CoreFormalism/Q16_16.jl")
include("/home/allaun/SilverSight/julia/nuvmap/projection_engine.jl")
using .Q16_16
using .NUVMAP
using Printf
# ── Test data ───────────────────────────────────────────────────────
test_data = [
Dict{Symbol, Any}(
:equation_id => 1, :amvr => 0.8, :avmr => 0.75, :cr => 0.05, :cs => "achiral_stable"
),
Dict{Symbol, Any}(
:equation_id => 2, :amvr => 0.3, :avmr => 0.4, :cr => 0.2, :cs => "left_handed_mass_bias"
),
Dict{Symbol, Any}(
:equation_id => 3, :amvr => 0.1, :avmr => 0.15, :cr => 0.6, :cs => "chiral_scarred"
),
Dict{Symbol, Any}(
:equation_id => 4, :amvr => 0.5, :avmr => 0.5, :cr => 0.1, :cs => "right_handed_vector_bias"
),
Dict{Symbol, Any}(
:equation_id => 5, :amvr => 0.9, :avmr => 0.85, :cr => 0.02, :cs => "achiral_stable"
),
]
function convert_to_q16(data)
return [Dict{Symbol, Any}(
:equation_id => d[:equation_id],
# Use round() to match Python f2q (banker's rounding) exactly.
# Julia of_float uses floor (matching Lean ofFloat), but
# the test data was generated by Python f2q's round().
:amvr_q16 => Q16_16.of_raw_int(Int32(round(d[:amvr] * 65536.0))),
:avmr_q16 => Q16_16.of_raw_int(Int32(round(d[:avmr] * 65536.0))),
:chiral_residual_q16 => Q16_16.of_raw_int(Int32(round(d[:cr] * 65536.0))),
:chiral_state => d[:cs],
) for d in data]
end
# ── Known Python Q16_16 outputs (from test run) ─────────────────────
# From tests/test_nuvmap_equivalence.py output:
# Cell 0: q_i=73, E_i=7.748764, R_i=0.114288
# Cell 1: q_i=0, E_i=0.466660, R_i=0.599991
# Cell 2: q_i=0, E_i=0.033340, R_i=1.285721
# Cell 3: q_i=2, E_i=0.933289, R_i=0.428574
# Cell 4: q_i=10780, E_i=99.902435, R_i=0.009995
# total_qubits=10855, B=21.816895
expected_q_i = [73, 0, 0, 2, 10780]
expected_E_i = [7.748764, 0.466660, 0.033340, 0.933289, 99.902435]
expected_R_i = [0.114288, 0.599991, 1.285721, 0.428574, 0.009995]
expected_qubits = 10855
expected_B = 21.816895
# ── Run Julia projector ─────────────────────────────────────────────
println("="^60)
println("NUVMAP Julia — Cross-Validation Test")
println("="^60)
data_q16 = convert_to_q16(test_data)
engine = NUVMAPProjectionEngine(
total_qubit_budget = 0,
chi_max_q16 = Q16_16.half,
R_max_q16 = Q16_16.half,
# Integer division on raw Q16_16 value: 65536 ÷ 10 = 6553 = 0.1
landauer_threshold_q16 = Q16_16.of_raw_int(Q16_16.to_int(Q16_16.one) ÷ 10)
)
surface = NUVMAP.project(engine, data_q16)
println("\nResults:")
println(" Cells: $(length(surface.cells))")
println(" Total qubits: $(surface.total_qubits) (expected $expected_qubits)")
println(" Bekenstein: $(Q16_16.to_float(surface.bekenstein_bound)) (expected $expected_B)")
# ── Compare ─────────────────────────────────────────────────────────
println("\nCell-by-cell comparison:")
println(" cell q_i E_i R_i")
println(" ---- ------- ----------- -----------")
all_ok = true
for i in 1:length(surface.cells)
c = surface.cells[i]
q_ok = c.q_i == expected_q_i[i]
e_diff = abs(Q16_16.to_float(c.E_i) - expected_E_i[i])
e_ok = e_diff < 0.02
r_diff = abs(Q16_16.to_float(c.R_i) - expected_R_i[i])
r_ok = r_diff < 0.0001
status = (q_ok && e_ok && r_ok) ? "" : ""
println(" [$(@sprintf("%d", i-1))] q=$(c.q_i)$(@sprintf("%+d", c.q_i - expected_q_i[i])) E=$(Q16_16.to_float(c.E_i)) R=$(Q16_16.to_float(c.R_i)) $status")
if !(q_ok && e_ok && r_ok)
println(" expected: q=$(@sprintf("%d", expected_q_i[i])) E=$(expected_E_i[i]) R=$(expected_R_i[i])")
all_ok = false
end
end
# Surface-level checks
qt_diff = abs(surface.total_qubits - expected_qubits)
if qt_diff > 1
println("\n✗ total_qubits: $(surface.total_qubits) vs expected $expected_qubits")
all_ok = false
end
b_diff = abs(Q16_16.to_float(surface.bekenstein_bound) - expected_B)
if b_diff > 0.02
println("✗ bekenstein_bound: $(Q16_16.to_float(surface.bekenstein_bound)) vs expected $expected_B")
all_ok = false
end
println("\n" * "="^60)
if all_ok
println("JULIA VALIDATION: PASS — matches Python/R Q16_16 output ✓")
exit(0)
else
println("JULIA VALIDATION: FAIL — divergence detected ✗")
exit(1)
end