Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
fused_classification_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Fusion classification validation: fused, supported-unfused, and deferred labels.
3 
4 Checks that fused, supported-but-unfused, and deferred or unsupported candidate
5 records remain explicit with no silent fallback.
6 
7 Run with:
8  python benchmarks/density_matrix/partitioned_runtime/fused_classification_validation.py
9 """
10 
11 from __future__ import annotations
12 
13 import argparse
14 import json
15 import sys
16 from pathlib import Path
17 
18 REPO_ROOT = Path(__file__).resolve().parents[3]
19 if str(REPO_ROOT) not in sys.path:
20  sys.path.insert(0, str(REPO_ROOT))
21 
22 from benchmarks.density_matrix.planner_surface.common import build_software_metadata
23 from benchmarks.density_matrix.partitioned_runtime.fusion_case_selection import (
24  iter_fusion_microcase_cases,
25  iter_fusion_structured_cases,
26 )
27 from squander.partitioning.noisy_runtime import (
28  PHASE3_FUSION_CLASS_DEFERRED,
29  PHASE3_FUSION_CLASS_FUSED,
30  PHASE3_FUSION_CLASS_SUPPORTED_UNFUSED,
31  PHASE3_RUNTIME_PATH_BASELINE,
32  PHASE3_RUNTIME_PATH_FUSED_UNITARY_ISLANDS,
33  execute_partitioned_density_fused,
34 )
35 
36 SUITE_NAME = "phase3_partitioned_runtime_fused_classification"
37 ARTIFACT_FILENAME = "classification_bundle.json"
38 DEFAULT_OUTPUT_DIR = (
39  REPO_ROOT
40  / "benchmarks"
41  / "density_matrix"
42  / "artifacts"
43  / "partitioned_runtime"
44  / "fused_classification"
45 )
46 ARTIFACT_CORE_FIELDS = (
47  "suite_name",
48  "status",
49  "software",
50  "summary",
51  "cases",
52 )
53 
54 
55 def _classification_case(metadata: dict, descriptor_set, parameters) -> dict:
56  runtime_result = execute_partitioned_density_fused(descriptor_set, parameters)
57  payload = runtime_result.to_dict(include_density_matrix=False)
58  classifications = [region["classification"] for region in payload["fused_regions"]]
59  return {
60  "case_name": metadata["workload_id"],
61  "case_kind": metadata["case_kind"],
62  "runtime_path": payload["runtime_path"],
63  "actual_fused_execution": payload["summary"]["actual_fused_execution"],
64  "classifications": classifications,
65  "classification_counts": {
66  PHASE3_FUSION_CLASS_FUSED: classifications.count(PHASE3_FUSION_CLASS_FUSED),
67  PHASE3_FUSION_CLASS_SUPPORTED_UNFUSED: classifications.count(
68  PHASE3_FUSION_CLASS_SUPPORTED_UNFUSED
69  ),
70  PHASE3_FUSION_CLASS_DEFERRED: classifications.count(
71  PHASE3_FUSION_CLASS_DEFERRED
72  ),
73  },
74  "classification_pass": (
75  (
76  payload["summary"]["actual_fused_execution"] is True
77  and payload["runtime_path"] == PHASE3_RUNTIME_PATH_FUSED_UNITARY_ISLANDS
78  )
79  or (
80  payload["summary"]["actual_fused_execution"] is False
81  and payload["runtime_path"] == PHASE3_RUNTIME_PATH_BASELINE
82  )
83  ),
84  "metadata": dict(metadata),
85  }
86 
87 
88 def build_cases() -> list[dict]:
89  cases: list[dict] = []
90  observed = set()
92  for metadata, descriptor_set, parameters in iterator:
93  case = _classification_case(metadata, descriptor_set, parameters)
94  cases.append(case)
95  observed.update(case["classifications"])
96  if observed >= {
97  PHASE3_FUSION_CLASS_FUSED,
98  PHASE3_FUSION_CLASS_SUPPORTED_UNFUSED,
99  PHASE3_FUSION_CLASS_DEFERRED,
100  }:
101  return cases
102  raise RuntimeError(
103  "Could not observe all required fusion classifications in sampled workloads"
104  )
105 
106 
107 def build_artifact_bundle(cases: list[dict]) -> dict:
108  classification_passes = sum(case["classification_pass"] for case in cases)
109  observed = {
110  classification
111  for case in cases
112  for classification in case["classifications"]
113  }
114  bundle = {
115  "suite_name": SUITE_NAME,
116  "status": "pass"
117  if classification_passes == len(cases)
118  and observed
119  >= {
120  PHASE3_FUSION_CLASS_FUSED,
121  PHASE3_FUSION_CLASS_SUPPORTED_UNFUSED,
122  PHASE3_FUSION_CLASS_DEFERRED,
123  }
124  else "fail",
125  "software": build_software_metadata(),
126  "summary": {
127  "total_cases": len(cases),
128  "classification_passes": classification_passes,
129  "observed_classifications": sorted(observed),
130  "fused_cases": sum(case["actual_fused_execution"] for case in cases),
131  },
132  "cases": cases,
133  }
134  missing = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
135  if missing:
136  raise ValueError(
137  "Fusion classification bundle missing required fields: {}".format(
138  ", ".join(missing)
139  )
140  )
141  return bundle
142 
143 
144 def write_artifact_bundle(bundle: dict, output_dir: Path = DEFAULT_OUTPUT_DIR) -> Path:
145  output_dir.mkdir(parents=True, exist_ok=True)
146  output_path = output_dir / ARTIFACT_FILENAME
147  output_path.write_text(json.dumps(bundle, indent=2, sort_keys=True) + "\n")
148  return output_path
149 
150 
151 def main(argv: list[str] | None = None) -> int:
152  parser = argparse.ArgumentParser(description=__doc__)
153  parser.add_argument(
154  "--output-dir",
155  type=Path,
156  default=DEFAULT_OUTPUT_DIR,
157  help="Directory to write the fusion classification bundle into.",
158  )
159  parser.add_argument(
160  "--quiet",
161  action="store_true",
162  help="Suppress per-case console output.",
163  )
164  args = parser.parse_args(argv)
165 
166  cases = build_cases()
167  bundle = build_artifact_bundle(cases)
168  output_path = write_artifact_bundle(bundle, output_dir=args.output_dir)
169 
170  if not args.quiet:
171  for case in cases:
172  print(
173  "{case_name}: path={runtime_path}, classifications={classifications}".format(
174  **case
175  )
176  )
177  print("Wrote {}".format(output_path))
178 
179  return 0 if bundle["status"] == "pass" else 1
180 
181 
182 if __name__ == "__main__":
183  raise SystemExit(main())
def build_software_metadata()