Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
bridge_publication_bundle.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Publication bundle: bridge evidence.
3 
4 Assembles the delivered bridge evidence into a single publication-oriented
5 manifest plus completeness checks.
6 
7 Run with:
8  python benchmarks/density_matrix/bridge_scope/bridge_publication_bundle.py --output-dir <dir>
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.workflow_evidence.exact_density_vqe_validation import (
23  FIXED_PARAMETER_QUBITS,
24  PRIMARY_BACKEND,
25  REFERENCE_BACKEND,
26  OPTIMIZATION_TRACE_ARTIFACT_FILENAME,
27  EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME,
28  build_software_metadata,
29  build_exact_regime_workflow_bundle,
30  capture_case,
31  get_git_revision,
32  run_fixed_parameter_case,
33  run_optimization_trace,
34  run_exact_regime_workflow_matrix,
35  write_json,
36  write_exact_regime_workflow_bundle,
37 )
38 from benchmarks.density_matrix.bridge_scope.bridge_validation import (
39  ARTIFACT_FILENAME as BRIDGE_MICRO_VALIDATION_BUNDLE_FILENAME,
40  build_artifact_bundle as build_bridge_micro_validation_bundle,
41  run_validation as run_bridge_micro_validation,
42  write_artifact_bundle as write_bridge_micro_validation_bundle,
43 )
44 from benchmarks.density_matrix.bridge_scope.unsupported_bridge_validation import (
45  ARTIFACT_FILENAME as UNSUPPORTED_BRIDGE_BUNDLE_FILENAME,
46  build_artifact_bundle as build_unsupported_bridge_bundle,
47  run_validation as run_unsupported_bridge_validation,
48  write_artifact_bundle as write_unsupported_bridge_bundle,
49 )
50 
51 BRIDGE_PUBLICATION_BUNDLE_FILENAME = "bridge_publication_bundle.json"
52 BRIDGE_PUBLICATION_BUNDLE_FIELDS = (
53  "suite_name",
54  "status",
55  "backend",
56  "reference_backend",
57  "software",
58  "provenance",
59  "summary",
60  "artifacts",
61 )
62 
63 
64 def _load_json(path: Path):
65  return json.loads(path.read_text(encoding="utf-8"))
66 
67 
69  *,
70  artifact_id,
71  artifact_class,
72  mandatory,
73  path,
74  status,
75  expected_statuses,
76  purpose,
77  generation_command,
78  summary=None,
79 ):
80  return {
81  "artifact_id": artifact_id,
82  "artifact_class": artifact_class,
83  "mandatory": mandatory,
84  "path": path,
85  "status": status,
86  "expected_statuses": list(expected_statuses),
87  "purpose": purpose,
88  "generation_command": generation_command,
89  "summary": {} if summary is None else dict(summary),
90  }
91 
92 
94  output_dir: Path,
95  *,
96  fixed_results,
97  trace_result,
98  bridge_micro_validation_bundle,
99  unsupported_bridge_bundle,
100  workflow_bundle,
101 ):
102  output_dir = Path(output_dir)
103  supported_fixed_parameter_command = (
104  f"python benchmarks/density_matrix/workflow_evidence/exact_density_vqe_validation.py "
105  f"--output-dir {output_dir}"
106  )
107  bridge_micro_validation_command = (
108  f"python benchmarks/density_matrix/bridge_scope/bridge_validation.py "
109  f"--output-dir {output_dir}"
110  )
111  unsupported_bridge_command = (
112  f"python benchmarks/density_matrix/bridge_scope/unsupported_bridge_validation.py "
113  f"--output-dir {output_dir}"
114  )
115  workflow_command = (
116  f"python benchmarks/density_matrix/workflow_evidence/exact_density_vqe_validation.py "
117  f"--workflow-bundle --output-dir {output_dir}"
118  )
119  publication_bundle_command = (
120  f"python benchmarks/density_matrix/bridge_scope/bridge_publication_bundle.py "
121  f"--output-dir {output_dir}"
122  )
123 
124  artifacts = [
126  artifact_id="bridge_fixed_parameters_4q",
127  artifact_class="supported_positive_bridge_case",
128  mandatory=True,
129  path="fixed_parameters_4q.json",
130  status=fixed_results[0]["status"],
131  expected_statuses=["completed"],
132  purpose="Supported positive 4-qubit bridge artifact for the generated-HEA anchor workflow.",
133  generation_command=supported_fixed_parameter_command,
134  summary={
135  "qbit_num": fixed_results[0]["qbit_num"],
136  "absolute_energy_error": fixed_results[0].get("absolute_energy_error"),
137  "bridge_source_type": fixed_results[0].get("bridge_source_type"),
138  "bridge_operation_count": fixed_results[0].get("bridge_operation_count"),
139  "bridge_noise_count": fixed_results[0].get("bridge_noise_count"),
140  },
141  ),
143  artifact_id="bridge_fixed_parameters_6q",
144  artifact_class="supported_positive_bridge_case",
145  mandatory=True,
146  path="fixed_parameters_6q.json",
147  status=fixed_results[1]["status"],
148  expected_statuses=["completed"],
149  purpose="Supported positive 6-qubit bridge artifact for the generated-HEA anchor workflow.",
150  generation_command=supported_fixed_parameter_command,
151  summary={
152  "qbit_num": fixed_results[1]["qbit_num"],
153  "absolute_energy_error": fixed_results[1].get("absolute_energy_error"),
154  "bridge_source_type": fixed_results[1].get("bridge_source_type"),
155  "bridge_operation_count": fixed_results[1].get("bridge_operation_count"),
156  "bridge_noise_count": fixed_results[1].get("bridge_noise_count"),
157  },
158  ),
160  artifact_id="bridge_micro_validation_bundle",
161  artifact_class="bridge_micro_validation_bundle",
162  mandatory=True,
163  path=BRIDGE_MICRO_VALIDATION_BUNDLE_FILENAME,
164  status=bridge_micro_validation_bundle["status"],
165  expected_statuses=["pass"],
166  purpose="Canonical local bridge-support validation bundle for 1 to 3 qubit generated-HEA microcases.",
167  generation_command=bridge_micro_validation_command,
168  summary={
169  "total_cases": bridge_micro_validation_bundle["summary"]["total_cases"],
170  "passed_cases": bridge_micro_validation_bundle["summary"][
171  "passed_cases"
172  ],
173  "pass_rate": bridge_micro_validation_bundle["summary"]["pass_rate"],
174  "microcase_qubits": bridge_micro_validation_bundle["requirements"][
175  "microcase_qubits"
176  ],
177  },
178  ),
180  artifact_id="bridge_exact_regime_workflow_bundle",
181  artifact_class="workflow_exact_regime_bundle",
182  mandatory=True,
183  path=EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME,
184  status=workflow_bundle["status"],
185  expected_statuses=["pass"],
186  purpose="Canonical workflow-scale bridge bundle across the mandatory 4/6/8/10 exact regime.",
187  generation_command=workflow_command,
188  summary={
189  "total_cases": workflow_bundle["summary"]["total_cases"],
190  "passed_cases": workflow_bundle["summary"]["passed_cases"],
191  "pass_rate": workflow_bundle["summary"]["pass_rate"],
192  "unsupported_cases": workflow_bundle["summary"]["unsupported_cases"],
193  "bridge_supported_cases": workflow_bundle["summary"]["bridge_supported_cases"],
194  "documented_10q_anchor_present": workflow_bundle["summary"][
195  "documented_10q_anchor_present"
196  ],
197  "supported_trace_completed": workflow_bundle["summary"][
198  "supported_trace_completed"
199  ],
200  "supported_trace_case_name": workflow_bundle["summary"][
201  "supported_trace_case_name"
202  ],
203  },
204  ),
206  artifact_id="bridge_optimization_trace_4q",
207  artifact_class="supported_optimization_trace",
208  mandatory=True,
209  path=OPTIMIZATION_TRACE_ARTIFACT_FILENAME,
210  status=trace_result["status"],
211  expected_statuses=["completed"],
212  purpose="Supported bounded 4-qubit optimization trace proving the full workflow crosses the bridge.",
213  generation_command=workflow_command,
214  summary={
215  "case_name": trace_result.get("case_name"),
216  "optimizer": trace_result.get("optimizer"),
217  "parameter_count": trace_result.get("parameter_count"),
218  "workflow_completed": trace_result.get("workflow_completed"),
219  "bridge_supported_pass": trace_result.get("bridge_supported_pass"),
220  "initial_energy": trace_result.get("initial_energy"),
221  "final_energy": trace_result.get("final_energy"),
222  },
223  ),
225  artifact_id="unsupported_bridge_bundle",
226  artifact_class="unsupported_bridge_bundle",
227  mandatory=True,
228  path=UNSUPPORTED_BRIDGE_BUNDLE_FILENAME,
229  status=unsupported_bridge_bundle["status"],
230  expected_statuses=["pass"],
231  purpose="Canonical representative unsupported-bridge bundle covering source, lowering, insertion, and noise-type failures.",
232  generation_command=unsupported_bridge_command,
233  summary={
234  "required_categories": unsupported_bridge_bundle["requirements"][
235  "required_categories"
236  ],
237  "total_cases": unsupported_bridge_bundle["summary"]["total_cases"],
238  "unsupported_cases": unsupported_bridge_bundle["summary"][
239  "unsupported_cases"
240  ],
241  "error_match_count": unsupported_bridge_bundle["summary"][
242  "error_match_count"
243  ],
244  "required_case_count": unsupported_bridge_bundle["summary"][
245  "required_case_count"
246  ],
247  },
248  ),
249  ]
250 
251  mandatory_artifacts = [artifact for artifact in artifacts if artifact["mandatory"]]
252  present_count = 0
253  status_match_count = 0
254  for artifact in mandatory_artifacts:
255  if (output_dir / artifact["path"]).exists():
256  present_count += 1
257  if artifact["status"] in artifact["expected_statuses"]:
258  status_match_count += 1
259 
260  bundle_status = (
261  "pass"
262  if present_count == len(mandatory_artifacts)
263  and status_match_count == len(mandatory_artifacts)
264  else "fail"
265  )
266 
267  bundle = {
268  "suite_name": "bridge_publication_evidence",
269  "status": bundle_status,
270  "backend": PRIMARY_BACKEND,
271  "reference_backend": REFERENCE_BACKEND,
272  "software": build_software_metadata(),
273  "provenance": {
274  "generation_command": publication_bundle_command,
275  "working_directory": str(REPO_ROOT),
276  "git_revision": get_git_revision(),
277  },
278  "summary": {
279  "mandatory_artifact_count": len(mandatory_artifacts),
280  "present_artifact_count": present_count,
281  "status_match_count": status_match_count,
282  "missing_artifact_count": len(mandatory_artifacts) - present_count,
283  "mismatched_status_count": len(mandatory_artifacts) - status_match_count,
284  },
285  "artifacts": artifacts,
286  }
287  validate_bridge_publication_bundle(bundle, output_dir)
288  return bundle
289 
290 
291 def validate_bridge_publication_bundle(bundle, bundle_dir: Path):
292  missing_fields = [
293  field for field in BRIDGE_PUBLICATION_BUNDLE_FIELDS if field not in bundle
294  ]
295  if missing_fields:
296  raise ValueError(
297  "Bridge-publication bundle is missing required fields: {}".format(
298  ", ".join(missing_fields)
299  )
300  )
301 
302  artifact_ids = {artifact["artifact_id"] for artifact in bundle["artifacts"]}
303  required_ids = {
304  "bridge_fixed_parameters_4q",
305  "bridge_fixed_parameters_6q",
306  "bridge_micro_validation_bundle",
307  "bridge_exact_regime_workflow_bundle",
308  "bridge_optimization_trace_4q",
309  "unsupported_bridge_bundle",
310  }
311  if required_ids - artifact_ids:
312  raise ValueError(
313  "Bridge-publication bundle is missing required artifact IDs: {}".format(
314  ", ".join(sorted(required_ids - artifact_ids))
315  )
316  )
317 
318  required_summary_keys = {
319  "bridge_micro_validation_bundle": {
320  "total_cases",
321  "passed_cases",
322  "pass_rate",
323  "microcase_qubits",
324  },
325  "bridge_exact_regime_workflow_bundle": {
326  "total_cases",
327  "passed_cases",
328  "pass_rate",
329  "unsupported_cases",
330  "bridge_supported_cases",
331  "documented_10q_anchor_present",
332  "supported_trace_completed",
333  "supported_trace_case_name",
334  },
335  "bridge_optimization_trace_4q": {
336  "case_name",
337  "optimizer",
338  "parameter_count",
339  "workflow_completed",
340  "bridge_supported_pass",
341  },
342  "unsupported_bridge_bundle": {
343  "required_categories",
344  "total_cases",
345  "unsupported_cases",
346  "error_match_count",
347  "required_case_count",
348  },
349  }
350 
351  for artifact in bundle["artifacts"]:
352  artifact_path = bundle_dir / artifact["path"]
353  if artifact["mandatory"] and not artifact_path.exists():
354  raise ValueError(
355  f"Bridge-publication bundle is missing artifact file: {artifact['path']}"
356  )
357  if artifact["status"] not in artifact["expected_statuses"]:
358  raise ValueError(
359  "Bridge-publication artifact {} has unexpected status {}".format(
360  artifact["artifact_id"], artifact["status"]
361  )
362  )
363  expected_summary_keys = required_summary_keys.get(artifact["artifact_id"])
364  if expected_summary_keys and expected_summary_keys - set(artifact["summary"].keys()):
365  raise ValueError(
366  "Bridge-publication artifact {} is missing summary keys: {}".format(
367  artifact["artifact_id"],
368  ", ".join(sorted(expected_summary_keys - set(artifact["summary"].keys()))),
369  )
370  )
371 
372 
373 def write_bridge_publication_bundle(output_path: Path, bundle):
374  validate_bridge_publication_bundle(bundle, output_path.parent)
375  output_path.parent.mkdir(parents=True, exist_ok=True)
376  output_path.write_text(json.dumps(bundle, indent=2) + "\n", encoding="utf-8")
377 
378 
380  print("\n" + "=" * 78)
381  print(
382  " Bridge Publication Bundle [{} vs {}]".format(
383  bundle["backend"], bundle["reference_backend"]
384  )
385  )
386  print("=" * 78)
387  print(
388  " Mandatory artifacts present: {}/{}".format(
389  bundle["summary"]["present_artifact_count"],
390  bundle["summary"]["mandatory_artifact_count"],
391  )
392  )
393  print(
394  " Status matches: {}/{}".format(
395  bundle["summary"]["status_match_count"],
396  bundle["summary"]["mandatory_artifact_count"],
397  )
398  )
399  print(" Git revision:", bundle["provenance"]["git_revision"])
400 
401 
403  output_dir = Path(output_dir)
404  output_dir.mkdir(parents=True, exist_ok=True)
405 
406  fixed_paths = [
407  output_dir / "fixed_parameters_4q.json",
408  output_dir / "fixed_parameters_6q.json",
409  ]
410  if all(path.exists() for path in fixed_paths):
411  fixed_results = [_load_json(path) for path in fixed_paths]
412  else:
413  fixed_results = [
414  capture_case(
415  f"fixed_parameters_{qbit_num}q",
416  lambda qbit_num=qbit_num: run_fixed_parameter_case(qbit_num),
417  )
418  for qbit_num in FIXED_PARAMETER_QUBITS
419  ]
420  for result in fixed_results:
421  write_json(output_dir / f"{result['case_name']}.json", result)
422 
423  trace_path = output_dir / OPTIMIZATION_TRACE_ARTIFACT_FILENAME
424  if trace_path.exists():
425  trace_result = _load_json(trace_path)
426  else:
427  trace_result = capture_case("optimization_trace_4q", run_optimization_trace)
428  write_json(trace_path, trace_result)
429 
430  bridge_micro_validation_path = output_dir / BRIDGE_MICRO_VALIDATION_BUNDLE_FILENAME
431  if bridge_micro_validation_path.exists():
432  bridge_micro_validation_bundle = _load_json(bridge_micro_validation_path)
433  else:
434  bridge_micro_validation_results = run_bridge_micro_validation(verbose=False)
435  bridge_micro_validation_bundle = build_bridge_micro_validation_bundle(
436  bridge_micro_validation_results
437  )
438  write_bridge_micro_validation_bundle(
439  bridge_micro_validation_path, bridge_micro_validation_bundle
440  )
441 
442  unsupported_bridge_path = output_dir / UNSUPPORTED_BRIDGE_BUNDLE_FILENAME
443  if unsupported_bridge_path.exists():
444  unsupported_bridge_bundle = _load_json(unsupported_bridge_path)
445  else:
446  unsupported_bridge_results = run_unsupported_bridge_validation(verbose=False)
447  unsupported_bridge_bundle = build_unsupported_bridge_bundle(
448  unsupported_bridge_results
449  )
450  write_unsupported_bridge_bundle(
451  unsupported_bridge_path, unsupported_bridge_bundle
452  )
453 
454  workflow_path = output_dir / EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME
455  if workflow_path.exists():
456  workflow_bundle = _load_json(workflow_path)
457  else:
458  workflow_results = run_exact_regime_workflow_matrix()
459  workflow_bundle = build_exact_regime_workflow_bundle(
460  workflow_results, trace_result=trace_result
461  )
462  write_exact_regime_workflow_bundle(workflow_path, workflow_bundle)
463 
465  output_dir,
466  fixed_results=fixed_results,
467  trace_result=trace_result,
468  bridge_micro_validation_bundle=bridge_micro_validation_bundle,
469  unsupported_bridge_bundle=unsupported_bridge_bundle,
470  workflow_bundle=workflow_bundle,
471  )
472  write_bridge_publication_bundle(output_dir / BRIDGE_PUBLICATION_BUNDLE_FILENAME, bundle)
473  return bundle
474 
475 
476 def main():
477  parser = argparse.ArgumentParser(description=__doc__)
478  parser.add_argument(
479  "--output-dir",
480  type=Path,
481  required=True,
482  help="Directory where bridge publication artifacts will be written.",
483  )
484  args = parser.parse_args()
485 
486  bundle = generate_bridge_publication_bundle(args.output_dir)
488 
489  if bundle["status"] != "pass":
490  raise SystemExit(1)
491 
492 
493 if __name__ == "__main__":
494  main()
def _build_artifact_entry(artifact_id, artifact_class, mandatory, path, status, expected_statuses, purpose, generation_command, summary=None)
def build_software_metadata()