Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
mandatory_workload_surface_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Mandatory workload planner surface validation.
3 
4 Builds the required 2 to 4 qubit microcases and the structured noisy
5 `U3` / `CNOT` workload families, then verifies that all of them enter the same
6 canonical Phase 3 planner contract.
7 
8 Run with:
9  python benchmarks/density_matrix/planner_surface/mandatory_workload_surface_validation.py
10 """
11 
12 from __future__ import annotations
13 
14 import argparse
15 import json
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.planner_surface.common import build_software_metadata
24 from benchmarks.density_matrix.planner_surface.workloads import (
25  MANDATORY_NOISE_PATTERNS,
26  STRUCTURED_FAMILY_NAMES,
27  STRUCTURED_QUBITS,
28  iter_microcase_surfaces,
29  iter_structured_surfaces,
30 )
31 from squander.partitioning.noisy_planner import (
32  PLANNER_OP_KIND_GATE,
33  PLANNER_OP_KIND_NOISE,
34 )
35 
36 SUITE_NAME = "phase3_planner_surface_workload_surface"
37 ARTIFACT_FILENAME = "mandatory_workload_surface_bundle.json"
38 DEFAULT_OUTPUT_DIR = (
39  REPO_ROOT / "benchmarks" / "density_matrix" / "artifacts" / "planner_surface"
40 )
41 ARTIFACT_CORE_FIELDS = (
42  "suite_name",
43  "status",
44  "requested_mode",
45  "software",
46  "summary",
47  "cases",
48 )
49 
50 
51 def _surface_case(case_kind: str, metadata: dict, surface) -> dict:
52  payload = surface.to_dict()
53  return {
54  "case_kind": case_kind,
55  "case_name": payload["workload_id"],
56  "status": "pass",
57  "requested_mode": payload["requested_mode"],
58  "source_type": payload["source_type"],
59  "workload_id": payload["workload_id"],
60  "qbit_num": payload["qbit_num"],
61  "operation_count": payload["operation_count"],
62  "gate_count": payload["gate_count"],
63  "noise_count": payload["noise_count"],
64  "gate_sequence": [
65  op["name"]
66  for op in payload["operations"]
67  if op["kind"] == PLANNER_OP_KIND_GATE
68  ],
69  "noise_sequence": [
70  op["name"]
71  for op in payload["operations"]
72  if op["kind"] == PLANNER_OP_KIND_NOISE
73  ],
74  "planner_operations": payload["operations"],
75  "metadata": metadata,
76  }
77 
78 
79 def run_validation(verbose: bool = True) -> list[dict]:
80  cases: list[dict] = []
81  for metadata, surface in iter_microcase_surfaces():
82  cases.append(_surface_case("microcase", metadata, surface))
83  for metadata, surface in iter_structured_surfaces():
84  cases.append(_surface_case("structured_family", metadata, surface))
85 
86  if verbose:
87  print("Mandatory workload planner surfaces:")
88  for case in cases:
89  print(
90  " {case_name}: q={qbit_num}, ops={operation_count}, gates={gate_count}, noise={noise_count}".format(
91  **case
92  )
93  )
94  return cases
95 
96 
97 def build_artifact_bundle(cases: list[dict]) -> dict:
98  payload_key_sets = {frozenset(case.keys()) for case in cases}
99  operation_key_sets = {
100  frozenset(case["planner_operations"][0].keys()) for case in cases if case["planner_operations"]
101  }
102  passed_cases = sum(case["status"] == "pass" for case in cases)
103  bundle = {
104  "suite_name": SUITE_NAME,
105  "status": "pass"
106  if passed_cases == len(cases) and len(payload_key_sets) == 1 and len(operation_key_sets) == 1
107  else "fail",
108  "requested_mode": "partitioned_density",
109  "software": build_software_metadata(),
110  "summary": {
111  "total_cases": len(cases),
112  "passed_cases": passed_cases,
113  "microcase_count": sum(case["case_kind"] == "microcase" for case in cases),
114  "structured_family_count": sum(
115  case["case_kind"] == "structured_family" for case in cases
116  ),
117  "required_structured_families": list(STRUCTURED_FAMILY_NAMES),
118  "required_structured_qubits": list(STRUCTURED_QUBITS),
119  "required_noise_patterns": list(MANDATORY_NOISE_PATTERNS),
120  "payload_schema_count": len(payload_key_sets),
121  "operation_schema_count": len(operation_key_sets),
122  },
123  "cases": cases,
124  }
125  missing = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
126  if missing:
127  raise ValueError(
128  "Mandatory workload surface bundle missing required fields: {}".format(
129  ", ".join(missing)
130  )
131  )
132  return bundle
133 
134 
135 def write_artifact_bundle(bundle: dict, output_dir: Path = DEFAULT_OUTPUT_DIR) -> Path:
136  output_dir.mkdir(parents=True, exist_ok=True)
137  output_path = output_dir / ARTIFACT_FILENAME
138  output_path.write_text(json.dumps(bundle, indent=2, sort_keys=True) + "\n")
139  return output_path
140 
141 
142 def main(argv: list[str] | None = None) -> int:
143  parser = argparse.ArgumentParser(description=__doc__)
144  parser.add_argument(
145  "--output-dir",
146  type=Path,
147  default=DEFAULT_OUTPUT_DIR,
148  help="Directory to write the mandatory workload surface bundle into.",
149  )
150  parser.add_argument(
151  "--quiet",
152  action="store_true",
153  help="Suppress per-case console output.",
154  )
155  args = parser.parse_args(argv)
156 
157  results = run_validation(verbose=not args.quiet)
158  bundle = build_artifact_bundle(results)
159  output_path = write_artifact_bundle(bundle, output_dir=args.output_dir)
160 
161  if not args.quiet:
162  print("Wrote {}".format(output_path))
163 
164  return 0 if bundle["status"] == "pass" else 1
165 
166 
167 if __name__ == "__main__":
168  raise SystemExit(main())
def build_software_metadata()