Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
test_density_matrix.py
Go to the documentation of this file.
1 """
2 Python Unit Tests for Density Matrix Module
3 """
4 
5 import pytest
6 import numpy as np
7 
8 try:
9  from squander.density_matrix import (
10  DensityMatrix,
11  NoisyCircuit,
12  DepolarizingChannel,
13  AmplitudeDampingChannel,
14  PhaseDampingChannel,
15  )
16  HAS_MODULE = True
17 except ImportError:
18  HAS_MODULE = False
19 
20 
21 HADAMARD = np.array([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2)
22 
23 
25  assert rho.purity() < 1.0
26  assert rho.is_valid()
27 
28 
30  rho_np = rho.to_numpy()
31  assert rho_np[0, 0].real > 0
32  assert rho.is_valid()
33 
34 
36  rho_np = rho.to_numpy()
37  assert np.abs(rho_np[0, 1]) < 0.5
38  assert rho.is_valid()
39 
40 
41 @pytest.mark.skipif(not HAS_MODULE, reason="Density matrix module not built")
43  """Test basic density matrix operations."""
44 
45  def test_construction(self):
46  """Test density matrix construction."""
47  rho = DensityMatrix(qbit_num=2)
48 
49  assert rho.qbit_num == 2
50  assert rho.dim == 4
51 
52  def test_ground_state(self):
53  """Test ground state initialization."""
54  rho = DensityMatrix(qbit_num=2)
55 
56  # Convert to NumPy for easier checking
57  rho_np = rho.to_numpy()
58 
59  # Should be |00⟩⟨00| = diag(1, 0, 0, 0)
60  expected = np.zeros((4, 4), dtype=complex)
61  expected[0, 0] = 1.0
62 
63  np.testing.assert_allclose(rho_np, expected, atol=1e-10)
64 
65  def test_trace(self):
66  """Test trace calculation."""
67  rho = DensityMatrix(qbit_num=2)
68 
69  tr = rho.trace()
70  assert np.isclose(tr.real, 1.0, atol=1e-10)
71  assert np.isclose(tr.imag, 0.0, atol=1e-10)
72 
74  """Test that pure states have purity = 1."""
75  rho = DensityMatrix(qbit_num=2)
76 
77  purity = rho.purity()
78  assert np.isclose(purity, 1.0, atol=1e-10), \
79  f"Pure state should have purity=1, got {purity}"
80 
82  """Test that mixed states have purity < 1."""
83  rho = DensityMatrix.maximally_mixed(qbit_num=2)
84 
85  purity = rho.purity()
86  expected_purity = 0.25 # 1/2^2
87 
88  assert np.isclose(purity, expected_purity, atol=1e-10), \
89  f"Maximally mixed 2-qubit state should have purity=0.25, got {purity}"
90 
92  """Test that pure states have zero entropy."""
93  rho = DensityMatrix(qbit_num=2)
94 
95  entropy = rho.entropy()
96  assert np.isclose(entropy, 0.0, atol=1e-10), \
97  f"Pure state should have entropy=0, got {entropy}"
98 
100  """Test entropy of maximally mixed state."""
101  rho = DensityMatrix.maximally_mixed(qbit_num=2)
102 
103  entropy = rho.entropy()
104  expected_entropy = 2.0 # log2(2^2) = 2 bits
105 
106  assert np.isclose(entropy, expected_entropy, atol=1e-10), \
107  f"Maximally mixed 2-qubit state should have entropy=2, got {entropy}"
108 
109  def test_is_valid(self):
110  """Test density matrix validation."""
111  # Pure state should be valid
112  rho_pure = DensityMatrix(qbit_num=2)
113  assert rho_pure.is_valid()
114 
115  # Maximally mixed should be valid
116  rho_mixed = DensityMatrix.maximally_mixed(qbit_num=2)
117  assert rho_mixed.is_valid()
118 
120  """Test construction from state vector."""
121  # Create |+⟩ = (|0⟩ + |1⟩)/√2
122  psi = np.array([1, 1], dtype=complex) / np.sqrt(2)
123 
124  rho = DensityMatrix(psi)
125 
126  # Check: ρ = |+⟩⟨+| = [[0.5, 0.5], [0.5, 0.5]]
127  expected = np.outer(psi, psi.conj())
128  rho_np = rho.to_numpy()
129 
130  np.testing.assert_allclose(rho_np, expected, atol=1e-10)
131 
132  # Should still be pure
133  assert np.isclose(rho.purity(), 1.0, atol=1e-10)
134 
136  """Test unitary application."""
137  rho = DensityMatrix(qbit_num=1)
138 
139  # Apply Hadamard
140  rho.apply_unitary(HADAMARD)
141 
142  expected = np.array([[0.5, 0.5], [0.5, 0.5]], dtype=complex)
143  np.testing.assert_allclose(rho.to_numpy(), expected, atol=1e-10)
144 
146  """Test optimized single-qubit unitary."""
147  rho = DensityMatrix(qbit_num=2)
148 
149  # Apply Hadamard on qubit 0
150  rho.apply_single_qubit_unitary(HADAMARD, 0)
151 
152  rho_np = rho.to_numpy()
153 
154  # Should create |+0⟩ state
155  # Qubit 0 is most significant bit in this convention
156  # |+0⟩ = (|00⟩ + |01⟩)/√2 corresponds to indices 0 and 1
157  assert np.isclose(rho_np[0, 0], 0.5)
158  assert np.isclose(rho_np[0, 1], 0.5)
159  assert np.isclose(rho_np[1, 0], 0.5)
160  assert np.isclose(rho_np[1, 1], 0.5)
161 
162  def test_clone(self):
163  """Test cloning."""
164  rho1 = DensityMatrix(qbit_num=2)
165  rho2 = rho1.clone()
166 
167  # Modify rho1
168  rho1.apply_single_qubit_unitary(HADAMARD, 0)
169 
170  # rho2 should be unchanged
171  rho2_np = rho2.to_numpy()
172  assert np.isclose(rho2_np[0, 0], 1.0)
173 
174  def test_eigenvalues(self):
175  """Test eigenvalue computation."""
176  # Pure state: one eigenvalue = 1, rest = 0
177  rho = DensityMatrix(qbit_num=2)
178  eigs = rho.eigenvalues()
179 
180  assert len(eigs) == 4
181  assert np.isclose(eigs[0], 1.0, atol=1e-10)
182  assert np.all(np.abs(eigs[1:]) < 1e-10)
183 
184  # Maximally mixed: all eigenvalues = 0.25
185  rho_mixed = DensityMatrix.maximally_mixed(qbit_num=2)
186  eigs_mixed = rho_mixed.eigenvalues()
187 
188  expected = np.array([0.25, 0.25, 0.25, 0.25])
189  np.testing.assert_allclose(eigs_mixed, expected, atol=1e-10)
190 
191 
192 @pytest.mark.skipif(not HAS_MODULE, reason="Density matrix module not built")
194  """Test unitary-only circuit operations."""
195 
197  """Test circuit construction."""
198  circuit = NoisyCircuit(qbit_num=2)
199 
200  assert circuit.qbit_num == 2
201  assert circuit.parameter_num == 0 # No parametric gates yet
202 
203  def test_add_gates(self):
204  """Test adding gates to circuit."""
205  circuit = NoisyCircuit(2)
206 
207  circuit.add_H(0)
208  circuit.add_X(1)
209  circuit.add_CNOT(1, 0)
210 
211  # Should not raise
212 
214  """Test Hadamard gate application."""
215  circuit = NoisyCircuit(2)
216  circuit.add_H(0)
217 
218  # Start with |00⟩
219  rho = DensityMatrix(qbit_num=2)
220 
221  # Apply circuit
222  circuit.apply_to(np.array([]), rho)
223 
224  # Qubit 0 should now be in |+⟩ state
225  # ρ should have structure reflecting H ⊗ I applied to |00⟩
226  purity = rho.purity()
227  assert np.isclose(purity, 1.0, atol=1e-10), \
228  "Hadamard should preserve purity"
229 
231  """Test creation of Bell state |Φ+⟩ = (|00⟩ + |11⟩)/√2."""
232  circuit = NoisyCircuit(2)
233  circuit.add_H(0)
234  circuit.add_CNOT(1, 0)
235 
236  # Start with |00⟩
237  rho = DensityMatrix(qbit_num=2)
238 
239  # Apply circuit
240  circuit.apply_to(np.array([]), rho)
241 
242  # Check purity = 1 (should still be pure)
243  purity = rho.purity()
244  assert np.isclose(purity, 1.0, atol=1e-10)
245 
246  # Check specific elements
247  rho_np = rho.to_numpy()
248 
249  # |Φ+⟩⟨Φ+| has elements at (0,0), (0,3), (3,0), (3,3)
250  assert np.isclose(rho_np[0, 0], 0.5, atol=1e-10)
251  assert np.isclose(rho_np[0, 3], 0.5, atol=1e-10)
252  assert np.isclose(rho_np[3, 0], 0.5, atol=1e-10)
253  assert np.isclose(rho_np[3, 3], 0.5, atol=1e-10)
254 
256  """Test parametric gate (RZ)."""
257  circuit = NoisyCircuit(2)
258  circuit.add_RZ(0)
259 
260  rho = DensityMatrix(qbit_num=2)
261 
262  # Apply with angle π/4
263  params = np.array([np.pi / 4])
264  circuit.apply_to(params, rho)
265 
266  # Should preserve purity (unitary evolution)
267  purity = rho.purity()
268  assert np.isclose(purity, 1.0, atol=1e-10)
269 
270 
271 @pytest.mark.skipif(not HAS_MODULE, reason="Density matrix module not built")
273  """Test noise operations in circuits."""
274 
275  @pytest.mark.parametrize(
276  "error_rate, params, expected_param_num",
277  [
278  pytest.param(0.1, np.array([]), 0, id="fixed"),
279  pytest.param(None, np.array([0.2]), 1, id="parametric"),
280  ],
281  )
282  def test_depolarizing(self, error_rate, params, expected_param_num):
283  """Test depolarizing noise in circuit."""
284  circuit = NoisyCircuit(2)
285  circuit.add_H(0)
286  circuit.add_CNOT(1, 0)
287  if error_rate is None:
288  circuit.add_depolarizing(2)
289  else:
290  circuit.add_depolarizing(2, error_rate=error_rate)
291 
292  assert circuit.parameter_num == expected_param_num
293 
294  rho = DensityMatrix(qbit_num=2)
295  circuit.apply_to(params, rho)
296 
297  assert rho.purity() < 1.0
298  assert rho.is_valid()
299 
301  """Test local single-qubit depolarizing noise in circuit."""
302  circuit = NoisyCircuit(2)
303  circuit.add_H(0)
304  circuit.add_local_depolarizing(0, error_rate=0.2)
305 
306  rho = DensityMatrix(qbit_num=2)
307  circuit.apply_to(np.array([]), rho)
308 
309  assert rho.purity() < 1.0
310  assert rho.is_valid()
311 
313  """Test local single-qubit depolarizing rejects out-of-range targets."""
314  circuit = NoisyCircuit(1)
315  circuit.add_local_depolarizing(1, error_rate=0.2)
316 
317  rho = DensityMatrix(qbit_num=1)
318  with pytest.raises(RuntimeError, match="target_qbit out of range"):
319  circuit.apply_to(np.array([]), rho)
320 
322  """Test amplitude damping in circuit."""
323  circuit = NoisyCircuit(1)
324  circuit.add_X(0) # Start in |1⟩
325  circuit.add_amplitude_damping(0, gamma=0.5)
326 
327  rho = DensityMatrix(qbit_num=1)
328  circuit.apply_to(np.array([]), rho)
329 
330  rho_np = rho.to_numpy()
331  # Should have some population in |0⟩
332  assert rho_np[0, 0].real > 0
333  assert rho_np[1, 1].real < 1
334  assert np.isclose(rho.trace().real, 1.0)
335 
337  """Test phase damping in circuit."""
338  circuit = NoisyCircuit(1)
339  circuit.add_H(0) # Create |+⟩ state with coherence
340  circuit.add_phase_damping(0, lambda_param=0.5)
341 
342  rho = DensityMatrix(qbit_num=1)
343  circuit.apply_to(np.array([]), rho)
344 
345  rho_np = rho.to_numpy()
346  # Off-diagonal elements should be reduced
347  assert np.abs(rho_np[0, 1]) < 0.5
348  # Diagonal should be unchanged
349  assert np.isclose(rho_np[0, 0].real, 0.5)
350  assert np.isclose(rho_np[1, 1].real, 0.5)
351 
352 
353 @pytest.mark.skipif(not HAS_MODULE, reason="Density matrix module not built")
355  """Test combined circuit operations."""
356 
358  """Test mixed gates and noise in circuit."""
359  circuit = NoisyCircuit(2)
360  circuit.add_H(0)
361  circuit.add_amplitude_damping(0, gamma=0.1)
362  circuit.add_CNOT(1, 0)
363  circuit.add_phase_damping(1, lambda_param=0.05)
364  circuit.add_depolarizing(2, error_rate=0.02)
365 
366  assert circuit.parameter_num == 0
367 
368  rho = DensityMatrix(qbit_num=2)
369  circuit.apply_to(np.array([]), rho)
370 
371  assert rho.is_valid()
372  assert rho.purity() < 1.0
373 
375  """Test operation info from circuit."""
376  circuit = NoisyCircuit(2)
377  circuit.add_H(0)
378  circuit.add_CNOT(1, 0)
379  circuit.add_depolarizing(2, error_rate=0.1)
380  circuit.add_phase_damping(0) # Parametric
381 
382  info = circuit.get_operation_info()
383 
384  assert len(info) == 4
385  assert info[0].name == "H"
386  assert info[0].is_unitary is True
387  assert info[0].param_count == 0
388 
389  assert info[1].name == "CNOT"
390  assert info[1].is_unitary is True
391 
392  assert info[2].name == "Depolarizing"
393  assert info[2].is_unitary is False
394  assert info[2].param_count == 0
395 
396  assert info[3].name == "PhaseDamping"
397  assert info[3].is_unitary is False
398  assert info[3].param_count == 1
399 
401  """Test HEA-relevant U3/CNOT lowering metadata."""
402  circuit = NoisyCircuit(2)
403  circuit.add_U3(0)
404  circuit.add_CNOT(1, 0)
405  circuit.add_local_depolarizing(0, error_rate=0.05)
406  circuit.add_phase_damping(1, lambda_param=0.02)
407 
408  info = circuit.get_operation_info()
409 
410  assert len(info) == 4
411  assert info[0].name == "U3"
412  assert info[0].param_count == 3
413  assert info[0].param_start == 0
414 
415  assert info[1].name == "CNOT"
416  assert info[1].param_count == 0
417  assert info[1].param_start == 3
418 
419  assert info[2].name == "LocalDepolarizing"
420  assert info[2].param_count == 0
421  assert info[2].param_start == 3
422 
423  assert info[3].name == "PhaseDamping"
424  assert info[3].param_count == 0
425  assert info[3].param_start == 3
426 
428  """Test the exact-energy helper on a deterministic tiny fixture."""
429  pytest.importorskip("qiskit")
430  pytest.importorskip("qiskit_aer")
431 
432  from benchmarks.density_matrix.validate_squander_vs_qiskit import density_energy
433 
434  hamiltonian = np.array(
435  [[0.6, 0.2 + 0.1j], [0.2 - 0.1j, -0.4]],
436  dtype=complex,
437  )
438  density_matrix = np.array(
439  [[0.7, 0.1 - 0.05j], [0.1 + 0.05j, 0.3]],
440  dtype=complex,
441  )
442 
443  energy_real, energy_imag = density_energy(hamiltonian, density_matrix)
444  expected = np.trace(hamiltonian @ density_matrix)
445 
446  assert np.isclose(energy_real, np.real(expected), atol=1e-12)
447  assert np.isclose(energy_imag, np.imag(expected), atol=1e-12)
448 
450  """Test one mandatory micro-validation case end-to-end."""
451  pytest.importorskip("qiskit")
452  pytest.importorskip("qiskit_aer")
453 
454  from benchmarks.density_matrix.circuits import MANDATORY_MICROCASES
455  from benchmarks.density_matrix.validate_squander_vs_qiskit import (
456  validate_microcase,
457  )
458 
459  case = next(
460  case
461  for case in MANDATORY_MICROCASES
462  if case["case_name"] == "micro_validation_2q_u3_cnot_local_depolarizing"
463  )
464  result = validate_microcase(case, verbose=False)
465 
466  assert result["status"] == "pass"
467  assert result["energy_pass"]
468  assert result["density_valid_pass"]
469  assert result["trace_pass"]
470  assert result["observable_pass"]
471  assert result["qbit_num"] == 2
472  assert len(result["parameter_vector"]) == 6
473 
475  """Test the mandatory mixed required-noise microcase."""
476  pytest.importorskip("qiskit")
477  pytest.importorskip("qiskit_aer")
478 
479  from benchmarks.density_matrix.circuits import MANDATORY_MICROCASES
480  from benchmarks.density_matrix.validate_squander_vs_qiskit import (
481  validate_microcase,
482  )
483 
484  case = next(
485  case
486  for case in MANDATORY_MICROCASES
487  if case["case_name"] == "micro_validation_3q_u3_cnot_mixed_local_noise"
488  )
489  result = validate_microcase(case, verbose=False)
490 
491  assert result["status"] == "pass"
492  assert result["energy_pass"]
493  assert result["density_valid_pass"]
494  assert result["trace_pass"]
495  assert result["observable_pass"]
496  assert result["required_gate_coverage_pass"]
497  assert result["required_noise_model_coverage_pass"]
498  assert result["noise_sequence_match_pass"]
499  assert result["mixed_sequence_order_pass"]
500  assert result["operation_audit_pass"]
501  assert result["noise_operation_sequence"] == [
502  "local_depolarizing",
503  "amplitude_damping",
504  "phase_damping",
505  ]
506  assert result["noise_operation_targets"] == [0, 1, 2]
507 
509  """Test the required local-noise micro-validation bundle schema."""
510  pytest.importorskip("qiskit")
511  pytest.importorskip("qiskit_aer")
512 
513  from benchmarks.density_matrix.noise_support.required_local_noise_micro_validation import (
514  REQUIRED_LOCAL_NOISE_MODELS,
515  build_artifact_bundle,
516  run_required_local_noise_micro_validation,
517  )
518 
519  results = run_required_local_noise_micro_validation(verbose=False)
520  bundle = build_artifact_bundle(results)
521 
522  assert bundle["status"] == "pass"
523  assert bundle["backend"] == "density_matrix"
524  assert bundle["summary"]["total_cases"] == 7
525  assert bundle["summary"]["passed_cases"] == 7
526  assert bundle["summary"]["pass_rate"] == 1.0
527  assert bundle["summary"]["required_cases"] == 7
528  assert bundle["summary"]["required_passed_cases"] == 7
529  assert bundle["summary"]["required_pass_rate"] == 1.0
530  assert bundle["summary"]["optional_cases"] == 0
531  assert bundle["summary"]["optional_cases_count_toward_mandatory_baseline"] == 0
532  assert bundle["summary"]["mandatory_baseline_completed"]
533  assert bundle["summary"]["exact_threshold_passed_cases"] == 7
534  assert bundle["summary"]["operation_audit_passed_cases"] == 7
535  assert bundle["summary"]["mixed_sequence_case_count"] == 1
536  assert bundle["summary"]["mixed_sequence_passed_cases"] == 1
537  assert set(bundle["requirements"]["required_local_noise_models"]) == set(
538  REQUIRED_LOCAL_NOISE_MODELS
539  )
540  assert "required" in bundle["requirements"]["support_tier_vocabulary"]
541  assert set(bundle["summary"]["required_noise_models_covered"]) == set(
542  REQUIRED_LOCAL_NOISE_MODELS
543  )
544  assert all(case["required_local_noise_microcase_pass"] for case in bundle["cases"])
545  assert all(case["support_tier"] == "required" for case in bundle["cases"])
546  assert all(case["case_purpose"] == "mandatory_baseline" for case in bundle["cases"])
547  assert all(case["counts_toward_mandatory_baseline"] for case in bundle["cases"])
548 
550  """Test the local-correctness bundle schema."""
551  pytest.importorskip("qiskit")
552  pytest.importorskip("qiskit_aer")
553 
554  from benchmarks.density_matrix.validation_evidence.local_correctness_validation import (
555  MANDATORY_CASE_NAMES,
556  run_validation,
557  )
558 
559  (
560  micro_validation_bundle,
561  required_local_noise_micro_validation_bundle,
562  bundle,
563  ) = run_validation(verbose=False)
564 
565  assert micro_validation_bundle["status"] == "pass"
566  assert required_local_noise_micro_validation_bundle["status"] == "pass"
567  assert bundle["status"] == "pass"
568  assert bundle["backend"] == "density_matrix"
569  assert bundle["summary"]["total_cases"] == len(MANDATORY_CASE_NAMES)
570  assert bundle["summary"]["passed_cases"] == len(MANDATORY_CASE_NAMES)
571  assert bundle["summary"]["required_cases"] == len(MANDATORY_CASE_NAMES)
572  assert bundle["summary"]["required_passed_cases"] == len(MANDATORY_CASE_NAMES)
573  assert bundle["summary"]["required_pass_rate"] == 1.0
574  assert bundle["summary"]["mandatory_baseline_completed"] is True
575  assert bundle["summary"]["exact_threshold_passed_cases"] == len(
576  MANDATORY_CASE_NAMES
577  )
578  assert bundle["summary"]["operation_audit_passed_cases"] == len(
579  MANDATORY_CASE_NAMES
580  )
581  assert bundle["summary"]["stable_case_ids_present"] is True
582  assert bundle["summary"]["missing_mandatory_case_names"] == []
583  assert bundle["summary"]["duplicate_case_names"] == []
584  assert bundle["summary"]["unexpected_case_names"] == []
585  assert bundle["summary"]["all_cases_required"] is True
586  assert bundle["summary"]["all_cases_count_toward_mandatory_baseline"] is True
587  assert bundle["summary"]["local_correctness_gate_completed"] is True
588  assert set(bundle["requirements"]["mandatory_case_names"]) == set(
589  MANDATORY_CASE_NAMES
590  )
591  assert bundle["required_artifacts"]["micro_validation_reference"]["status"] == "pass"
592  assert bundle["required_artifacts"]["required_local_noise_micro_validation"]["status"] == "pass"
593  assert all(case["support_tier"] == "required" for case in bundle["cases"])
594  assert all(case["counts_toward_mandatory_baseline"] for case in bundle["cases"])
595 
597  """Test that missing mandatory microcases fail the local-correctness gate."""
598  pytest.importorskip("qiskit")
599  pytest.importorskip("qiskit_aer")
600 
601  import copy
602 
603  from benchmarks.density_matrix.validation_evidence.local_correctness_validation import (
604  build_artifact_bundle,
605  run_validation,
606  )
607 
608  (
609  micro_validation_bundle,
610  required_local_noise_micro_validation_bundle,
611  _,
612  ) = run_validation(verbose=False)
613  broken_required_local_noise_micro_validation_bundle = copy.deepcopy(
614  required_local_noise_micro_validation_bundle
615  )
616  omitted_case = broken_required_local_noise_micro_validation_bundle["cases"].pop()
617 
618  bundle = build_artifact_bundle(
619  micro_validation_bundle,
620  broken_required_local_noise_micro_validation_bundle,
621  )
622 
623  assert bundle["status"] == "fail"
624  assert bundle["summary"]["stable_case_ids_present"] is False
625  assert bundle["summary"]["local_correctness_gate_completed"] is False
626  assert omitted_case["case_name"] in bundle["summary"]["missing_mandatory_case_names"]
627 
629  """Test the optional-noise classification bundle schema."""
630  pytest.importorskip("qiskit")
631  pytest.importorskip("qiskit_aer")
632 
633  from benchmarks.density_matrix.noise_support.optional_noise_classification_validation import (
634  OPTIONAL_WHOLE_REGISTER_CASES,
635  build_artifact_bundle,
636  run_validation,
637  )
638 
639  (
640  required_local_noise_bundle,
641  required_local_noise_micro_bundle,
642  optional_results,
643  ) = run_validation(verbose=False)
644  bundle = build_artifact_bundle(
645  required_local_noise_bundle,
646  required_local_noise_micro_bundle,
647  optional_results,
648  )
649 
650  assert bundle["status"] == "pass"
651  assert bundle["backend"] == "density_matrix"
652  assert bundle["summary"]["required_cases"] == 10
653  assert bundle["summary"]["required_passed_cases"] == 10
654  assert bundle["summary"]["required_pass_rate"] == 1.0
655  assert bundle["summary"]["optional_cases"] == len(OPTIONAL_WHOLE_REGISTER_CASES)
656  assert bundle["summary"]["optional_passed_cases"] == len(OPTIONAL_WHOLE_REGISTER_CASES)
657  assert bundle["summary"]["optional_pass_rate"] == 1.0
658  assert bundle["summary"]["optional_cases_count_toward_mandatory_baseline"] == 0
659  assert bundle["summary"]["mandatory_baseline_completed"]
660  assert set(bundle["summary"]["support_tiers_present"]) == {"optional", "required"}
661  assert bundle["required_artifacts"]["required_local_noise_bundle"]["status"] == "pass"
662  assert (
663  bundle["required_artifacts"]["required_local_noise_micro_bundle"]["status"]
664  == "pass"
665  )
666  assert "optional" in bundle["requirements"]["support_tier_vocabulary"]
667  assert all(case["support_tier"] == "optional" for case in bundle["cases"])
668  assert all(not case["counts_toward_mandatory_baseline"] for case in bundle["cases"])
669  assert all(case["whole_register_baseline_classification_pass"] for case in bundle["cases"])
670  assert all(case["optional_noise_case_pass"] for case in bundle["cases"])
671  assert all(case["noise_operation_sequence"] == ["depolarizing"] for case in bundle["cases"])
672 
673  def test_all_gates(self):
674  """Test all supported gate types."""
675  circuit = NoisyCircuit(2)
676 
677  # Single-qubit constant gates
678  circuit.add_H(0)
679  circuit.add_X(0)
680  circuit.add_Y(0)
681  circuit.add_Z(0)
682  circuit.add_S(0)
683  circuit.add_Sdg(0)
684  circuit.add_T(0)
685  circuit.add_Tdg(0)
686  circuit.add_SX(0)
687 
688  # Two-qubit gates
689  circuit.add_CNOT(1, 0)
690  circuit.add_CZ(1, 0)
691  circuit.add_CH(1, 0)
692 
693  rho = DensityMatrix(qbit_num=2)
694  circuit.apply_to(np.array([]), rho)
695 
696  # Should complete without error and produce valid state
697  assert rho.is_valid()
698 
699 
700 @pytest.mark.skipif(not HAS_MODULE, reason="Density matrix module not built")
702  """Test noise channel implementations."""
703 
705  """Test depolarizing noise reduces purity."""
706  rho = DensityMatrix(qbit_num=2)
707 
708  initial_purity = rho.purity()
709  assert np.isclose(initial_purity, 1.0)
710 
711  # Apply 10% depolarizing noise
712  noise = DepolarizingChannel(qbit_num=2, error_rate=0.1)
713  noise.apply(rho)
714 
715  final_purity = rho.purity()
716 
717  # Purity should decrease
718  assert final_purity < initial_purity, \
719  f"Noise should reduce purity: {initial_purity} → {final_purity}"
720 
721  # Trace should still be 1
722  tr = rho.trace()
723  assert np.isclose(tr.real, 1.0, atol=1e-10)
724 
726  """Test depolarizing noise converges to maximally mixed."""
727  rho = DensityMatrix(qbit_num=2)
728 
729  # Apply very strong noise (99%)
730  noise = DepolarizingChannel(qbit_num=2, error_rate=0.99)
731  noise.apply(rho)
732 
733  # Should be close to maximally mixed (purity ≈ 0.25)
734  purity = rho.purity()
735  assert np.isclose(purity, 0.25, atol=0.01), \
736  f"Strong depolarizing should give purity ≈ 0.25, got {purity}"
737 
739  """Test amplitude damping channel."""
740  # Start with |1⟩ (excited state)
741  psi = np.array([0, 1], dtype=complex)
742  rho = DensityMatrix(psi)
743 
744  # Apply amplitude damping (30% probability of decay)
745  noise = AmplitudeDampingChannel(target_qbit=0, gamma=0.3)
746  noise.apply(rho)
747 
748  # Population in |1⟩ should decrease
749  rho_np = rho.to_numpy()
750  pop_1 = rho_np[1, 1].real
751 
752  # After damping: ρ₁₁ ≈ (1-γ) = 0.7
753  assert pop_1 < 1.0, "Amplitude damping should reduce |1⟩ population"
754  assert pop_1 > 0.6, "Population should not decay completely with γ=0.3"
755 
757  """Test phase damping channel."""
758  # Start with |+⟩ = (|0⟩ + |1⟩)/√2 (has coherence)
759  psi = np.array([1, 1], dtype=complex) / np.sqrt(2)
760  rho = DensityMatrix(psi)
761 
762  rho_np_before = rho.to_numpy()
763  coherence_before = abs(rho_np_before[0, 1])
764 
765  # Apply phase damping
766  noise = PhaseDampingChannel(target_qbit=0, **{'lambda': 0.5})
767  noise.apply(rho)
768 
769  rho_np_after = rho.to_numpy()
770  coherence_after = abs(rho_np_after[0, 1])
771 
772  # Coherence should decrease
773  assert coherence_after < coherence_before, \
774  "Phase damping should reduce coherence"
775 
776  @pytest.mark.parametrize(
777  "channel_factory, rho_factory, validate",
778  [
779  pytest.param(
780  lambda: DepolarizingChannel(2, 0.5),
781  lambda: DensityMatrix(qbit_num=2),
782  _assert_purity_reduced,
783  id="depolarizing",
784  ),
785  pytest.param(
786  lambda: AmplitudeDampingChannel(0, 0.5),
787  lambda: DensityMatrix(np.array([0, 1], dtype=complex)),
788  _assert_population_transferred,
789  id="amplitude_damping",
790  ),
791  pytest.param(
792  lambda: PhaseDampingChannel(0, 0.5),
793  lambda: DensityMatrix(
794  np.array([1, 1], dtype=complex) / np.sqrt(2)
795  ),
796  _assert_coherence_reduced,
797  id="phase_damping",
798  ),
799  ],
800  )
802  self, channel_factory, rho_factory, validate
803  ):
804  """Test legacy channel constructor signatures."""
805  rho = rho_factory()
806  noise = channel_factory()
807  noise.apply(rho)
808  validate(rho)
809 
810 
811 @pytest.mark.skipif(not HAS_MODULE, reason="Density matrix module not built")
813  """Integration tests combining multiple features."""
814 
816  """Test circuit application followed by noise."""
817  # Create GHZ-like circuit
818  circuit = NoisyCircuit(3)
819  circuit.add_H(0)
820  circuit.add_CNOT(1, 0)
821  circuit.add_CNOT(2, 1)
822 
823  rho = DensityMatrix(qbit_num=3)
824 
825  # Apply circuit
826  circuit.apply_to(np.array([]), rho)
827 
828  # Should still be pure
829  purity_before = rho.purity()
830  assert np.isclose(purity_before, 1.0, atol=1e-10)
831 
832  # Add noise
833  noise = DepolarizingChannel(qbit_num=3, error_rate=0.05)
834  noise.apply(rho)
835 
836  # Should now be mixed
837  purity_after = rho.purity()
838  assert purity_after < 1.0
839 
840  # But trace should still be 1
841  tr = rho.trace()
842  assert np.isclose(tr.real, 1.0, atol=1e-10)
843 
845  """Test partial trace operation."""
846  # Create Bell state
847  circuit = NoisyCircuit(2)
848  circuit.add_H(0)
849  circuit.add_CNOT(1, 0)
850 
851  rho_full = DensityMatrix(qbit_num=2)
852  circuit.apply_to(np.array([]), rho_full)
853 
854  # Trace out qubit 1
855  rho_reduced = rho_full.partial_trace([1])
856 
857  # For Bell state, reduced should be maximally mixed
858  purity_reduced = rho_reduced.purity()
859  assert np.isclose(purity_reduced, 0.5, atol=1e-10), \
860  f"Bell state reduced density matrix should have purity=0.5, got {purity_reduced}"
861 
863  """Test partial trace from NumPy-constructed density matrix."""
864  # Create Bell state manually
865  bell = np.array([[0.5, 0, 0, 0.5],
866  [0, 0, 0, 0],
867  [0, 0, 0, 0],
868  [0.5, 0, 0, 0.5]], dtype=complex)
869  rho = DensityMatrix.from_numpy(bell)
870 
871  # Trace out qubit 1
872  rho_reduced = rho.partial_trace([1])
873 
874  expected = np.array([[0.5, 0], [0, 0.5]], dtype=complex)
875  np.testing.assert_allclose(rho_reduced.to_numpy(), expected, atol=1e-10)
876 
878  """Test that density matrix evolution matches state vector for pure states."""
879  from squander.gates.qgd_Circuit import qgd_Circuit
880 
881  # Create same circuit in both frameworks
882  sv_circuit = qgd_Circuit(2)
883  sv_circuit.add_H(0)
884  sv_circuit.add_CNOT(1, 0)
885 
886  dm_circuit = NoisyCircuit(2)
887  dm_circuit.add_H(0)
888  dm_circuit.add_CNOT(1, 0)
889 
890  # Apply to state vector
891  sv = np.zeros(4, dtype=complex)
892  sv[0] = 1.0
893  U = sv_circuit.get_Matrix(np.array([]))
894  sv_final = U @ sv
895 
896  # Apply to density matrix
897  rho = DensityMatrix(qbit_num=2)
898  dm_circuit.apply_to(np.array([]), rho)
899 
900  # Density matrix from state vector
901  rho_expected = np.outer(sv_final, sv_final.conj())
902  rho_actual = rho.to_numpy()
903 
904  np.testing.assert_allclose(rho_actual, rho_expected, atol=1e-10)
905 
907  """Test HEA-relevant U3 plus CNOT evolution against state vector."""
908  from squander.gates.qgd_Circuit import qgd_Circuit
909 
910  sv_circuit = qgd_Circuit(2)
911  sv_circuit.add_U3(0)
912  sv_circuit.add_CNOT(1, 0)
913 
914  dm_circuit = NoisyCircuit(2)
915  dm_circuit.add_U3(0)
916  dm_circuit.add_CNOT(1, 0)
917 
918  params = np.array([0.21, -0.13, 0.37], dtype=np.float64)
919 
920  sv = np.zeros(4, dtype=complex)
921  sv[0] = 1.0
922  U = sv_circuit.get_Matrix(params)
923  sv_final = U @ sv
924 
925  rho = DensityMatrix(qbit_num=2)
926  dm_circuit.apply_to(params, rho)
927 
928  rho_expected = np.outer(sv_final, sv_final.conj())
929  rho_actual = rho.to_numpy()
930 
931  np.testing.assert_allclose(rho_actual, rho_expected, atol=1e-10)
932 
933 
934 @pytest.mark.skipif(not HAS_MODULE, reason="Density matrix module not built")
935 @pytest.mark.slow
937  """Performance-related tests."""
938 
940  """Test moderately large circuit."""
941  n_qubits = 4
942  circuit = NoisyCircuit(n_qubits)
943 
944  # Add 20 operations
945  for _ in range(5):
946  circuit.add_H(0)
947  circuit.add_CNOT(1, 0)
948  circuit.add_CNOT(2, 1)
949  circuit.add_CNOT(3, 2)
950 
951  rho = DensityMatrix(qbit_num=n_qubits)
952  circuit.apply_to(np.array([]), rho)
953 
954  assert rho.is_valid()
955 
957  """Test repeated noise application."""
958  circuit = NoisyCircuit(2)
959 
960  # Interleave gates with noise (10% per step for more noticeable effect)
961  for _ in range(10):
962  circuit.add_H(0)
963  circuit.add_depolarizing(2, error_rate=0.1)
964 
965  rho = DensityMatrix(qbit_num=2)
966  circuit.apply_to(np.array([]), rho)
967 
968  # Purity should decrease (10 applications of 10% noise)
969  # Not necessarily below 0.5, but significantly reduced
970  assert rho.purity() < 0.9
971  assert rho.is_valid()
972 
973 
975  """Test the workflow-contract bundle schema."""
976  from benchmarks.density_matrix.workflow_evidence.workflow_contract_validation import (
977  CONTRACT_VERSION,
978  STATUS_VOCABULARY,
979  THRESHOLD_CORE_FIELDS,
980  WORKFLOW_ID,
981  run_validation,
982  )
983 
984  reference_bundle, artifact = run_validation(verbose=False)
985 
986  assert reference_bundle["status"] == "pass"
987  assert artifact["status"] == "pass"
988  assert artifact["workflow_id"] == WORKFLOW_ID
989  assert artifact["contract_version"] == CONTRACT_VERSION
990  assert artifact["backend"] == "density_matrix"
991  assert artifact["reference_backend"] == "qiskit_aer_density_matrix"
992  assert artifact["requirements"]["workflow_id"] == WORKFLOW_ID
993  assert artifact["requirements"]["contract_version"] == CONTRACT_VERSION
994  assert artifact["requirements"]["end_to_end_qubits"] == [4, 6]
995  assert artifact["requirements"]["fixed_parameter_matrix_qubits"] == [4, 6, 8, 10]
996  assert artifact["requirements"]["documented_anchor_qubit"] == 10
997  assert artifact["requirements"]["fixed_parameter_sets_per_size"] == 10
998  assert artifact["requirements"]["required_threshold_fields"] == list(
999  THRESHOLD_CORE_FIELDS
1000  )
1001  assert artifact["input_contract"]["workflow_family"] == "noisy_vqe_ground_state_estimation"
1002  assert artifact["input_contract"]["ansatz"]["family"] == "HEA"
1003  assert artifact["input_contract"]["backend_selection"]["selected_backend"] == "density_matrix"
1004  assert artifact["input_contract"]["backend_selection"]["silent_fallback_allowed"] is False
1005  assert (
1006  artifact["input_contract"]["seed_policy"]["bounded_optimization_trace"][
1007  "random_seed_required"
1008  ]
1009  is False
1010  )
1011  assert artifact["output_contract"]["case_status_vocabulary"] == list(STATUS_VOCABULARY)
1012  assert set(artifact["output_contract"]["aggregate_status_semantics"].keys()) == {
1013  "pass",
1014  "fail",
1015  }
1016  assert "required_unsupported_case_fields" in artifact["output_contract"]
1017  assert artifact["thresholds"]["absolute_energy_error"] == pytest.approx(1e-8)
1018  assert artifact["thresholds"]["required_end_to_end_qubits"] == [4, 6]
1019  assert artifact["thresholds"]["required_workflow_qubits"] == [4, 6, 8, 10]
1020  assert set(artifact["boundary_classification"].keys()) == {
1021  "supported",
1022  "optional",
1023  "deferred",
1024  "unsupported",
1025  }
1026  assert artifact["summary"]["mandatory_reference_artifact_count"] == 6
1027  assert artifact["summary"]["reference_artifact_count"] == 6
1028  assert artifact["summary"]["contract_sections_complete"] is True
1029  assert artifact["summary"]["required_threshold_field_count"] == len(
1030  THRESHOLD_CORE_FIELDS
1031  )
1032  assert any(
1033  entry["artifact_id"] == "workflow_baseline_bundle"
1034  for entry in artifact["reference_artifacts"]
1035  )
1036 
1037 
1039  """Test that missing boundary classes fail workflow-contract validation."""
1040  import copy
1041 
1042  from benchmarks.density_matrix.workflow_evidence.workflow_contract_validation import (
1043  run_validation,
1044  validate_artifact_bundle,
1045  )
1046 
1047  _, artifact = run_validation(verbose=False)
1048  broken_artifact = copy.deepcopy(artifact)
1049  broken_artifact["boundary_classification"].pop("unsupported")
1050 
1051  with pytest.raises(ValueError, match="boundary classes mismatch"):
1052  validate_artifact_bundle(broken_artifact)
1053 
1054 
1056  """Test that missing workflow identity fails workflow-contract validation."""
1057  import copy
1058 
1059  from benchmarks.density_matrix.workflow_evidence.workflow_contract_validation import (
1060  run_validation,
1061  validate_artifact_bundle,
1062  )
1063 
1064  _, artifact = run_validation(verbose=False)
1065  broken_artifact = copy.deepcopy(artifact)
1066  broken_artifact["workflow_id"] = ""
1067 
1068  with pytest.raises(ValueError, match="workflow_id must be non-empty"):
1069  validate_artifact_bundle(broken_artifact)
1070 
1071 
1073  """Test that missing threshold fields fail workflow-contract validation."""
1074  import copy
1075 
1076  from benchmarks.density_matrix.workflow_evidence.workflow_contract_validation import (
1077  run_validation,
1078  validate_artifact_bundle,
1079  )
1080 
1081  _, artifact = run_validation(verbose=False)
1082  broken_artifact = copy.deepcopy(artifact)
1083  broken_artifact["thresholds"].pop("required_workflow_qubits")
1084 
1085  with pytest.raises(ValueError, match="thresholds are missing required field"):
1086  validate_artifact_bundle(broken_artifact)
1087 
1088 
1090  """Test the end-to-end trace bundle schema."""
1091  from benchmarks.density_matrix.workflow_evidence.end_to_end_trace_validation import (
1092  MANDATORY_END_TO_END_CASE_NAMES,
1093  TRACE_CASE_NAME,
1094  WORKFLOW_ID,
1095  run_validation,
1096  )
1097 
1098  workflow_contract, workflow_bundle, trace_artifact, bundle = run_validation(
1099  verbose=False
1100  )
1101 
1102  assert workflow_contract["status"] == "pass"
1103  assert workflow_bundle["status"] == "pass"
1104  assert trace_artifact["case_name"] == TRACE_CASE_NAME
1105  assert bundle["status"] == "pass"
1106  assert bundle["workflow_id"] == WORKFLOW_ID
1107  assert bundle["summary"]["total_end_to_end_cases"] == len(MANDATORY_END_TO_END_CASE_NAMES)
1108  assert bundle["summary"]["passed_end_to_end_cases"] == len(MANDATORY_END_TO_END_CASE_NAMES)
1109  assert bundle["summary"]["stable_case_ids_present"] is True
1110  assert bundle["summary"]["required_trace_present"] is True
1111  assert bundle["summary"]["required_trace_completed"] is True
1112  assert bundle["summary"]["required_trace_bridge_supported"] is True
1113  assert bundle["summary"]["all_cases_match_contract"] is True
1114  assert bundle["summary"]["end_to_end_qubits_match_contract"] is True
1115  assert bundle["summary"]["trace_case_name_matches_contract"] is True
1116  assert bundle["summary"]["trace_matches_contract"] is True
1117  assert bundle["summary"]["workflow_thresholds_match_contract"] is True
1118  assert bundle["summary"]["end_to_end_gate_completed"] is True
1119  assert bundle["requirements"]["required_trace_case_name"] == TRACE_CASE_NAME
1120  assert bundle["requirements"]["mandatory_end_to_end_qubits"] == [4, 6]
1121  assert bundle["requirements"]["workflow_id"] == WORKFLOW_ID
1122  assert bundle["thresholds"]["required_end_to_end_qubits"] == [4, 6]
1123  assert bundle["thresholds"]["required_trace_case_name"] == TRACE_CASE_NAME
1124  assert [case["case_name"] for case in bundle["cases"]] == list(
1125  MANDATORY_END_TO_END_CASE_NAMES
1126  )
1127  assert all(case["required_workflow_case"] for case in bundle["cases"])
1128  assert bundle["trace_artifact"]["required_workflow_trace"] is True
1129 
1130 
1132  """Test that missing mandatory end-to-end cases fail the trace gate."""
1133  import copy
1134 
1135  from benchmarks.density_matrix.workflow_evidence.end_to_end_trace_validation import (
1136  VALIDATION_TRACE_ARTIFACT_PATH,
1137  VALIDATION_WORKFLOW_BASELINE_PATH,
1138  build_artifact_bundle,
1139  _load_json,
1140  _load_workflow_contract,
1141  )
1142 
1143  workflow_contract = _load_workflow_contract()
1144  workflow_bundle = copy.deepcopy(_load_json(VALIDATION_WORKFLOW_BASELINE_PATH))
1145  trace_artifact = _load_json(VALIDATION_TRACE_ARTIFACT_PATH)
1146  workflow_bundle["cases"] = [
1147  case
1148  for case in workflow_bundle["cases"]
1149  if case["case_name"] != "exact_regime_6q_set_00"
1150  ]
1151 
1152  bundle = build_artifact_bundle(workflow_contract, workflow_bundle, trace_artifact)
1153 
1154  assert bundle["status"] == "fail"
1155  assert bundle["summary"]["stable_case_ids_present"] is False
1156  assert bundle["summary"]["end_to_end_gate_completed"] is False
1157  assert "exact_regime_6q_set_00" in bundle["summary"]["missing_mandatory_case_names"]
1158 
1159 
1161  """Test that workflow-contract trace-name drift blocks the trace gate."""
1162  import copy
1163 
1164  from benchmarks.density_matrix.workflow_evidence.end_to_end_trace_validation import (
1165  VALIDATION_TRACE_ARTIFACT_PATH,
1166  VALIDATION_WORKFLOW_BASELINE_PATH,
1167  build_artifact_bundle,
1168  _load_json,
1169  _load_workflow_contract,
1170  )
1171 
1172  workflow_contract = copy.deepcopy(_load_workflow_contract())
1173  workflow_bundle = _load_json(VALIDATION_WORKFLOW_BASELINE_PATH)
1174  trace_artifact = _load_json(VALIDATION_TRACE_ARTIFACT_PATH)
1175  workflow_contract["input_contract"]["execution_modes"]["bounded_optimization_trace"][
1176  "canonical_trace_case_name"
1177  ] = "unexpected_trace_6q"
1178 
1179  bundle = build_artifact_bundle(workflow_contract, workflow_bundle, trace_artifact)
1180 
1181  assert bundle["status"] == "fail"
1182  assert bundle["summary"]["required_trace_present"] is False
1183  assert bundle["summary"]["trace_case_name_matches_contract"] is False
1184  assert bundle["summary"]["end_to_end_gate_completed"] is False
1185 
1186 
1188  """Test that incomplete trace evidence fails the trace gate."""
1189  import copy
1190 
1191  from benchmarks.density_matrix.workflow_evidence.end_to_end_trace_validation import (
1192  VALIDATION_TRACE_ARTIFACT_PATH,
1193  VALIDATION_WORKFLOW_BASELINE_PATH,
1194  build_artifact_bundle,
1195  _load_json,
1196  _load_workflow_contract,
1197  )
1198 
1199  workflow_contract = _load_workflow_contract()
1200  workflow_bundle = _load_json(VALIDATION_WORKFLOW_BASELINE_PATH)
1201  trace_artifact = copy.deepcopy(_load_json(VALIDATION_TRACE_ARTIFACT_PATH))
1202  trace_artifact["workflow_completed"] = False
1203 
1204  bundle = build_artifact_bundle(workflow_contract, workflow_bundle, trace_artifact)
1205 
1206  assert bundle["status"] == "fail"
1207  assert bundle["summary"]["required_trace_completed"] is False
1208  assert bundle["summary"]["end_to_end_gate_completed"] is False
1209 
1210 
1212  """Test the matrix-baseline bundle schema."""
1213  from benchmarks.density_matrix.workflow_evidence.matrix_baseline_validation import (
1214  WORKFLOW_ID,
1215  run_validation,
1216  )
1217 
1218  workflow_contract, end_to_end_trace_bundle, workflow_baseline_bundle, bundle = run_validation(
1219  verbose=False
1220  )
1221 
1222  assert workflow_contract["status"] == "pass"
1223  assert end_to_end_trace_bundle["status"] == "pass"
1224  assert workflow_baseline_bundle["status"] == "pass"
1225  assert bundle["status"] == "pass"
1226  assert bundle["workflow_id"] == WORKFLOW_ID
1227  assert bundle["summary"]["required_cases"] == 40
1228  assert bundle["summary"]["required_passed_cases"] == 40
1229  assert bundle["summary"]["required_pass_rate"] == 1.0
1230  assert bundle["summary"]["stable_case_ids_present"] is True
1231  assert bundle["summary"]["stable_parameter_set_ids_present"] is True
1232  assert bundle["summary"]["documented_10q_anchor_present"] is True
1233  assert bundle["summary"]["workflow_inventory_matches_contract"] is True
1234  assert bundle["summary"]["workflow_thresholds_match_contract"] is True
1235  assert bundle["summary"]["all_cases_match_contract"] is True
1236  assert bundle["summary"]["matrix_gate_completed"] is True
1237  assert bundle["requirements"]["mandatory_workflow_qubits"] == [4, 6, 8, 10]
1238  assert bundle["requirements"]["fixed_parameter_sets_per_size"] == 10
1239  assert bundle["requirements"]["documented_anchor_qubit"] == 10
1240  assert bundle["thresholds"]["required_workflow_qubits"] == [4, 6, 8, 10]
1241  assert bundle["thresholds"]["fixed_parameter_sets_per_size"] == 10
1242  assert bundle["thresholds"]["documented_anchor_qubit"] == 10
1243  assert bundle["required_artifacts"]["end_to_end_trace_reference"]["status"] == "pass"
1244  assert len(bundle["cases"]) == 40
1245  assert all(case["required_matrix_case"] for case in bundle["cases"])
1246 
1247 
1249  """Test that missing matrix cases fail the matrix baseline gate."""
1250  import copy
1251 
1252  from benchmarks.density_matrix.workflow_evidence.matrix_baseline_validation import (
1253  VALIDATION_WORKFLOW_BASELINE_PATH,
1254  _load_json,
1255  _load_workflow_contract,
1256  _load_end_to_end_trace_bundle,
1257  build_artifact_bundle,
1258  )
1259 
1260  workflow_contract = _load_workflow_contract()
1261  end_to_end_trace_bundle = _load_end_to_end_trace_bundle()
1262  workflow_baseline_bundle = copy.deepcopy(
1263  _load_json(VALIDATION_WORKFLOW_BASELINE_PATH)
1264  )
1265  workflow_baseline_bundle["cases"] = [
1266  case
1267  for case in workflow_baseline_bundle["cases"]
1268  if case["case_name"] != "exact_regime_10q_set_09"
1269  ]
1270 
1271  bundle = build_artifact_bundle(
1272  workflow_contract,
1273  end_to_end_trace_bundle,
1274  workflow_baseline_bundle,
1275  )
1276 
1277  assert bundle["status"] == "fail"
1278  assert bundle["summary"]["stable_case_ids_present"] is False
1279  assert bundle["summary"]["matrix_gate_completed"] is False
1280  assert "exact_regime_10q_set_09" in bundle["summary"]["missing_mandatory_case_names"]
1281 
1282 
1284  """Test that workflow-contract threshold drift blocks the matrix gate."""
1285  import copy
1286 
1287  from benchmarks.density_matrix.workflow_evidence.matrix_baseline_validation import (
1288  VALIDATION_WORKFLOW_BASELINE_PATH,
1289  _load_json,
1290  _load_workflow_contract,
1291  _load_end_to_end_trace_bundle,
1292  build_artifact_bundle,
1293  )
1294 
1295  workflow_contract = copy.deepcopy(_load_workflow_contract())
1296  end_to_end_trace_bundle = _load_end_to_end_trace_bundle()
1297  workflow_baseline_bundle = _load_json(VALIDATION_WORKFLOW_BASELINE_PATH)
1298  workflow_contract["thresholds"]["absolute_energy_error"] = 1e-7
1299 
1300  bundle = build_artifact_bundle(
1301  workflow_contract,
1302  end_to_end_trace_bundle,
1303  workflow_baseline_bundle,
1304  )
1305 
1306  assert bundle["status"] == "fail"
1307  assert bundle["summary"]["workflow_thresholds_match_contract"] is False
1308  assert bundle["summary"]["matrix_gate_completed"] is False
1309 
1310 
1312  """Test that case-level contract mismatch fails matrix-baseline validation."""
1313  import copy
1314 
1315  from benchmarks.density_matrix.workflow_evidence.matrix_baseline_validation import (
1316  run_validation,
1317  validate_artifact_bundle,
1318  )
1319 
1320  _, _, _, bundle = run_validation(verbose=False)
1321  broken_bundle = copy.deepcopy(bundle)
1322  broken_bundle["cases"][0]["workflow_id"] = "wrong_workflow_id"
1323 
1324  with pytest.raises(ValueError, match="does not match bundle workflow_id"):
1325  validate_artifact_bundle(broken_bundle)
1326 
1327 
1329  """Test the unsupported-workflow bundle schema."""
1330  from benchmarks.density_matrix.workflow_evidence.unsupported_workflow_validation import (
1331  BACKEND_MISMATCH_CASE_NAME,
1332  run_validation,
1333  )
1334 
1335  (
1336  workflow_contract,
1337  end_to_end_trace_bundle,
1338  matrix_baseline_bundle,
1339  unsupported_noise_bundle,
1340  backend_mismatch_case,
1341  bundle,
1342  ) = run_validation(verbose=False)
1343 
1344  assert workflow_contract["status"] == "pass"
1345  assert end_to_end_trace_bundle["status"] == "pass"
1346  assert matrix_baseline_bundle["status"] == "pass"
1347  assert unsupported_noise_bundle["status"] == "pass"
1348  assert backend_mismatch_case["case_name"] == BACKEND_MISMATCH_CASE_NAME
1349  assert bundle["status"] == "pass"
1350  assert bundle["summary"]["unsupported_status_cases"] == bundle["summary"]["total_cases"]
1351  assert bundle["summary"]["mandatory_baseline_case_count"] == 0
1352  assert bundle["summary"]["backend_incompatible_case_present"] is True
1353  assert bundle["summary"]["all_cases_match_contract"] is True
1354  assert bundle["summary"]["unsupported_gate_completed"] is True
1355  assert (
1356  bundle["requirements"]["required_case_fields"]
1357  == workflow_contract["output_contract"]["required_unsupported_case_fields"]
1358  )
1359  assert bundle["thresholds"]["silent_fallback_allowed"] is False
1360  assert "backend_incompatible_request" in bundle["summary"]["categories_present"]
1361  assert all(case["required_unsupported_case"] for case in bundle["cases"])
1362 
1363 
1365  """Test that missing backend-mismatch evidence fails the unsupported gate."""
1366  import copy
1367 
1368  from benchmarks.density_matrix.workflow_evidence.unsupported_workflow_validation import (
1369  BACKEND_MISMATCH_CASE_PATH,
1370  UNSUPPORTED_NOISE_BUNDLE_PATH,
1371  _load_json,
1372  _load_workflow_contract,
1373  _load_end_to_end_trace_bundle,
1374  _load_matrix_baseline_bundle,
1375  build_artifact_bundle,
1376  )
1377 
1378  workflow_contract = _load_workflow_contract()
1379  end_to_end_trace_bundle = _load_end_to_end_trace_bundle()
1380  matrix_baseline_bundle = _load_matrix_baseline_bundle()
1381  unsupported_noise_bundle = _load_json(UNSUPPORTED_NOISE_BUNDLE_PATH)
1382  backend_mismatch_case = copy.deepcopy(_load_json(BACKEND_MISMATCH_CASE_PATH))
1383  backend_mismatch_case["case_name"] = "missing_backend_case"
1384 
1385  bundle = build_artifact_bundle(
1386  workflow_contract,
1387  end_to_end_trace_bundle,
1388  matrix_baseline_bundle,
1389  unsupported_noise_bundle,
1390  backend_mismatch_case,
1391  )
1392 
1393  assert bundle["status"] == "fail"
1394  assert bundle["summary"]["backend_incompatible_case_present"] is False
1395  assert bundle["summary"]["unsupported_gate_completed"] is False
1396 
1397 
1399  """Test that missing first-unsupported-condition fields fail validation."""
1400  import copy
1401 
1402  from benchmarks.density_matrix.workflow_evidence.unsupported_workflow_validation import (
1403  run_validation,
1404  validate_artifact_bundle,
1405  )
1406 
1407  *_, bundle = run_validation(verbose=False)
1408  broken_bundle = copy.deepcopy(bundle)
1409  broken_bundle["cases"][0].pop("first_unsupported_condition")
1410 
1411  with pytest.raises(ValueError, match="missing required fields"):
1412  validate_artifact_bundle(broken_bundle)
1413 
1414 
1416  """Test that workflow-contract field drift is enforced by the unsupported gate."""
1417  import copy
1418 
1419  from benchmarks.density_matrix.workflow_evidence.unsupported_workflow_validation import (
1420  BACKEND_MISMATCH_CASE_PATH,
1421  UNSUPPORTED_NOISE_BUNDLE_PATH,
1422  _load_json,
1423  _load_workflow_contract,
1424  _load_end_to_end_trace_bundle,
1425  _load_matrix_baseline_bundle,
1426  build_artifact_bundle,
1427  )
1428 
1429  workflow_contract = copy.deepcopy(_load_workflow_contract())
1430  end_to_end_trace_bundle = _load_end_to_end_trace_bundle()
1431  matrix_baseline_bundle = _load_matrix_baseline_bundle()
1432  unsupported_noise_bundle = _load_json(UNSUPPORTED_NOISE_BUNDLE_PATH)
1433  backend_mismatch_case = _load_json(BACKEND_MISMATCH_CASE_PATH)
1434  workflow_contract["output_contract"]["required_unsupported_case_fields"].append(
1435  "workflow_contract_only_required_field"
1436  )
1437 
1438  with pytest.raises(ValueError, match="missing required fields"):
1440  workflow_contract,
1441  end_to_end_trace_bundle,
1442  matrix_baseline_bundle,
1443  unsupported_noise_bundle,
1444  backend_mismatch_case,
1445  )
1446 
1447 
1449  """Test the workflow-interpretation bundle schema."""
1450  from benchmarks.density_matrix.workflow_evidence.workflow_interpretation_validation import (
1451  WORKFLOW_ID,
1452  run_validation,
1453  )
1454 
1455  (
1456  workflow_contract,
1457  end_to_end_trace_bundle,
1458  matrix_baseline_bundle,
1459  unsupported_workflow_bundle,
1460  optional_noise_bundle,
1461  bundle,
1462  ) = run_validation(verbose=False)
1463 
1464  assert workflow_contract["status"] == "pass"
1465  assert end_to_end_trace_bundle["status"] == "pass"
1466  assert matrix_baseline_bundle["status"] == "pass"
1467  assert unsupported_workflow_bundle["status"] == "pass"
1468  assert optional_noise_bundle["status"] == "pass"
1469  assert bundle["status"] == "pass"
1470  assert bundle["workflow_id"] == WORKFLOW_ID
1471  assert bundle["summary"]["workflow_contract_complete"] is True
1472  assert bundle["summary"]["end_to_end_gate_complete"] is True
1473  assert bundle["summary"]["matrix_baseline_gate_complete"] is True
1474  assert bundle["summary"]["unsupported_workflow_gate_complete"] is True
1475  assert bundle["summary"]["unsupported_case_field_alignment"] is True
1476  assert bundle["summary"]["mandatory_artifacts_complete"] is True
1477  assert bundle["summary"]["optional_evidence_supplemental"] is True
1478  assert bundle["summary"]["unsupported_evidence_negative_only"] is True
1479  assert bundle["summary"]["main_workflow_claim_completed"] is True
1480  assert bundle["summary"]["optional_cases_count_toward_mandatory_baseline"] == 0
1481  assert bundle["required_artifacts"]["unsupported_workflow_reference"]["status"] == "pass"
1482 
1483 
1485  """Test that optional evidence cannot count toward the main workflow claim."""
1486  import copy
1487 
1488  from benchmarks.density_matrix.workflow_evidence.workflow_interpretation_validation import (
1489  OPTIONAL_NOISE_BUNDLE_PATH,
1490  _load_json,
1491  _load_workflow_contract,
1492  _load_end_to_end_trace_bundle,
1493  _load_matrix_baseline_bundle,
1494  _load_unsupported_workflow_bundle,
1495  build_artifact_bundle,
1496  )
1497 
1498  workflow_contract = _load_workflow_contract()
1499  end_to_end_trace_bundle = _load_end_to_end_trace_bundle()
1500  matrix_baseline_bundle = _load_matrix_baseline_bundle()
1501  unsupported_workflow_bundle = _load_unsupported_workflow_bundle()
1502  optional_noise_bundle = copy.deepcopy(_load_json(OPTIONAL_NOISE_BUNDLE_PATH))
1503  optional_noise_bundle["summary"]["optional_cases_count_toward_mandatory_baseline"] = 1
1504 
1505  bundle = build_artifact_bundle(
1506  workflow_contract,
1507  end_to_end_trace_bundle,
1508  matrix_baseline_bundle,
1509  unsupported_workflow_bundle,
1510  optional_noise_bundle,
1511  )
1512 
1513  assert bundle["status"] == "fail"
1514  assert bundle["summary"]["optional_evidence_supplemental"] is False
1515  assert bundle["summary"]["main_workflow_claim_completed"] is False
1516 
1517 
1519  """Test that incomplete mandatory artifacts block claim closure."""
1520  import copy
1521 
1522  from benchmarks.density_matrix.workflow_evidence.workflow_interpretation_validation import (
1523  OPTIONAL_NOISE_BUNDLE_PATH,
1524  _load_json,
1525  _load_workflow_contract,
1526  _load_end_to_end_trace_bundle,
1527  _load_matrix_baseline_bundle,
1528  _load_unsupported_workflow_bundle,
1529  build_artifact_bundle,
1530  )
1531 
1532  workflow_contract = _load_workflow_contract()
1533  end_to_end_trace_bundle = _load_end_to_end_trace_bundle()
1534  matrix_baseline_bundle = copy.deepcopy(_load_matrix_baseline_bundle())
1535  unsupported_workflow_bundle = _load_unsupported_workflow_bundle()
1536  optional_noise_bundle = _load_json(OPTIONAL_NOISE_BUNDLE_PATH)
1537  matrix_baseline_bundle["status"] = "fail"
1538 
1539  bundle = build_artifact_bundle(
1540  workflow_contract,
1541  end_to_end_trace_bundle,
1542  matrix_baseline_bundle,
1543  unsupported_workflow_bundle,
1544  optional_noise_bundle,
1545  )
1546 
1547  assert bundle["status"] == "fail"
1548  assert "matrix_baseline_reference" in bundle["summary"]["incomplete_mandatory_artifacts"]
1549  assert bundle["summary"]["mandatory_artifacts_complete"] is False
1550  assert bundle["summary"]["main_workflow_claim_completed"] is False
1551 
1552 
1554  """Test that unsupported-field drift blocks the main workflow claim."""
1555  import copy
1556 
1557  from benchmarks.density_matrix.workflow_evidence.workflow_interpretation_validation import (
1558  OPTIONAL_NOISE_BUNDLE_PATH,
1559  _load_json,
1560  _load_workflow_contract,
1561  _load_end_to_end_trace_bundle,
1562  _load_matrix_baseline_bundle,
1563  _load_unsupported_workflow_bundle,
1564  build_artifact_bundle,
1565  )
1566 
1567  workflow_contract = _load_workflow_contract()
1568  end_to_end_trace_bundle = _load_end_to_end_trace_bundle()
1569  matrix_baseline_bundle = _load_matrix_baseline_bundle()
1570  unsupported_workflow_bundle = copy.deepcopy(_load_unsupported_workflow_bundle())
1571  optional_noise_bundle = _load_json(OPTIONAL_NOISE_BUNDLE_PATH)
1572  unsupported_workflow_bundle["requirements"]["required_case_fields"].append(
1573  "exact_regime_only_field_drift"
1574  )
1575 
1576  bundle = build_artifact_bundle(
1577  workflow_contract,
1578  end_to_end_trace_bundle,
1579  matrix_baseline_bundle,
1580  unsupported_workflow_bundle,
1581  optional_noise_bundle,
1582  )
1583 
1584  assert bundle["status"] == "fail"
1585  assert bundle["summary"]["unsupported_case_field_alignment"] is False
1586  assert bundle["summary"]["unsupported_evidence_negative_only"] is False
1587  assert bundle["summary"]["main_workflow_claim_completed"] is False
1588 
1589 
1591  """Test the workflow-publication bundle schema."""
1592  from benchmarks.density_matrix.workflow_evidence.workflow_publication_bundle import (
1593  WORKFLOW_ID,
1594  run_validation,
1595  )
1596 
1597  (
1598  workflow_contract,
1599  end_to_end_trace_bundle,
1600  matrix_baseline_bundle,
1601  unsupported_workflow_bundle,
1602  workflow_interpretation_bundle,
1603  bundle,
1604  ) = run_validation(verbose=False)
1605 
1606  assert workflow_contract["status"] == "pass"
1607  assert end_to_end_trace_bundle["status"] == "pass"
1608  assert matrix_baseline_bundle["status"] == "pass"
1609  assert unsupported_workflow_bundle["status"] == "pass"
1610  assert workflow_interpretation_bundle["status"] == "pass"
1611  assert bundle["status"] == "pass"
1612  assert bundle["workflow_id"] == WORKFLOW_ID
1613  assert bundle["summary"]["mandatory_artifact_count"] == 5
1614  assert bundle["summary"]["present_artifact_count"] == 5
1615  assert bundle["summary"]["status_match_count"] == 5
1616  assert bundle["summary"]["workflow_identity_match_count"] == 5
1617  assert bundle["summary"]["semantic_match_count"] == 5
1618  assert len(bundle["artifacts"]) == 5
1619  assert all(artifact["mandatory"] for artifact in bundle["artifacts"])
1620 
1621 
1623  """Test that missing mandatory artifact entries fail publication validation."""
1624  import copy
1625 
1626  from benchmarks.density_matrix.workflow_evidence.workflow_publication_bundle import (
1627  DEFAULT_OUTPUT_DIR,
1628  run_validation,
1629  validate_workflow_publication_bundle,
1630  )
1631 
1632  *_, bundle = run_validation(verbose=False)
1633  broken_bundle = copy.deepcopy(bundle)
1634  broken_bundle["artifacts"] = broken_bundle["artifacts"][:-1]
1635 
1636  with pytest.raises(ValueError, match="missing required artifact IDs"):
1637  validate_workflow_publication_bundle(broken_bundle, DEFAULT_OUTPUT_DIR)
1638 
1639 
1641  """Test that mismatched contract versions fail publication validation."""
1642  import copy
1643 
1644  from benchmarks.density_matrix.workflow_evidence.workflow_publication_bundle import (
1645  DEFAULT_OUTPUT_DIR,
1646  run_validation,
1647  validate_workflow_publication_bundle,
1648  )
1649 
1650  *_, bundle = run_validation(verbose=False)
1651  broken_bundle = copy.deepcopy(bundle)
1652  broken_bundle["artifacts"][0]["summary"]["contract_version"] = "v2"
1653 
1654  with pytest.raises(ValueError, match="mismatched contract_version"):
1655  validate_workflow_publication_bundle(broken_bundle, DEFAULT_OUTPUT_DIR)
1656 
1657 
1659  """Test that missing semantic closure flags fail publication validation."""
1660  import copy
1661 
1662  from benchmarks.density_matrix.workflow_evidence.workflow_publication_bundle import (
1663  DEFAULT_OUTPUT_DIR,
1664  run_validation,
1665  validate_workflow_publication_bundle,
1666  )
1667 
1668  *_, bundle = run_validation(verbose=False)
1669  broken_bundle = copy.deepcopy(bundle)
1670  broken_bundle["artifacts"][1]["summary"]["end_to_end_gate_completed"] = False
1671 
1672  with pytest.raises(ValueError, match="missing required semantic closure flags"):
1673  validate_workflow_publication_bundle(broken_bundle, DEFAULT_OUTPUT_DIR)
1674 
1675 
1676 if __name__ == "__main__":
1677  pytest.main([__file__, "-v"])
def validate_microcase(case, verbose=True)
def test_workflow_interpretation_incomplete_mandatory_artifact_blocks_closure_module_level()
def test_depolarizing(self, error_rate, params, expected_param_num)
def validate_artifact_bundle(bundle)
def build_artifact_bundle(results)
def test_workflow_publication_mismatched_contract_version_fails_validation_module_level()
def test_workflow_contract_missing_boundary_classification_fails_validation_module_level()
def run_validation(verbose=True)
def test_legacy_channel_signatures(self, channel_factory, rho_factory, validate)
def test_workflow_interpretation_optional_evidence_counting_toward_mandatory_blocks_closure_module_level()
def test_unsupported_workflow_missing_backend_mismatch_case_blocks_closure_module_level()