Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
descriptor_reconstruction_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Partition-descriptor reconstruction validation.
3 
4 Emits reconstruction-oriented audits for one continuity case, the boundary-heavy
5 4-qubit microcase, and one structured-family case. Verifies that partition
6 descriptors expose reviewable qubit-support, remapping, and parameter-routing
7 metadata.
8 
9 Run with:
10  python benchmarks/density_matrix/planner_surface/descriptor_reconstruction_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_structured_descriptor_set,
31  iter_structured_descriptor_sets,
32 )
33 from squander.partitioning.noisy_planner import (
34  build_phase3_continuity_partition_descriptor_set,
35  validate_partition_descriptor_set,
36 )
37 
38 SUITE_NAME = "phase3_planner_surface_descriptor_reconstruction"
39 ARTIFACT_FILENAME = "descriptor_reconstruction_bundle.json"
40 DEFAULT_OUTPUT_DIR = (
41  REPO_ROOT
42  / "benchmarks"
43  / "density_matrix"
44  / "artifacts"
45  / "planner_surface"
46  / "descriptor_reconstruction"
47 )
48 ARTIFACT_CORE_FIELDS = (
49  "suite_name",
50  "status",
51  "requested_mode",
52  "software",
53  "summary",
54  "cases",
55 )
56 
57 
58 def _reconstruction_case(case_kind: str, metadata: dict, descriptor_set) -> dict:
59  validated = validate_partition_descriptor_set(descriptor_set)
60  payload = validated.to_dict()
61  return {
62  "case_kind": case_kind,
63  "case_name": payload["workload_id"],
64  "status": "pass",
65  "reconstruction_pass": True,
66  "requested_mode": payload["requested_mode"],
67  "source_type": payload["source_type"],
68  "workload_id": payload["workload_id"],
69  "qbit_num": payload["qbit_num"],
70  "partition_count": payload["partition_count"],
71  "descriptor_member_count": payload["descriptor_member_count"],
72  "remapped_partition_count": sum(
73  partition["requires_remap"] for partition in payload["partitions"]
74  ),
75  "parameter_routing_segment_count": sum(
76  len(partition["parameter_routing"]) for partition in payload["partitions"]
77  ),
78  "descriptor_partitions": payload["partitions"],
79  "metadata": metadata,
80  }
81 
82 
83 def run_validation(verbose: bool = True) -> list[dict]:
84  continuity_vqe, _, _ = build_phase2_continuity_vqe(4)
85  continuity_case = _reconstruction_case(
86  "continuity",
87  {"qbit_num": 4},
89  )
90 
91  boundary_case = _reconstruction_case(
92  "boundary_microcase",
93  {"case_name": "microcase_4q_partition_boundary_triplet", "qbit_num": 4},
94  build_microcase_descriptor_set("microcase_4q_partition_boundary_triplet"),
95  )
96 
97  structured_metadata, _ = next(iter(iter_structured_descriptor_sets()))
98  structured_case = _reconstruction_case(
99  "structured_family",
100  structured_metadata,
102  structured_metadata["family_name"],
103  qbit_num=structured_metadata["qbit_num"],
104  noise_pattern=structured_metadata["noise_pattern"],
105  seed=structured_metadata["seed"],
106  ),
107  )
108 
109  cases = [continuity_case, boundary_case, structured_case]
110  if verbose:
111  print("Partition-descriptor reconstruction:")
112  for case in cases:
113  print(
114  " {case_name}: remapped_partitions={remapped_partition_count}, parameter_segments={parameter_routing_segment_count}, reconstruction_pass={reconstruction_pass}".format(
115  **case
116  )
117  )
118  return cases
119 
120 
121 def build_artifact_bundle(cases: list[dict]) -> dict:
122  reconstruction_passes = sum(case["reconstruction_pass"] for case in cases)
123  passed_cases = sum(case["status"] == "pass" for case in cases)
124  bundle = {
125  "suite_name": SUITE_NAME,
126  "status": "pass"
127  if passed_cases == len(cases) and reconstruction_passes == len(cases)
128  else "fail",
129  "requested_mode": "partitioned_density",
130  "software": build_software_metadata(),
131  "summary": {
132  "total_cases": len(cases),
133  "passed_cases": passed_cases,
134  "reconstruction_passes": reconstruction_passes,
135  "continuity_cases": sum(
136  case["case_kind"] == "continuity" for case in cases
137  ),
138  "boundary_microcases": sum(
139  case["case_kind"] == "boundary_microcase" for case in cases
140  ),
141  "structured_family_cases": sum(
142  case["case_kind"] == "structured_family" for case in cases
143  ),
144  "remapped_partition_count": sum(
145  case["remapped_partition_count"] for case in cases
146  ),
147  "parameter_routing_segment_count": sum(
148  case["parameter_routing_segment_count"] for case in cases
149  ),
150  },
151  "cases": cases,
152  }
153  missing = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
154  if missing:
155  raise ValueError(
156  "Descriptor reconstruction bundle missing required fields: {}".format(
157  ", ".join(missing)
158  )
159  )
160  return bundle
161 
162 
163 def write_artifact_bundle(bundle: dict, output_dir: Path = DEFAULT_OUTPUT_DIR) -> Path:
164  output_dir.mkdir(parents=True, exist_ok=True)
165  output_path = output_dir / ARTIFACT_FILENAME
166  output_path.write_text(json.dumps(bundle, indent=2, sort_keys=True) + "\n")
167  return output_path
168 
169 
170 def main(argv: list[str] | None = None) -> int:
171  parser = argparse.ArgumentParser(description=__doc__)
172  parser.add_argument(
173  "--output-dir",
174  type=Path,
175  default=DEFAULT_OUTPUT_DIR,
176  help="Directory to write the descriptor reconstruction bundle into.",
177  )
178  parser.add_argument(
179  "--quiet",
180  action="store_true",
181  help="Suppress per-case console output.",
182  )
183  args = parser.parse_args(argv)
184 
185  results = run_validation(verbose=not args.quiet)
186  bundle = build_artifact_bundle(results)
187  output_path = write_artifact_bundle(bundle, output_dir=args.output_dir)
188 
189  if not args.quiet:
190  print("Wrote {}".format(output_path))
191 
192  return 0 if bundle["status"] == "pass" else 1
193 
194 
195 if __name__ == "__main__":
196  raise SystemExit(main())
def build_phase2_continuity_vqe
def validate_partition_descriptor_set
def build_phase3_continuity_partition_descriptor_set
def build_software_metadata()