Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
continuity_surface_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Continuity planner surface validation.
3 
4 Builds the required 4, 6, 8, and 10 qubit Phase 2 continuity-anchor workloads
5 and verifies that each one reaches the canonical Phase 3 planner surface through
6 the shared bridge-based continuity entry path.
7 
8 Run with:
9  python benchmarks/density_matrix/planner_surface/continuity_surface_validation.py
10 """
11 
12 from __future__ import annotations
13 
14 import argparse
15 import json
16 import sys
17 from pathlib import Path
18 
19 REPO_ROOT = Path(__file__).resolve().parents[3]
20 if str(REPO_ROOT) not in sys.path:
21  sys.path.insert(0, str(REPO_ROOT))
22 
23 from benchmarks.density_matrix.planner_surface.common import (
24  DEFAULT_ANSATZ,
25  DEFAULT_INNER_BLOCKS,
26  DEFAULT_LAYERS,
27  PRIMARY_BACKEND,
28  build_case_metadata,
29  build_phase2_continuity_vqe,
30  build_software_metadata,
31 )
32 from squander.partitioning.noisy_planner import (
33  PLANNER_OP_KIND_GATE,
34  PLANNER_OP_KIND_NOISE,
35  build_phase3_continuity_planner_surface,
36 )
37 
38 SUITE_NAME = "phase3_planner_surface_continuity_surface"
39 ARTIFACT_FILENAME = "continuity_surface_bundle.json"
40 DEFAULT_OUTPUT_DIR = (
41  REPO_ROOT / "benchmarks" / "density_matrix" / "artifacts" / "planner_surface"
42 )
43 REQUIRED_QUBITS = (4, 6, 8, 10)
44 ARTIFACT_CORE_FIELDS = (
45  "suite_name",
46  "status",
47  "requested_mode",
48  "software",
49  "summary",
50  "cases",
51 )
52 
53 
54 def build_case_result(qbit_num: int) -> dict:
55  vqe, _, topology = build_phase2_continuity_vqe(qbit_num)
57  payload = surface.to_dict()
58 
59  case = build_case_metadata(
60  qbit_num=qbit_num,
61  topology=topology,
62  density_noise=[dict(item) for item in vqe.density_noise],
63  )
64  case.update(
65  {
66  "case_name": "phase2_xxz_hea_q{}_continuity".format(qbit_num),
67  "case_kind": "phase3_planner_surface_continuity_surface",
68  "status": "pass",
69  "requested_mode": payload["requested_mode"],
70  "source_type": payload["source_type"],
71  "workload_id": payload["workload_id"],
72  "parameter_count": payload["parameter_count"],
73  "operation_count": payload["operation_count"],
74  "gate_count": payload["gate_count"],
75  "noise_count": payload["noise_count"],
76  "gate_sequence": [
77  op["name"]
78  for op in payload["operations"]
79  if op["kind"] == PLANNER_OP_KIND_GATE
80  ],
81  "noise_sequence": [
82  op["name"]
83  for op in payload["operations"]
84  if op["kind"] == PLANNER_OP_KIND_NOISE
85  ],
86  "continuity_anchor_pass": (
87  payload["source_type"] == "generated_hea"
88  and payload["operation_count"]
89  == payload["gate_count"] + payload["noise_count"]
90  ),
91  "planner_operations": payload["operations"],
92  }
93  )
94  return case
95 
96 
97 def build_artifact_bundle(cases: list[dict]) -> dict:
98  passed_cases = sum(case["status"] == "pass" for case in cases)
99  continuity_passes = sum(case["continuity_anchor_pass"] for case in cases)
100  bundle = {
101  "suite_name": SUITE_NAME,
102  "status": "pass" if passed_cases == len(cases) and continuity_passes == len(cases) else "fail",
103  "requested_mode": "partitioned_density",
104  "software": build_software_metadata(),
105  "summary": {
106  "total_cases": len(cases),
107  "passed_cases": passed_cases,
108  "continuity_anchor_passes": continuity_passes,
109  "required_qubits": list(REQUIRED_QUBITS),
110  "required_pass_rate": 1.0,
111  "actual_pass_rate": passed_cases / len(cases) if cases else 0.0,
112  },
113  "cases": cases,
114  }
115  missing = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
116  if missing:
117  raise ValueError("Continuity surface bundle missing required fields: {}".format(", ".join(missing)))
118  return bundle
119 
120 
121 def write_artifact_bundle(bundle: dict, output_dir: Path = DEFAULT_OUTPUT_DIR) -> Path:
122  output_dir.mkdir(parents=True, exist_ok=True)
123  output_path = output_dir / ARTIFACT_FILENAME
124  output_path.write_text(json.dumps(bundle, indent=2, sort_keys=True) + "\n")
125  return output_path
126 
127 
128 def run_validation(verbose: bool = True) -> list[dict]:
129  results = [build_case_result(qbit_num) for qbit_num in REQUIRED_QUBITS]
130  if verbose:
131  print("Continuity planner surface validation:")
132  for case in results:
133  print(
134  " q={qbit_num}: ops={operation_count}, gates={gate_count}, noise={noise_count}, continuity_pass={continuity_anchor_pass}".format(
135  **case
136  )
137  )
138  return results
139 
140 
141 def main(argv: list[str] | None = None) -> int:
142  parser = argparse.ArgumentParser(description=__doc__)
143  parser.add_argument(
144  "--output-dir",
145  type=Path,
146  default=DEFAULT_OUTPUT_DIR,
147  help="Directory to write the continuity surface bundle into.",
148  )
149  parser.add_argument(
150  "--quiet",
151  action="store_true",
152  help="Suppress per-case console output.",
153  )
154  args = parser.parse_args(argv)
155 
156  results = run_validation(verbose=not args.quiet)
157  bundle = build_artifact_bundle(results)
158  output_path = write_artifact_bundle(bundle, output_dir=args.output_dir)
159 
160  if not args.quiet:
161  print("Wrote {}".format(output_path))
162 
163  return 0 if bundle["status"] == "pass" else 1
164 
165 
166 if __name__ == "__main__":
167  raise SystemExit(main())
def build_phase2_continuity_vqe
def build_phase3_continuity_planner_surface
Build a canonical planner surface from a Phase 2 continuity VQE instance.
def build_software_metadata()