Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
descriptor_ordering_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Partition-descriptor ordering and noise placement validation.
3 
4 Emits order-and-noise audits for one continuity case, the boundary-heavy 4-qubit
5 microcase, and one structured-family case. Verifies that partition descriptors
6 preserve exact within-partition order and keep noise placement explicit as
7 first-class descriptor content.
8 
9 Run with:
10  python benchmarks/density_matrix/planner_surface/descriptor_ordering_validation.py
11 """
12 
13 from __future__ import annotations
14 
15 import argparse
16 import json
17 import sys
18 from pathlib import Path
19 
20 REPO_ROOT = Path(__file__).resolve().parents[3]
21 if str(REPO_ROOT) not in sys.path:
22  sys.path.insert(0, str(REPO_ROOT))
23 
24 from benchmarks.density_matrix.planner_surface.common import (
25  build_phase2_continuity_vqe,
26  build_software_metadata,
27 )
28 from benchmarks.density_matrix.planner_surface.workloads import (
29  build_microcase_descriptor_set,
30  build_microcase_surface,
31  build_structured_descriptor_set,
32  build_structured_surface,
33  iter_structured_descriptor_sets,
34 )
35 from squander.partitioning.noisy_planner import (
36  PLANNER_OP_KIND_NOISE,
37  build_phase3_continuity_partition_descriptor_set,
38  build_phase3_continuity_planner_surface,
39 )
40 
41 SUITE_NAME = "phase3_planner_surface_descriptor_ordering"
42 ARTIFACT_FILENAME = "descriptor_ordering_bundle.json"
43 DEFAULT_OUTPUT_DIR = (
44  REPO_ROOT
45  / "benchmarks"
46  / "density_matrix"
47  / "artifacts"
48  / "planner_surface"
49  / "descriptor_ordering"
50 )
51 ARTIFACT_CORE_FIELDS = (
52  "suite_name",
53  "status",
54  "requested_mode",
55  "software",
56  "summary",
57  "cases",
58 )
59 
60 
61 def _flatten_canonical_indices(payload: dict) -> list[int]:
62  return [
63  member["canonical_operation_index"]
64  for partition in payload["partitions"]
65  for member in partition["members"]
66  ]
67 
68 
69 def _flatten_member_names(payload: dict) -> list[str]:
70  return [
71  member["name"]
72  for partition in payload["partitions"]
73  for member in partition["members"]
74  ]
75 
76 
77 def _case_from_surface(case_kind: str, metadata: dict, surface, descriptor_set) -> dict:
78  surface_payload = surface.to_dict()
79  descriptor_payload = descriptor_set.to_dict()
80  expected_names = [operation["name"] for operation in surface_payload["operations"]]
81  actual_names = _flatten_member_names(descriptor_payload)
82  ordering_pass = (
83  _flatten_canonical_indices(descriptor_payload)
84  == list(range(surface_payload["operation_count"]))
85  and actual_names == expected_names
86  and descriptor_payload["noise_count"]
87  == sum(
88  member["kind"] == PLANNER_OP_KIND_NOISE
89  for partition in descriptor_payload["partitions"]
90  for member in partition["members"]
91  )
92  )
93 
94  return {
95  "case_kind": case_kind,
96  "case_name": descriptor_payload["workload_id"],
97  "status": "pass",
98  "ordering_pass": ordering_pass,
99  "requested_mode": descriptor_payload["requested_mode"],
100  "source_type": descriptor_payload["source_type"],
101  "workload_id": descriptor_payload["workload_id"],
102  "qbit_num": descriptor_payload["qbit_num"],
103  "partition_count": descriptor_payload["partition_count"],
104  "descriptor_member_count": descriptor_payload["descriptor_member_count"],
105  "gate_count": descriptor_payload["gate_count"],
106  "noise_count": descriptor_payload["noise_count"],
107  "boundary_mixed_partition_count": sum(
108  partition["gate_count"] > 0 and partition["noise_count"] > 0
109  for partition in descriptor_payload["partitions"]
110  ),
111  "expected_name_sequence": expected_names,
112  "actual_name_sequence": actual_names,
113  "descriptor_partitions": descriptor_payload["partitions"],
114  "metadata": metadata,
115  }
116 
117 
118 def run_validation(verbose: bool = True) -> list[dict]:
119  continuity_vqe, _, _ = build_phase2_continuity_vqe(4)
120  continuity_case = _case_from_surface(
121  "continuity",
122  {"qbit_num": 4, "workload_id": "phase2_xxz_hea_q4_continuity"},
125  )
126 
127  boundary_surface = build_microcase_surface(
128  "microcase_4q_partition_boundary_triplet"
129  )
130  boundary_descriptor_set = build_microcase_descriptor_set(
131  "microcase_4q_partition_boundary_triplet"
132  )
133  boundary_case = _case_from_surface(
134  "boundary_microcase",
135  {
136  "case_name": "microcase_4q_partition_boundary_triplet",
137  "noise_pattern": "dense",
138  "qbit_num": 4,
139  },
140  boundary_surface,
141  boundary_descriptor_set,
142  )
143 
144  structured_metadata, _ = next(iter(iter_structured_descriptor_sets()))
145  structured_surface = build_structured_surface(
146  structured_metadata["family_name"],
147  qbit_num=structured_metadata["qbit_num"],
148  noise_pattern=structured_metadata["noise_pattern"],
149  seed=structured_metadata["seed"],
150  )
151  structured_descriptor_set = build_structured_descriptor_set(
152  structured_metadata["family_name"],
153  qbit_num=structured_metadata["qbit_num"],
154  noise_pattern=structured_metadata["noise_pattern"],
155  seed=structured_metadata["seed"],
156  )
157  structured_case = _case_from_surface(
158  "structured_family",
159  structured_metadata,
160  structured_surface,
161  structured_descriptor_set,
162  )
163 
164  cases = [continuity_case, boundary_case, structured_case]
165  if verbose:
166  print("Descriptor ordering and noise placement:")
167  for case in cases:
168  print(
169  " {case_name}: members={descriptor_member_count}, mixed_partitions={boundary_mixed_partition_count}, ordering_pass={ordering_pass}".format(
170  **case
171  )
172  )
173  return cases
174 
175 
176 def build_artifact_bundle(cases: list[dict]) -> dict:
177  ordering_passes = sum(case["ordering_pass"] for case in cases)
178  passed_cases = sum(case["status"] == "pass" for case in cases)
179  bundle = {
180  "suite_name": SUITE_NAME,
181  "status": "pass"
182  if passed_cases == len(cases) and ordering_passes == len(cases)
183  else "fail",
184  "requested_mode": "partitioned_density",
185  "software": build_software_metadata(),
186  "summary": {
187  "total_cases": len(cases),
188  "passed_cases": passed_cases,
189  "ordering_passes": ordering_passes,
190  "continuity_cases": sum(
191  case["case_kind"] == "continuity" for case in cases
192  ),
193  "boundary_microcases": sum(
194  case["case_kind"] == "boundary_microcase" for case in cases
195  ),
196  "structured_family_cases": sum(
197  case["case_kind"] == "structured_family" for case in cases
198  ),
199  },
200  "cases": cases,
201  }
202  missing = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
203  if missing:
204  raise ValueError(
205  "Descriptor ordering bundle missing required fields: {}".format(
206  ", ".join(missing)
207  )
208  )
209  return bundle
210 
211 
212 def write_artifact_bundle(bundle: dict, output_dir: Path = DEFAULT_OUTPUT_DIR) -> Path:
213  output_dir.mkdir(parents=True, exist_ok=True)
214  output_path = output_dir / ARTIFACT_FILENAME
215  output_path.write_text(json.dumps(bundle, indent=2, sort_keys=True) + "\n")
216  return output_path
217 
218 
219 def main(argv: list[str] | None = None) -> int:
220  parser = argparse.ArgumentParser(description=__doc__)
221  parser.add_argument(
222  "--output-dir",
223  type=Path,
224  default=DEFAULT_OUTPUT_DIR,
225  help="Directory to write the descriptor ordering bundle into.",
226  )
227  parser.add_argument(
228  "--quiet",
229  action="store_true",
230  help="Suppress per-case console output.",
231  )
232  args = parser.parse_args(argv)
233 
234  results = run_validation(verbose=not args.quiet)
235  bundle = build_artifact_bundle(results)
236  output_path = write_artifact_bundle(bundle, output_dir=args.output_dir)
237 
238  if not args.quiet:
239  print("Wrote {}".format(output_path))
240 
241  return 0 if bundle["status"] == "pass" else 1
242 
243 
244 if __name__ == "__main__":
245  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_phase3_continuity_partition_descriptor_set
def build_software_metadata()