2 """Validation: publication-ready noise-support evidence bundle. 4 Builds the top-level noise-support manifest by assembling the delivered 5 artifacts into one reproducible, machine-checkable package. 8 python benchmarks/density_matrix/noise_support/noise_support_publication_bundle.py 11 from __future__
import annotations
16 from pathlib
import Path
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))
22 from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation
import (
25 EXACT_REGIME_PARAMETER_SET_COUNT,
26 EXACT_REGIME_WORKFLOW_QUBITS,
27 build_software_metadata,
31 from benchmarks.density_matrix.noise_support.required_local_noise_validation
import (
32 ARTIFACT_FILENAME
as REQUIRED_LOCAL_NOISE_ARTIFACT_FILENAME,
33 write_artifact_bundle
as write_required_local_noise_bundle_file,
35 from benchmarks.density_matrix.noise_support.required_local_noise_micro_validation
import (
36 ARTIFACT_FILENAME
as REQUIRED_LOCAL_NOISE_MICRO_ARTIFACT_FILENAME,
37 write_artifact_bundle
as write_required_local_noise_micro_bundle_file,
39 from benchmarks.density_matrix.noise_support.optional_noise_classification_validation
import (
40 ARTIFACT_FILENAME
as OPTIONAL_NOISE_CLASSIFICATION_ARTIFACT_FILENAME,
41 build_artifact_bundle
as build_optional_noise_classification_bundle,
42 run_validation
as run_optional_noise_classification_validation,
43 write_artifact_bundle
as write_optional_noise_classification_bundle_file,
45 from benchmarks.density_matrix.noise_support.unsupported_noise_validation
import (
46 ARTIFACT_FILENAME
as UNSUPPORTED_NOISE_ARTIFACT_FILENAME,
47 build_artifact_bundle
as build_unsupported_noise_bundle,
48 run_validation
as run_unsupported_noise_validation,
49 write_artifact_bundle
as write_unsupported_noise_bundle_file,
51 from benchmarks.density_matrix.noise_support.required_local_noise_workflow_validation
import (
52 TRACE_ARTIFACT_FILENAME
as REQUIRED_LOCAL_NOISE_TRACE_ARTIFACT_FILENAME,
53 WORKFLOW_BUNDLE_FILENAME
as REQUIRED_LOCAL_NOISE_WORKFLOW_BUNDLE_FILENAME,
54 run_validation
as run_required_local_noise_workflow_validation,
55 write_artifact_bundle
as write_required_local_noise_workflow_bundle_file,
58 SUITE_NAME =
"noise_support_publication_evidence" 59 ARTIFACT_FILENAME =
"noise_support_publication_bundle.json" 60 DEFAULT_OUTPUT_DIR = (
61 REPO_ROOT /
"benchmarks" /
"density_matrix" /
"artifacts" /
"noise_support" 88 "artifact_id": artifact_id,
89 "artifact_class": artifact_class,
90 "mandatory": mandatory,
93 "expected_statuses": list(expected_statuses),
95 "generation_command": generation_command,
96 "summary": dict(summary),
101 return json.loads(path.read_text(encoding=
"utf-8"))
107 required_local_noise_bundle,
108 required_local_noise_micro_bundle,
109 optional_noise_classification_bundle,
110 unsupported_noise_bundle,
111 required_local_noise_workflow_bundle,
112 required_local_noise_trace_result,
114 output_dir = Path(output_dir)
115 required_local_noise_command = (
116 f
"python benchmarks/density_matrix/noise_support/required_local_noise_validation.py " 117 f
"--output-dir {output_dir}" 119 required_local_noise_micro_command = (
120 f
"python benchmarks/density_matrix/noise_support/required_local_noise_micro_validation.py " 121 f
"--output-dir {output_dir}" 123 optional_noise_command = (
124 f
"python benchmarks/density_matrix/noise_support/optional_noise_classification_validation.py " 125 f
"--output-dir {output_dir}" 127 unsupported_noise_command = (
128 f
"python benchmarks/density_matrix/noise_support/unsupported_noise_validation.py " 129 f
"--output-dir {output_dir}" 131 required_local_noise_workflow_command = (
132 f
"python benchmarks/density_matrix/noise_support/required_local_noise_workflow_validation.py " 133 f
"--output-dir {output_dir}" 135 publication_bundle_command = (
136 f
"python benchmarks/density_matrix/noise_support/noise_support_publication_bundle.py " 137 f
"--output-dir {output_dir}" 142 artifact_id=
"required_local_noise_bundle",
143 artifact_class=
"required_positive_path_bundle",
145 path=REQUIRED_LOCAL_NOISE_ARTIFACT_FILENAME,
146 status=required_local_noise_bundle[
"status"],
147 expected_statuses=[
"pass"],
148 purpose=
"Required positive-path evidence for the three mandatory local-noise models.",
149 generation_command=required_local_noise_command,
151 "total_cases": required_local_noise_bundle[
"summary"][
"total_cases"],
152 "passed_cases": required_local_noise_bundle[
"summary"][
"passed_cases"],
153 "required_pass_rate": required_local_noise_bundle[
"summary"][
156 "support_tiers_present": required_local_noise_bundle[
"summary"][
157 "support_tiers_present" 162 artifact_id=
"required_local_noise_micro_bundle",
163 artifact_class=
"required_micro_validation_bundle",
165 path=REQUIRED_LOCAL_NOISE_MICRO_ARTIFACT_FILENAME,
166 status=required_local_noise_micro_bundle[
"status"],
167 expected_statuses=[
"pass"],
168 purpose=
"Mandatory 1 to 3 qubit exact micro-validation for the required local-noise baseline.",
169 generation_command=required_local_noise_micro_command,
171 "total_cases": required_local_noise_micro_bundle[
"summary"][
174 "passed_cases": required_local_noise_micro_bundle[
"summary"][
177 "required_pass_rate": required_local_noise_micro_bundle[
"summary"][
180 "required_noise_models_covered": required_local_noise_micro_bundle[
183 "required_noise_models_covered" 188 artifact_id=
"optional_noise_classification_bundle",
189 artifact_class=
"optional_classification_bundle",
191 path=OPTIONAL_NOISE_CLASSIFICATION_ARTIFACT_FILENAME,
192 status=optional_noise_classification_bundle[
"status"],
193 expected_statuses=[
"pass"],
194 purpose=
"Optional-baseline classification that keeps whole-register depolarizing outside the mandatory baseline.",
195 generation_command=optional_noise_command,
197 "required_cases": optional_noise_classification_bundle[
"summary"][
200 "optional_cases": optional_noise_classification_bundle[
"summary"][
203 "optional_pass_rate": optional_noise_classification_bundle[
"summary"][
206 "mandatory_baseline_completed": optional_noise_classification_bundle[
209 "mandatory_baseline_completed" 211 "support_tiers_present": optional_noise_classification_bundle[
214 "support_tiers_present" 219 artifact_id=
"unsupported_noise_bundle",
220 artifact_class=
"unsupported_noise_bundle",
222 path=UNSUPPORTED_NOISE_ARTIFACT_FILENAME,
223 status=unsupported_noise_bundle[
"status"],
224 expected_statuses=[
"pass"],
225 purpose=
"Structured negative evidence for deferred families and invalid noise schedule/configuration requests.",
226 generation_command=unsupported_noise_command,
228 "total_cases": unsupported_noise_bundle[
"summary"][
"total_cases"],
229 "deferred_cases": unsupported_noise_bundle[
"summary"][
"deferred_cases"],
230 "unsupported_cases": unsupported_noise_bundle[
"summary"][
233 "unsupported_status_cases": unsupported_noise_bundle[
"summary"][
234 "unsupported_status_cases" 236 "boundary_passed_cases": unsupported_noise_bundle[
"summary"][
237 "boundary_passed_cases" 242 artifact_id=
"required_local_noise_workflow_bundle",
243 artifact_class=
"required_workflow_bundle",
245 path=REQUIRED_LOCAL_NOISE_WORKFLOW_BUNDLE_FILENAME,
246 status=required_local_noise_workflow_bundle[
"status"],
247 expected_statuses=[
"pass"],
248 purpose=
"Required-local-noise workflow sufficiency bundle across the accepted exact regime.",
249 generation_command=required_local_noise_workflow_command,
251 "required_cases": required_local_noise_workflow_bundle[
"summary"][
254 "required_passed_cases": required_local_noise_workflow_bundle[
257 "required_passed_cases" 259 "required_pass_rate": required_local_noise_workflow_bundle[
"summary"][
262 "mandatory_baseline_completed": required_local_noise_workflow_bundle[
265 "mandatory_baseline_completed" 267 "unsupported_status_cases": required_local_noise_workflow_bundle[
270 "unsupported_status_cases" 272 "required_trace_case_name": required_local_noise_workflow_bundle[
275 "required_trace_case_name" 277 "required_trace_completed": required_local_noise_workflow_bundle[
280 "required_trace_completed" 285 artifact_id=
"required_local_noise_trace_4q",
286 artifact_class=
"required_workflow_trace",
288 path=REQUIRED_LOCAL_NOISE_TRACE_ARTIFACT_FILENAME,
289 status=required_local_noise_trace_result[
"status"],
290 expected_statuses=[
"completed"],
291 purpose=
"Bounded required-local-noise optimization trace for the anchor workflow.",
292 generation_command=required_local_noise_workflow_command,
294 "case_name": required_local_noise_trace_result[
"case_name"],
295 "support_tier": required_local_noise_trace_result[
"support_tier"],
296 "case_purpose": required_local_noise_trace_result[
"case_purpose"],
297 "required_validation_trace": required_local_noise_trace_result[
298 "required_validation_trace" 300 "workflow_completed": required_local_noise_trace_result[
303 "optimizer": required_local_noise_trace_result[
"optimizer"],
304 "parameter_count": required_local_noise_trace_result[
"parameter_count"],
309 mandatory_artifacts = [artifact
for artifact
in artifacts
if artifact[
"mandatory"]]
311 status_match_count = 0
312 for artifact
in mandatory_artifacts:
313 if (output_dir / artifact[
"path"]).exists():
315 if artifact[
"status"]
in artifact[
"expected_statuses"]:
316 status_match_count += 1
318 workflow_trace_reference_pass = (
319 required_local_noise_workflow_bundle[
"summary"][
"required_trace_case_name"]
320 == required_local_noise_trace_result[
"case_name"]
325 if present_count == len(mandatory_artifacts)
326 and status_match_count == len(mandatory_artifacts)
327 and workflow_trace_reference_pass
332 "suite_name": SUITE_NAME,
333 "status": bundle_status,
334 "backend": PRIMARY_BACKEND,
335 "reference_backend": REFERENCE_BACKEND,
338 "generation_command": publication_bundle_command,
339 "working_directory": str(REPO_ROOT),
341 "conda_env_assumption":
"qgd",
344 "mandatory_artifact_count": len(mandatory_artifacts),
345 "present_artifact_count": present_count,
346 "status_match_count": status_match_count,
347 "missing_artifact_count": len(mandatory_artifacts) - present_count,
348 "mismatched_status_count": len(mandatory_artifacts) - status_match_count,
349 "workflow_trace_reference_pass": workflow_trace_reference_pass,
351 "artifacts": artifacts,
358 missing_fields = [field
for field
in BUNDLE_FIELDS
if field
not in bundle]
361 "Noise-support publication bundle is missing required fields: {}".format(
362 ", ".join(missing_fields)
367 "required_local_noise_bundle",
368 "required_local_noise_micro_bundle",
369 "optional_noise_classification_bundle",
370 "unsupported_noise_bundle",
371 "required_local_noise_workflow_bundle",
372 "required_local_noise_trace_4q",
374 artifact_ids = {artifact[
"artifact_id"]
for artifact
in bundle[
"artifacts"]}
375 missing_ids = required_ids - artifact_ids
378 "Noise-support publication bundle is missing required artifact IDs: {}".format(
379 ", ".join(sorted(missing_ids))
383 required_payload_fields = {
384 "required_local_noise_bundle": {
392 "required_local_noise_micro_bundle": {
401 "optional_noise_classification_bundle": {
409 "required_artifacts",
411 "unsupported_noise_bundle": {
419 "required_local_noise_workflow_bundle": {
427 "required_local_noise_trace_4q": {
432 "required_validation_trace",
433 "workflow_completed",
438 required_summary_fields = {
439 "required_local_noise_bundle": {
442 "required_pass_rate",
444 "required_local_noise_micro_bundle": {
447 "required_pass_rate",
448 "required_noise_models_covered",
450 "optional_noise_classification_bundle": {
453 "optional_pass_rate",
454 "mandatory_baseline_completed",
456 "unsupported_noise_bundle": {
459 "unsupported_status_cases",
460 "boundary_passed_cases",
462 "required_local_noise_workflow_bundle": {
464 "required_passed_cases",
465 "required_pass_rate",
466 "mandatory_baseline_completed",
467 "unsupported_status_cases",
468 "required_trace_case_name",
469 "required_trace_present",
470 "required_trace_completed",
471 "required_trace_bridge_supported",
476 for artifact
in bundle[
"artifacts"]:
477 artifact_path = bundle_dir / artifact[
"path"]
478 if artifact[
"mandatory"]
and not artifact_path.exists():
480 "Noise-support publication bundle is missing artifact file: {}".format(
484 if artifact[
"status"]
not in artifact[
"expected_statuses"]:
486 "Noise-support publication artifact {} has unexpected status {}".format(
487 artifact[
"artifact_id"], artifact[
"status"]
492 loaded_payloads[artifact[
"artifact_id"]] = payload
494 payload_missing_fields = [
496 for field
in required_payload_fields[artifact[
"artifact_id"]]
497 if field
not in payload
499 if payload_missing_fields:
501 "Artifact {} is missing required payload fields: {}".format(
502 artifact[
"artifact_id"],
", ".join(payload_missing_fields)
506 if artifact[
"artifact_id"]
in required_summary_fields:
507 summary_missing_fields = [
509 for field
in required_summary_fields[artifact[
"artifact_id"]]
510 if field
not in payload[
"summary"]
512 if summary_missing_fields:
514 "Artifact {} is missing required summary fields: {}".format(
515 artifact[
"artifact_id"],
", ".join(summary_missing_fields)
519 workflow_payload = loaded_payloads[
520 "required_local_noise_workflow_bundle" 522 trace_payload = loaded_payloads[
"required_local_noise_trace_4q"]
523 if workflow_payload[
"summary"][
"required_trace_case_name"] != trace_payload[
"case_name"]:
525 "Required-local-noise workflow bundle trace reference does not match the trace artifact" 531 output_path.parent.mkdir(parents=
True, exist_ok=
True)
532 output_path.write_text(
533 json.dumps(bundle, indent=2, sort_keys=
True) +
"\n",
541 qubit_sizes=EXACT_REGIME_WORKFLOW_QUBITS,
542 parameter_set_count: int = EXACT_REGIME_PARAMETER_SET_COUNT,
545 output_dir = Path(output_dir)
546 output_dir.mkdir(parents=
True, exist_ok=
True)
548 required_local_noise_bundle, required_local_noise_micro_bundle, optional_results = (
549 run_optional_noise_classification_validation(verbose=verbose)
551 optional_noise_classification_bundle = build_optional_noise_classification_bundle(
552 required_local_noise_bundle,
553 required_local_noise_micro_bundle,
556 write_required_local_noise_bundle_file(
557 output_dir / REQUIRED_LOCAL_NOISE_ARTIFACT_FILENAME,
558 required_local_noise_bundle,
560 write_required_local_noise_micro_bundle_file(
561 output_dir / REQUIRED_LOCAL_NOISE_MICRO_ARTIFACT_FILENAME,
562 required_local_noise_micro_bundle,
564 write_optional_noise_classification_bundle_file(
565 output_dir / OPTIONAL_NOISE_CLASSIFICATION_ARTIFACT_FILENAME,
566 optional_noise_classification_bundle,
569 unsupported_noise_results = run_unsupported_noise_validation(verbose=verbose)
570 unsupported_noise_bundle = build_unsupported_noise_bundle(
571 unsupported_noise_results
573 write_unsupported_noise_bundle_file(
574 output_dir / UNSUPPORTED_NOISE_ARTIFACT_FILENAME,
575 unsupported_noise_bundle,
578 _, required_local_noise_trace_result, required_local_noise_workflow_bundle = (
579 run_required_local_noise_workflow_validation(
580 qubit_sizes=qubit_sizes,
581 parameter_set_count=parameter_set_count,
585 write_required_local_noise_workflow_bundle_file(
586 output_dir / REQUIRED_LOCAL_NOISE_WORKFLOW_BUNDLE_FILENAME,
587 required_local_noise_workflow_bundle,
588 trace_result=required_local_noise_trace_result,
591 output_dir / REQUIRED_LOCAL_NOISE_TRACE_ARTIFACT_FILENAME,
592 required_local_noise_trace_result,
597 required_local_noise_bundle=required_local_noise_bundle,
598 required_local_noise_micro_bundle=required_local_noise_micro_bundle,
599 optional_noise_classification_bundle=optional_noise_classification_bundle,
600 unsupported_noise_bundle=unsupported_noise_bundle,
601 required_local_noise_workflow_bundle=required_local_noise_workflow_bundle,
602 required_local_noise_trace_result=required_local_noise_trace_result,
609 parser = argparse.ArgumentParser(description=__doc__)
613 default=DEFAULT_OUTPUT_DIR,
614 help=
"Directory for the noise-support publication JSON artifacts.",
617 "--parameter-set-count",
619 default=EXACT_REGIME_PARAMETER_SET_COUNT,
620 help=
"Number of fixed parameter vectors per workflow qubit size.",
626 default=list(EXACT_REGIME_WORKFLOW_QUBITS),
627 help=
"Workflow qubit sizes to include in the prerequisite workflow bundle.",
632 help=
"Suppress progress output from prerequisite bundle generators.",
634 return parser.parse_args()
641 qubit_sizes=tuple(args.qubit_sizes),
642 parameter_set_count=args.parameter_set_count,
643 verbose=
not args.quiet,
646 "Wrote {} with status {} ({}/{})".format(
647 args.output_dir / ARTIFACT_FILENAME,
649 bundle[
"summary"][
"present_artifact_count"],
650 bundle[
"summary"][
"mandatory_artifact_count"],
653 if bundle[
"status"] !=
"pass":
657 if __name__ ==
"__main__":
def _build_artifact_entry(artifact_id, artifact_class, mandatory, path, status, expected_statuses, purpose, generation_command, summary)
def write_noise_support_publication_bundle
def build_software_metadata()
def validate_noise_support_publication_bundle
def generate_noise_support_publication_bundle
def build_noise_support_publication_bundle