2 """Exact-density VQE validation for canonical anchor cases. 4 Runs the foundational exact density-matrix evidence used by the higher-level 6 - fixed-parameter 4-qubit and 6-qubit XXZ anchor comparisons against Qiskit Aer, 7 - one bounded 4-qubit density-backed optimization trace, 8 - an exact-regime workflow matrix, 9 - and a compact validation bundle tying those artifacts together. 11 Unsupported cases are emitted as structured negative evidence instead of 12 crashing or silently disappearing. 15 from __future__
import annotations
23 from pathlib
import Path
28 from qiskit
import QuantumCircuit
29 from qiskit_aer
import AerSimulator
30 from qiskit_aer.noise
import (
31 amplitude_damping_error,
35 from qiskit.quantum_info
import DensityMatrix
as QiskitDensityMatrix
36 from qiskit.quantum_info
import state_fidelity
38 REPO_ROOT = Path(__file__).resolve().parents[3]
39 if str(REPO_ROOT)
not in sys.path:
40 sys.path.insert(0, str(REPO_ROOT))
42 from examples.VQE.shot_noise_measurement
import generate_zz_xx_hamiltonian
43 from benchmarks.density_matrix.validate_squander_vs_qiskit
import (
44 ARTIFACT_FILENAME
as MICRO_VALIDATION_BUNDLE_FILENAME,
45 build_artifact_bundle
as build_micro_validation_bundle,
46 run_validation
as run_micro_validation,
47 write_artifact_bundle
as write_micro_validation_bundle_file,
49 from benchmarks.density_matrix.noise_support.support_tiers
import (
50 build_required_case_classification,
51 build_support_tier_summary,
52 classify_noise_boundary_reason,
54 from squander
import Variational_Quantum_Eigensolver
56 from squander.partitioning.noisy_planner
import (
58 PLANNER_OP_KIND_NOISE,
61 PRIMARY_BACKEND =
"density_matrix" 62 REFERENCE_BACKEND =
"qiskit_aer_density_matrix" 63 DEFAULT_ANSATZ =
"HEA" 65 DEFAULT_INNER_BLOCKS = 1
66 FIXED_PARAMETER_QUBITS = (4, 6)
67 EXACT_REGIME_WORKFLOW_QUBITS = (4, 6, 8, 10)
68 EXACT_REGIME_PARAMETER_SET_COUNT = 10
69 EXACT_REGIME_WORKFLOW_ERROR_TOL = 1e-8
70 EXACT_REGIME_VALIDITY_TOL = 1e-10
71 EXACT_REGIME_TRACE_TOL = 1e-10
72 EXACT_REGIME_OBSERVABLE_IMAG_TOL = 1e-10
73 EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME =
"exact_regime_workflow_bundle.json" 74 OPTIMIZATION_TRACE_ARTIFACT_FILENAME =
"optimization_trace_4q.json" 75 EXACT_REGIME_WORKFLOW_BUNDLE_FIELDS = (
85 EXACT_DENSITY_VALIDATION_BUNDLE_FILENAME =
"exact_density_validation_bundle.json" 86 EXACT_DENSITY_VALIDATION_BUNDLE_FIELDS = (
96 SUPPORTED_BACKEND_LABELS = {PRIMARY_BACKEND,
"state_vector"}
97 REQUIRED_BRIDGE_GATE_NAMES = {
"U3",
"CNOT"}
98 REQUIRED_BRIDGE_NOISE_NAMES = {
103 ARTIFACT_CORE_FIELDS = (
119 "channel":
"local_depolarizing",
121 "after_gate_index": 0,
125 "channel":
"amplitude_damping",
127 "after_gate_index": 2,
131 "channel":
"phase_damping",
133 "after_gate_index": 4,
140 return [(idx, idx + 1)
for idx
in range(qbit_num - 1)]
145 "max_inner_iterations": 4,
147 "convergence_length": 2,
152 return np.linspace(0.05, 0.05 * param_num, param_num, dtype=np.float64)
166 "python": sys.version.split()[0],
167 "numpy": np.__version__,
168 "qiskit": getattr(qiskit,
"__version__",
"unknown"),
169 "qiskit_aer": getattr(qiskit_aer,
"__version__",
"unknown"),
174 qubit_sizes=EXACT_REGIME_WORKFLOW_QUBITS,
175 parameter_set_count: int = EXACT_REGIME_PARAMETER_SET_COUNT,
178 "absolute_energy_error": EXACT_REGIME_WORKFLOW_ERROR_TOL,
179 "rho_is_valid_tol": EXACT_REGIME_VALIDITY_TOL,
180 "trace_deviation": EXACT_REGIME_TRACE_TOL,
181 "observable_imag_abs": EXACT_REGIME_OBSERVABLE_IMAG_TOL,
182 "required_pass_rate": 1.0,
183 "required_workflow_qubits": list(qubit_sizes),
184 "fixed_parameter_sets_per_size": parameter_set_count,
189 param_num: int, count: int = EXACT_REGIME_PARAMETER_SET_COUNT
191 base = np.linspace(0.05, 0.05 * param_num, param_num, dtype=np.float64)
193 for idx
in range(count):
195 scale = 1.0 + 0.025 * idx
196 params = np.mod(scale * base + shift, 2.0 * np.pi)
197 parameter_sets.append(
199 "parameter_set_id": f
"set_{idx:02d}",
200 "parameter_vector": params,
203 return parameter_sets
208 result = subprocess.run(
209 [
"git",
"rev-parse",
"HEAD"],
215 return result.stdout.strip()
226 ansatz: str = DEFAULT_ANSATZ,
227 layers: int = DEFAULT_LAYERS,
228 inner_blocks: int = DEFAULT_INNER_BLOCKS,
229 reference_backend: str |
None =
None,
230 hamiltonian: dict |
None =
None,
231 optimizer: str |
None =
None,
235 "qbit_num": qbit_num,
236 "topology": topology,
239 "inner_blocks": inner_blocks,
240 "density_noise": density_noise,
242 if reference_backend
is not None:
243 metadata[
"reference_backend"] = reference_backend
244 if hamiltonian
is not None:
245 metadata[
"hamiltonian"] = hamiltonian
246 if optimizer
is not None:
247 metadata[
"optimizer"] = optimizer
252 missing_fields = [field
for field
in ARTIFACT_CORE_FIELDS
if field
not in payload]
255 "Artifact payload is missing required fields: {}".format(
256 ", ".join(missing_fields)
260 if payload[
"backend"]
not in SUPPORTED_BACKEND_LABELS:
262 "Artifact payload has unsupported backend label '{}'".format(
267 if payload[
"status"]
not in {
"completed",
"unsupported"}:
269 "Artifact payload has unsupported status '{}'".format(payload[
"status"])
275 optimizer: str |
None =
None,
287 requested_density_noise = (
290 vqe = Variational_Quantum_Eigensolver(
294 backend=PRIMARY_BACKEND,
295 density_noise=requested_density_noise,
297 if optimizer
is not None:
298 vqe.set_Optimizer(optimizer)
299 vqe.set_Ansatz(DEFAULT_ANSATZ)
300 vqe.Generate_Circuit(layers=DEFAULT_LAYERS, inner_blocks=DEFAULT_INNER_BLOCKS)
301 return vqe, hamiltonian, topology
305 bridge = vqe.describe_density_bridge()
307 op
for op
in bridge[
"operations"]
if op[
"kind"] == PLANNER_OP_KIND_NOISE
310 "bridge_source_type": bridge[
"source_type"],
311 "bridge_parameter_count": bridge[
"parameter_count"],
312 "bridge_operation_count": bridge[
"operation_count"],
313 "bridge_gate_count": bridge[
"gate_count"],
314 "bridge_noise_count": bridge[
"noise_count"],
315 "bridge_operations": bridge[
"operations"],
316 "bridge_noise_sequence": [op[
"name"]
for op
in noise_operations],
317 "bridge_noise_targets": [op[
"target_qbit"]
for op
in noise_operations],
318 "bridge_noise_after_gate_indices": [
319 op[
"source_gate_index"]
for op
in noise_operations
321 "bridge_noise_fixed_values": [op[
"fixed_value"]
for op
in noise_operations],
326 if "unsupported circuit source" in reason
or "requires a generated HEA circuit" in reason:
327 category =
"circuit_source" 328 if "custom_gate_structure" in reason:
329 first_condition =
"custom_gate_structure" 330 bridge_source_type =
"custom_gate_structure" 331 elif "binary_import" in reason:
332 first_condition =
"binary_import" 333 bridge_source_type =
"binary_import" 334 elif "generated HEA circuit" in reason:
335 first_condition =
"generated_hea_required" 336 bridge_source_type =
"unset" 338 first_condition =
"circuit_source" 339 bridge_source_type =
"unset" 341 "only the HEA ansatz" in reason
342 or "first unsupported gate in density backend path" in reason
343 or "unsupported gate in density backend path" in reason
345 category =
"lowering_path" 346 if "only the HEA ansatz" in reason:
347 first_condition =
"generated_hea_zyz" 348 bridge_source_type =
"generated_hea_zyz" 349 elif "first unsupported gate in density backend path is " in reason:
350 first_condition = reason.split(
351 "first unsupported gate in density backend path is ", 1
353 bridge_source_type =
"generated_hea" 354 elif "unsupported gate in density backend path: " in reason:
355 first_condition = reason.split(
356 "unsupported gate in density backend path: ", 1
358 bridge_source_type =
"generated_hea" 360 first_condition =
"lowering_path" 361 bridge_source_type =
"generated_hea" 362 elif "unsupported density-noise insertion" in reason
or "after_gate_index" in reason:
363 category =
"noise_insertion" 364 first_condition =
"after_gate_index" 365 bridge_source_type =
"generated_hea" 366 elif "Unsupported density-noise channel" in reason
or "unsupported density-noise type" in reason:
367 category =
"noise_type" 368 first_condition =
"unsupported_density_noise_channel" 369 bridge_source_type =
"unset" 371 category =
"workflow_execution" 372 first_condition =
"workflow_execution" 373 bridge_source_type =
"unknown" 376 "unsupported_category": category,
377 "first_unsupported_condition": first_condition,
378 "bridge_source_type": bridge_source_type,
379 "error_match_pass": category !=
"workflow_execution",
384 bridge = vqe.describe_density_bridge()
386 op[
"name"]
for op
in bridge[
"operations"]
if op[
"kind"] == PLANNER_OP_KIND_GATE
389 op[
"name"]
for op
in bridge[
"operations"]
if op[
"kind"] == PLANNER_OP_KIND_NOISE
392 source_pass = bridge[
"source_type"] ==
"generated_hea" 395 and set(gate_sequence).issubset(REQUIRED_BRIDGE_GATE_NAMES)
396 and "U3" in gate_sequence
397 and (vqe.get_Qbit_Num() == 1
or "CNOT" in gate_sequence)
399 noise_pass = REQUIRED_BRIDGE_NOISE_NAMES.issubset(set(noise_sequence))
400 execution_ready =
bool(execution_ready)
403 "bridge_source_type": bridge[
"source_type"],
404 "bridge_parameter_count": bridge[
"parameter_count"],
405 "bridge_operation_count": bridge[
"operation_count"],
406 "bridge_gate_count": bridge[
"gate_count"],
407 "bridge_noise_count": bridge[
"noise_count"],
408 "bridge_gate_sequence": gate_sequence,
409 "bridge_noise_sequence": noise_sequence,
410 "source_pass": source_pass,
411 "gate_pass": gate_pass,
412 "noise_pass": noise_pass,
413 "execution_ready": execution_ready,
414 "bridge_supported_pass": source_pass
431 vqe = Variational_Quantum_Eigensolver(
435 backend=
"state_vector",
438 vqe.set_Ansatz(DEFAULT_ANSATZ)
439 vqe.Generate_Circuit(layers=DEFAULT_LAYERS, inner_blocks=DEFAULT_INNER_BLOCKS)
440 return vqe, hamiltonian, topology
444 noisy_circuit = QuantumCircuit(base_circuit.num_qubits)
446 for noise_spec
in density_noise:
447 noise_by_gate.setdefault(noise_spec[
"after_gate_index"], []).append(noise_spec)
449 for gate_index, instruction
in enumerate(base_circuit.data):
451 noisy_circuit.qubits[base_circuit.find_bit(qubit).index]
452 for qubit
in instruction.qubits
455 noisy_circuit.clbits[base_circuit.find_bit(clbit).index]
456 for clbit
in instruction.clbits
458 noisy_circuit.append(instruction.operation, qargs, cargs)
460 for noise_spec
in noise_by_gate.get(gate_index, []):
461 target = noise_spec[
"target"]
462 channel = noise_spec[
"channel"]
463 if channel ==
"local_depolarizing":
464 noisy_circuit.append(
465 depolarizing_error(noise_spec[
"error_rate"], 1),
466 [noisy_circuit.qubits[target]],
468 elif channel ==
"amplitude_damping":
469 noisy_circuit.append(
470 amplitude_damping_error(noise_spec[
"gamma"]),
471 [noisy_circuit.qubits[target]],
473 elif channel ==
"phase_damping":
474 noisy_circuit.append(
475 phase_damping_error(noise_spec[
"lambda"]),
476 [noisy_circuit.qubits[target]],
479 raise ValueError(f
"Unsupported fixed-parameter channel: {channel}")
481 noisy_circuit.save_density_matrix()
486 energy = np.trace(hamiltonian.dot(density_matrix))
487 return float(np.real(energy)), float(np.imag(energy))
492 eigenvalues = np.linalg.eigvalsh(diff @ diff.conj().T)
493 return float(0.5 * np.sum(np.sqrt(np.maximum(eigenvalues, 0))))
497 circuit = NoisyCircuit(base_circuit.num_qubits)
500 for noise_spec
in density_noise:
501 noise_by_gate.setdefault(noise_spec[
"after_gate_index"], []).append(noise_spec)
503 for gate_index, instruction
in enumerate(base_circuit.data):
505 base_circuit.find_bit(qubit).index
for qubit
in instruction.qubits
507 gate_name = instruction.operation.name
510 theta, phi, lam = [float(value) for value
in instruction.operation.params]
513 circuit.add_U3(qubit_indices[0])
514 params.extend([theta / 2.0, phi, lam])
515 elif gate_name
in {
"cx",
"cnot"}:
516 circuit.add_CNOT(qubit_indices[1], qubit_indices[0])
519 f
"Unsupported workflow gate in reconstruction: {gate_name}" 522 for noise_spec
in noise_by_gate.get(gate_index, []):
523 target = noise_spec[
"target"]
524 channel = noise_spec[
"channel"]
525 if channel ==
"local_depolarizing":
526 circuit.add_local_depolarizing(
527 target, error_rate=noise_spec[
"error_rate"]
529 elif channel ==
"amplitude_damping":
530 circuit.add_amplitude_damping(target, gamma=noise_spec[
"gamma"])
531 elif channel ==
"phase_damping":
532 circuit.add_phase_damping(target, lambda_param=noise_spec[
"lambda"])
535 f
"Unsupported workflow noise channel in reconstruction: {channel}" 538 rho = DensityMatrix(base_circuit.num_qubits)
539 circuit.apply_to(np.asarray(params, dtype=np.float64), rho)
545 parameter_set_id: str,
546 parameter_vector: np.ndarray,
549 vqe, hamiltonian, topology =
build_vqe(qbit_num)
550 vqe.set_Optimized_Parameters(parameter_vector)
553 case_start = time.perf_counter()
554 squander_start = time.perf_counter()
555 squander_energy = float(vqe.Optimization_Problem(parameter_vector))
556 squander_runtime_ms = (time.perf_counter() - squander_start) * 1000.0
558 base_qiskit_circuit = vqe.get_Qiskit_Circuit()
560 base_qiskit_circuit, density_noise
562 squander_rho_np = np.asarray(squander_rho.to_numpy())
563 squ_trace = squander_rho.trace()
564 squ_trace_deviation = float(abs(squ_trace - 1.0))
565 squ_density_valid =
bool(squander_rho.is_valid(tol=EXACT_REGIME_VALIDITY_TOL))
566 squ_purity = float(np.real(np.trace(squander_rho_np @ squander_rho_np)))
568 hamiltonian, squander_rho_np
571 reference_start = time.perf_counter()
573 simulator = AerSimulator(method=
"density_matrix")
574 result = simulator.run(noisy_qiskit_circuit, shots=1).
result()
575 aer_rho = np.asarray(result.data()[
"density_matrix"])
576 reference_runtime_ms = (time.perf_counter() - reference_start) * 1000.0
578 aer_energy_real, aer_energy_imag =
density_energy(hamiltonian, aer_rho)
579 aer_trace = np.trace(aer_rho)
580 aer_purity = float(np.real(np.trace(aer_rho @ aer_rho)))
583 QiskitDensityMatrix(squander_rho_np), QiskitDensityMatrix(aer_rho)
586 density_max_diff = float(np.max(np.abs(squander_rho_np - aer_rho)))
589 energy_error = float(abs(squander_energy - aer_energy_real))
590 energy_pass = energy_error <= EXACT_REGIME_WORKFLOW_ERROR_TOL
591 density_valid_pass = squ_density_valid
592 trace_pass = squ_trace_deviation <= EXACT_REGIME_TRACE_TOL
593 observable_pass = abs(squ_energy_imag) <= EXACT_REGIME_OBSERVABLE_IMAG_TOL
594 workflow_completed =
True 597 if workflow_completed
599 and density_valid_pass
602 and bridge_metadata[
"bridge_supported_pass"]
607 backend=PRIMARY_BACKEND,
610 density_noise=density_noise,
611 reference_backend=REFERENCE_BACKEND,
616 "case_name": f
"exact_regime_{qbit_num}q_{parameter_set_id}",
618 "workflow_completed": workflow_completed,
619 "parameter_set_id": parameter_set_id,
620 "parameter_vector": parameter_vector.tolist(),
621 "squander_energy": squander_energy,
622 "squander_energy_from_rho_real": squ_energy_real_from_rho,
623 "squander_energy_imag": squ_energy_imag,
624 "aer_energy_real": aer_energy_real,
625 "aer_energy_imag": aer_energy_imag,
626 "absolute_energy_error": energy_error,
627 "energy_pass": energy_pass,
628 "rho_is_valid": squ_density_valid,
629 "rho_is_valid_tol": EXACT_REGIME_VALIDITY_TOL,
630 "density_valid_pass": density_valid_pass,
631 "squander_trace_real": float(np.real(squ_trace)),
632 "squander_trace_imag": float(np.imag(squ_trace)),
633 "trace_deviation": squ_trace_deviation,
634 "trace_pass": trace_pass,
635 "observable_pass": observable_pass,
636 "squander_purity": squ_purity,
637 "aer_trace_real": float(np.real(aer_trace)),
638 "aer_trace_imag": float(np.imag(aer_trace)),
639 "aer_purity": aer_purity,
640 "state_fidelity": fidelity,
641 "density_max_diff": density_max_diff,
642 "density_trace_distance": density_trace_distance,
643 "squander_runtime_ms": squander_runtime_ms,
644 "reference_runtime_ms": reference_runtime_ms,
645 "total_case_runtime_ms": (time.perf_counter() - case_start) * 1000.0,
646 "process_peak_rss_kb":
int(
647 resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
657 parameter_set_id = parameter_set[
"parameter_set_id"]
658 parameter_vector = np.asarray(parameter_set[
"parameter_vector"], dtype=np.float64)
661 except Exception
as exc:
662 unsupported_reason = str(exc)
667 if noise_boundary_metadata[
"unsupported_category"] !=
"workflow_execution":
668 unsupported_metadata[
"unsupported_category"] = noise_boundary_metadata[
669 "unsupported_category" 671 unsupported_metadata[
"first_unsupported_condition"] = (
672 noise_boundary_metadata[
"first_unsupported_condition"]
674 unsupported_metadata[
"noise_boundary_class"] = noise_boundary_metadata[
675 "noise_boundary_class" 677 unsupported_metadata[
"failure_stage"] = noise_boundary_metadata[
681 "case_name": f
"exact_regime_{qbit_num}q_{parameter_set_id}",
682 "status":
"unsupported",
683 "backend": PRIMARY_BACKEND,
684 "reference_backend": REFERENCE_BACKEND,
685 "qbit_num": qbit_num,
686 "workflow_completed":
False,
687 "parameter_set_id": parameter_set_id,
688 "parameter_vector": parameter_vector.tolist(),
689 **unsupported_metadata,
690 "unsupported_reason": unsupported_reason,
691 "source_pass":
False,
694 "execution_ready":
False,
695 "bridge_supported_pass":
False,
696 "energy_pass":
False,
697 "density_valid_pass":
False,
699 "observable_pass":
False,
705 qubit_sizes=EXACT_REGIME_WORKFLOW_QUBITS,
706 parameter_set_count: int = EXACT_REGIME_PARAMETER_SET_COUNT,
709 for qbit_num
in qubit_sizes:
712 preview_vqe.get_Parameter_Num(), count=parameter_set_count
714 for parameter_set
in parameter_sets:
721 qubit_sizes=EXACT_REGIME_WORKFLOW_QUBITS,
722 parameter_set_count: int = EXACT_REGIME_PARAMETER_SET_COUNT,
727 str(qbit_num): sum(1
for result
in results
if result[
"qbit_num"] == qbit_num)
728 for qbit_num
in qubit_sizes
730 passed = sum(1
for result
in results
if result[
"status"] ==
"pass")
731 unsupported = sum(1
for result
in results
if result[
"status"] ==
"unsupported")
733 required_pass_rate = support_tier_summary[
"required_pass_rate"]
734 documented_10q_anchor_present = any(result[
"qbit_num"] == 10
for result
in results)
735 documented_10q_anchor_required = 10
in qubit_sizes
736 required_counts_present = all(
737 cases_per_qbit[str(qbit_num)] >= parameter_set_count
for qbit_num
in qubit_sizes
739 supported_trace_completed =
bool(
741 and trace_result.get(
"workflow_completed",
False)
742 and trace_result.get(
"bridge_supported_pass",
False)
744 bridge_supported_cases = sum(
745 1
for result
in results
if result.get(
"bridge_supported_pass",
False)
749 if support_tier_summary[
"mandatory_baseline_completed"]
750 and required_counts_present
752 not documented_10q_anchor_required
or documented_10q_anchor_present
754 and (trace_result
is None or supported_trace_completed)
759 "suite_name":
"exact_regime_workflow",
760 "status": bundle_status,
761 "backend": PRIMARY_BACKEND,
762 "reference_backend": REFERENCE_BACKEND,
764 qubit_sizes=qubit_sizes,
765 parameter_set_count=parameter_set_count,
769 "total_cases": total,
770 "passed_cases": passed,
771 "failed_cases": total - passed,
772 "unsupported_cases": unsupported,
773 "unsupported_status_cases": unsupported,
774 "bridge_supported_cases": bridge_supported_cases,
775 "pass_rate": required_pass_rate,
776 "required_workflow_qubits": list(qubit_sizes),
777 "fixed_parameter_sets_per_size": parameter_set_count,
778 "cases_per_qbit": cases_per_qbit,
779 "documented_10q_anchor_present": documented_10q_anchor_present,
780 "documented_10q_anchor_required": documented_10q_anchor_required,
781 "supported_trace_completed": supported_trace_completed,
782 "supported_trace_case_name": (
783 trace_result.get(
"case_name",
"optimization_trace_4q")
787 "required_cases": support_tier_summary[
"required_cases"],
788 "required_passed_cases": support_tier_summary[
"required_passed_cases"],
789 "required_pass_rate": required_pass_rate,
790 "mandatory_baseline_case_count": support_tier_summary[
791 "mandatory_baseline_case_count" 793 "mandatory_baseline_passed_cases": support_tier_summary[
794 "mandatory_baseline_passed_cases" 796 "mandatory_baseline_completed": support_tier_summary[
797 "mandatory_baseline_completed" 799 "support_tiers_present": support_tier_summary[
"support_tiers_present"],
800 "optional_cases_count_toward_mandatory_baseline": support_tier_summary[
801 "optional_cases_count_toward_mandatory_baseline" 812 field
for field
in EXACT_REGIME_WORKFLOW_BUNDLE_FIELDS
if field
not in bundle
816 "Exact-regime workflow bundle is missing required fields: {}".format(
817 ", ".join(missing_fields)
821 required_qubits = bundle[
"thresholds"][
"required_workflow_qubits"]
822 required_count = bundle[
"thresholds"][
"fixed_parameter_sets_per_size"]
823 cases_per_qbit = bundle[
"summary"][
"cases_per_qbit"]
824 for qbit_num
in required_qubits:
825 if cases_per_qbit.get(str(qbit_num), 0) < required_count:
827 f
"Exact-regime workflow bundle is missing required cases for {qbit_num} qubits" 833 output_path.parent.mkdir(parents=
True, exist_ok=
True)
834 output_path.write_text(json.dumps(bundle, indent=2) +
"\n", encoding=
"utf-8")
838 print(
"\n" +
"=" * 78)
840 " Exact-Regime Workflow Bundle [{} vs {}]".format(
841 bundle[
"backend"], bundle[
"reference_backend"]
845 for qbit_num
in bundle[
"summary"][
"required_workflow_qubits"]:
846 count = bundle[
"summary"][
"cases_per_qbit"][str(qbit_num)]
847 print(f
" {qbit_num} qubits: {count} mandatory fixed-parameter cases recorded")
849 " Pass rate: {}/{} ({:.0%})".format(
850 bundle[
"summary"][
"passed_cases"],
851 bundle[
"summary"][
"total_cases"],
852 bundle[
"summary"][
"pass_rate"],
856 " Documented 10-qubit anchor present:",
857 bundle[
"summary"][
"documented_10q_anchor_present"],
874 "artifact_id": artifact_id,
875 "artifact_class": artifact_class,
876 "mandatory": mandatory,
879 "expected_statuses": list(expected_statuses),
881 "generation_command": generation_command,
882 "summary": {}
if summary
is None else dict(summary),
895 output_dir = Path(output_dir)
896 base_validation_command = (
897 f
"python benchmarks/density_matrix/workflow_evidence/exact_density_vqe_validation.py " 898 f
"--output-dir {output_dir}" 901 f
"python benchmarks/density_matrix/workflow_evidence/exact_density_vqe_validation.py " 902 f
"--workflow-bundle --output-dir {output_dir}" 904 micro_validation_command = (
905 f
"python benchmarks/density_matrix/validate_squander_vs_qiskit.py " 906 f
"--output-dir {output_dir}" 908 validation_bundle_command = (
909 f
"python benchmarks/density_matrix/workflow_evidence/exact_density_vqe_validation.py " 910 f
"--publication-bundle --output-dir {output_dir}" 915 artifact_id=
"micro_validation_bundle",
916 artifact_class=
"micro_validation_bundle",
918 path=MICRO_VALIDATION_BUNDLE_FILENAME,
919 status=micro_bundle[
"status"],
920 expected_statuses=[
"pass"],
921 purpose=
"Local exactness and density-validity gate for mandatory 1 to 3 qubit microcases.",
922 generation_command=micro_validation_command,
924 "total_cases": micro_bundle[
"summary"][
"total_cases"],
925 "passed_cases": micro_bundle[
"summary"][
"passed_cases"],
926 "pass_rate": micro_bundle[
"summary"][
"pass_rate"],
930 artifact_id=
"exact_regime_workflow_bundle",
931 artifact_class=
"workflow_exact_regime_bundle",
933 path=EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME,
934 status=workflow_bundle[
"status"],
935 expected_statuses=[
"pass"],
936 purpose=
"Workflow-scale exactness evidence across the mandatory 4/6/8/10 exact regime.",
937 generation_command=workflow_command,
939 "total_cases": workflow_bundle[
"summary"][
"total_cases"],
940 "passed_cases": workflow_bundle[
"summary"][
"passed_cases"],
941 "pass_rate": workflow_bundle[
"summary"][
"pass_rate"],
942 "documented_10q_anchor_present": workflow_bundle[
"summary"][
943 "documented_10q_anchor_present" 948 artifact_id=
"fixed_parameters_4q",
949 artifact_class=
"fixed_parameter_case",
951 path=
"fixed_parameters_4q.json",
952 status=fixed_results[0][
"status"],
953 expected_statuses=[
"completed"],
954 purpose=
"Supported fixed-parameter 4-qubit anchor exactness evidence.",
955 generation_command=base_validation_command,
957 "qbit_num": fixed_results[0][
"qbit_num"],
958 "absolute_energy_error": fixed_results[0].get(
"absolute_energy_error"),
962 artifact_id=
"fixed_parameters_6q",
963 artifact_class=
"fixed_parameter_case",
965 path=
"fixed_parameters_6q.json",
966 status=fixed_results[1][
"status"],
967 expected_statuses=[
"completed"],
968 purpose=
"Supported fixed-parameter 6-qubit anchor exactness evidence.",
969 generation_command=base_validation_command,
971 "qbit_num": fixed_results[1][
"qbit_num"],
972 "absolute_energy_error": fixed_results[1].get(
"absolute_energy_error"),
976 artifact_id=
"optimization_trace_4q",
977 artifact_class=
"optimization_trace",
979 path=
"optimization_trace_4q.json",
980 status=trace_result[
"status"],
981 expected_statuses=[
"completed"],
982 purpose=
"Reproducible bounded 4-qubit optimization trace for the exact noisy anchor workflow.",
983 generation_command=base_validation_command,
985 "optimizer": trace_result.get(
"optimizer"),
986 "parameter_count": trace_result.get(
"parameter_count"),
987 "workflow_completed": trace_result.get(
"workflow_completed"),
988 "initial_energy": trace_result.get(
"initial_energy"),
989 "final_energy": trace_result.get(
"final_energy"),
993 artifact_id=
"unsupported_state_vector_density_noise",
994 artifact_class=
"unsupported_case",
996 path=
"unsupported_state_vector_density_noise.json",
997 status=unsupported_result[
"status"],
998 expected_statuses=[
"unsupported"],
999 purpose=
"Structured negative evidence for backend-mismatch and mixed-state-only unsupported behavior.",
1000 generation_command=base_validation_command,
1002 "unsupported_category": unsupported_result.get(
"unsupported_category"),
1003 "unsupported_reason": unsupported_result.get(
"unsupported_reason"),
1008 mandatory_artifacts = [artifact
for artifact
in artifacts
if artifact[
"mandatory"]]
1010 status_match_count = 0
1011 for artifact
in mandatory_artifacts:
1012 if (output_dir / artifact[
"path"]).exists():
1014 if artifact[
"status"]
in artifact[
"expected_statuses"]:
1015 status_match_count += 1
1019 if present_count == len(mandatory_artifacts)
1020 and status_match_count == len(mandatory_artifacts)
1025 "suite_name":
"exact_density_validation",
1026 "status": bundle_status,
1027 "backend": PRIMARY_BACKEND,
1028 "reference_backend": REFERENCE_BACKEND,
1031 "generation_command": validation_bundle_command,
1032 "working_directory": str(REPO_ROOT),
1036 "mandatory_artifact_count": len(mandatory_artifacts),
1037 "present_artifact_count": present_count,
1038 "status_match_count": status_match_count,
1039 "missing_artifact_count": len(mandatory_artifacts) - present_count,
1040 "mismatched_status_count": len(mandatory_artifacts) - status_match_count,
1042 "artifacts": artifacts,
1049 missing_fields = [field
for field
in EXACT_DENSITY_VALIDATION_BUNDLE_FIELDS
if field
not in bundle]
1052 "Exact-density validation bundle is missing required fields: {}".format(
1053 ", ".join(missing_fields)
1057 artifact_ids = {artifact[
"artifact_id"]
for artifact
in bundle[
"artifacts"]}
1059 "micro_validation_bundle",
1060 "exact_regime_workflow_bundle",
1061 "fixed_parameters_4q",
1062 "fixed_parameters_6q",
1063 "optimization_trace_4q",
1064 "unsupported_state_vector_density_noise",
1066 if required_ids - artifact_ids:
1068 "Exact-density validation bundle is missing required artifact IDs: {}".format(
1069 ", ".join(sorted(required_ids - artifact_ids))
1073 for artifact
in bundle[
"artifacts"]:
1074 artifact_path = bundle_dir / artifact[
"path"]
1075 if artifact[
"mandatory"]
and not artifact_path.exists():
1077 f
"Exact-density validation bundle is missing artifact file: {artifact['path']}" 1079 if artifact[
"status"]
not in artifact[
"expected_statuses"]:
1081 f
"Exact-density validation artifact {artifact['artifact_id']} has unexpected status {artifact['status']}" 1087 output_path.parent.mkdir(parents=
True, exist_ok=
True)
1088 output_path.write_text(json.dumps(bundle, indent=2) +
"\n", encoding=
"utf-8")
1092 print(
"\n" +
"=" * 78)
1094 " Exact-Density Validation Bundle [{} vs {}]".format(
1095 bundle[
"backend"], bundle[
"reference_backend"]
1100 " Mandatory artifacts present: {}/{}".format(
1101 bundle[
"summary"][
"present_artifact_count"],
1102 bundle[
"summary"][
"mandatory_artifact_count"],
1106 " Status matches: {}/{}".format(
1107 bundle[
"summary"][
"status_match_count"],
1108 bundle[
"summary"][
"mandatory_artifact_count"],
1111 print(
" Git revision:", bundle[
"provenance"][
"git_revision"])
1115 output_dir = Path(output_dir)
1116 output_dir.mkdir(parents=
True, exist_ok=
True)
1120 f
"fixed_parameters_{qbit_num}q",
1123 for qbit_num
in FIXED_PARAMETER_QUBITS
1125 trace_result =
capture_case(
"optimization_trace_4q", run_optimization_trace)
1127 backend=
"state_vector",
1134 "unsupported_state_vector_density_noise",
1135 run_unsupported_state_vector_density_noise_case,
1136 base_metadata=unsupported_base_metadata,
1139 for result
in fixed_results:
1140 write_json(output_dir / f
"{result['case_name']}.json", result)
1141 write_json(output_dir /
"optimization_trace_4q.json", trace_result)
1143 output_dir /
"unsupported_state_vector_density_noise.json",
1147 micro_results = run_micro_validation()
1148 micro_bundle = build_micro_validation_bundle(micro_results)
1149 write_micro_validation_bundle_file(output_dir / MICRO_VALIDATION_BUNDLE_FILENAME, micro_bundle)
1154 output_dir / EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME, workflow_bundle
1159 fixed_results=fixed_results,
1160 trace_result=trace_result,
1161 unsupported_result=unsupported_result,
1162 micro_bundle=micro_bundle,
1163 workflow_bundle=workflow_bundle,
1166 return validation_bundle
1170 vqe, hamiltonian, topology =
build_vqe(qbit_num)
1172 vqe.set_Optimized_Parameters(params)
1175 squander_energy = float(vqe.Optimization_Problem(params))
1178 vqe.get_Qiskit_Circuit(),
1181 simulator = AerSimulator(method=
"density_matrix")
1182 result = simulator.run(noisy_qiskit_circuit, shots=1).
result()
1183 aer_rho = np.asarray(result.data()[
"density_matrix"])
1184 aer_energy_real, aer_energy_imag =
density_energy(hamiltonian, aer_rho)
1186 trace_val = np.trace(aer_rho)
1187 purity = float(np.real(np.trace(aer_rho @ aer_rho)))
1189 backend=PRIMARY_BACKEND,
1193 reference_backend=REFERENCE_BACKEND,
1198 "status":
"completed",
1199 "parameter_vector": params.tolist(),
1200 "squander_energy": squander_energy,
1201 "aer_energy_real": aer_energy_real,
1202 "aer_energy_imag": aer_energy_imag,
1203 "absolute_energy_error": abs(squander_energy - aer_energy_real),
1204 "aer_trace_real": float(np.real(trace_val)),
1205 "aer_trace_imag": float(np.imag(trace_val)),
1206 "aer_purity": purity,
1214 vqe, _, topology =
build_vqe(4, optimizer=
"COSINE")
1216 vqe.set_Optimized_Parameters(initial_parameters)
1219 trace_start = time.perf_counter()
1220 initial_energy = float(vqe.Optimization_Problem(initial_parameters))
1221 vqe.Start_Optimization()
1222 final_parameters = np.asarray(vqe.get_Optimized_Parameters(), dtype=np.float64)
1223 final_energy = float(vqe.Optimization_Problem(final_parameters))
1226 backend=PRIMARY_BACKEND,
1235 "initial_parameters": initial_parameters.tolist(),
1236 "final_parameters": final_parameters.tolist(),
1237 "initial_energy": initial_energy,
1238 "final_energy": final_energy,
1239 "energy_improvement": initial_energy - final_energy,
1241 "parameter_count":
int(initial_parameters.size),
1242 "workflow_completed":
True,
1243 "trace_kind":
"bounded_optimization_trace",
1244 "total_trace_runtime_ms": (time.perf_counter() - trace_start) * 1000.0,
1245 "process_peak_rss_kb":
int(
1246 resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
1248 "status":
"completed",
1251 "counts_toward_mandatory_baseline":
False,
1252 "required_validation_trace":
True,
1262 backend=
"state_vector",
1270 "parameter_vector": parameters.tolist(),
1271 "energy": float(vqe.Optimization_Problem(parameters)),
1272 "status":
"completed",
1279 base_metadata = {}
if base_metadata
is None else dict(base_metadata)
1281 result = dict(base_metadata)
1282 result.update(case_callable())
1283 result.setdefault(
"status",
"completed")
1284 result[
"case_name"] = case_name
1285 except Exception
as exc:
1286 result = dict(base_metadata)
1289 "case_name": case_name,
1290 "status":
"unsupported",
1291 "unsupported_category":
"phase2_support_matrix",
1292 "unsupported_reason": str(exc),
1302 output_path.parent.mkdir(parents=
True, exist_ok=
True)
1303 output_path.write_text(json.dumps(payload, indent=2) +
"\n", encoding=
"utf-8")
1307 parser = argparse.ArgumentParser(description=__doc__)
1308 parser.add_argument(
1312 help=
"Optional directory for JSON evidence artifacts.",
1314 parser.add_argument(
1315 "--workflow-bundle",
1316 action=
"store_true",
1317 help=
"Run the workflow-scale exact-regime validation matrix and emit the bundle.",
1319 parser.add_argument(
1320 "--publication-bundle",
1321 action=
"store_true",
1322 help=
"Run the full exact-density validation bundle workflow.",
1324 args = parser.parse_args()
1326 if args.publication_bundle:
1327 if args.output_dir
is None:
1329 "Exact-density validation bundle generation requires --output-dir" 1333 if validation_bundle[
"status"] !=
"pass":
1337 if args.workflow_bundle:
1339 trace_result =
capture_case(
"optimization_trace_4q", run_optimization_trace)
1341 workflow_results, trace_result=trace_result
1344 if trace_result[
"status"] ==
"completed":
1346 " Workflow supported trace [{}]:".format(trace_result[
"backend"]),
1347 trace_result[
"trace_kind"],
1349 trace_result[
"bridge_supported_pass"],
1352 if args.output_dir
is not None:
1354 args.output_dir / EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME,
1357 write_json(args.output_dir / OPTIMIZATION_TRACE_ARTIFACT_FILENAME, trace_result)
1359 if workflow_bundle[
"status"] !=
"pass":
1365 f
"fixed_parameters_{qbit_num}q",
1368 for qbit_num
in FIXED_PARAMETER_QUBITS
1370 trace_result =
capture_case(
"optimization_trace_4q", run_optimization_trace)
1372 backend=
"state_vector",
1379 "unsupported_state_vector_density_noise",
1380 run_unsupported_state_vector_density_noise_case,
1381 base_metadata=unsupported_base_metadata,
1384 for result
in fixed_results:
1385 if result[
"status"] ==
"completed":
1387 "Fixed-parameter case [{}]:".format(result[
"backend"]),
1389 "qubits, |E_sq - E_aer| =",
1390 f
"{result['absolute_energy_error']:.6e}",
1394 "Fixed-parameter case [{}]:".format(result[
"backend"]),
1396 result[
"case_name"],
1397 result[
"unsupported_reason"],
1400 if trace_result[
"status"] ==
"completed":
1402 "Optimization trace [{}]:".format(trace_result[
"backend"]),
1404 f
"{trace_result['initial_energy']:.6e}",
1406 f
"{trace_result['final_energy']:.6e}",
1410 "Optimization trace [{}]:".format(trace_result[
"backend"]),
1411 trace_result[
"status"],
1412 trace_result[
"unsupported_reason"],
1416 "Unsupported backend-mismatch case [{}]:".format(unsupported_result[
"backend"]),
1417 unsupported_result[
"status"],
1418 unsupported_result.get(
"unsupported_reason",
""),
1421 if args.output_dir
is not None:
1422 for result
in fixed_results:
1423 write_json(args.output_dir / f
"{result['case_name']}.json", result)
1424 write_json(args.output_dir /
"optimization_trace_4q.json", trace_result)
1426 args.output_dir /
"unsupported_state_vector_density_noise.json",
1431 if __name__ ==
"__main__":
def classify_bridge_unsupported_reason
def validate_artifact_payload(payload)
def build_optimizer_config()
def build_exact_density_validation_bundle
def build_reference_bridge_metadata(vqe)
def density_energy(hamiltonian, density_matrix)
def run_fixed_parameter_case
def write_exact_density_validation_bundle
def validate_exact_regime_workflow_bundle(bundle)
def build_software_metadata()
def build_support_tier_summary(cases)
def run_exact_regime_workflow_matrix
def generate_exact_density_validation_bundle
generate_zz_xx_hamiltonian
def build_exact_regime_bridge_metadata
def build_exact_regime_workflow_bundle
def build_open_chain_topology
def run_optimization_trace()
def capture_exact_regime_workflow_case
def _build_validation_bundle_artifact_entry(artifact_id, artifact_class, mandatory, path, status, expected_statuses, purpose, generation_command, summary=None)
def classify_noise_boundary_reason
def build_initial_parameters
def build_required_case_classification()
def build_squander_density_from_qiskit_circuit(base_circuit, density_noise)
def print_exact_density_validation_bundle_summary(bundle)
def validate_exact_density_validation_bundle
def build_reference_noise()
def build_exact_regime_parameter_sets
def run_exact_regime_workflow_case
def insert_reference_noise
def build_hamiltonian_metadata()
def build_exact_regime_threshold_metadata
def write_exact_regime_workflow_bundle
def build_unsupported_state_vector_density_noise_vqe
def print_exact_regime_workflow_summary(bundle)
def run_unsupported_state_vector_density_noise_case()