Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
continuity_descriptor_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Continuity partition-descriptor validation.
3 
4 Builds the required 4, 6, 8, and 10 qubit Phase 2 continuity-anchor workloads
5 and verifies that each one emits a conforming partition-descriptor set through
6 the continuity entry route.
7 
8 Run with:
9  python benchmarks/density_matrix/planner_surface/continuity_descriptor_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  build_case_metadata,
25  build_phase2_continuity_vqe,
26  build_software_metadata,
27 )
28 from squander.partitioning.noisy_planner import (
29  DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
30  build_phase3_continuity_partition_descriptor_set,
31 )
32 
33 SUITE_NAME = "phase3_planner_surface_continuity_descriptors"
34 ARTIFACT_FILENAME = "continuity_descriptor_bundle.json"
35 DEFAULT_OUTPUT_DIR = (
36  REPO_ROOT
37  / "benchmarks"
38  / "density_matrix"
39  / "artifacts"
40  / "planner_surface"
41  / "continuity_descriptor"
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 = descriptor_set.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": f"phase2_xxz_hea_q{qbit_num}_continuity",
67  "case_kind": "phase3_planner_surface_continuity_descriptors",
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  "partition_count": payload["partition_count"],
74  "descriptor_member_count": payload["descriptor_member_count"],
75  "gate_count": payload["gate_count"],
76  "noise_count": payload["noise_count"],
77  "max_partition_qubits": payload["max_partition_qubits"],
78  "max_partition_span": payload["max_partition_span"],
79  "partition_member_counts": payload["partition_member_counts"],
80  "continuity_descriptor_pass": (
81  payload["partition_count"] > 0
82  and payload["descriptor_member_count"]
83  == payload["gate_count"] + payload["noise_count"]
84  and payload["max_partition_qubits"]
85  == DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS
86  ),
87  "descriptor_partitions": payload["partitions"],
88  }
89  )
90  return case
91 
92 
93 def build_artifact_bundle(cases: list[dict]) -> dict:
94  passed_cases = sum(case["status"] == "pass" for case in cases)
95  descriptor_passes = sum(case["continuity_descriptor_pass"] for case in cases)
96  bundle = {
97  "suite_name": SUITE_NAME,
98  "status": "pass"
99  if passed_cases == len(cases) and descriptor_passes == len(cases)
100  else "fail",
101  "requested_mode": "partitioned_density",
102  "software": build_software_metadata(),
103  "summary": {
104  "total_cases": len(cases),
105  "passed_cases": passed_cases,
106  "continuity_descriptor_passes": descriptor_passes,
107  "required_qubits": list(REQUIRED_QUBITS),
108  "required_pass_rate": 1.0,
109  "actual_pass_rate": passed_cases / len(cases) if cases else 0.0,
110  },
111  "cases": cases,
112  }
113  missing = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
114  if missing:
115  raise ValueError(
116  "Continuity descriptor bundle missing required fields: {}".format(
117  ", ".join(missing)
118  )
119  )
120  return bundle
121 
122 
123 def write_artifact_bundle(bundle: dict, output_dir: Path = DEFAULT_OUTPUT_DIR) -> Path:
124  output_dir.mkdir(parents=True, exist_ok=True)
125  output_path = output_dir / ARTIFACT_FILENAME
126  output_path.write_text(json.dumps(bundle, indent=2, sort_keys=True) + "\n")
127  return output_path
128 
129 
130 def run_validation(verbose: bool = True) -> list[dict]:
131  results = [build_case_result(qbit_num) for qbit_num in REQUIRED_QUBITS]
132  if verbose:
133  print("Continuity partition descriptors:")
134  for case in results:
135  print(
136  " q={qbit_num}: partitions={partition_count}, members={descriptor_member_count}, span={max_partition_span}, continuity_pass={continuity_descriptor_pass}".format(
137  **case
138  )
139  )
140  return results
141 
142 
143 def main(argv: list[str] | None = None) -> int:
144  parser = argparse.ArgumentParser(description=__doc__)
145  parser.add_argument(
146  "--output-dir",
147  type=Path,
148  default=DEFAULT_OUTPUT_DIR,
149  help="Directory to write the continuity descriptor bundle into.",
150  )
151  parser.add_argument(
152  "--quiet",
153  action="store_true",
154  help="Suppress per-case console output.",
155  )
156  args = parser.parse_args(argv)
157 
158  results = run_validation(verbose=not args.quiet)
159  bundle = build_artifact_bundle(results)
160  output_path = write_artifact_bundle(bundle, output_dir=args.output_dir)
161 
162  if not args.quiet:
163  print("Wrote {}".format(output_path))
164 
165  return 0 if bundle["status"] == "pass" else 1
166 
167 
168 if __name__ == "__main__":
169  raise SystemExit(main())
def build_phase2_continuity_vqe
def build_phase3_continuity_partition_descriptor_set
def build_software_metadata()