Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
interpretation_validation.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 """Validation: validation-evidence interpretation guardrails.
3 
4 Builds the phase-level interpretation layer from:
5 - the already passing metric-completeness bundle,
6 - the optional-noise classification bundle,
7 - and the unsupported-noise bundle.
8 
9 The resulting bundle is intentionally a thin validation-evidence layer:
10 - it computes the main Phase 2 validation claim only from mandatory, complete,
11  supported evidence,
12 - it keeps optional evidence explicitly supplemental,
13 - it keeps unsupported or deferred evidence explicitly negative,
14 - and it treats missing mandatory evidence as incomplete rather than as partial
15  success.
16 
17 Run with:
18  python benchmarks/density_matrix/validation_evidence/interpretation_validation.py
19 """
20 
21 from __future__ import annotations
22 
23 import argparse
24 import json
25 import sys
26 from pathlib import Path
27 
28 REPO_ROOT = Path(__file__).resolve().parents[3]
29 if str(REPO_ROOT) not in sys.path:
30  sys.path.insert(0, str(REPO_ROOT))
31 
32 from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation import (
33  EXACT_REGIME_PARAMETER_SET_COUNT,
34  EXACT_REGIME_WORKFLOW_QUBITS,
35  build_software_metadata,
36 )
37 from benchmarks.density_matrix.noise_support.optional_noise_classification_validation import (
38  build_artifact_bundle as build_optional_noise_bundle,
39  run_validation as run_optional_noise_validation,
40 )
41 from benchmarks.density_matrix.noise_support.unsupported_noise_validation import (
42  build_artifact_bundle as build_unsupported_noise_bundle,
43  run_validation as run_unsupported_noise_validation,
44 )
45 from benchmarks.density_matrix.noise_support.support_tiers import SUPPORT_TIER_VOCABULARY
46 from benchmarks.density_matrix.validation_evidence.metric_completeness_validation import (
47  PRIMARY_BACKEND,
48  REFERENCE_BACKEND,
49  run_validation as run_metric_completeness_validation,
50 )
51 
52 SUITE_NAME = "validation_evidence_interpretation"
53 ARTIFACT_FILENAME = "interpretation_bundle.json"
54 DEFAULT_OUTPUT_DIR = (
55  REPO_ROOT / "benchmarks" / "density_matrix" / "artifacts" / "validation_evidence"
56 )
57 ARTIFACT_CORE_FIELDS = (
58  "suite_name",
59  "status",
60  "backend",
61  "reference_backend",
62  "requirements",
63  "thresholds",
64  "software",
65  "summary",
66  "required_artifacts",
67 )
68 
69 
71  return {
72  "support_tier_vocabulary": list(SUPPORT_TIER_VOCABULARY),
73  "main_claim_rule": (
74  "Only mandatory, complete, supported evidence may close the main "
75  "validation-evidence claim."
76  ),
77  "excluded_evidence_classes": [
78  "optional",
79  "deferred",
80  "unsupported",
81  "incomplete",
82  ],
83  "required_bundle_sources": [
84  "metric_completeness_validation",
85  "optional_noise_classification",
86  "unsupported_noise_boundary",
87  ],
88  }
89 
90 
92  metric_completeness_bundle,
93  optional_noise_bundle,
94  unsupported_noise_bundle,
95 ):
96  incomplete_mandatory_artifacts = []
97  if metric_completeness_bundle["status"] != "pass":
98  incomplete_mandatory_artifacts.append("metric_completeness_validation")
99 
100  for artifact_id, artifact in metric_completeness_bundle["required_artifacts"].items():
101  if artifact["status"] != "pass":
102  incomplete_mandatory_artifacts.append(artifact_id)
103 
104  mandatory_artifacts_complete = not incomplete_mandatory_artifacts
105  optional_evidence_supplemental = bool(
106  optional_noise_bundle["status"] == "pass"
107  and optional_noise_bundle["summary"][
108  "optional_cases_count_toward_mandatory_baseline"
109  ]
110  == 0
111  )
112  unsupported_evidence_negative_only = bool(
113  unsupported_noise_bundle["status"] == "pass"
114  and unsupported_noise_bundle["summary"]["unsupported_status_cases"]
115  == unsupported_noise_bundle["summary"]["total_cases"]
116  and unsupported_noise_bundle["summary"]["mandatory_baseline_case_count"] == 0
117  )
118  main_validation_claim_completed = bool(
119  mandatory_artifacts_complete
120  and optional_evidence_supplemental
121  and unsupported_evidence_negative_only
122  )
123 
124  bundle = {
125  "suite_name": SUITE_NAME,
126  "status": "pass" if main_validation_claim_completed else "fail",
127  "backend": PRIMARY_BACKEND,
128  "reference_backend": REFERENCE_BACKEND,
129  "requirements": build_requirement_metadata(),
130  "thresholds": dict(metric_completeness_bundle["thresholds"]),
131  "software": build_software_metadata(),
132  "summary": {
133  "mandatory_artifacts": [
134  "local_correctness_reference",
135  "workflow_baseline_reference",
136  "trace_anchor_reference",
137  "exact_regime_metric_completeness",
138  ],
139  "incomplete_mandatory_artifacts": incomplete_mandatory_artifacts,
140  "mandatory_artifacts_complete": mandatory_artifacts_complete,
141  "optional_cases": optional_noise_bundle["summary"]["optional_cases"],
142  "optional_passed_cases": optional_noise_bundle["summary"][
143  "optional_passed_cases"
144  ],
145  "optional_cases_count_toward_mandatory_baseline": optional_noise_bundle[
146  "summary"
147  ]["optional_cases_count_toward_mandatory_baseline"],
148  "optional_evidence_supplemental": optional_evidence_supplemental,
149  "unsupported_status_cases": unsupported_noise_bundle["summary"][
150  "unsupported_status_cases"
151  ],
152  "unsupported_cases": unsupported_noise_bundle["summary"][
153  "unsupported_cases"
154  ],
155  "deferred_cases": unsupported_noise_bundle["summary"]["deferred_cases"],
156  "unsupported_evidence_negative_only": unsupported_evidence_negative_only,
157  "main_validation_claim_completed": main_validation_claim_completed,
158  },
159  "required_artifacts": {
160  "metric_completeness_validation": {
161  "suite_name": metric_completeness_bundle["suite_name"],
162  "status": metric_completeness_bundle["status"],
163  "summary": metric_completeness_bundle["summary"],
164  },
165  "optional_noise_reference": {
166  "suite_name": optional_noise_bundle["suite_name"],
167  "status": optional_noise_bundle["status"],
168  "summary": optional_noise_bundle["summary"],
169  },
170  "unsupported_noise_reference": {
171  "suite_name": unsupported_noise_bundle["suite_name"],
172  "status": unsupported_noise_bundle["status"],
173  "summary": unsupported_noise_bundle["summary"],
174  },
175  },
176  }
178  return bundle
179 
180 
182  missing_fields = [field for field in ARTIFACT_CORE_FIELDS if field not in bundle]
183  if missing_fields:
184  raise ValueError(
185  "Interpretation bundle is missing required fields: {}".format(
186  ", ".join(missing_fields)
187  )
188  )
189 
190 
191 def write_artifact_bundle(output_path: Path, bundle):
193  output_path.parent.mkdir(parents=True, exist_ok=True)
194  output_path.write_text(
195  json.dumps(bundle, indent=2, sort_keys=True) + "\n", encoding="utf-8"
196  )
197 
198 
199 def run_validation(
200  *,
201  qubit_sizes=EXACT_REGIME_WORKFLOW_QUBITS,
202  parameter_set_count: int = EXACT_REGIME_PARAMETER_SET_COUNT,
203  verbose=False,
204 ):
205  _, _, _, metric_completeness_bundle = run_metric_completeness_validation(
206  qubit_sizes=qubit_sizes,
207  parameter_set_count=parameter_set_count,
208  verbose=verbose,
209  )
210  required_local_noise_bundle, required_local_noise_micro_bundle, optional_results = (
211  run_optional_noise_validation(verbose=verbose)
212  )
213  optional_noise_bundle = build_optional_noise_bundle(
214  required_local_noise_bundle,
215  required_local_noise_micro_bundle,
216  optional_results,
217  )
218  unsupported_results = run_unsupported_noise_validation(verbose=verbose)
219  unsupported_noise_bundle = build_unsupported_noise_bundle(unsupported_results)
220  bundle = build_artifact_bundle(
221  metric_completeness_bundle,
222  optional_noise_bundle,
223  unsupported_noise_bundle,
224  )
225  if verbose:
226  print(
227  "{} [{}] mandatory_complete={} optional_supplemental={} unsupported_negative_only={}".format(
228  bundle["suite_name"],
229  bundle["status"],
230  bundle["summary"]["mandatory_artifacts_complete"],
231  bundle["summary"]["optional_evidence_supplemental"],
232  bundle["summary"]["unsupported_evidence_negative_only"],
233  )
234  )
235  return metric_completeness_bundle, optional_noise_bundle, unsupported_noise_bundle, bundle
236 
237 
239  parser = argparse.ArgumentParser(description=__doc__)
240  parser.add_argument(
241  "--output-dir",
242  type=Path,
243  default=DEFAULT_OUTPUT_DIR,
244  help="Directory for the interpretation JSON artifact bundle.",
245  )
246  parser.add_argument(
247  "--parameter-set-count",
248  type=int,
249  default=EXACT_REGIME_PARAMETER_SET_COUNT,
250  help="Number of fixed parameter vectors per workflow qubit size.",
251  )
252  parser.add_argument(
253  "--qubit-sizes",
254  type=int,
255  nargs="*",
256  default=list(EXACT_REGIME_WORKFLOW_QUBITS),
257  help="Workflow qubit sizes to include in the mandatory baseline.",
258  )
259  parser.add_argument(
260  "--quiet",
261  action="store_true",
262  help="Suppress progress output.",
263  )
264  return parser.parse_args()
265 
266 
267 def main():
268  args = parse_args()
269  _, _, _, bundle = run_validation(
270  qubit_sizes=tuple(args.qubit_sizes),
271  parameter_set_count=args.parameter_set_count,
272  verbose=not args.quiet,
273  )
274  output_path = args.output_dir / ARTIFACT_FILENAME
275  write_artifact_bundle(output_path, bundle)
276  print(
277  "Wrote {} with status {}".format(
278  output_path,
279  bundle["status"],
280  )
281  )
282  if bundle["status"] != "pass":
283  raise SystemExit(1)
284 
285 
286 if __name__ == "__main__":
287  main()
def build_artifact_bundle(metric_completeness_bundle, optional_noise_bundle, unsupported_noise_bundle)
def build_software_metadata()