Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
unsupported_runtime_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Unsupported runtime boundary validation: explicit categories and no silent fallback.
3 
4 Exercises representative runtime-stage unsupported or incomplete execution
5 conditions and records the stable no-fallback outcome for each one.
6 
7 Run with:
8  python benchmarks/density_matrix/partitioned_runtime/unsupported_runtime_validation.py
9 """
10 
11 from __future__ import annotations
12 
13 import argparse
14 import json
15 import sys
16 from dataclasses import replace
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  build_initial_parameters,
25 )
26 from benchmarks.density_matrix.planner_surface.common import (
27  build_phase2_continuity_vqe,
28  build_software_metadata,
29 )
30 from benchmarks.density_matrix.planner_surface.workloads import (
31  build_microcase_descriptor_set,
32 )
33 from squander.partitioning.noisy_planner import (
34  PLANNER_OP_KIND_GATE,
35  PLANNER_OP_KIND_NOISE,
36  build_phase3_continuity_partition_descriptor_set,
37 )
38 from squander.partitioning.noisy_runtime import execute_partitioned_density
39 
40 SUITE_NAME = "phase3_partitioned_runtime_unsupported_runtime"
41 ARTIFACT_FILENAME = "unsupported_runtime_bundle.json"
42 DEFAULT_OUTPUT_DIR = (
43  REPO_ROOT
44  / "benchmarks"
45  / "density_matrix"
46  / "artifacts"
47  / "partitioned_runtime"
48  / "unsupported_runtime"
49 )
50 ARTIFACT_CORE_FIELDS = (
51  "suite_name",
52  "status",
53  "software",
54  "summary",
55  "cases",
56 )
57 
58 
59 def _unsupported_case(case_name: str, runner) -> dict:
60  try:
61  runner()
62  except Exception as err:
63  payload = err.to_dict() if hasattr(err, "to_dict") else {"reason": str(err)}
64  payload.update(
65  {
66  "case_name": case_name,
67  "status": "unsupported",
68  "supported_runtime_case_recorded": False,
69  }
70  )
71  return payload
72  return {
73  "case_name": case_name,
74  "status": "unexpected_pass",
75  "supported_runtime_case_recorded": False,
76  "reason": "unsupported runtime case unexpectedly passed",
77  }
78 
79 
80 def _replace_first_operation(descriptor_set, *, predicate, replacer):
81  ops = list(descriptor_set.operations)
82  for i, op in enumerate(ops):
83  if predicate(op):
84  ops[i] = replacer(op)
85  return replace(descriptor_set, operations=tuple(ops))
86  raise ValueError("Unable to build requested unsupported runtime case")
87 
88 
90  continuity_vqe, _, _ = build_phase2_continuity_vqe(4)
91  descriptor_set = build_phase3_continuity_partition_descriptor_set(continuity_vqe)
92  bad_descriptor = replace(descriptor_set, requested_mode="state_vector")
93  parameters = build_initial_parameters(bad_descriptor.parameter_count)
94  return lambda: execute_partitioned_density(bad_descriptor, parameters)
95 
96 
98  continuity_vqe, _, _ = build_phase2_continuity_vqe(4)
99  descriptor_set = build_phase3_continuity_partition_descriptor_set(continuity_vqe)
100  parameters = build_initial_parameters(descriptor_set.parameter_count)
101  return lambda: execute_partitioned_density(descriptor_set, parameters[:-1])
102 
103 
105  descriptor_set = build_microcase_descriptor_set(
106  "microcase_4q_partition_boundary_triplet"
107  )
108  bad_descriptor = _replace_first_operation(
109  descriptor_set,
110  predicate=lambda op: op.kind == PLANNER_OP_KIND_GATE,
111  replacer=lambda op: replace(op, name="CZ"),
112  )
113  parameters = build_initial_parameters(bad_descriptor.parameter_count)
114  return lambda: execute_partitioned_density(bad_descriptor, parameters)
115 
116 
118  descriptor_set = build_microcase_descriptor_set(
119  "microcase_4q_partition_boundary_triplet"
120  )
121  bad_descriptor = _replace_first_operation(
122  descriptor_set,
123  predicate=lambda op: op.kind == PLANNER_OP_KIND_NOISE,
124  replacer=lambda op: replace(op, name="depolarizing"),
125  )
126  parameters = build_initial_parameters(bad_descriptor.parameter_count)
127  return lambda: execute_partitioned_density(bad_descriptor, parameters)
128 
129 
131  descriptor_set = build_microcase_descriptor_set(
132  "microcase_4q_partition_boundary_triplet"
133  )
134  bad_descriptor = _replace_first_operation(
135  descriptor_set,
136  predicate=lambda op: op.kind == PLANNER_OP_KIND_GATE,
137  replacer=lambda op: replace(op, fixed_value=0.1),
138  )
139  parameters = build_initial_parameters(bad_descriptor.parameter_count)
140  return lambda: execute_partitioned_density(bad_descriptor, parameters)
141 
142 
143 def build_cases() -> list[dict]:
144  return [
145  _unsupported_case("wrong_requested_mode", _wrong_requested_mode_runner()),
147  "parameter_count_mismatch", _parameter_count_mismatch_runner()
148  ),
149  _unsupported_case("unsupported_gate_name", _unsupported_gate_name_runner()),
151  "unsupported_noise_name", _unsupported_noise_name_runner()
152  ),
153  _unsupported_case("gate_fixed_value", _gate_fixed_value_runner()),
154  ]
155 
156 
157 def build_artifact_bundle(cases: list[dict]) -> dict:
158  unsupported_cases = sum(case["status"] == "unsupported" for case in cases)
159  unexpected_passes = sum(case["status"] == "unexpected_pass" for case in cases)
160  bundle = {
161  "suite_name": SUITE_NAME,
162  "status": "pass"
163  if unsupported_cases == len(cases) and unexpected_passes == 0
164  else "fail",
165  "software": build_software_metadata(),
166  "summary": {
167  "total_cases": len(cases),
168  "unsupported_cases": unsupported_cases,
169  "unexpected_passes": unexpected_passes,
170  },
171  "cases": cases,
172  }
173  missing = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
174  if missing:
175  raise ValueError(
176  "Unsupported runtime bundle missing required fields: {}".format(
177  ", ".join(missing)
178  )
179  )
180  return bundle
181 
182 
183 def write_artifact_bundle(bundle: dict, output_dir: Path = DEFAULT_OUTPUT_DIR) -> Path:
184  output_dir.mkdir(parents=True, exist_ok=True)
185  output_path = output_dir / ARTIFACT_FILENAME
186  output_path.write_text(json.dumps(bundle, indent=2, sort_keys=True) + "\n")
187  return output_path
188 
189 
190 def main(argv: list[str] | None = None) -> int:
191  parser = argparse.ArgumentParser(description=__doc__)
192  parser.add_argument(
193  "--output-dir",
194  type=Path,
195  default=DEFAULT_OUTPUT_DIR,
196  help="Directory to write the unsupported runtime bundle into.",
197  )
198  parser.add_argument(
199  "--quiet",
200  action="store_true",
201  help="Suppress per-case console output.",
202  )
203  args = parser.parse_args(argv)
204 
205  cases = build_cases()
206  bundle = build_artifact_bundle(cases)
207  output_path = write_artifact_bundle(bundle, output_dir=args.output_dir)
208 
209  if not args.quiet:
210  for case in cases:
211  print("{case_name}: {status}".format(**case))
212  print("Wrote {}".format(output_path))
213 
214  return 0 if bundle["status"] == "pass" else 1
215 
216 
217 if __name__ == "__main__":
218  raise SystemExit(main())
def build_phase2_continuity_vqe
def build_phase3_continuity_partition_descriptor_set
def build_software_metadata()
def _replace_first_operation(descriptor_set, predicate, replacer)