2 """Validation: validation-evidence interpretation guardrails. 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. 9 The resulting bundle is intentionally a thin validation-evidence layer: 10 - it computes the main Phase 2 validation claim only from mandatory, complete, 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 18 python benchmarks/density_matrix/validation_evidence/interpretation_validation.py 21 from __future__
import annotations
26 from pathlib
import Path
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))
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,
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,
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,
45 from benchmarks.density_matrix.noise_support.support_tiers
import SUPPORT_TIER_VOCABULARY
46 from benchmarks.density_matrix.validation_evidence.metric_completeness_validation
import (
49 run_validation
as run_metric_completeness_validation,
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" 57 ARTIFACT_CORE_FIELDS = (
72 "support_tier_vocabulary": list(SUPPORT_TIER_VOCABULARY),
74 "Only mandatory, complete, supported evidence may close the main " 75 "validation-evidence claim." 77 "excluded_evidence_classes": [
83 "required_bundle_sources": [
84 "metric_completeness_validation",
85 "optional_noise_classification",
86 "unsupported_noise_boundary",
92 metric_completeness_bundle,
93 optional_noise_bundle,
94 unsupported_noise_bundle,
96 incomplete_mandatory_artifacts = []
97 if metric_completeness_bundle[
"status"] !=
"pass":
98 incomplete_mandatory_artifacts.append(
"metric_completeness_validation")
100 for artifact_id, artifact
in metric_completeness_bundle[
"required_artifacts"].items():
101 if artifact[
"status"] !=
"pass":
102 incomplete_mandatory_artifacts.append(artifact_id)
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" 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
118 main_validation_claim_completed =
bool(
119 mandatory_artifacts_complete
120 and optional_evidence_supplemental
121 and unsupported_evidence_negative_only
125 "suite_name": SUITE_NAME,
126 "status":
"pass" if main_validation_claim_completed
else "fail",
127 "backend": PRIMARY_BACKEND,
128 "reference_backend": REFERENCE_BACKEND,
130 "thresholds": dict(metric_completeness_bundle[
"thresholds"]),
133 "mandatory_artifacts": [
134 "local_correctness_reference",
135 "workflow_baseline_reference",
136 "trace_anchor_reference",
137 "exact_regime_metric_completeness",
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" 145 "optional_cases_count_toward_mandatory_baseline": optional_noise_bundle[
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" 152 "unsupported_cases": unsupported_noise_bundle[
"summary"][
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,
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"],
165 "optional_noise_reference": {
166 "suite_name": optional_noise_bundle[
"suite_name"],
167 "status": optional_noise_bundle[
"status"],
168 "summary": optional_noise_bundle[
"summary"],
170 "unsupported_noise_reference": {
171 "suite_name": unsupported_noise_bundle[
"suite_name"],
172 "status": unsupported_noise_bundle[
"status"],
173 "summary": unsupported_noise_bundle[
"summary"],
182 missing_fields = [field
for field
in ARTIFACT_CORE_FIELDS
if field
not in bundle]
185 "Interpretation bundle is missing required fields: {}".format(
186 ", ".join(missing_fields)
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" 201 qubit_sizes=EXACT_REGIME_WORKFLOW_QUBITS,
202 parameter_set_count: int = EXACT_REGIME_PARAMETER_SET_COUNT,
205 _, _, _, metric_completeness_bundle = run_metric_completeness_validation(
206 qubit_sizes=qubit_sizes,
207 parameter_set_count=parameter_set_count,
210 required_local_noise_bundle, required_local_noise_micro_bundle, optional_results = (
211 run_optional_noise_validation(verbose=verbose)
213 optional_noise_bundle = build_optional_noise_bundle(
214 required_local_noise_bundle,
215 required_local_noise_micro_bundle,
218 unsupported_results = run_unsupported_noise_validation(verbose=verbose)
219 unsupported_noise_bundle = build_unsupported_noise_bundle(unsupported_results)
221 metric_completeness_bundle,
222 optional_noise_bundle,
223 unsupported_noise_bundle,
227 "{} [{}] mandatory_complete={} optional_supplemental={} unsupported_negative_only={}".format(
228 bundle[
"suite_name"],
230 bundle[
"summary"][
"mandatory_artifacts_complete"],
231 bundle[
"summary"][
"optional_evidence_supplemental"],
232 bundle[
"summary"][
"unsupported_evidence_negative_only"],
235 return metric_completeness_bundle, optional_noise_bundle, unsupported_noise_bundle, bundle
239 parser = argparse.ArgumentParser(description=__doc__)
243 default=DEFAULT_OUTPUT_DIR,
244 help=
"Directory for the interpretation JSON artifact bundle.",
247 "--parameter-set-count",
249 default=EXACT_REGIME_PARAMETER_SET_COUNT,
250 help=
"Number of fixed parameter vectors per workflow qubit size.",
256 default=list(EXACT_REGIME_WORKFLOW_QUBITS),
257 help=
"Workflow qubit sizes to include in the mandatory baseline.",
262 help=
"Suppress progress output.",
264 return parser.parse_args()
270 qubit_sizes=tuple(args.qubit_sizes),
271 parameter_set_count=args.parameter_set_count,
272 verbose=
not args.quiet,
274 output_path = args.output_dir / ARTIFACT_FILENAME
277 "Wrote {} with status {}".format(
282 if bundle[
"status"] !=
"pass":
286 if __name__ ==
"__main__":
def build_artifact_bundle(metric_completeness_bundle, optional_noise_bundle, unsupported_noise_bundle)
def validate_artifact_bundle(bundle)
def build_requirement_metadata()
def build_software_metadata()
def write_artifact_bundle