Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
test_VQE.py
Go to the documentation of this file.
1 import functools
2 import numpy as np
3 import scipy as sp
4 import pytest
5 
6 
7 @functools.lru_cache(maxsize=1)
9  """Lazy import so test collection works without a full squander extension build."""
10  from squander.partitioning.noisy_planner import (
11  PLANNER_OP_KIND_GATE,
12  PLANNER_OP_KIND_NOISE,
13  )
14 
15  return PLANNER_OP_KIND_GATE, PLANNER_OP_KIND_NOISE
16 
17 
18 sigmax = sp.sparse.csr_matrix(np.array([[0,1],
19  [1,0]])+0.j)
20 sigmay = sp.sparse.csr_matrix(np.array([[0,0+-1j],
21  [0+1j,0]])+0.j)
22 sigmaz = sp.sparse.csr_matrix(np.array([[1,0],
23  [0,-1]])+0.j)
24 
25 
26 def generate_hamiltonian(topology, n):
27 
28  Hamiltonian = sp.sparse.coo_matrix((2**n, 2**n), dtype=np.complex128)
29  for i in topology:
30  if i[0]==0:
31  lhs_1 = sp.sparse.eye(1,format='coo')
32  else:
33  lhs_1 = sp.sparse.eye(2,format='coo')
34  for k in range(i[0]-1):
35  lhs_1 = sp.sparse.kron(lhs_1,sp.sparse.eye(2,format='coo'),format='coo')
36  if i[0]==n-1:
37  rhs_1 = sp.sparse.eye(1,format='coo')
38  else:
39  rhs_1 = sp.sparse.eye(2,format='coo')
40  for k in range(n-i[0]-2):
41  rhs_1 = sp.sparse.kron(rhs_1,sp.sparse.eye(2,format='coo'),format='coo')
42  if i[1]==0:
43  lhs_2 = sp.sparse.eye(1,format='coo')
44  else:
45  lhs_2 = sp.sparse.eye(2,format='coo')
46  for k in range(i[1]-1):
47  lhs_2 = sp.sparse.kron(lhs_2,sp.sparse.eye(2,format='coo'),format='coo')
48  if i[1]==n-1:
49  rhs_2 = sp.sparse.eye(1,format='coo')
50  else:
51  rhs_2 = sp.sparse.eye(2,format='coo')
52  for k in range(n-i[1]-2):
53  rhs_2 = sp.sparse.kron(rhs_2,sp.sparse.eye(2,format='coo'),format='coo')
54  Hamiltonian += -0.5*sp.sparse.kron(sp.sparse.kron(lhs_1,sigmax,format='coo'),rhs_1,format='coo')@sp.sparse.kron(sp.sparse.kron(lhs_2 ,sigmax,format='coo'),rhs_2 ,format='coo')
55  Hamiltonian += -0.5*sp.sparse.kron(sp.sparse.kron(lhs_1,sigmay,format='coo'),rhs_1,format='coo')@sp.sparse.kron(sp.sparse.kron(lhs_2 ,sigmay,format='coo'),rhs_2 ,format='coo')
56  Hamiltonian += -0.5*sp.sparse.kron(sp.sparse.kron(lhs_1,sigmaz,format='coo'),rhs_1,format='coo')@sp.sparse.kron(sp.sparse.kron(lhs_2 ,sigmaz,format='coo'),rhs_2 ,format='coo')
57  for i in range(n):
58 
59  if i==0:
60  lhs_1 = sp.sparse.eye(1,format='coo')
61  else:
62  lhs_1 = sp.sparse.eye(2,format='coo')
63  for k in range(i-1):
64  lhs_1 = sp.sparse.kron(lhs_1,sp.sparse.eye(2,format='coo'),format='coo')
65  if i==n-1:
66  rhs_1 = sp.sparse.eye(1,format='coo')
67  else:
68  rhs_1 = sp.sparse.eye(2,format='coo')
69  for k in range(n-i-2):
70  rhs_1 = sp.sparse.kron(rhs_1,sp.sparse.eye(2,format='coo'),format='coo')
71  Hamiltonian += -0.5*sp.sparse.kron(sp.sparse.kron(lhs_1,sigmaz,format='coo'),rhs_1,format='coo')
72 
73 
74  return Hamiltonian.tocsr()
75 
76 
77 
78 
79 
80 
81 class Test_VQE:
82 
83  @staticmethod
85  try:
87  qgd_Variational_Quantum_Eigensolver_Base as Variational_Quantum_Eigensolver_Base,
88  )
89  return Variational_Quantum_Eigensolver_Base
90  except Exception as exc:
91  pytest.skip(f"VQE wrapper not available: {exc}")
92 
93  @staticmethod
95  return {
96  "agent_lifetime": 500,
97  "optimization_tolerance": -7.1,
98  "max_inner_iterations": 10,
99  "max_iterations": 50,
100  "learning_rate": 2e-1,
101  "agent_num": 64,
102  "agent_exploration_rate": 0.3,
103  "max_inner_iterations_adam": 50000,
104  }
105 
106  @staticmethod
108  return {
109  "max_inner_iterations": 4,
110  "max_iterations": 1,
111  "convergence_length": 2,
112  }
113 
114  @staticmethod
116  return [
117  {
118  "channel": "local_depolarizing",
119  "target": 0,
120  "after_gate_index": 0,
121  "error_rate": 0.1,
122  },
123  {
124  "channel": "amplitude_damping",
125  "target": 1,
126  "after_gate_index": 2,
127  "gamma": 0.05,
128  },
129  {
130  "channel": "phase_damping",
131  "target": 0,
132  "after_gate_index": 4,
133  "lambda": 0.07,
134  },
135  ]
136 
137  @staticmethod
139  return (
140  {
141  "case_name": "required_local_noise_4q_local_depolarizing_positive",
142  "qbit_num": 4,
143  "requested_noise_channel": "local_depolarizing",
144  "expected_target": 0,
145  "expected_after_gate_index": 0,
146  "expected_value": 0.1,
147  "density_noise": [
148  {
149  "channel": "local_depolarizing",
150  "target": 0,
151  "after_gate_index": 0,
152  "error_rate": 0.1,
153  }
154  ],
155  },
156  {
157  "case_name": "required_local_noise_4q_amplitude_damping_positive",
158  "qbit_num": 4,
159  "requested_noise_channel": "amplitude_damping",
160  "expected_target": 1,
161  "expected_after_gate_index": 2,
162  "expected_value": 0.05,
163  "density_noise": [
164  {
165  "channel": "amplitude_damping",
166  "target": 1,
167  "after_gate_index": 2,
168  "gamma": 0.05,
169  }
170  ],
171  },
172  {
173  "case_name": "required_local_noise_4q_phase_damping_positive",
174  "qbit_num": 4,
175  "requested_noise_channel": "phase_damping",
176  "expected_target": 0,
177  "expected_after_gate_index": 4,
178  "expected_value": 0.07,
179  "density_noise": [
180  {
181  "channel": "phase_damping",
182  "target": 0,
183  "after_gate_index": 4,
184  "lambda": 0.07,
185  }
186  ],
187  },
188  )
189 
190  def _build_identity_vqe(self, qbit_num=2, backend=None, Hamiltonian=None):
191  if Hamiltonian is None:
192  Hamiltonian = sp.sparse.eye(2**qbit_num, format="csr")
193  VQE_cls = self._get_vqe_class()
194 
195  if backend is None:
196  vqe = VQE_cls(Hamiltonian, qbit_num, self._get_identity_config())
197  else:
198  vqe = VQE_cls(
199  Hamiltonian,
200  qbit_num,
201  self._get_identity_config(),
202  backend=backend,
203  )
204 
205  vqe.set_Ansatz("HEA")
206  vqe.Generate_Circuit(1, 1)
207  return vqe
208 
209  def _build_density_backend_vqe(self, qbit_num, optimizer=None, density_noise=None):
210  topology = [(idx, idx + 1) for idx in range(qbit_num - 1)]
211  Hamiltonian = generate_hamiltonian(topology, qbit_num)
212  VQE_cls = self._get_vqe_class()
213  if density_noise is None:
214  density_noise = self._get_density_backend_noise()
215  vqe = VQE_cls(
216  Hamiltonian,
217  qbit_num,
219  backend="density_matrix",
220  density_noise=density_noise,
221  )
222  if optimizer is not None:
223  vqe.set_Optimizer(optimizer)
224  vqe.set_Ansatz("HEA")
225  vqe.Generate_Circuit(1, 1)
226  return vqe, Hamiltonian
227 
229  self, qbit_num, *, omit_backend=False
230  ):
231  topology = [(idx, idx + 1) for idx in range(qbit_num - 1)]
232  Hamiltonian = generate_hamiltonian(topology, qbit_num)
233  VQE_cls = self._get_vqe_class()
234  kwargs = {"density_noise": self._get_density_backend_noise()}
235  if not omit_backend:
236  kwargs["backend"] = "state_vector"
237  vqe = VQE_cls(
238  Hamiltonian,
239  qbit_num,
241  **kwargs,
242  )
243  vqe.set_Ansatz("HEA")
244  vqe.Generate_Circuit(1, 1)
245  return vqe, Hamiltonian
246 
247  @staticmethod
248  def _insert_reference_noise(base_circuit, density_noise):
249  pytest.importorskip("qiskit")
250  pytest.importorskip("qiskit_aer")
251 
252  from qiskit import QuantumCircuit
253  from qiskit_aer.noise import (
254  amplitude_damping_error,
255  depolarizing_error,
256  phase_damping_error,
257  )
258 
259  noisy_circuit = QuantumCircuit(base_circuit.num_qubits)
260  noise_by_gate = {}
261  for noise_spec in density_noise:
262  noise_by_gate.setdefault(noise_spec["after_gate_index"], []).append(
263  noise_spec
264  )
265 
266  for gate_index, instruction in enumerate(base_circuit.data):
267  qargs = [
268  noisy_circuit.qubits[base_circuit.find_bit(qubit).index]
269  for qubit in instruction.qubits
270  ]
271  cargs = [
272  noisy_circuit.clbits[base_circuit.find_bit(clbit).index]
273  for clbit in instruction.clbits
274  ]
275  noisy_circuit.append(instruction.operation, qargs, cargs)
276 
277  for noise_spec in noise_by_gate.get(gate_index, []):
278  target = noise_spec["target"]
279  channel = noise_spec["channel"]
280  if channel == "local_depolarizing":
281  noisy_circuit.append(
282  depolarizing_error(noise_spec["error_rate"], 1),
283  [noisy_circuit.qubits[target]],
284  )
285  elif channel == "amplitude_damping":
286  noisy_circuit.append(
287  amplitude_damping_error(noise_spec["gamma"]),
288  [noisy_circuit.qubits[target]],
289  )
290  elif channel == "phase_damping":
291  noisy_circuit.append(
292  phase_damping_error(noise_spec["lambda"]),
293  [noisy_circuit.qubits[target]],
294  )
295  else:
296  raise ValueError(
297  f"Unsupported density-backend channel: {channel}"
298  )
299 
300  noisy_circuit.save_density_matrix()
301  return noisy_circuit
302 
303  @staticmethod
304  def _density_energy(hamiltonian, density_matrix):
305  energy = np.trace(hamiltonian.dot(density_matrix))
306  return float(np.real(energy)), float(np.imag(energy))
307 
308  def _get_density_backend_aer_reference(self, vqe, Hamiltonian):
309  pytest.importorskip("qiskit_aer")
310 
311  from qiskit_aer import AerSimulator
312 
313  noisy_qiskit_circuit = self._insert_reference_noise(
314  vqe.get_Qiskit_Circuit(),
316  )
317  simulator = AerSimulator(method="density_matrix")
318  result = simulator.run(noisy_qiskit_circuit, shots=1).result()
319  aer_rho = np.asarray(result.data()["density_matrix"])
320  return self._density_energy(Hamiltonian, aer_rho)
321 
322  @staticmethod
324  pytest.importorskip("qiskit")
325 
326  planner_gate_kind, planner_noise_kind = _planner_operation_kind_tags()
327 
328  base_circuit = vqe.get_Qiskit_Circuit()
329  noise_by_gate = {}
330  for noise_spec in vqe.density_noise:
331  noise_by_gate.setdefault(noise_spec["after_gate_index"], []).append(noise_spec)
332 
333  expected = []
334  param_start = 0
335  for gate_index, instruction in enumerate(base_circuit.data):
336  qubit_indices = [
337  base_circuit.find_bit(qubit).index for qubit in instruction.qubits
338  ]
339  gate_name = instruction.operation.name
340 
341  if gate_name == "u":
342  expected.append(
343  {
344  "kind": planner_gate_kind,
345  "name": "U3",
346  "is_unitary": True,
347  "source_gate_index": gate_index,
348  "target_qbit": qubit_indices[0],
349  "control_qbit": None,
350  "param_count": 3,
351  "param_start": param_start,
352  "fixed_value": None,
353  }
354  )
355  param_start += 3
356  elif gate_name in {"cx", "cnot"}:
357  expected.append(
358  {
359  "kind": planner_gate_kind,
360  "name": "CNOT",
361  "is_unitary": True,
362  "source_gate_index": gate_index,
363  "target_qbit": qubit_indices[1],
364  "control_qbit": qubit_indices[0],
365  "param_count": 0,
366  "param_start": param_start,
367  "fixed_value": None,
368  }
369  )
370  else:
371  raise ValueError(
372  f"Unsupported gate in expected bridge: {gate_name}"
373  )
374 
375  for noise_spec in noise_by_gate.get(gate_index, []):
376  expected.append(
377  {
378  "kind": planner_noise_kind,
379  "name": noise_spec["channel"],
380  "is_unitary": False,
381  "source_gate_index": gate_index,
382  "target_qbit": noise_spec["target"],
383  "control_qbit": None,
384  "param_count": 0,
385  "param_start": param_start,
386  "fixed_value": noise_spec["value"],
387  }
388  )
389 
390  return expected
391 
393  qbit_num = 2
394  Hamiltonian = sp.sparse.eye(2**qbit_num, format="csr")
395  VQE_cls = self._get_vqe_class()
396 
397  legacy_vqe = VQE_cls(Hamiltonian, qbit_num, self._get_identity_config())
398  state_vector_vqe = VQE_cls(
399  Hamiltonian,
400  qbit_num,
401  self._get_identity_config(),
402  backend="state_vector",
403  )
404  density_matrix_vqe = VQE_cls(
405  Hamiltonian,
406  qbit_num,
407  self._get_identity_config(),
408  backend="density_matrix",
409  )
410 
411  assert legacy_vqe.backend == "state_vector"
412  assert state_vector_vqe.backend == "state_vector"
413  assert density_matrix_vqe.backend == "density_matrix"
414 
416  qbit_num = 2
417  Hamiltonian = sp.sparse.eye(2**qbit_num, format="csr")
418  VQE_cls = self._get_vqe_class()
419 
420  with pytest.raises(ValueError, match="Unsupported backend"):
421  VQE_cls(
422  Hamiltonian,
423  qbit_num,
424  self._get_identity_config(),
425  backend="invalid_backend",
426  )
427 
429  qbit_num = 4
430  Hamiltonian = sp.sparse.eye(2**qbit_num, format="csr")
431  VQE_cls = self._get_vqe_class()
432 
433  vqe = VQE_cls(
434  Hamiltonian,
435  qbit_num,
437  backend="density_matrix",
438  density_noise=self._get_density_backend_noise(),
439  )
440 
441  assert vqe.backend == "density_matrix"
442  assert vqe.density_noise == [
443  {
444  "channel": "local_depolarizing",
445  "target": 0,
446  "after_gate_index": 0,
447  "value": 0.1,
448  },
449  {
450  "channel": "amplitude_damping",
451  "target": 1,
452  "after_gate_index": 2,
453  "value": 0.05,
454  },
455  {
456  "channel": "phase_damping",
457  "target": 0,
458  "after_gate_index": 4,
459  "value": 0.07,
460  },
461  ]
462 
463  @pytest.mark.parametrize("omit_backend", [False, True])
465  qbit_num = 4
467  qbit_num, omit_backend=omit_backend
468  )
469 
470  parameters = np.linspace(
471  0.05,
472  0.05 * vqe.get_Parameter_Num(),
473  vqe.get_Parameter_Num(),
474  dtype=np.float64,
475  )
476 
477  with pytest.raises(
478  Exception,
479  match="state_vector backend does not support density_matrix-only noise configuration",
480  ):
481  vqe.Optimization_Problem(parameters)
482 
484  qbit_num = 4
485  topology = [(idx, idx + 1) for idx in range(qbit_num - 1)]
486  Hamiltonian = generate_hamiltonian(topology, qbit_num)
487  VQE_cls = self._get_vqe_class()
488  vqe = VQE_cls(
489  Hamiltonian,
490  qbit_num,
492  backend="density_matrix",
493  density_noise=self._get_density_backend_noise(),
494  )
495  vqe.set_Ansatz("HEA_ZYZ")
496  vqe.Generate_Circuit(1, 1)
497 
498  parameters = np.linspace(
499  0.05,
500  0.05 * vqe.get_Parameter_Num(),
501  vqe.get_Parameter_Num(),
502  dtype=np.float64,
503  )
504 
505  with pytest.raises(Exception, match="only the HEA ansatz"):
506  vqe.Optimization_Problem(parameters)
507 
509  qbit_num = 4
510  topology = [(idx, idx + 1) for idx in range(qbit_num - 1)]
511  Hamiltonian = generate_hamiltonian(topology, qbit_num)
512  VQE_cls = self._get_vqe_class()
513  vqe = VQE_cls(
514  Hamiltonian,
515  qbit_num,
517  backend="density_matrix",
518  density_noise=self._get_density_backend_noise(),
519  )
520 
521  with pytest.raises(Exception, match="requires a generated HEA circuit"):
522  vqe.Optimization_Problem(np.array([], dtype=np.float64))
523 
525  qbit_num = 4
526  topology = [(idx, idx + 1) for idx in range(qbit_num - 1)]
527  Hamiltonian = generate_hamiltonian(topology, qbit_num)
528  VQE_cls = self._get_vqe_class()
529  vqe = VQE_cls(
530  Hamiltonian,
531  qbit_num,
533  backend="density_matrix",
534  density_noise=[
535  {
536  "channel": "local_depolarizing",
537  "target": 0,
538  "after_gate_index": 999,
539  "error_rate": 0.1,
540  }
541  ],
542  )
543  vqe.set_Ansatz("HEA")
544  vqe.Generate_Circuit(1, 1)
545 
546  parameters = np.linspace(
547  0.05,
548  0.05 * vqe.get_Parameter_Num(),
549  vqe.get_Parameter_Num(),
550  dtype=np.float64,
551  )
552 
553  with pytest.raises(
554  Exception, match="after_gate_index exceeds generated gate count"
555  ):
556  vqe.Optimization_Problem(parameters)
557 
559  from squander.gates.qgd_Circuit import qgd_Circuit
560 
561  qbit_num = 2
562  topology = [(idx, idx + 1) for idx in range(qbit_num - 1)]
563  Hamiltonian = generate_hamiltonian(topology, qbit_num)
564  VQE_cls = self._get_vqe_class()
565  vqe = VQE_cls(
566  Hamiltonian,
567  qbit_num,
569  backend="density_matrix",
570  )
571  custom_circuit = qgd_Circuit(qbit_num)
572  custom_circuit.add_H(0)
573  custom_circuit.add_CNOT(1, 0)
574  vqe.set_Gate_Structure(custom_circuit)
575 
576  with pytest.raises(
577  Exception,
578  match="unsupported circuit source in density backend path: custom_gate_structure",
579  ):
580  vqe.describe_density_bridge()
581 
583  qbit_num = 1
584  Hamiltonian = generate_hamiltonian([], qbit_num)
585  VQE_cls = self._get_vqe_class()
586 
587  with pytest.raises(ValueError, match="Unsupported density-noise channel"):
588  VQE_cls(
589  Hamiltonian,
590  qbit_num,
592  backend="density_matrix",
593  density_noise=[
594  {
595  "channel": "readout_noise",
596  "target": 0,
597  "after_gate_index": 0,
598  "value": 0.1,
599  }
600  ],
601  )
602 
605  _normalize_density_noise_spec,
606  )
607 
608  normalized = _normalize_density_noise_spec(
609  [
610  {
611  "channel": "depolarizing",
612  "target": 0,
613  "after_gate_index": 0,
614  "error_rate": 0.1,
615  },
616  {
617  "channel": "dephasing",
618  "target": 1,
619  "after_gate_index": 2,
620  "lambda": 0.05,
621  },
622  ]
623  )
624 
625  assert [item["channel"] for item in normalized] == [
626  "local_depolarizing",
627  "phase_damping",
628  ]
629  assert [item["target"] for item in normalized] == [0, 1]
630  assert [item["after_gate_index"] for item in normalized] == [0, 2]
631  assert [item["value"] for item in normalized] == pytest.approx([0.1, 0.05])
632 
633  @pytest.mark.parametrize(
634  "channel",
635  [
636  "readout_noise",
637  "correlated_multi_qubit_noise",
638  "calibration_aware_noise",
639  "non_markovian_noise",
640  ],
641  )
643  qbit_num = 1
644  Hamiltonian = generate_hamiltonian([], qbit_num)
645  VQE_cls = self._get_vqe_class()
646 
647  with pytest.raises(
648  ValueError,
649  match="Unsupported density-noise channel '{}'".format(channel),
650  ):
651  VQE_cls(
652  Hamiltonian,
653  qbit_num,
655  backend="density_matrix",
656  density_noise=[
657  {
658  "channel": channel,
659  "target": 0,
660  "after_gate_index": 0,
661  "value": 0.1,
662  }
663  ],
664  )
665 
667  qbit_num = 2
668  topology = [(idx, idx + 1) for idx in range(qbit_num - 1)]
669  Hamiltonian = generate_hamiltonian(topology, qbit_num)
670  VQE_cls = self._get_vqe_class()
671 
672  with pytest.raises(Exception, match="after_gate_index must be non-negative"):
673  VQE_cls(
674  Hamiltonian,
675  qbit_num,
677  backend="density_matrix",
678  density_noise=[
679  {
680  "channel": "local_depolarizing",
681  "target": 0,
682  "after_gate_index": -1,
683  "error_rate": 0.1,
684  }
685  ],
686  )
687 
689  qbit_num = 2
690  topology = [(idx, idx + 1) for idx in range(qbit_num - 1)]
691  Hamiltonian = generate_hamiltonian(topology, qbit_num)
692  VQE_cls = self._get_vqe_class()
693 
694  with pytest.raises(Exception, match="target_qbit out of range"):
695  VQE_cls(
696  Hamiltonian,
697  qbit_num,
699  backend="density_matrix",
700  density_noise=[
701  {
702  "channel": "phase_damping",
703  "target": 10,
704  "after_gate_index": 0,
705  "lambda": 0.1,
706  }
707  ],
708  )
709 
711  qbit_num = 2
712  topology = [(idx, idx + 1) for idx in range(qbit_num - 1)]
713  Hamiltonian = generate_hamiltonian(topology, qbit_num)
714  VQE_cls = self._get_vqe_class()
715 
716  with pytest.raises(Exception, match="noise values must be in \\[0, 1\\]"):
717  VQE_cls(
718  Hamiltonian,
719  qbit_num,
721  backend="density_matrix",
722  density_noise=[
723  {
724  "channel": "amplitude_damping",
725  "target": 0,
726  "after_gate_index": 0,
727  "gamma": 1.5,
728  }
729  ],
730  )
731 
733  vqe, _ = self._build_density_backend_vqe(4)
734  parameters = np.linspace(
735  0.05,
736  0.05 * vqe.get_Parameter_Num(),
737  vqe.get_Parameter_Num(),
738  dtype=np.float64,
739  )
740 
741  with pytest.raises(Exception, match="does not support gradient-based optimization"):
742  vqe.Optimization_Problem_Grad(parameters)
743 
745  vqe = self._build_identity_vqe()
746 
747  with pytest.raises(Exception, match="Unsupported optimizer"):
748  vqe.set_Optimizer("NOT_A_REAL_OPTIMIZER")
749 
751  vqe = self._build_identity_vqe()
752 
753  with pytest.raises(Exception, match="Unsupported ansatz"):
754  vqe.set_Ansatz("NOT_A_REAL_ANSATZ")
755 
757  qbit_num = 2
758  Hamiltonian = generate_hamiltonian([(0, 1)], qbit_num)
759  legacy_vqe = self._build_identity_vqe(qbit_num=qbit_num, Hamiltonian=Hamiltonian)
760  explicit_state_vector_vqe = self._build_identity_vqe(
761  qbit_num=qbit_num,
762  Hamiltonian=Hamiltonian,
763  backend="state_vector",
764  )
765 
766  assert legacy_vqe.backend == "state_vector"
767  assert explicit_state_vector_vqe.backend == "state_vector"
768  assert legacy_vqe.get_Parameter_Num() == explicit_state_vector_vqe.get_Parameter_Num()
769 
770  param_num = legacy_vqe.get_Parameter_Num()
771  assert param_num > 0
772 
773  parameters = np.linspace(0.05, 0.05 * param_num, param_num, dtype=np.float64)
774  legacy_energy = legacy_vqe.Optimization_Problem(parameters)
775  explicit_state_vector_energy = explicit_state_vector_vqe.Optimization_Problem(parameters)
776 
777  assert np.isclose(legacy_energy, explicit_state_vector_energy, atol=1e-12)
778 
779  @pytest.mark.parametrize("qbit_num", [4, 6, 8, 10])
781  density_vqe, Hamiltonian = self._build_density_backend_vqe(qbit_num)
782  VQE_cls = self._get_vqe_class()
783  state_vector_vqe = VQE_cls(
784  Hamiltonian,
785  qbit_num,
787  backend="state_vector",
788  )
789  state_vector_vqe.set_Ansatz("HEA")
790  state_vector_vqe.Generate_Circuit(1, 1)
791 
792  param_num = density_vqe.get_Parameter_Num()
793  parameters = np.linspace(0.05, 0.05 * param_num, param_num, dtype=np.float64)
794 
795  density_energy = density_vqe.Optimization_Problem(parameters)
796  state_vector_energy = state_vector_vqe.Optimization_Problem(parameters)
797 
798  assert density_vqe.backend == "density_matrix"
799  assert np.isfinite(density_energy)
800  assert np.isfinite(state_vector_energy)
801  assert not np.isclose(density_energy, state_vector_energy, atol=1e-8)
802 
803  @pytest.mark.parametrize("qbit_num", [4, 6])
805  self, qbit_num
806  ):
807  pytest.importorskip("qiskit")
808 
809  density_vqe, _ = self._build_density_backend_vqe(qbit_num)
810  parameters = np.linspace(
811  0.05,
812  0.05 * density_vqe.get_Parameter_Num(),
813  density_vqe.get_Parameter_Num(),
814  dtype=np.float64,
815  )
816  density_vqe.set_Optimized_Parameters(parameters)
817  bridge = density_vqe.describe_density_bridge()
818  expected_operations = self._expected_bridge_operations(density_vqe)
819 
820  assert bridge["backend"] == "density_matrix"
821  assert bridge["source_type"] == "generated_hea"
822  assert bridge["qbit_num"] == qbit_num
823  assert bridge["parameter_count"] == density_vqe.get_Parameter_Num()
824  assert bridge["gate_count"] == density_vqe.get_Qiskit_Circuit().size()
825  assert bridge["noise_count"] == len(density_vqe.density_noise)
826  assert bridge["operation_count"] == len(expected_operations)
827  assert len(bridge["operations"]) == len(expected_operations)
828 
829  for actual, expected in zip(bridge["operations"], expected_operations):
830  assert actual["kind"] == expected["kind"]
831  assert actual["name"] == expected["name"]
832  assert actual["is_unitary"] == expected["is_unitary"]
833  assert actual["source_gate_index"] == expected["source_gate_index"]
834  assert actual["target_qbit"] == expected["target_qbit"]
835  assert actual["control_qbit"] == expected["control_qbit"]
836  assert actual["param_count"] == expected["param_count"]
837  assert actual["param_start"] == expected["param_start"]
838  if expected["fixed_value"] is None:
839  assert actual["fixed_value"] is None
840  else:
841  assert actual["fixed_value"] == pytest.approx(expected["fixed_value"])
842 
844  pytest.importorskip("qiskit")
845  pytest.importorskip("qiskit_aer")
846 
847  from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation import (
848  run_fixed_parameter_case,
849  )
850 
851  artifact = run_fixed_parameter_case(4)
852 
853  assert artifact["status"] == "completed"
854  assert artifact["bridge_source_type"] == "generated_hea"
855  assert artifact["bridge_operation_count"] == len(artifact["bridge_operations"])
856  assert artifact["bridge_gate_count"] + artifact["bridge_noise_count"] == artifact["bridge_operation_count"]
857  assert artifact["bridge_noise_count"] == len(artifact["density_noise"])
858  assert artifact["bridge_parameter_count"] > 0
859  gate_kind, noise_kind = _planner_operation_kind_tags()
860  assert artifact["bridge_operations"][0]["kind"] == gate_kind
861  assert any(
862  op["kind"] == noise_kind
863  for op in artifact["bridge_operations"]
864  )
865 
867  for case in self._get_required_local_noise_cases():
868  density_vqe, _ = self._build_density_backend_vqe(
869  case["qbit_num"],
870  density_noise=case["density_noise"],
871  )
872  parameters = np.linspace(
873  0.05,
874  0.05 * density_vqe.get_Parameter_Num(),
875  density_vqe.get_Parameter_Num(),
876  dtype=np.float64,
877  )
878 
879  density_vqe.set_Optimized_Parameters(parameters)
880  density_energy = density_vqe.Optimization_Problem(parameters)
881  bridge = density_vqe.describe_density_bridge()
882  _, noise_kind = _planner_operation_kind_tags()
883  noise_ops = [
884  op
885  for op in bridge["operations"]
886  if op["kind"] == noise_kind
887  ]
888 
889  assert density_vqe.backend == "density_matrix"
890  assert np.isfinite(density_energy)
891  assert bridge["source_type"] == "generated_hea"
892  assert bridge["noise_count"] == 1
893  assert len(noise_ops) == 1
894  assert [op["name"] for op in noise_ops] == [case["requested_noise_channel"]]
895  assert all(op["name"] != "depolarizing" for op in noise_ops)
896  assert [op["target_qbit"] for op in noise_ops] == [case["expected_target"]]
897  assert [op["source_gate_index"] for op in noise_ops] == [
898  case["expected_after_gate_index"]
899  ]
900  assert [op["fixed_value"] for op in noise_ops] == pytest.approx(
901  [case["expected_value"]]
902  )
903 
905  pytest.importorskip("qiskit")
906  pytest.importorskip("qiskit_aer")
907 
908  from benchmarks.density_matrix.noise_support.required_local_noise_validation import (
909  REQUIRED_LOCAL_NOISE_CASES,
910  REQUIRED_LOCAL_NOISE_MODELS,
911  build_artifact_bundle,
912  run_validation,
913  )
914 
915  results = run_validation(verbose=False)
916  bundle = build_artifact_bundle(results)
917 
918  assert bundle["status"] == "pass"
919  assert bundle["backend"] == "density_matrix"
920  assert bundle["summary"]["total_cases"] == len(REQUIRED_LOCAL_NOISE_CASES)
921  assert bundle["summary"]["passed_cases"] == len(REQUIRED_LOCAL_NOISE_CASES)
922  assert bundle["summary"]["pass_rate"] == 1.0
923  assert bundle["summary"]["required_cases"] == len(REQUIRED_LOCAL_NOISE_CASES)
924  assert bundle["summary"]["required_passed_cases"] == len(REQUIRED_LOCAL_NOISE_CASES)
925  assert bundle["summary"]["required_pass_rate"] == 1.0
926  assert bundle["summary"]["optional_cases"] == 0
927  assert bundle["summary"]["optional_cases_count_toward_mandatory_baseline"] == 0
928  assert bundle["summary"]["mandatory_baseline_completed"]
929  assert bundle["summary"]["whole_register_substitute_failures"] == 0
930  assert set(bundle["requirements"]["required_local_noise_models"]) == set(
931  REQUIRED_LOCAL_NOISE_MODELS
932  )
933  assert "required" in bundle["requirements"]["support_tier_vocabulary"]
934  assert {case["requested_noise_channel"] for case in bundle["cases"]} == set(
935  REQUIRED_LOCAL_NOISE_MODELS
936  )
937  assert all(case["status"] == "pass" for case in bundle["cases"])
938  assert all(case["positive_slice_pass"] for case in bundle["cases"])
939  assert all(case["support_tier"] == "required" for case in bundle["cases"])
940  assert all(case["case_purpose"] == "mandatory_baseline" for case in bundle["cases"])
941  assert all(case["counts_toward_mandatory_baseline"] for case in bundle["cases"])
942  assert all(
943  case["bridge_noise_sequence"] == [case["requested_noise_channel"]]
944  for case in bundle["cases"]
945  )
946 
948  pytest.importorskip("qiskit")
949  pytest.importorskip("qiskit_aer")
950 
951  from benchmarks.density_matrix.bridge_scope.bridge_validation import (
952  MANDATORY_BRIDGE_MICROCASES,
953  validate_bridge_microcase,
954  )
955 
956  case = next(
957  case
958  for case in MANDATORY_BRIDGE_MICROCASES
959  if case["case_name"] == "bridge_3q_mixed_local_noise_sequence"
960  )
961  result = validate_bridge_microcase(case, verbose=False)
962 
963  assert result["status"] == "pass"
964  assert result["source_pass"]
965  assert result["gate_pass"]
966  assert result["noise_pass"]
967  assert result["operation_match_pass"]
968  assert result["execution_ready"]
969  assert result["bridge_source_type"] == "generated_hea"
970  assert result["bridge_noise_count"] == 3
971  gate_kind, _ = _planner_operation_kind_tags()
972  assert any(
973  op["name"] == "CNOT" and op["kind"] == gate_kind
974  for op in result["bridge_operations"]
975  )
976 
978  pytest.importorskip("qiskit")
979  pytest.importorskip("qiskit_aer")
980 
981  from benchmarks.density_matrix.bridge_scope.bridge_validation import (
982  MANDATORY_BRIDGE_MICROCASES,
983  build_artifact_bundle,
984  run_validation,
985  )
986 
987  results = run_validation(verbose=False)
988  bundle = build_artifact_bundle(results)
989 
990  assert bundle["status"] == "pass"
991  assert bundle["backend"] == "density_matrix"
992  assert bundle["requirements"]["source_type"] == "generated_hea"
993  assert bundle["summary"]["total_cases"] == len(MANDATORY_BRIDGE_MICROCASES)
994  assert bundle["summary"]["passed_cases"] == len(MANDATORY_BRIDGE_MICROCASES)
995  assert bundle["summary"]["pass_rate"] == 1.0
996  assert {case["qbit_num"] for case in bundle["cases"]} == {1, 2, 3}
997  assert all(case["status"] == "pass" for case in bundle["cases"])
998  assert all("bridge_operations" in case for case in bundle["cases"])
999 
1001  from benchmarks.density_matrix.bridge_scope.unsupported_bridge_validation import (
1002  UNSUPPORTED_CASE_BUILDERS,
1003  build_artifact_bundle,
1004  run_validation,
1005  )
1006 
1007  results = run_validation(verbose=False)
1008  bundle = build_artifact_bundle(results)
1009 
1010  assert bundle["status"] == "pass"
1011  assert bundle["backend"] == "density_matrix"
1012  assert bundle["summary"]["total_cases"] == len(UNSUPPORTED_CASE_BUILDERS)
1013  assert bundle["summary"]["unsupported_cases"] == len(
1014  UNSUPPORTED_CASE_BUILDERS
1015  )
1016  assert bundle["summary"]["error_match_count"] == len(
1017  UNSUPPORTED_CASE_BUILDERS
1018  )
1019  assert {case["unsupported_category"] for case in bundle["cases"]} == {
1020  "circuit_source",
1021  "lowering_path",
1022  "noise_insertion",
1023  "noise_type",
1024  }
1025  assert all(case["status"] == "unsupported" for case in bundle["cases"])
1026  assert all(case["error_match_pass"] for case in bundle["cases"])
1027 
1029  pytest.importorskip("qiskit")
1030  pytest.importorskip("qiskit_aer")
1031 
1032  from benchmarks.density_matrix.noise_support.unsupported_noise_validation import (
1033  UNSUPPORTED_NOISE_BOUNDARY_CASES,
1034  build_artifact_bundle,
1035  run_validation,
1036  )
1037 
1038  results = run_validation(verbose=False)
1039  bundle = build_artifact_bundle(results)
1040 
1041  assert bundle["status"] == "pass"
1042  assert bundle["backend"] == "density_matrix"
1043  assert bundle["summary"]["total_cases"] == len(UNSUPPORTED_NOISE_BOUNDARY_CASES)
1044  assert bundle["summary"]["unsupported_status_cases"] == len(
1045  UNSUPPORTED_NOISE_BOUNDARY_CASES
1046  )
1047  assert bundle["summary"]["error_match_count"] == len(
1048  UNSUPPORTED_NOISE_BOUNDARY_CASES
1049  )
1050  assert bundle["summary"]["pre_execution_failure_count"] == len(
1051  UNSUPPORTED_NOISE_BOUNDARY_CASES
1052  )
1053  assert bundle["summary"]["boundary_passed_cases"] == len(
1054  UNSUPPORTED_NOISE_BOUNDARY_CASES
1055  )
1056  assert bundle["summary"]["deferred_cases"] == 4
1057  assert bundle["summary"]["unsupported_cases"] == 4
1058  assert bundle["summary"]["support_tiers_present"] == [
1059  "deferred",
1060  "unsupported",
1061  ]
1062  assert bundle["summary"]["silent_substitution_failures"] == 0
1063  assert bundle["summary"]["silent_fallback_failures"] == 0
1064  assert set(bundle["summary"]["categories_present"]) == {
1065  "noise_insertion",
1066  "noise_target",
1067  "noise_type",
1068  "noise_value",
1069  }
1070  assert set(bundle["summary"]["boundary_classes_present"]) == {
1071  "configuration",
1072  "model_family",
1073  "schedule_element",
1074  }
1075  assert set(bundle["summary"]["failure_stages_present"]) == {
1076  "cxx_noise_spec_validation",
1077  "density_anchor_preflight",
1078  "python_normalization",
1079  }
1080  assert {
1081  case["first_unsupported_condition"] for case in bundle["cases"]
1082  } >= {
1083  "readout_noise",
1084  "correlated_multi_qubit_noise",
1085  "calibration_aware_noise",
1086  "non_markovian_noise",
1087  "after_gate_index_negative",
1088  "after_gate_index_exceeds_gate_count",
1089  "target_qbit_out_of_range",
1090  "noise_value_out_of_range",
1091  }
1092  assert all(case["status"] == "unsupported" for case in bundle["cases"])
1093  assert all(case["error_match_pass"] for case in bundle["cases"])
1094  assert all(case["unsupported_boundary_pass"] for case in bundle["cases"])
1095  assert all(
1096  not case["counts_toward_mandatory_baseline"] for case in bundle["cases"]
1097  )
1098 
1100  pytest.importorskip("qiskit")
1101  pytest.importorskip("qiskit_aer")
1102 
1103  from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation import (
1104  build_exact_regime_parameter_sets,
1105  run_exact_regime_workflow_case,
1106  )
1107 
1108  density_vqe, _ = self._build_density_backend_vqe(4)
1109  parameter_set = build_exact_regime_parameter_sets(
1110  density_vqe.get_Parameter_Num(),
1111  count=1,
1112  )[0]
1114  4,
1115  parameter_set["parameter_set_id"],
1116  parameter_set["parameter_vector"],
1117  )
1118 
1119  assert result["status"] == "pass"
1120  assert result["bridge_source_type"] == "generated_hea"
1121  assert result["source_pass"]
1122  assert result["gate_pass"]
1123  assert result["noise_pass"]
1124  assert result["execution_ready"]
1125  assert result["bridge_supported_pass"]
1126  assert result["bridge_gate_count"] > 0
1127  assert result["bridge_noise_count"] == len(result["density_noise"])
1128  assert "U3" in result["bridge_gate_sequence"]
1129  assert "CNOT" in result["bridge_gate_sequence"]
1130  assert set(result["bridge_noise_sequence"]) == {
1131  "local_depolarizing",
1132  "amplitude_damping",
1133  "phase_damping",
1134  }
1135  assert result["support_tier"] == "required"
1136  assert result["case_purpose"] == "mandatory_baseline"
1137  assert result["counts_toward_mandatory_baseline"] is True
1138 
1140  pytest.importorskip("qiskit")
1141  pytest.importorskip("qiskit_aer")
1142 
1143  from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation import (
1144  build_exact_regime_parameter_sets,
1145  build_exact_regime_workflow_bundle,
1146  run_optimization_trace,
1147  run_exact_regime_workflow_case,
1148  )
1149 
1150  density_vqe, _ = self._build_density_backend_vqe(4)
1151  parameter_set = build_exact_regime_parameter_sets(
1152  density_vqe.get_Parameter_Num(),
1153  count=1,
1154  )[0]
1156  4,
1157  parameter_set["parameter_set_id"],
1158  parameter_set["parameter_vector"],
1159  )
1160  trace_result = run_optimization_trace()
1162  [result],
1163  qubit_sizes=(4,),
1164  parameter_set_count=1,
1165  trace_result=trace_result,
1166  )
1167 
1168  assert result["status"] == "pass"
1169  assert result["workflow_completed"]
1170  assert result["energy_pass"]
1171  assert result["density_valid_pass"]
1172  assert result["trace_pass"]
1173  assert result["observable_pass"]
1174  assert result["qbit_num"] == 4
1175  assert bundle["status"] == "pass"
1176  assert bundle["summary"]["total_cases"] == 1
1177  assert bundle["summary"]["passed_cases"] == 1
1178  assert bundle["summary"]["unsupported_cases"] == 0
1179  assert bundle["summary"]["unsupported_status_cases"] == 0
1180  assert bundle["summary"]["bridge_supported_cases"] == 1
1181  assert bundle["summary"]["documented_10q_anchor_present"] is False
1182  assert bundle["summary"]["supported_trace_completed"] is True
1183  assert bundle["summary"]["supported_trace_case_name"] == trace_result.get(
1184  "case_name", "optimization_trace_4q"
1185  )
1186  assert bundle["summary"]["required_cases"] == 1
1187  assert bundle["summary"]["required_passed_cases"] == 1
1188  assert bundle["summary"]["required_pass_rate"] == 1.0
1189  assert bundle["summary"]["mandatory_baseline_case_count"] == 1
1190  assert bundle["summary"]["mandatory_baseline_passed_cases"] == 1
1191  assert bundle["summary"]["mandatory_baseline_completed"] is True
1192  assert bundle["summary"]["support_tiers_present"] == ["required"]
1193  assert bundle["summary"]["optional_cases_count_toward_mandatory_baseline"] == 0
1194  assert bundle["thresholds"]["absolute_energy_error"] == 1e-8
1195 
1197  pytest.importorskip("qiskit")
1198  pytest.importorskip("qiskit_aer")
1199 
1200  from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation import (
1201  run_optimization_trace,
1202  )
1203 
1204  artifact = run_optimization_trace()
1205 
1206  assert artifact["status"] == "completed"
1207  assert artifact["bridge_source_type"] == "generated_hea"
1208  assert artifact["source_pass"]
1209  assert artifact["gate_pass"]
1210  assert artifact["noise_pass"]
1211  assert artifact["execution_ready"]
1212  assert artifact["bridge_supported_pass"]
1213  assert artifact["bridge_gate_count"] > 0
1214  assert artifact["bridge_noise_count"] == len(artifact["density_noise"])
1215  assert artifact["support_tier"] == "required"
1216  assert artifact["case_purpose"] == "mandatory_baseline"
1217  assert artifact["counts_toward_mandatory_baseline"] is False
1218  assert artifact["required_validation_trace"] is True
1219 
1221  pytest.importorskip("qiskit")
1222  pytest.importorskip("qiskit_aer")
1223 
1224  from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation import (
1225  run_optimization_trace,
1226  )
1227 
1228  artifact = run_optimization_trace()
1229 
1230  assert artifact["status"] == "completed"
1231  assert artifact["workflow_completed"] is True
1232  assert artifact["trace_kind"] == "bounded_optimization_trace"
1233  assert artifact["optimizer"] == "COSINE"
1234  assert artifact["parameter_count"] == len(artifact["initial_parameters"])
1235  assert artifact["total_trace_runtime_ms"] >= 0.0
1236  assert artifact["process_peak_rss_kb"] > 0
1237  assert artifact["energy_improvement"] == (
1238  artifact["initial_energy"] - artifact["final_energy"]
1239  )
1240  assert artifact["optimizer_config"]["max_iterations"] == 1
1241  assert artifact["support_tier"] == "required"
1242  assert artifact["case_purpose"] == "mandatory_baseline"
1243  assert artifact["counts_toward_mandatory_baseline"] is False
1244  assert artifact["required_validation_trace"] is True
1245 
1247  pytest.importorskip("qiskit")
1248  pytest.importorskip("qiskit_aer")
1249 
1250  from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation import write_json
1251  from benchmarks.density_matrix.noise_support.required_local_noise_workflow_validation import (
1252  TRACE_ARTIFACT_FILENAME,
1253  TRACE_CASE_NAME,
1254  WORKFLOW_BUNDLE_FILENAME,
1255  build_artifact_bundle,
1256  run_validation,
1257  write_artifact_bundle,
1258  )
1259 
1260  workflow_results, trace_result, bundle = run_validation(
1261  qubit_sizes=(4,),
1262  parameter_set_count=1,
1263  verbose=False,
1264  )
1265  bundle = build_artifact_bundle(
1266  workflow_results,
1267  trace_result,
1268  qubit_sizes=(4,),
1269  parameter_set_count=1,
1270  )
1272  tmp_path / WORKFLOW_BUNDLE_FILENAME,
1273  bundle,
1274  trace_result=trace_result,
1275  )
1276  write_json(tmp_path / TRACE_ARTIFACT_FILENAME, trace_result)
1277 
1278  assert bundle["status"] == "pass"
1279  assert bundle["suite_name"] == "required_local_noise_workflow"
1280  assert bundle["summary"]["required_cases"] == 1
1281  assert bundle["summary"]["required_passed_cases"] == 1
1282  assert bundle["summary"]["required_pass_rate"] == 1.0
1283  assert bundle["summary"]["unsupported_status_cases"] == 0
1284  assert bundle["summary"]["required_trace_case_name"] == TRACE_CASE_NAME
1285  assert bundle["summary"]["required_trace_present"] is True
1286  assert bundle["summary"]["required_trace_completed"] is True
1287  assert bundle["summary"]["required_trace_bridge_supported"] is True
1288  assert (
1289  bundle["summary"]["required_trace_counts_toward_mandatory_baseline"]
1290  is False
1291  )
1292  assert trace_result["case_name"] == TRACE_CASE_NAME
1293  assert trace_result["support_tier"] == "required"
1294  assert (tmp_path / WORKFLOW_BUNDLE_FILENAME).exists()
1295  assert (tmp_path / TRACE_ARTIFACT_FILENAME).exists()
1296 
1298  pytest.importorskip("qiskit")
1299  pytest.importorskip("qiskit_aer")
1300 
1301  from benchmarks.density_matrix.validation_evidence.workflow_baseline_validation import (
1302  run_validation,
1303  )
1304 
1305  exact_regime_workflow_bundle, bundle = run_validation(
1306  qubit_sizes=(4,),
1307  parameter_set_count=1,
1308  verbose=False,
1309  )
1310 
1311  assert exact_regime_workflow_bundle["status"] == "pass"
1312  assert bundle["status"] == "pass"
1313  assert bundle["suite_name"] == "workflow_baseline_validation"
1314  assert bundle["backend"] == "density_matrix"
1315  assert bundle["summary"]["total_cases"] == 1
1316  assert bundle["summary"]["passed_cases"] == 1
1317  assert bundle["summary"]["unsupported_cases"] == 0
1318  assert bundle["summary"]["required_cases"] == 1
1319  assert bundle["summary"]["required_passed_cases"] == 1
1320  assert bundle["summary"]["required_pass_rate"] == 1.0
1321  assert bundle["summary"]["stable_case_ids_present"] is True
1322  assert bundle["summary"]["stable_parameter_set_ids_present"] is True
1323  assert bundle["summary"]["workflow_baseline_completed"] is True
1324  assert bundle["summary"]["documented_10q_anchor_present"] is False
1325  assert bundle["required_artifacts"]["exact_regime_workflow_reference"]["status"] == "pass"
1326  assert len(bundle["cases"]) == 1
1327  assert bundle["cases"][0]["parameter_set_id"] == "set_00"
1328 
1330  pytest.importorskip("qiskit")
1331  pytest.importorskip("qiskit_aer")
1332 
1333  import copy
1334 
1335  from benchmarks.density_matrix.validation_evidence.workflow_baseline_validation import (
1336  build_artifact_bundle,
1337  run_validation,
1338  )
1339 
1340  exact_regime_workflow_bundle, bundle = run_validation(
1341  qubit_sizes=(4,),
1342  parameter_set_count=1,
1343  verbose=False,
1344  )
1345  broken_workflow_results = copy.deepcopy(bundle["cases"])
1346  omitted_case = broken_workflow_results.pop()
1347 
1348  broken_bundle = build_artifact_bundle(
1349  exact_regime_workflow_bundle,
1350  broken_workflow_results,
1351  qubit_sizes=(4,),
1352  parameter_set_count=1,
1353  )
1354 
1355  assert broken_bundle["status"] == "fail"
1356  assert broken_bundle["summary"]["stable_case_ids_present"] is False
1357  assert broken_bundle["summary"]["stable_parameter_set_ids_present"] is False
1358  assert broken_bundle["summary"]["workflow_baseline_completed"] is False
1359  assert (
1360  omitted_case["case_name"]
1361  in broken_bundle["summary"]["missing_mandatory_case_names"]
1362  )
1363 
1365  pytest.importorskip("qiskit")
1366  pytest.importorskip("qiskit_aer")
1367 
1368  from benchmarks.density_matrix.validation_evidence.trace_anchor_validation import (
1369  run_validation,
1370  )
1371 
1372  workflow_baseline_bundle, trace_result, bundle = run_validation(
1373  qubit_sizes=(10,),
1374  parameter_set_count=1,
1375  verbose=False,
1376  )
1377 
1378  assert workflow_baseline_bundle["status"] == "pass"
1379  assert trace_result["status"] == "completed"
1380  assert bundle["status"] == "pass"
1381  assert bundle["suite_name"] == "trace_anchor_validation"
1382  assert bundle["summary"]["workflow_baseline_completed"] is True
1383  assert bundle["summary"]["documented_10q_anchor_present"] is True
1384  assert bundle["summary"]["required_trace_case_name"] == "optimization_trace_4q"
1385  assert bundle["summary"]["required_trace_present"] is True
1386  assert bundle["summary"]["required_trace_completed"] is True
1387  assert bundle["summary"]["required_trace_bridge_supported"] is True
1388  assert bundle["summary"]["trace_and_anchor_gate_completed"] is True
1389  assert bundle["required_artifacts"]["workflow_baseline_reference"]["status"] == "pass"
1390  assert bundle["trace_artifact"]["case_name"] == "optimization_trace_4q"
1391 
1393  pytest.importorskip("qiskit")
1394  pytest.importorskip("qiskit_aer")
1395 
1396  import copy
1397 
1398  from benchmarks.density_matrix.validation_evidence.trace_anchor_validation import (
1399  build_artifact_bundle,
1400  run_validation,
1401  )
1402 
1403  workflow_baseline_bundle, trace_result, _ = run_validation(
1404  qubit_sizes=(10,),
1405  parameter_set_count=1,
1406  verbose=False,
1407  )
1408  broken_trace_result = copy.deepcopy(trace_result)
1409  broken_trace_result["required_validation_trace"] = False
1410 
1411  bundle = build_artifact_bundle(
1412  workflow_baseline_bundle,
1413  broken_trace_result,
1414  qubit_sizes=(10,),
1415  parameter_set_count=1,
1416  )
1417 
1418  assert bundle["status"] == "fail"
1419  assert bundle["summary"]["required_trace_present"] is False
1420  assert bundle["summary"]["trace_and_anchor_gate_completed"] is False
1421 
1423  pytest.importorskip("qiskit")
1424  pytest.importorskip("qiskit_aer")
1425 
1426  from benchmarks.density_matrix.validation_evidence.metric_completeness_validation import (
1427  run_validation,
1428  )
1429 
1430  _, _, _, bundle = run_validation(
1431  qubit_sizes=(10,),
1432  parameter_set_count=1,
1433  verbose=False,
1434  )
1435 
1436  assert bundle["status"] == "pass"
1437  assert bundle["suite_name"] == "metric_completeness_validation"
1438  assert bundle["summary"]["micro_cases_checked"] == 7
1439  assert bundle["summary"]["workflow_cases_checked"] == 1
1440  assert bundle["summary"]["trace_artifacts_checked"] == 1
1441  assert bundle["summary"]["micro_cases_missing_required_metrics"] == 0
1442  assert bundle["summary"]["workflow_cases_missing_required_metrics"] == 0
1443  assert bundle["summary"]["trace_artifacts_missing_required_metrics"] == 0
1444  assert bundle["summary"]["workflow_cases_with_stable_execution"] == 1
1445  assert bundle["summary"]["trace_execution_stability_pass"] is True
1446  assert bundle["summary"]["metric_completeness_gate_completed"] is True
1447  assert bundle["required_artifacts"]["local_correctness_reference"]["status"] == "pass"
1448  assert bundle["required_artifacts"]["workflow_baseline_reference"]["status"] == "pass"
1449  assert bundle["required_artifacts"]["trace_anchor_reference"]["status"] == "pass"
1450 
1452  pytest.importorskip("qiskit")
1453  pytest.importorskip("qiskit_aer")
1454 
1455  import copy
1456 
1457  from benchmarks.density_matrix.validation_evidence.metric_completeness_validation import (
1458  build_artifact_bundle,
1459  run_validation,
1460  )
1461 
1462  local_correctness_bundle, workflow_baseline_bundle, trace_anchor_bundle, _ = run_validation(
1463  qubit_sizes=(10,),
1464  parameter_set_count=1,
1465  verbose=False,
1466  )
1467  broken_workflow_baseline_bundle = copy.deepcopy(workflow_baseline_bundle)
1468  broken_case = broken_workflow_baseline_bundle["cases"][0]
1469  del broken_case["process_peak_rss_kb"]
1470 
1471  bundle = build_artifact_bundle(
1472  local_correctness_bundle,
1473  broken_workflow_baseline_bundle,
1474  trace_anchor_bundle,
1475  )
1476 
1477  assert bundle["status"] == "fail"
1478  assert bundle["summary"]["workflow_cases_missing_required_metrics"] == 1
1479  assert "process_peak_rss_kb" in bundle["summary"]["missing_workflow_metric_fields_by_case"][
1480  broken_case["case_name"]
1481  ]
1482  assert bundle["summary"]["metric_completeness_gate_completed"] is False
1483 
1485  pytest.importorskip("qiskit")
1486  pytest.importorskip("qiskit_aer")
1487 
1488  from benchmarks.density_matrix.validation_evidence.interpretation_validation import (
1489  run_validation,
1490  )
1491 
1492  metric_completeness_bundle, optional_bundle, unsupported_bundle, bundle = run_validation(
1493  qubit_sizes=(10,),
1494  parameter_set_count=1,
1495  verbose=False,
1496  )
1497 
1498  assert metric_completeness_bundle["status"] == "pass"
1499  assert optional_bundle["status"] == "pass"
1500  assert unsupported_bundle["status"] == "pass"
1501  assert bundle["status"] == "pass"
1502  assert bundle["suite_name"] == "validation_evidence_interpretation"
1503  assert bundle["summary"]["mandatory_artifacts_complete"] is True
1504  assert bundle["summary"]["optional_evidence_supplemental"] is True
1505  assert bundle["summary"]["unsupported_evidence_negative_only"] is True
1506  assert bundle["summary"]["main_validation_claim_completed"] is True
1507  assert bundle["summary"]["incomplete_mandatory_artifacts"] == []
1508  assert bundle["required_artifacts"]["metric_completeness_validation"]["status"] == "pass"
1509  assert (
1510  bundle["required_artifacts"]["optional_noise_reference"]["status"]
1511  == "pass"
1512  )
1513  assert bundle["required_artifacts"]["unsupported_noise_reference"]["status"] == "pass"
1514 
1516  pytest.importorskip("qiskit")
1517  pytest.importorskip("qiskit_aer")
1518 
1519  import copy
1520 
1521  from benchmarks.density_matrix.validation_evidence.interpretation_validation import (
1522  build_artifact_bundle,
1523  run_validation,
1524  )
1525 
1526  metric_completeness_bundle, optional_bundle, unsupported_bundle, _ = run_validation(
1527  qubit_sizes=(10,),
1528  parameter_set_count=1,
1529  verbose=False,
1530  )
1531  broken_metric_completeness_bundle = copy.deepcopy(metric_completeness_bundle)
1532  broken_metric_completeness_bundle["required_artifacts"]["workflow_baseline_reference"][
1533  "status"
1534  ] = "fail"
1535 
1536  bundle = build_artifact_bundle(
1537  broken_metric_completeness_bundle,
1538  optional_bundle,
1539  unsupported_bundle,
1540  )
1541 
1542  assert bundle["status"] == "fail"
1543  assert "workflow_baseline_reference" in bundle["summary"][
1544  "incomplete_mandatory_artifacts"
1545  ]
1546  assert bundle["summary"]["mandatory_artifacts_complete"] is False
1547  assert bundle["summary"]["main_validation_claim_completed"] is False
1548 
1550  pytest.importorskip("qiskit")
1551  pytest.importorskip("qiskit_aer")
1552 
1553  from benchmarks.density_matrix.validation_evidence.validation_evidence_publication_bundle import (
1554  ARTIFACT_FILENAME,
1555  generate_validation_evidence_publication_bundle,
1556  )
1557 
1559  tmp_path,
1560  qubit_sizes=(10,),
1561  parameter_set_count=1,
1562  verbose=False,
1563  )
1564 
1565  assert bundle["status"] == "pass"
1566  assert bundle["suite_name"] == "validation_evidence_publication"
1567  assert bundle["summary"]["mandatory_artifact_count"] == 6
1568  assert bundle["summary"]["present_artifact_count"] == 6
1569  assert bundle["summary"]["status_match_count"] == 6
1570  assert bundle["summary"]["missing_artifact_count"] == 0
1571  assert bundle["summary"]["mismatched_status_count"] == 0
1572  assert bundle["summary"]["raw_trace_reference_pass"] is True
1573  assert bundle["provenance"]["git_revision"]
1574  assert {artifact["artifact_id"] for artifact in bundle["artifacts"]} == {
1575  "local_correctness_bundle",
1576  "workflow_baseline_bundle",
1577  "trace_anchor_bundle",
1578  "optimization_trace_4q",
1579  "metric_completeness_bundle",
1580  "interpretation_bundle",
1581  }
1582  assert (tmp_path / ARTIFACT_FILENAME).exists()
1583 
1585  pytest.importorskip("qiskit")
1586  pytest.importorskip("qiskit_aer")
1587 
1588  from benchmarks.density_matrix.validation_evidence.validation_evidence_publication_bundle import (
1589  TRACE_ARTIFACT_FILENAME,
1590  generate_validation_evidence_publication_bundle,
1591  validate_validation_evidence_publication_bundle,
1592  )
1593 
1595  tmp_path,
1596  qubit_sizes=(10,),
1597  parameter_set_count=1,
1598  verbose=False,
1599  )
1600  (tmp_path / TRACE_ARTIFACT_FILENAME).unlink()
1601 
1602  with pytest.raises(ValueError, match="missing artifact file"):
1604 
1606  pytest.importorskip("qiskit")
1607  pytest.importorskip("qiskit_aer")
1608 
1609  from benchmarks.density_matrix.noise_support.noise_support_publication_bundle import (
1610  ARTIFACT_FILENAME,
1611  generate_noise_support_publication_bundle,
1612  )
1613 
1615  tmp_path,
1616  qubit_sizes=(4,),
1617  parameter_set_count=1,
1618  verbose=False,
1619  )
1620 
1621  assert bundle["status"] == "pass"
1622  assert bundle["suite_name"] == "noise_support_publication_evidence"
1623  assert bundle["summary"]["mandatory_artifact_count"] == 6
1624  assert bundle["summary"]["present_artifact_count"] == 6
1625  assert bundle["summary"]["status_match_count"] == 6
1626  assert bundle["summary"]["missing_artifact_count"] == 0
1627  assert bundle["summary"]["mismatched_status_count"] == 0
1628  assert bundle["summary"]["workflow_trace_reference_pass"] is True
1629  assert bundle["provenance"]["git_revision"]
1630  assert {artifact["artifact_id"] for artifact in bundle["artifacts"]} == {
1631  "required_local_noise_bundle",
1632  "required_local_noise_micro_bundle",
1633  "optional_noise_classification_bundle",
1634  "unsupported_noise_bundle",
1635  "required_local_noise_workflow_bundle",
1636  "required_local_noise_trace_4q",
1637  }
1638  assert (tmp_path / ARTIFACT_FILENAME).exists()
1639 
1641  pytest.importorskip("qiskit")
1642  pytest.importorskip("qiskit_aer")
1643 
1644  from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation import (
1645  MICRO_VALIDATION_BUNDLE_FILENAME,
1646  EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME,
1647  build_exact_density_validation_bundle,
1648  )
1649 
1650  (tmp_path / MICRO_VALIDATION_BUNDLE_FILENAME).write_text("{}\n", encoding="utf-8")
1651  (tmp_path / EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME).write_text(
1652  "{}\n", encoding="utf-8"
1653  )
1654  (tmp_path / "fixed_parameters_4q.json").write_text("{}\n", encoding="utf-8")
1655  (tmp_path / "fixed_parameters_6q.json").write_text("{}\n", encoding="utf-8")
1656  (tmp_path / "optimization_trace_4q.json").write_text("{}\n", encoding="utf-8")
1657  (tmp_path / "unsupported_state_vector_density_noise.json").write_text(
1658  "{}\n", encoding="utf-8"
1659  )
1660 
1661  micro_bundle = {
1662  "status": "pass",
1663  "summary": {"total_cases": 7, "passed_cases": 7, "pass_rate": 1.0},
1664  }
1665  workflow_bundle = {
1666  "status": "pass",
1667  "summary": {
1668  "total_cases": 40,
1669  "passed_cases": 40,
1670  "pass_rate": 1.0,
1671  "documented_10q_anchor_present": True,
1672  },
1673  }
1674  fixed_results = [
1675  {
1676  "status": "completed",
1677  "qbit_num": 4,
1678  "absolute_energy_error": 1e-12,
1679  },
1680  {
1681  "status": "completed",
1682  "qbit_num": 6,
1683  "absolute_energy_error": 1e-12,
1684  },
1685  ]
1686  trace_result = {
1687  "status": "completed",
1688  "optimizer": "COSINE",
1689  "parameter_count": 18,
1690  "workflow_completed": True,
1691  "initial_energy": 1.0,
1692  "final_energy": -1.0,
1693  }
1694  unsupported_result = {
1695  "status": "unsupported",
1696  "unsupported_category": "phase2_support_matrix",
1697  "unsupported_reason": "example",
1698  }
1699 
1701  tmp_path,
1702  fixed_results=fixed_results,
1703  trace_result=trace_result,
1704  unsupported_result=unsupported_result,
1705  micro_bundle=micro_bundle,
1706  workflow_bundle=workflow_bundle,
1707  )
1708 
1709  assert bundle["status"] == "pass"
1710  assert bundle["summary"]["mandatory_artifact_count"] == 6
1711  assert bundle["summary"]["present_artifact_count"] == 6
1712  assert bundle["summary"]["status_match_count"] == 6
1713  assert bundle["provenance"]["git_revision"]
1714  assert {artifact["artifact_id"] for artifact in bundle["artifacts"]} == {
1715  "micro_validation_bundle",
1716  "exact_regime_workflow_bundle",
1717  "fixed_parameters_4q",
1718  "fixed_parameters_6q",
1719  "optimization_trace_4q",
1720  "unsupported_state_vector_density_noise",
1721  }
1722 
1724  from benchmarks.density_matrix.bridge_scope.bridge_publication_bundle import (
1725  BRIDGE_MICRO_VALIDATION_BUNDLE_FILENAME,
1726  BRIDGE_PUBLICATION_BUNDLE_FILENAME,
1727  UNSUPPORTED_BRIDGE_BUNDLE_FILENAME,
1728  build_bridge_publication_bundle,
1729  )
1730  from benchmarks.density_matrix.workflow_evidence.exact_density_vqe_validation import (
1731  OPTIMIZATION_TRACE_ARTIFACT_FILENAME,
1732  EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME,
1733  )
1734 
1735  (tmp_path / "fixed_parameters_4q.json").write_text("{}\n", encoding="utf-8")
1736  (tmp_path / "fixed_parameters_6q.json").write_text("{}\n", encoding="utf-8")
1737  (tmp_path / OPTIMIZATION_TRACE_ARTIFACT_FILENAME).write_text(
1738  "{}\n", encoding="utf-8"
1739  )
1740  (tmp_path / EXACT_REGIME_WORKFLOW_BUNDLE_FILENAME).write_text(
1741  "{}\n", encoding="utf-8"
1742  )
1743  (tmp_path / BRIDGE_MICRO_VALIDATION_BUNDLE_FILENAME).write_text(
1744  "{}\n", encoding="utf-8"
1745  )
1746  (tmp_path / UNSUPPORTED_BRIDGE_BUNDLE_FILENAME).write_text(
1747  "{}\n", encoding="utf-8"
1748  )
1749 
1750  fixed_results = [
1751  {
1752  "status": "completed",
1753  "qbit_num": 4,
1754  "absolute_energy_error": 1e-12,
1755  "bridge_source_type": "generated_hea",
1756  "bridge_operation_count": 12,
1757  "bridge_noise_count": 3,
1758  },
1759  {
1760  "status": "completed",
1761  "qbit_num": 6,
1762  "absolute_energy_error": 1e-12,
1763  "bridge_source_type": "generated_hea",
1764  "bridge_operation_count": 18,
1765  "bridge_noise_count": 3,
1766  },
1767  ]
1768  trace_result = {
1769  "status": "completed",
1770  "case_name": "optimization_trace_4q",
1771  "optimizer": "COSINE",
1772  "parameter_count": 18,
1773  "workflow_completed": True,
1774  "bridge_supported_pass": True,
1775  "initial_energy": 1.0,
1776  "final_energy": -1.0,
1777  }
1778  bridge_micro_validation_bundle = {
1779  "status": "pass",
1780  "requirements": {"microcase_qubits": [1, 2, 3]},
1781  "summary": {"total_cases": 5, "passed_cases": 5, "pass_rate": 1.0},
1782  }
1783  unsupported_bridge_bundle = {
1784  "status": "pass",
1785  "requirements": {
1786  "required_categories": [
1787  "circuit_source",
1788  "lowering_path",
1789  "noise_insertion",
1790  "noise_type",
1791  ]
1792  },
1793  "summary": {
1794  "total_cases": 4,
1795  "unsupported_cases": 4,
1796  "error_match_count": 4,
1797  "required_case_count": 4,
1798  },
1799  }
1800  workflow_bundle = {
1801  "status": "pass",
1802  "summary": {
1803  "total_cases": 40,
1804  "passed_cases": 40,
1805  "pass_rate": 1.0,
1806  "unsupported_cases": 0,
1807  "bridge_supported_cases": 40,
1808  "documented_10q_anchor_present": True,
1809  "supported_trace_completed": True,
1810  "supported_trace_case_name": "optimization_trace_4q",
1811  },
1812  }
1813 
1815  tmp_path,
1816  fixed_results=fixed_results,
1817  trace_result=trace_result,
1818  bridge_micro_validation_bundle=bridge_micro_validation_bundle,
1819  unsupported_bridge_bundle=unsupported_bridge_bundle,
1820  workflow_bundle=workflow_bundle,
1821  )
1822 
1823  assert bundle["status"] == "pass"
1824  assert bundle["summary"]["mandatory_artifact_count"] == 6
1825  assert bundle["summary"]["present_artifact_count"] == 6
1826  assert bundle["summary"]["status_match_count"] == 6
1827  assert bundle["provenance"]["git_revision"]
1828  assert {artifact["artifact_id"] for artifact in bundle["artifacts"]} == {
1829  "bridge_fixed_parameters_4q",
1830  "bridge_fixed_parameters_6q",
1831  "bridge_micro_validation_bundle",
1832  "bridge_exact_regime_workflow_bundle",
1833  "bridge_optimization_trace_4q",
1834  "unsupported_bridge_bundle",
1835  }
1836  assert (tmp_path / BRIDGE_PUBLICATION_BUNDLE_FILENAME).name == BRIDGE_PUBLICATION_BUNDLE_FILENAME
1837 
1839  density_vqe, Hamiltonian = self._build_density_backend_vqe(4)
1840 
1841  param_num = density_vqe.get_Parameter_Num()
1842  parameters = np.linspace(0.05, 0.05 * param_num, param_num, dtype=np.float64)
1843  density_vqe.set_Optimized_Parameters(parameters)
1844 
1845  density_energy = float(density_vqe.Optimization_Problem(parameters))
1846  aer_energy_real, aer_energy_imag = self._get_density_backend_aer_reference(
1847  density_vqe, Hamiltonian
1848  )
1849 
1850  assert density_vqe.backend == "density_matrix"
1851  assert np.isfinite(density_energy)
1852  assert np.isclose(density_energy, aer_energy_real, atol=1e-12)
1853  assert abs(aer_energy_imag) <= 1e-12
1854 
1856  density_vqe, _ = self._build_density_backend_vqe(4, optimizer="COSINE")
1857 
1858  param_num = density_vqe.get_Parameter_Num()
1859  parameters = np.linspace(0.05, 0.05 * param_num, param_num, dtype=np.float64)
1860  density_vqe.set_Optimized_Parameters(parameters)
1861 
1862  initial_energy = density_vqe.Optimization_Problem(parameters)
1863  density_vqe.Start_Optimization()
1864  final_parameters = density_vqe.get_Optimized_Parameters()
1865  final_energy = density_vqe.Optimization_Problem(final_parameters)
1866 
1867  assert np.isfinite(initial_energy)
1868  assert np.isfinite(final_energy)
1869  assert final_parameters.shape == parameters.shape
1870 
1872  density_vqe, _ = self._build_density_backend_vqe(4, optimizer="ADAM")
1873 
1874  param_num = density_vqe.get_Parameter_Num()
1875  parameters = np.linspace(0.05, 0.05 * param_num, param_num, dtype=np.float64)
1876  density_vqe.set_Optimized_Parameters(parameters)
1877 
1878  with pytest.raises(
1879  Exception,
1880  match="supports only BAYES_OPT or COSINE optimization traces",
1881  ):
1882  density_vqe.Start_Optimization()
1883 
1885  layers = 1
1886  blocks = 1
1887 
1888  qbit_num = 7
1889  Hamiltonian = sp.sparse.eye(2**qbit_num,format="csr")
1890 
1891  config = self._get_identity_config()
1892 
1893  # initiate the VQE object with the Hamiltonian
1894  VQE_cls = self._get_vqe_class()
1895  VQE_eye = VQE_cls(Hamiltonian, qbit_num, config)
1896 
1897  # set the optimization engine
1898  VQE_eye.set_Optimizer("GRAD_DESCEND")
1899 
1900  # set the ansatz variant (U3 rotations and CNOT gates)
1901  VQE_eye.set_Ansatz("HEA")
1902 
1903  # generate the circuit ansatz for the optimization
1904  VQE_eye.Generate_Circuit(layers, blocks)
1905 
1906  # create initial parameters
1907  param_num = VQE_eye.get_Parameter_Num()
1908  parameters = np.random.random( (param_num,) )
1909 
1910  VQE_eye.set_Optimized_Parameters(parameters)
1911 
1912  # start an etap of the optimization (max_inner_iterations iterations)
1913  VQE_eye.Start_Optimization()
1914 
1915  # retrieve QISKIT format of the optimized circuit
1916  quantum_circuit = VQE_eye.get_Qiskit_Circuit()
1917 
1918  # retrieve the optimized parameter
1919  parameters = VQE_eye.get_Optimized_Parameters()
1920 
1921  # evaluate the VQE energy at the optimized parameters
1922  Energy = VQE_eye.Optimization_Problem( parameters )
1923 
1924 
1925  assert (abs(Energy-1)<1e-4)
1926 
1928 
1929  layers = 1
1930  blocks = 1
1931 
1932  qbit_num = 9
1933  topology = []
1934  for idx in range(qbit_num-1):
1935  topology.append( (idx, idx+1) )
1936 
1937  Hamiltonian = generate_hamiltonian(topology, qbit_num)
1938 
1939  config = {"agent_lifetime":10,
1940  "max_inner_iterations":1000,
1941  "max_iterations":1000,
1942  "agent_num":3,
1943  "agent_exploration_rate":0.5,
1944  "max_inner_iterations_adam":500,
1945  "convergence_length": 300}
1946 
1947  # initiate the VQE object with the Hamiltonian
1948  VQE_cls = self._get_vqe_class()
1949  VQE_Heisenberg = VQE_cls(Hamiltonian, qbit_num, config)
1950 
1951  # set the optimization engine
1952  VQE_Heisenberg.set_Optimizer("AGENTS")
1953 
1954  # set the ansatz variant (U3 rotations and CNOT gates)
1955  VQE_Heisenberg.set_Ansatz("HEA_ZYZ")
1956 
1957  # generate the circuit ansatz for the optimization
1958  VQE_Heisenberg.Generate_Circuit(layers, blocks)
1959 
1960  # create initial parameters
1961  param_num = VQE_Heisenberg.get_Parameter_Num()
1962  parameters = np.random.random( (param_num,) )
1963 
1964  VQE_Heisenberg.set_Optimized_Parameters(parameters)
1965 
1966  # start an etap of the optimization (max_inner_iterations iterations)
1967  VQE_Heisenberg.Start_Optimization()
1968 
1969  # retrieve QISKIT format of the optimized circuit
1970  quantum_circuit = VQE_Heisenberg.get_Qiskit_Circuit()
1971 
1972  # print the quantum circuit
1973  lambdas, vecs = sp.sparse.linalg.eigs(Hamiltonian)
1974 
1975  # retrieve the optimized parameter
1976  parameters = VQE_Heisenberg.get_Optimized_Parameters()
1977 
1978  # evaluate the VQE energy at the optimized parameters
1979  Energy = VQE_Heisenberg.Optimization_Problem( parameters )
1980 
1981  print('Expected energy: ', np.real(lambdas[0]))
1982  print('Obtained energy: ', Energy)
1983  assert ((Energy - np.real(lambdas[0]))<1e-2)
1984 
1985 
1986 
1987 
1988 
1989 
def test_invalid_backend_rejected(self)
Definition: test_VQE.py:415
def test_unsupported_noise_bundle_schema(self)
Definition: test_VQE.py:1028
def test_trace_anchor_bundle_schema(self)
Definition: test_VQE.py:1364
def test_density_backend_rejects_invalid_after_gate_index(self)
Definition: test_VQE.py:524
def test_exact_density_validation_bundle_manifest_schema(self, tmp_path)
Definition: test_VQE.py:1640
def test_trace_anchor_missing_trace_marker_blocks_closure(self)
Definition: test_VQE.py:1392
def test_validation_evidence_publication_missing_trace_file_fails_bundle_validation(self, tmp_path)
Definition: test_VQE.py:1584
def _build_state_vector_vqe_with_density_noise(self, qbit_num, omit_backend=False)
Definition: test_VQE.py:230
def test_backend_argument_normalization(self)
Definition: test_VQE.py:392
def generate_hamiltonian(topology, n)
Definition: test_VQE.py:26
def test_density_backend_rejects_gradient_entrypoint(self)
Definition: test_VQE.py:732
def test_density_noise_aliases_normalize_to_required_local_models(self)
Definition: test_VQE.py:603
def _build_density_backend_vqe(self, qbit_num, optimizer=None, density_noise=None)
Definition: test_VQE.py:209
def test_density_backend_rejects_unsupported_optimizer_on_start(self)
Definition: test_VQE.py:1871
def test_required_local_noise_bundle_schema(self)
Definition: test_VQE.py:904
def _build_identity_vqe(self, qbit_num=2, backend=None, Hamiltonian=None)
Definition: test_VQE.py:190
def test_density_matrix_backend_anchor_fixed_parameter_smoke(self, qbit_num)
Definition: test_VQE.py:780
def test_metric_completeness_bundle_schema(self)
Definition: test_VQE.py:1422
def test_validation_evidence_publication_bundle_schema(self, tmp_path)
Definition: test_VQE.py:1549
def test_density_backend_rejects_unsupported_ansatz(self)
Definition: test_VQE.py:483
def build_artifact_bundle(results)
def test_explicit_state_vector_matches_legacy_default(self)
Definition: test_VQE.py:756
def test_interpretation_bundle_schema(self)
Definition: test_VQE.py:1484
def test_fixed_parameter_artifact_includes_bridge_metadata(self)
Definition: test_VQE.py:843
def validate_bridge_microcase(case, verbose=True)
def test_bridge_scope_bundle_schema(self)
Definition: test_VQE.py:977
def _density_energy(hamiltonian, density_matrix)
Definition: test_VQE.py:304
def test_density_matrix_backend_anchor_fixed_parameter_matches_aer_reference(self)
Definition: test_VQE.py:1838
def test_density_backend_rejects_target_out_of_range(self)
Definition: test_VQE.py:688
def test_trace_artifact_includes_bridge_metadata(self)
Definition: test_VQE.py:1196
def test_deferred_density_noise_families_fail_before_execution(self, channel)
Definition: test_VQE.py:642
def test_state_vector_rejects_density_noise(self, omit_backend)
Definition: test_VQE.py:464
def run_validation(verbose=True)
def test_invalid_ansatz_rejected(self)
Definition: test_VQE.py:750
def test_exact_regime_workflow_bundle_schema(self)
Definition: test_VQE.py:1139
def test_density_matrix_bridge_metadata_matches_generated_anchor_circuit(self, qbit_num)
Definition: test_VQE.py:806
def test_bridge_publication_bundle_manifest_schema(self, tmp_path)
Definition: test_VQE.py:1723
def _expected_bridge_operations(vqe)
Definition: test_VQE.py:323
def test_required_local_noise_validation_models_execute_on_supported_path(self)
Definition: test_VQE.py:866
def test_noise_support_publication_bundle_schema(self, tmp_path)
Definition: test_VQE.py:1605
def test_density_backend_rejects_negative_after_gate_index(self)
Definition: test_VQE.py:666
def test_density_backend_rejects_custom_gate_structure_source(self)
Definition: test_VQE.py:558
def test_trace_artifact_schema(self)
Definition: test_VQE.py:1220
def test_density_backend_rejects_noise_value_out_of_range(self)
Definition: test_VQE.py:710
def test_exact_regime_workflow_case_includes_bridge_metadata(self)
Definition: test_VQE.py:1099
def test_metric_completeness_missing_workflow_metric_blocks_gate(self)
Definition: test_VQE.py:1451
def test_density_backend_rejects_unsupported_density_noise_channel(self)
Definition: test_VQE.py:582
def test_density_noise_normalization(self)
Definition: test_VQE.py:428
def test_density_matrix_backend_bounded_optimization_trace(self)
Definition: test_VQE.py:1855
def test_workflow_baseline_missing_case_blocks_closure(self)
Definition: test_VQE.py:1329
def test_required_local_noise_workflow_bundle_schema(self, tmp_path)
Definition: test_VQE.py:1246
def test_workflow_baseline_bundle_schema(self)
Definition: test_VQE.py:1297
def test_validation_interpretation_incomplete_mandatory_artifact_blocks_main_claim(self)
Definition: test_VQE.py:1515
def _planner_operation_kind_tags()
Definition: test_VQE.py:8
def test_invalid_optimizer_rejected(self)
Definition: test_VQE.py:744
def _get_density_backend_aer_reference(self, vqe, Hamiltonian)
Definition: test_VQE.py:308
def _insert_reference_noise(base_circuit, density_noise)
Definition: test_VQE.py:248
def test_density_backend_requires_generated_hea_circuit(self)
Definition: test_VQE.py:508
def test_unsupported_bridge_bundle_schema(self)
Definition: test_VQE.py:1000
def test_bridge_scope_mixed_bridge_case_passes(self)
Definition: test_VQE.py:947