2 """Validation: required local-noise positive slice. 4 Runs one supported positive case per required Phase 2 local-noise model and 5 records reviewable bridge metadata proving that the requested local model is 6 what actually reaches the VQE-facing density path. 8 This script is intentionally narrower than the broader exactness and 9 noise-support workflow validation package: 10 - it proves each required local model executes on the supported generated-HEA 12 - it records model identity, placement, and fixed value metadata, 13 - it marks every emitted case as part of the mandatory required-local-noise baseline, 14 - and it rejects whole-register depolarizing as a stand-in for the required 18 python benchmarks/density_matrix/noise_support/required_local_noise_validation.py 21 from __future__
import annotations
26 from pathlib
import Path
31 from qiskit_aer
import AerSimulator
33 REPO_ROOT = Path(__file__).resolve().parents[3]
34 if str(REPO_ROOT)
not in sys.path:
35 sys.path.insert(0, str(REPO_ROOT))
37 from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation
import (
44 build_software_metadata,
45 build_reference_bridge_metadata,
46 build_hamiltonian_metadata,
47 build_initial_parameters,
50 insert_reference_noise,
52 from benchmarks.density_matrix.noise_support.support_tiers
import (
53 SUPPORT_TIER_VOCABULARY,
54 build_required_case_classification,
55 build_support_tier_summary,
58 SUITE_NAME =
"required_local_noise_validation" 59 ARTIFACT_FILENAME =
"required_local_noise_bundle.json" 60 DEFAULT_OUTPUT_DIR = REPO_ROOT /
"benchmarks" /
"density_matrix" /
"artifacts" /
"noise_support" 61 REQUIRED_LOCAL_NOISE_MODELS = (
66 REQUIRED_LOCAL_NOISE_CASES = (
68 "case_name":
"required_local_noise_4q_local_depolarizing_positive",
70 "requested_noise_channel":
"local_depolarizing",
72 "expected_after_gate_index": 0,
73 "expected_value": 0.1,
76 "channel":
"local_depolarizing",
78 "after_gate_index": 0,
84 "case_name":
"required_local_noise_4q_amplitude_damping_positive",
86 "requested_noise_channel":
"amplitude_damping",
88 "expected_after_gate_index": 2,
89 "expected_value": 0.05,
92 "channel":
"amplitude_damping",
94 "after_gate_index": 2,
100 "case_name":
"required_local_noise_4q_phase_damping_positive",
102 "requested_noise_channel":
"phase_damping",
103 "expected_target": 0,
104 "expected_after_gate_index": 4,
105 "expected_value": 0.07,
108 "channel":
"phase_damping",
110 "after_gate_index": 4,
120 "source_type":
"generated_hea",
121 "required_local_noise_models": list(REQUIRED_LOCAL_NOISE_MODELS),
122 "support_tier_vocabulary": list(SUPPORT_TIER_VOCABULARY),
123 "case_names": [case[
"case_name"]
for case
in REQUIRED_LOCAL_NOISE_CASES],
124 "workflow_qubits": sorted({case[
"qbit_num"]
for case
in REQUIRED_LOCAL_NOISE_CASES}),
125 "required_bridge_fields": [
126 "bridge_source_type",
127 "bridge_operation_count",
128 "bridge_noise_count",
129 "bridge_noise_sequence",
130 "bridge_noise_targets",
131 "bridge_noise_after_gate_indices",
132 "bridge_noise_fixed_values",
148 "requested_noise_channel",
149 "bridge_source_type",
150 "bridge_noise_sequence",
151 "bridge_noise_targets",
152 "bridge_noise_after_gate_indices",
153 "bridge_noise_fixed_values",
154 "positive_slice_pass",
157 "counts_toward_mandatory_baseline",
159 missing_fields = [field
for field
in required_fields
if field
not in case]
162 "Required local-noise case artifact is missing required fields: {}".format(
163 ", ".join(missing_fields)
167 if case[
"status"]
not in {
"pass",
"fail"}:
169 "Required local-noise case artifact has unsupported status '{}'".format(
174 if case[
"backend"] != PRIMARY_BACKEND:
176 "Required local-noise case artifact has unexpected backend '{}'".format(
183 density_noise = [dict(item)
for item
in case[
"density_noise"]]
186 density_noise=density_noise,
189 vqe.set_Optimized_Parameters(params)
192 squander_energy = float(vqe.Optimization_Problem(params))
195 simulator = AerSimulator(method=
"density_matrix")
196 result = simulator.run(noisy_qiskit_circuit, shots=1).
result()
197 aer_rho = np.asarray(result.data()[
"density_matrix"])
198 aer_energy_real, aer_energy_imag =
density_energy(hamiltonian, aer_rho)
200 requested_channel = case[
"requested_noise_channel"]
201 noise_sequence = bridge_metadata[
"bridge_noise_sequence"]
202 noise_targets = bridge_metadata[
"bridge_noise_targets"]
203 noise_after_gate_indices = bridge_metadata[
"bridge_noise_after_gate_indices"]
204 noise_fixed_values = bridge_metadata[
"bridge_noise_fixed_values"]
206 bridge_source_pass = bridge_metadata[
"bridge_source_type"] ==
"generated_hea" 207 bridge_noise_count_pass = bridge_metadata[
"bridge_noise_count"] == 1
208 bridge_noise_model_pass = noise_sequence == [requested_channel]
209 bridge_noise_target_pass = noise_targets == [case[
"expected_target"]]
210 bridge_noise_position_pass = noise_after_gate_indices == [
211 case[
"expected_after_gate_index"]
213 bridge_noise_value_pass =
bool(
214 len(noise_fixed_values) == 1
216 noise_fixed_values[0],
217 case[
"expected_value"],
221 no_whole_register_substitute_pass = all(
222 noise_name !=
"depolarizing" for noise_name
in noise_sequence
224 energy_is_finite =
bool(np.isfinite(squander_energy))
225 positive_slice_pass = all(
228 bridge_noise_count_pass,
229 bridge_noise_model_pass,
230 bridge_noise_target_pass,
231 bridge_noise_position_pass,
232 bridge_noise_value_pass,
233 no_whole_register_substitute_pass,
239 backend=PRIMARY_BACKEND,
240 qbit_num=case[
"qbit_num"],
242 density_noise=density_noise,
243 ansatz=DEFAULT_ANSATZ,
244 layers=DEFAULT_LAYERS,
245 inner_blocks=DEFAULT_INNER_BLOCKS,
246 reference_backend=REFERENCE_BACKEND,
251 "case_name": case[
"case_name"],
252 "status":
"pass" if positive_slice_pass
else "fail",
253 "requested_noise_channel": requested_channel,
254 "parameter_vector": params.tolist(),
255 "squander_energy": squander_energy,
256 "aer_energy_real": aer_energy_real,
257 "aer_energy_imag": aer_energy_imag,
258 "absolute_energy_error": abs(squander_energy - aer_energy_real),
259 "bridge_source_pass": bridge_source_pass,
260 "bridge_noise_count_pass": bridge_noise_count_pass,
261 "bridge_noise_model_pass": bridge_noise_model_pass,
262 "bridge_noise_target_pass": bridge_noise_target_pass,
263 "bridge_noise_position_pass": bridge_noise_position_pass,
264 "bridge_noise_value_pass": bridge_noise_value_pass,
265 "no_whole_register_substitute_pass": no_whole_register_substitute_pass,
266 "energy_is_finite": energy_is_finite,
267 "positive_slice_pass": positive_slice_pass,
278 for case
in REQUIRED_LOCAL_NOISE_CASES:
280 results.append(result)
283 "{} [{}] requested={} sequence={}".format(
286 result[
"requested_noise_channel"],
287 result[
"bridge_noise_sequence"],
294 results = list(results)
295 passed_cases = sum(case[
"status"] ==
"pass" for case
in results)
296 total_cases = len(results)
297 pass_rate = (passed_cases / total_cases)
if total_cases
else 0.0
301 "suite_name": SUITE_NAME,
303 if support_tier_summary[
"mandatory_baseline_completed"]
304 and passed_cases == total_cases
307 "backend": PRIMARY_BACKEND,
308 "reference_backend": REFERENCE_BACKEND,
312 "total_cases": total_cases,
313 "passed_cases": passed_cases,
314 "failed_cases": total_cases - passed_cases,
315 "pass_rate": pass_rate,
316 **support_tier_summary,
317 "whole_register_substitute_failures": sum(
318 not case[
"no_whole_register_substitute_pass"]
for case
in results
320 "reviewable_bridge_cases": sum(
321 case[
"bridge_noise_model_pass"]
322 and case[
"bridge_noise_target_pass"]
323 and case[
"bridge_noise_position_pass"]
324 and case[
"bridge_noise_value_pass"]
334 path.parent.mkdir(parents=
True, exist_ok=
True)
335 path.write_text(json.dumps(bundle, indent=2, sort_keys=
True) +
"\n")
339 parser = argparse.ArgumentParser(
340 description=
"Run required local-noise validation." 345 default=DEFAULT_OUTPUT_DIR,
346 help=
"Directory for the emitted JSON bundle.",
351 help=
"Suppress per-case progress output.",
353 return parser.parse_args()
360 output_path = args.output_dir / ARTIFACT_FILENAME
363 "Wrote {} with status {} ({}/{})".format(
366 bundle[
"summary"][
"passed_cases"],
367 bundle[
"summary"][
"total_cases"],
372 if __name__ ==
"__main__":
def run_required_local_noise_case(case)
def build_reference_bridge_metadata(vqe)
def build_support_tier_summary(cases)
def build_initial_parameters
def build_requirement_metadata()
def build_required_case_classification()
def build_software_metadata()
def validate_case_artifact(case)
def build_artifact_bundle(results)
def insert_reference_noise
def build_hamiltonian_metadata()
def write_artifact_bundle