Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
runtime_semantics_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Runtime semantics validation: partitioned vs sequential reference exactness.
3 
4 Exercises representative supported cases that stress remapping, parameter
5 routing, and explicit noise placement, then checks that the partitioned runtime
6 matches the sequential descriptor-driven reference exactly within the frozen
7 tolerance.
8 
9 Run with:
10  python benchmarks/density_matrix/partitioned_runtime/runtime_semantics_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.partitioned_runtime.common import (
25  PHASE3_RUNTIME_DENSITY_TOL,
26  build_initial_parameters,
27  execute_partitioned_with_reference,
28 )
29 from benchmarks.density_matrix.planner_surface.common import (
30  build_phase2_continuity_vqe,
31  build_software_metadata,
32 )
33 from benchmarks.density_matrix.planner_surface.workloads import (
34  build_microcase_descriptor_set,
35  iter_structured_descriptor_sets,
36 )
37 from squander.partitioning.noisy_planner import build_phase3_continuity_partition_descriptor_set
38 
39 SUITE_NAME = "phase3_partitioned_runtime_runtime_semantics"
40 ARTIFACT_FILENAME = "runtime_semantics_bundle.json"
41 DEFAULT_OUTPUT_DIR = (
42  REPO_ROOT
43  / "benchmarks"
44  / "density_matrix"
45  / "artifacts"
46  / "partitioned_runtime"
47  / "runtime_semantics"
48 )
49 ARTIFACT_CORE_FIELDS = (
50  "suite_name",
51  "status",
52  "software",
53  "summary",
54  "cases",
55 )
56 
57 
58 def _semantic_case(*, case_name: str, case_kind: str, descriptor_set, metadata: dict | None = None):
59  parameters = build_initial_parameters(descriptor_set.parameter_count)
60  runtime_result, _, density_metrics = execute_partitioned_with_reference(
61  descriptor_set, parameters
62  )
63  runtime_payload = runtime_result.to_dict(include_density_matrix=False)
64  case = {
65  "case_name": case_name,
66  "case_kind": case_kind,
67  "status": "pass"
68  if density_metrics["frobenius_norm_diff"] <= PHASE3_RUNTIME_DENSITY_TOL
69  and density_metrics["max_abs_diff"] <= PHASE3_RUNTIME_DENSITY_TOL
70  and runtime_result.rho_is_valid
71  else "fail",
72  "workload_id": runtime_payload["workload_id"],
73  "qbit_num": runtime_payload["qbit_num"],
74  "partition_count": runtime_payload["summary"]["partition_count"],
75  "remapped_partition_count": runtime_payload["summary"]["remapped_partition_count"],
76  "parameter_routing_segment_count": runtime_payload["summary"][
77  "parameter_routing_segment_count"
78  ],
79  "frobenius_norm_diff": density_metrics["frobenius_norm_diff"],
80  "max_abs_diff": density_metrics["max_abs_diff"],
81  "rho_is_valid": runtime_payload["summary"]["rho_is_valid"],
82  "trace_deviation": runtime_payload["summary"]["trace_deviation"],
83  "runtime_semantics_pass": (
84  density_metrics["frobenius_norm_diff"] <= PHASE3_RUNTIME_DENSITY_TOL
85  and density_metrics["max_abs_diff"] <= PHASE3_RUNTIME_DENSITY_TOL
86  and runtime_payload["summary"]["parameter_routing_segment_count"] > 0
87  ),
88  "runtime_partitions": runtime_payload["partitions"],
89  "metadata": dict(metadata) if metadata is not None else {},
90  }
91  return case
92 
93 
94 def build_cases() -> list[dict]:
95  continuity_vqe, _, _ = build_phase2_continuity_vqe(4)
96  continuity_case = _semantic_case(
97  case_name="phase2_xxz_hea_q4_continuity",
98  case_kind="continuity",
99  descriptor_set=build_phase3_continuity_partition_descriptor_set(continuity_vqe),
100  )
101  boundary_microcase = _semantic_case(
102  case_name="microcase_4q_partition_boundary_triplet",
103  case_kind="microcase",
104  descriptor_set=build_microcase_descriptor_set(
105  "microcase_4q_partition_boundary_triplet"
106  ),
107  )
108  structured_metadata, structured_descriptor_set = next(
110  )
111  structured_case = _semantic_case(
112  case_name=structured_metadata["workload_id"],
113  case_kind="structured_family",
114  descriptor_set=structured_descriptor_set,
115  metadata=structured_metadata,
116  )
117  return [continuity_case, boundary_microcase, structured_case]
118 
119 
120 def build_artifact_bundle(cases: list[dict]) -> dict:
121  semantics_passes = sum(case["runtime_semantics_pass"] for case in cases)
122  passed_cases = sum(case["status"] == "pass" for case in cases)
123  bundle = {
124  "suite_name": SUITE_NAME,
125  "status": "pass"
126  if semantics_passes == len(cases) and passed_cases == len(cases)
127  else "fail",
128  "software": build_software_metadata(),
129  "summary": {
130  "total_cases": len(cases),
131  "passed_cases": passed_cases,
132  "runtime_semantics_passes": semantics_passes,
133  "cases_with_remap": sum(case["remapped_partition_count"] > 0 for case in cases),
134  "cases_with_parameter_routing": sum(
135  case["parameter_routing_segment_count"] > 0 for case in cases
136  ),
137  },
138  "cases": cases,
139  }
140  missing = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
141  if missing:
142  raise ValueError(
143  "Runtime semantics bundle missing required fields: {}".format(
144  ", ".join(missing)
145  )
146  )
147  return bundle
148 
149 
150 def write_artifact_bundle(bundle: dict, output_dir: Path = DEFAULT_OUTPUT_DIR) -> Path:
151  output_dir.mkdir(parents=True, exist_ok=True)
152  output_path = output_dir / ARTIFACT_FILENAME
153  output_path.write_text(json.dumps(bundle, indent=2, sort_keys=True) + "\n")
154  return output_path
155 
156 
157 def main(argv: list[str] | None = None) -> int:
158  parser = argparse.ArgumentParser(description=__doc__)
159  parser.add_argument(
160  "--output-dir",
161  type=Path,
162  default=DEFAULT_OUTPUT_DIR,
163  help="Directory to write the runtime semantics bundle into.",
164  )
165  parser.add_argument(
166  "--quiet",
167  action="store_true",
168  help="Suppress per-case console output.",
169  )
170  args = parser.parse_args(argv)
171 
172  cases = build_cases()
173  bundle = build_artifact_bundle(cases)
174  output_path = write_artifact_bundle(bundle, output_dir=args.output_dir)
175 
176  if not args.quiet:
177  for case in cases:
178  print(
179  "{case_name}: dRho={frobenius_norm_diff:.3e}, remap={remapped_partition_count}, routing={parameter_routing_segment_count}, pass={runtime_semantics_pass}".format(
180  **case
181  )
182  )
183  print("Wrote {}".format(output_path))
184 
185  return 0 if bundle["status"] == "pass" else 1
186 
187 
188 if __name__ == "__main__":
189  raise SystemExit(main())
def build_phase2_continuity_vqe
def build_phase3_continuity_partition_descriptor_set
def build_software_metadata()
def execute_partitioned_with_reference