Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
fused_performance_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Fused performance validation: timing, memory, and threshold-or-diagnosis closure.
3 
4 Benchmarks representative required structured cases with real fused coverage and
5 closes the threshold-or-diagnosis rule for publication-style evidence.
6 
7 Run with:
8  python benchmarks/density_matrix/partitioned_runtime/fused_performance_validation.py
9 """
10 
11 from __future__ import annotations
12 
13 import argparse
14 import json
15 import statistics
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.partitioned_runtime.common import (
24  PHASE3_RUNTIME_DENSITY_TOL,
25  execute_fused_with_reference,
26 )
27 from benchmarks.density_matrix.partitioned_runtime.fusion_case_selection import (
28  iter_fusion_structured_cases,
29 )
30 from benchmarks.density_matrix.planner_surface.common import build_software_metadata
31 from squander.partitioning.noisy_runtime import (
32  execute_partitioned_density,
33  execute_partitioned_density_fused,
34 )
35 
36 SUITE_NAME = "phase3_partitioned_runtime_fused_performance"
37 ARTIFACT_FILENAME = "fused_performance_bundle.json"
38 DEFAULT_OUTPUT_DIR = (
39  REPO_ROOT
40  / "benchmarks"
41  / "density_matrix"
42  / "artifacts"
43  / "partitioned_runtime"
44  / "fused_performance"
45 )
46 ARTIFACT_CORE_FIELDS = (
47  "suite_name",
48  "status",
49  "software",
50  "summary",
51  "cases",
52 )
53 REPETITIONS = 3
54 
55 
56 def _benchmark_case(metadata: dict, descriptor_set, parameters) -> dict:
57  fused_result, _, density_metrics = execute_fused_with_reference(
58  descriptor_set, parameters
59  )
60  if not fused_result.actual_fused_execution:
61  return {
62  "case_name": metadata["workload_id"],
63  "case_kind": metadata["case_kind"],
64  "qbit_num": metadata["qbit_num"],
65  "actual_fused_execution": False,
66  "threshold_or_diagnosis_pass": False,
67  "reason": "no_real_fused_coverage",
68  "metadata": dict(metadata),
69  }
70 
71  baseline_runtime_ms: list[float] = []
72  fused_runtime_ms: list[float] = []
73  baseline_peak_rss_kb: list[int] = []
74  fused_peak_rss_kb: list[int] = []
75  for _ in range(REPETITIONS):
76  baseline_result = execute_partitioned_density(descriptor_set, parameters)
77  fused_repeat_result = execute_partitioned_density_fused(descriptor_set, parameters)
78  baseline_runtime_ms.append(baseline_result.runtime_ms)
79  fused_runtime_ms.append(fused_repeat_result.runtime_ms)
80  baseline_peak_rss_kb.append(baseline_result.peak_rss_kb)
81  fused_peak_rss_kb.append(fused_repeat_result.peak_rss_kb)
82 
83  baseline_median_runtime_ms = float(statistics.median(baseline_runtime_ms))
84  fused_median_runtime_ms = float(statistics.median(fused_runtime_ms))
85  baseline_median_peak_rss_kb = int(statistics.median(baseline_peak_rss_kb))
86  fused_median_peak_rss_kb = int(statistics.median(fused_peak_rss_kb))
87  speedup = (
88  baseline_median_runtime_ms / fused_median_runtime_ms
89  if fused_median_runtime_ms > 0.0
90  else 0.0
91  )
92  memory_reduction = (
93  (baseline_median_peak_rss_kb - fused_median_peak_rss_kb)
94  / baseline_median_peak_rss_kb
95  if baseline_median_peak_rss_kb > 0
96  else 0.0
97  )
98  correctness_pass = (
99  density_metrics["frobenius_norm_diff"] <= PHASE3_RUNTIME_DENSITY_TOL
100  and density_metrics["max_abs_diff"] <= PHASE3_RUNTIME_DENSITY_TOL
101  and fused_result.rho_is_valid
102  )
103  positive_threshold_pass = correctness_pass and (
104  speedup >= 1.2 or memory_reduction >= 0.15
105  )
106  diagnosis_reasons: list[str] = []
107  if not positive_threshold_pass:
108  if fused_result.deferred_region_count > 0:
109  diagnosis_reasons.append("limited_fused_coverage_due_to_noise_boundaries")
110  if fused_result.supported_unfused_region_count > 0:
111  diagnosis_reasons.append("supported_islands_left_unfused")
112  if fused_median_runtime_ms >= baseline_median_runtime_ms:
113  diagnosis_reasons.append("python_fused_kernel_overhead_or_short_unitary_islands")
114  if fused_median_peak_rss_kb >= baseline_median_peak_rss_kb:
115  diagnosis_reasons.append("no_peak_memory_reduction_on_representative_case")
116  if not diagnosis_reasons:
117  diagnosis_reasons.append("no_representative_threshold_gain_observed")
118  return {
119  "case_name": metadata["workload_id"],
120  "case_kind": metadata["case_kind"],
121  "family_name": metadata["family_name"],
122  "qbit_num": metadata["qbit_num"],
123  "noise_pattern": metadata["noise_pattern"],
124  "runtime_path": fused_result.runtime_path,
125  "actual_fused_execution": fused_result.actual_fused_execution,
126  "fused_region_count": fused_result.fused_region_count,
127  "supported_unfused_region_count": fused_result.supported_unfused_region_count,
128  "deferred_region_count": fused_result.deferred_region_count,
129  "fused_gate_count": fused_result.fused_gate_count,
130  "frobenius_norm_diff": density_metrics["frobenius_norm_diff"],
131  "max_abs_diff": density_metrics["max_abs_diff"],
132  "correctness_pass": correctness_pass,
133  "baseline_median_runtime_ms": baseline_median_runtime_ms,
134  "fused_median_runtime_ms": fused_median_runtime_ms,
135  "baseline_median_peak_rss_kb": baseline_median_peak_rss_kb,
136  "fused_median_peak_rss_kb": fused_median_peak_rss_kb,
137  "speedup": speedup,
138  "memory_reduction": memory_reduction,
139  "positive_threshold_pass": positive_threshold_pass,
140  "diagnosis_reasons": diagnosis_reasons,
141  "threshold_or_diagnosis_pass": correctness_pass
142  and (positive_threshold_pass or len(diagnosis_reasons) > 0),
143  "metadata": dict(metadata),
144  }
145 
146 
147 def build_cases() -> list[dict]:
148  selected_by_qubits: dict[int, dict] = {}
149  for metadata, descriptor_set, parameters in iter_fusion_structured_cases():
150  if metadata["qbit_num"] in selected_by_qubits:
151  continue
152  case = _benchmark_case(metadata, descriptor_set, parameters)
153  if case["actual_fused_execution"]:
154  selected_by_qubits[metadata["qbit_num"]] = case
155  if set(selected_by_qubits) == {8, 10}:
156  break
157  missing = {8, 10} - set(selected_by_qubits)
158  if missing:
159  raise RuntimeError(
160  "Missing representative fused benchmark cases for qubits: {}".format(
161  sorted(missing)
162  )
163  )
164  return [selected_by_qubits[8], selected_by_qubits[10]]
165 
166 
167 def build_artifact_bundle(cases: list[dict]) -> dict:
168  threshold_pass_cases = sum(case["positive_threshold_pass"] for case in cases)
169  threshold_or_diagnosis_passes = sum(
170  case["threshold_or_diagnosis_pass"] for case in cases
171  )
172  bundle = {
173  "suite_name": SUITE_NAME,
174  "status": "pass"
175  if threshold_or_diagnosis_passes == len(cases)
176  and len(cases) == 2
177  and (
178  threshold_pass_cases >= 1
179  or all(case["diagnosis_reasons"] for case in cases if not case["positive_threshold_pass"])
180  )
181  else "fail",
182  "software": build_software_metadata(),
183  "summary": {
184  "total_cases": len(cases),
185  "representative_qubits": [8, 10],
186  "positive_threshold_pass_cases": threshold_pass_cases,
187  "threshold_or_diagnosis_passes": threshold_or_diagnosis_passes,
188  "diagnosis_only_cases": sum(
189  (not case["positive_threshold_pass"]) and case["threshold_or_diagnosis_pass"]
190  for case in cases
191  ),
192  },
193  "cases": cases,
194  }
195  missing = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
196  if missing:
197  raise ValueError(
198  "Fused performance bundle missing required fields: {}".format(
199  ", ".join(missing)
200  )
201  )
202  return bundle
203 
204 
205 def write_artifact_bundle(bundle: dict, output_dir: Path = DEFAULT_OUTPUT_DIR) -> Path:
206  output_dir.mkdir(parents=True, exist_ok=True)
207  output_path = output_dir / ARTIFACT_FILENAME
208  output_path.write_text(json.dumps(bundle, indent=2, sort_keys=True) + "\n")
209  return output_path
210 
211 
212 def main(argv: list[str] | None = None) -> int:
213  parser = argparse.ArgumentParser(description=__doc__)
214  parser.add_argument(
215  "--output-dir",
216  type=Path,
217  default=DEFAULT_OUTPUT_DIR,
218  help="Directory to write the fused performance bundle into.",
219  )
220  parser.add_argument(
221  "--quiet",
222  action="store_true",
223  help="Suppress per-case console output.",
224  )
225  args = parser.parse_args(argv)
226 
227  cases = build_cases()
228  bundle = build_artifact_bundle(cases)
229  output_path = write_artifact_bundle(bundle, output_dir=args.output_dir)
230 
231  if not args.quiet:
232  for case in cases:
233  print(
234  "{case_name}: speedup={speedup:.3f}, memory_reduction={memory_reduction:.3f}, positive={positive_threshold_pass}, diagnosis={diagnosis_reasons}".format(
235  **case
236  )
237  )
238  print("Wrote {}".format(output_path))
239 
240  return 0 if bundle["status"] == "pass" else 1
241 
242 
243 if __name__ == "__main__":
244  raise SystemExit(main())
def build_software_metadata()