Download QH034/code/scripts/validate_qh034_static.py from Runqing93/Agent-Guided-Quantum-MLLM: direct link, hf CLI and curl.
- Browser
- Download file 5.49 kB
-
https://huggingface.co/Runqing93/Agent-Guided-Quantum-MLLM/resolve/main/QH034/code/scripts/validate_qh034_static.py
- Command line
-
hf download hf://Runqing93/Agent-Guided-Quantum-MLLM/QH034/code/scripts/validate_qh034_static.py
-
curl -L -o validate_qh034_static.py https://huggingface.co/Runqing93/Agent-Guided-Quantum-MLLM/resolve/main/QH034/code/scripts/validate_qh034_static.py
5.49 kB
| #!/usr/bin/env python3 | |
| """CUDA identity, gradient, DQ, and control checks for QH034.""" | |
| from __future__ import annotations | |
| import json | |
| import sys | |
| from datetime import datetime, timezone | |
| from pathlib import Path | |
| import torch | |
| PROJECT = Path(__file__).resolve().parents[2] | |
| sys.path.insert(0, str(PROJECT / "code/src")) | |
| from quantum_qwen38.qh034_spectral_modulation_replacement import ( # noqa: E402 | |
| DequantizedSpectralCore, | |
| EqualParameterClassicalSpectralCore, | |
| ExactQuantumSpectralCore, | |
| QH034Config, | |
| qh034_parameter_audit, | |
| ) | |
| def relative(a: torch.Tensor, b: torch.Tensor) -> float: | |
| return float((a - b).float().norm() / b.float().norm().clamp_min(1.0e-12)) | |
| def main() -> None: | |
| if not torch.cuda.is_available(): | |
| raise RuntimeError("QH034 static validation requires CUDA") | |
| torch.manual_seed(20260856) | |
| device = torch.device("cuda:0") | |
| config = QH034Config( | |
| hidden_size=128, output_size=64, rank=64, layer_indices=(0, 1), | |
| num_qubits=6, depth=2, entangling_offsets=(1, 2, 3), | |
| ) | |
| qh = ExactQuantumSpectralCore(config).to(device) | |
| dq = DequantizedSpectralCore(config).to(device) | |
| cc = EqualParameterClassicalSpectralCore(config).to(device) | |
| no_ent = ExactQuantumSpectralCore(config, use_entanglers=False).to(device) | |
| if {module.parameter_count for module in (qh, dq, cc, no_ent)} != {48}: | |
| raise AssertionError("small QH034 parameter counts differ") | |
| identity_input = torch.randn(3, 5, config.rank, device=device) | |
| identity_errors = { | |
| name: float((module(identity_input) - identity_input).float().abs().max()) | |
| for name, module in (("qh", qh), ("dq", dq), ("cc", cc), ("no_ent", no_ent)) | |
| } | |
| if max(identity_errors.values()) > 2.0e-7: | |
| raise AssertionError(f"zero-angle identity failed: {identity_errors}") | |
| with torch.no_grad(): | |
| qh.theta.uniform_(-0.25, 0.25) | |
| dq.theta.copy_(qh.theta) | |
| xq = torch.randn(2, 3, config.rank, device=device, requires_grad=True) | |
| xd = xq.detach().clone().requires_grad_(True) | |
| yq, yd = qh(xq), dq(xd) | |
| probe = torch.randn_like(yq) | |
| (yq * probe).sum().backward() | |
| (yd * probe).sum().backward() | |
| checks = { | |
| "forward_max_abs": float((yq - yd).float().abs().max()), | |
| "forward_relative_l2": relative(yq, yd), | |
| "input_gradient_max_abs": float((xq.grad - xd.grad).float().abs().max()), | |
| "input_gradient_relative_l2": relative(xq.grad, xd.grad), | |
| "theta_gradient_max_abs": float((qh.theta.grad - dq.theta.grad).abs().max()), | |
| "theta_gradient_relative_l2": relative(qh.theta.grad, dq.theta.grad), | |
| } | |
| if checks["forward_max_abs"] > 2.0e-5: | |
| raise AssertionError(f"QH/DQ forward mismatch: {checks}") | |
| if checks["input_gradient_max_abs"] > 2.0e-5 or checks["theta_gradient_max_abs"] > 3.0e-4: | |
| raise AssertionError(f"QH/DQ gradient mismatch: {checks}") | |
| gradient_audit = {} | |
| for name, module in (("qh", qh), ("dq", dq), ("cc", cc), ("no_ent", no_ent)): | |
| module.zero_grad(set_to_none=True) | |
| with torch.no_grad(): | |
| module.theta.uniform_(-0.2, 0.2) | |
| value = torch.randn(4, config.rank, device=device) | |
| module(value).float().square().mean().backward() | |
| gradient = module.theta.grad | |
| gradient_audit[name] = { | |
| "norm": float(gradient.norm()), | |
| "nonzero_elements": int((gradient != 0).sum()), | |
| "all_finite": bool(torch.isfinite(gradient).all()), | |
| } | |
| if gradient_audit[name]["norm"] == 0 or not gradient_audit[name]["all_finite"]: | |
| raise AssertionError(f"invalid {name} gradients") | |
| scale_audit = {} | |
| with torch.no_grad(): | |
| for name, module in (("qh", qh), ("dq", dq), ("cc", cc), ("no_ent", no_ent)): | |
| output = module(torch.ones(1, config.rank, device=device)).float().squeeze(0) | |
| scale_audit[name] = { | |
| "minimum": float(output.min()), | |
| "mean": float(output.mean()), | |
| "maximum": float(output.max()), | |
| } | |
| if output.min() < 0 or abs(float(output.mean()) - 1.0) > 3.0e-6: | |
| raise AssertionError(f"invalid positive mean-one scale: {name}") | |
| cpu_rejected = False | |
| try: | |
| ExactQuantumSpectralCore(config)(torch.randn(1, config.rank)) | |
| except RuntimeError: | |
| cpu_rejected = True | |
| if not cpu_rejected: | |
| raise AssertionError("CPU exact-quantum path was not rejected") | |
| full_audit = qh034_parameter_audit(QH034Config()) | |
| if full_audit["trainable_parameters"] != 82 or full_audit["net_parameter_reduction"] != 3145646: | |
| raise AssertionError(f"full parameter audit changed: {full_audit}") | |
| payload = { | |
| "status": "pass", | |
| "candidate": "QH-034 quantum shared-SVD spectral modulation", | |
| "small_config": config.__dict__, | |
| "small_parameter_count_per_core": qh.parameter_count, | |
| "zero_angle_identity_max_abs": identity_errors, | |
| "dequantization_checks": checks, | |
| "gradient_audit": gradient_audit, | |
| "positive_mean_one_scale_audit": scale_audit, | |
| "cpu_quantum_path_rejected": cpu_rejected, | |
| "full_parameter_audit": full_audit, | |
| "created_at": datetime.now(timezone.utc).isoformat(), | |
| } | |
| output = PROJECT / "artifacts/qh034-static-validation.json" | |
| output.write_text(json.dumps(payload, indent=2), encoding="utf-8") | |
| print(json.dumps(payload, indent=2)) | |
| if __name__ == "__main__": | |
| main() | |