qiskit 1.0.2__cp38-abi3-macosx_11_0_arm64.whl → 1.1.0rc1__cp38-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +27 -16
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/disassemble.py +5 -6
  6. qiskit/circuit/__init__.py +1131 -169
  7. qiskit/circuit/_classical_resource_map.py +7 -6
  8. qiskit/circuit/_utils.py +18 -8
  9. qiskit/circuit/annotated_operation.py +21 -0
  10. qiskit/circuit/barrier.py +10 -13
  11. qiskit/circuit/bit.py +0 -1
  12. qiskit/circuit/classical/__init__.py +2 -2
  13. qiskit/circuit/classical/expr/__init__.py +39 -5
  14. qiskit/circuit/classical/expr/constructors.py +84 -1
  15. qiskit/circuit/classical/expr/expr.py +83 -13
  16. qiskit/circuit/classical/expr/visitors.py +83 -0
  17. qiskit/circuit/commutation_checker.py +86 -51
  18. qiskit/circuit/controlflow/_builder_utils.py +9 -1
  19. qiskit/circuit/controlflow/break_loop.py +8 -22
  20. qiskit/circuit/controlflow/builder.py +116 -1
  21. qiskit/circuit/controlflow/continue_loop.py +8 -22
  22. qiskit/circuit/controlflow/control_flow.py +47 -8
  23. qiskit/circuit/controlflow/for_loop.py +8 -23
  24. qiskit/circuit/controlflow/if_else.py +13 -27
  25. qiskit/circuit/controlflow/switch_case.py +14 -21
  26. qiskit/circuit/controlflow/while_loop.py +9 -23
  27. qiskit/circuit/controlledgate.py +2 -2
  28. qiskit/circuit/delay.py +7 -5
  29. qiskit/circuit/gate.py +20 -7
  30. qiskit/circuit/instruction.py +31 -30
  31. qiskit/circuit/instructionset.py +9 -22
  32. qiskit/circuit/library/__init__.py +8 -2
  33. qiskit/circuit/library/arithmetic/integer_comparator.py +2 -2
  34. qiskit/circuit/library/arithmetic/quadratic_form.py +3 -2
  35. qiskit/circuit/library/blueprintcircuit.py +29 -7
  36. qiskit/circuit/library/data_preparation/state_preparation.py +6 -5
  37. qiskit/circuit/library/generalized_gates/diagonal.py +5 -4
  38. qiskit/circuit/library/generalized_gates/isometry.py +51 -254
  39. qiskit/circuit/library/generalized_gates/pauli.py +2 -2
  40. qiskit/circuit/library/generalized_gates/permutation.py +4 -1
  41. qiskit/circuit/library/generalized_gates/rv.py +15 -11
  42. qiskit/circuit/library/generalized_gates/uc.py +2 -98
  43. qiskit/circuit/library/generalized_gates/unitary.py +9 -4
  44. qiskit/circuit/library/hamiltonian_gate.py +11 -5
  45. qiskit/circuit/library/n_local/efficient_su2.py +5 -5
  46. qiskit/circuit/library/n_local/n_local.py +100 -49
  47. qiskit/circuit/library/n_local/two_local.py +3 -59
  48. qiskit/circuit/library/overlap.py +3 -3
  49. qiskit/circuit/library/phase_oracle.py +1 -1
  50. qiskit/circuit/library/quantum_volume.py +39 -38
  51. qiskit/circuit/library/standard_gates/equivalence_library.py +50 -0
  52. qiskit/circuit/library/standard_gates/global_phase.py +4 -2
  53. qiskit/circuit/library/standard_gates/i.py +1 -2
  54. qiskit/circuit/library/standard_gates/iswap.py +1 -2
  55. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +11 -5
  56. qiskit/circuit/library/standard_gates/p.py +31 -15
  57. qiskit/circuit/library/standard_gates/r.py +4 -3
  58. qiskit/circuit/library/standard_gates/rx.py +7 -4
  59. qiskit/circuit/library/standard_gates/rxx.py +4 -3
  60. qiskit/circuit/library/standard_gates/ry.py +7 -4
  61. qiskit/circuit/library/standard_gates/ryy.py +4 -3
  62. qiskit/circuit/library/standard_gates/rz.py +7 -4
  63. qiskit/circuit/library/standard_gates/rzx.py +4 -3
  64. qiskit/circuit/library/standard_gates/rzz.py +4 -3
  65. qiskit/circuit/library/standard_gates/s.py +4 -8
  66. qiskit/circuit/library/standard_gates/t.py +2 -4
  67. qiskit/circuit/library/standard_gates/u.py +16 -11
  68. qiskit/circuit/library/standard_gates/u1.py +6 -2
  69. qiskit/circuit/library/standard_gates/u2.py +4 -2
  70. qiskit/circuit/library/standard_gates/u3.py +9 -5
  71. qiskit/circuit/library/standard_gates/x.py +22 -11
  72. qiskit/circuit/library/standard_gates/xx_minus_yy.py +4 -3
  73. qiskit/circuit/library/standard_gates/xx_plus_yy.py +7 -5
  74. qiskit/circuit/library/standard_gates/z.py +1 -2
  75. qiskit/circuit/measure.py +4 -1
  76. qiskit/circuit/operation.py +13 -8
  77. qiskit/circuit/parameter.py +11 -6
  78. qiskit/circuit/quantumcircuit.py +864 -128
  79. qiskit/circuit/quantumcircuitdata.py +2 -2
  80. qiskit/circuit/reset.py +5 -2
  81. qiskit/circuit/store.py +95 -0
  82. qiskit/compiler/assembler.py +22 -22
  83. qiskit/compiler/transpiler.py +63 -112
  84. qiskit/converters/circuit_to_dag.py +7 -0
  85. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  86. qiskit/converters/circuit_to_gate.py +2 -0
  87. qiskit/converters/circuit_to_instruction.py +22 -0
  88. qiskit/converters/dag_to_circuit.py +4 -0
  89. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  90. qiskit/dagcircuit/collect_blocks.py +15 -10
  91. qiskit/dagcircuit/dagcircuit.py +434 -124
  92. qiskit/dagcircuit/dagdependency.py +19 -12
  93. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  94. qiskit/dagcircuit/dagdepnode.py +19 -16
  95. qiskit/dagcircuit/dagnode.py +14 -4
  96. qiskit/primitives/__init__.py +12 -8
  97. qiskit/primitives/backend_estimator.py +3 -5
  98. qiskit/primitives/backend_estimator_v2.py +410 -0
  99. qiskit/primitives/backend_sampler_v2.py +287 -0
  100. qiskit/primitives/base/base_estimator.py +4 -9
  101. qiskit/primitives/base/base_sampler.py +2 -2
  102. qiskit/primitives/containers/__init__.py +5 -4
  103. qiskit/primitives/containers/bit_array.py +292 -2
  104. qiskit/primitives/containers/data_bin.py +123 -50
  105. qiskit/primitives/containers/estimator_pub.py +10 -3
  106. qiskit/primitives/containers/observables_array.py +2 -2
  107. qiskit/primitives/containers/pub_result.py +1 -1
  108. qiskit/primitives/containers/sampler_pub.py +19 -3
  109. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  110. qiskit/primitives/containers/shape.py +1 -1
  111. qiskit/primitives/statevector_estimator.py +4 -4
  112. qiskit/primitives/statevector_sampler.py +7 -12
  113. qiskit/providers/__init__.py +17 -18
  114. qiskit/providers/backend.py +2 -2
  115. qiskit/providers/backend_compat.py +8 -10
  116. qiskit/providers/basic_provider/basic_provider_tools.py +67 -31
  117. qiskit/providers/basic_provider/basic_simulator.py +81 -21
  118. qiskit/providers/fake_provider/fake_1q.py +1 -1
  119. qiskit/providers/fake_provider/fake_backend.py +3 -408
  120. qiskit/providers/fake_provider/generic_backend_v2.py +26 -14
  121. qiskit/providers/provider.py +16 -0
  122. qiskit/pulse/builder.py +4 -1
  123. qiskit/pulse/parameter_manager.py +60 -4
  124. qiskit/pulse/schedule.py +29 -13
  125. qiskit/pulse/utils.py +61 -20
  126. qiskit/qasm2/__init__.py +1 -5
  127. qiskit/qasm2/parse.py +1 -4
  128. qiskit/qasm3/__init__.py +42 -5
  129. qiskit/qasm3/ast.py +19 -0
  130. qiskit/qasm3/exporter.py +178 -106
  131. qiskit/qasm3/printer.py +27 -5
  132. qiskit/qpy/__init__.py +247 -13
  133. qiskit/qpy/binary_io/circuits.py +216 -47
  134. qiskit/qpy/binary_io/schedules.py +42 -36
  135. qiskit/qpy/binary_io/value.py +201 -22
  136. qiskit/qpy/common.py +1 -1
  137. qiskit/qpy/exceptions.py +20 -0
  138. qiskit/qpy/formats.py +29 -0
  139. qiskit/qpy/type_keys.py +21 -0
  140. qiskit/quantum_info/analysis/distance.py +3 -3
  141. qiskit/quantum_info/analysis/make_observable.py +2 -1
  142. qiskit/quantum_info/analysis/z2_symmetries.py +2 -1
  143. qiskit/quantum_info/operators/channel/chi.py +9 -8
  144. qiskit/quantum_info/operators/channel/choi.py +10 -9
  145. qiskit/quantum_info/operators/channel/kraus.py +2 -1
  146. qiskit/quantum_info/operators/channel/ptm.py +10 -9
  147. qiskit/quantum_info/operators/channel/quantum_channel.py +2 -1
  148. qiskit/quantum_info/operators/channel/stinespring.py +2 -1
  149. qiskit/quantum_info/operators/channel/superop.py +12 -11
  150. qiskit/quantum_info/operators/channel/transformations.py +12 -11
  151. qiskit/quantum_info/operators/dihedral/dihedral.py +5 -4
  152. qiskit/quantum_info/operators/operator.py +43 -30
  153. qiskit/quantum_info/operators/scalar_op.py +10 -9
  154. qiskit/quantum_info/operators/symplectic/base_pauli.py +70 -59
  155. qiskit/quantum_info/operators/symplectic/clifford.py +36 -9
  156. qiskit/quantum_info/operators/symplectic/pauli.py +48 -4
  157. qiskit/quantum_info/operators/symplectic/pauli_list.py +36 -14
  158. qiskit/quantum_info/operators/symplectic/random.py +3 -2
  159. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +54 -33
  160. qiskit/quantum_info/states/densitymatrix.py +13 -13
  161. qiskit/quantum_info/states/stabilizerstate.py +3 -3
  162. qiskit/quantum_info/states/statevector.py +14 -13
  163. qiskit/quantum_info/states/utils.py +5 -3
  164. qiskit/result/mitigation/correlated_readout_mitigator.py +3 -2
  165. qiskit/result/mitigation/local_readout_mitigator.py +2 -1
  166. qiskit/result/mitigation/utils.py +3 -2
  167. qiskit/synthesis/__init__.py +2 -0
  168. qiskit/synthesis/discrete_basis/commutator_decompose.py +2 -2
  169. qiskit/synthesis/evolution/lie_trotter.py +7 -14
  170. qiskit/synthesis/evolution/qdrift.py +3 -4
  171. qiskit/synthesis/linear/cnot_synth.py +1 -3
  172. qiskit/synthesis/linear/linear_circuits_utils.py +1 -1
  173. qiskit/synthesis/linear_phase/cz_depth_lnn.py +4 -18
  174. qiskit/synthesis/permutation/__init__.py +1 -0
  175. qiskit/synthesis/permutation/permutation_reverse_lnn.py +90 -0
  176. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -6
  177. qiskit/synthesis/two_qubit/two_qubit_decompose.py +165 -954
  178. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +13 -12
  179. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +7 -1
  180. qiskit/synthesis/unitary/aqc/__init__.py +1 -1
  181. qiskit/synthesis/unitary/aqc/cnot_structures.py +2 -1
  182. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +2 -1
  183. qiskit/synthesis/unitary/qsd.py +3 -2
  184. qiskit/transpiler/__init__.py +7 -3
  185. qiskit/transpiler/layout.py +140 -61
  186. qiskit/transpiler/passes/__init__.py +6 -0
  187. qiskit/transpiler/passes/basis/basis_translator.py +7 -2
  188. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  189. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  190. qiskit/transpiler/passes/calibration/rzx_builder.py +2 -1
  191. qiskit/transpiler/passes/layout/apply_layout.py +8 -3
  192. qiskit/transpiler/passes/layout/sabre_layout.py +15 -3
  193. qiskit/transpiler/passes/layout/set_layout.py +1 -1
  194. qiskit/transpiler/passes/optimization/__init__.py +2 -0
  195. qiskit/transpiler/passes/optimization/commutation_analysis.py +2 -2
  196. qiskit/transpiler/passes/optimization/commutative_cancellation.py +1 -1
  197. qiskit/transpiler/passes/optimization/consolidate_blocks.py +1 -1
  198. qiskit/transpiler/passes/optimization/cx_cancellation.py +10 -0
  199. qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
  200. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +9 -3
  201. qiskit/transpiler/passes/optimization/optimize_annotated.py +248 -12
  202. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  203. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +1 -3
  204. qiskit/transpiler/passes/routing/__init__.py +1 -0
  205. qiskit/transpiler/passes/routing/basic_swap.py +13 -2
  206. qiskit/transpiler/passes/routing/lookahead_swap.py +7 -1
  207. qiskit/transpiler/passes/routing/sabre_swap.py +10 -6
  208. qiskit/transpiler/passes/routing/star_prerouting.py +417 -0
  209. qiskit/transpiler/passes/routing/stochastic_swap.py +24 -8
  210. qiskit/transpiler/passes/scheduling/__init__.py +1 -1
  211. qiskit/transpiler/passes/scheduling/alap.py +1 -2
  212. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +1 -2
  213. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +9 -6
  214. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +8 -0
  215. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +13 -4
  216. qiskit/transpiler/passes/scheduling/asap.py +1 -2
  217. qiskit/transpiler/passes/scheduling/base_scheduler.py +21 -2
  218. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +26 -4
  219. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +24 -2
  220. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +28 -4
  221. qiskit/transpiler/passes/synthesis/aqc_plugin.py +2 -2
  222. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +120 -13
  223. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +162 -55
  224. qiskit/transpiler/passes/utils/gates_basis.py +3 -3
  225. qiskit/transpiler/passmanager.py +44 -1
  226. qiskit/transpiler/preset_passmanagers/__init__.py +3 -3
  227. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +34 -16
  228. qiskit/transpiler/preset_passmanagers/common.py +4 -6
  229. qiskit/transpiler/preset_passmanagers/plugin.py +9 -1
  230. qiskit/utils/optionals.py +6 -2
  231. qiskit/visualization/array.py +1 -1
  232. qiskit/visualization/bloch.py +2 -3
  233. qiskit/visualization/circuit/matplotlib.py +44 -14
  234. qiskit/visualization/circuit/text.py +38 -18
  235. qiskit/visualization/counts_visualization.py +3 -6
  236. qiskit/visualization/dag_visualization.py +6 -7
  237. qiskit/visualization/pulse_v2/interface.py +8 -3
  238. qiskit/visualization/state_visualization.py +3 -2
  239. qiskit/visualization/timeline/interface.py +18 -8
  240. {qiskit-1.0.2.dist-info → qiskit-1.1.0rc1.dist-info}/METADATA +12 -8
  241. {qiskit-1.0.2.dist-info → qiskit-1.1.0rc1.dist-info}/RECORD +245 -235
  242. {qiskit-1.0.2.dist-info → qiskit-1.1.0rc1.dist-info}/WHEEL +1 -1
  243. qiskit/_qasm2.abi3.so +0 -0
  244. qiskit/_qasm3.abi3.so +0 -0
  245. {qiskit-1.0.2.dist-info → qiskit-1.1.0rc1.dist-info}/LICENSE.txt +0 -0
  246. {qiskit-1.0.2.dist-info → qiskit-1.1.0rc1.dist-info}/entry_points.txt +0 -0
  247. {qiskit-1.0.2.dist-info → qiskit-1.1.0rc1.dist-info}/top_level.txt +0 -0
@@ -15,10 +15,11 @@ DensityMatrix quantum state class.
15
15
  """
16
16
 
17
17
  from __future__ import annotations
18
- import copy
18
+ import copy as _copy
19
19
  from numbers import Number
20
20
  import numpy as np
21
21
 
22
+ from qiskit import _numpy_compat
22
23
  from qiskit.circuit.quantumcircuit import QuantumCircuit
23
24
  from qiskit.circuit.instruction import Instruction
24
25
  from qiskit.exceptions import QiskitError
@@ -110,10 +111,9 @@ class DensityMatrix(QuantumState, TolerancesMixin):
110
111
  raise QiskitError("Invalid DensityMatrix input: not a square matrix.")
111
112
  super().__init__(op_shape=OpShape.auto(shape=self._data.shape, dims_l=dims, dims_r=dims))
112
113
 
113
- def __array__(self, dtype=None):
114
- if dtype:
115
- return np.asarray(self.data, dtype=dtype)
116
- return self.data
114
+ def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
115
+ dtype = self.data.dtype if dtype is None else dtype
116
+ return np.array(self.data, dtype=dtype, copy=copy)
117
117
 
118
118
  def __eq__(self, other):
119
119
  return super().__eq__(other) and np.allclose(
@@ -241,7 +241,7 @@ class DensityMatrix(QuantumState, TolerancesMixin):
241
241
  """
242
242
  if not isinstance(other, DensityMatrix):
243
243
  other = DensityMatrix(other)
244
- ret = copy.copy(self)
244
+ ret = _copy.copy(self)
245
245
  ret._data = np.kron(self._data, other._data)
246
246
  ret._op_shape = self._op_shape.tensor(other._op_shape)
247
247
  return ret
@@ -260,7 +260,7 @@ class DensityMatrix(QuantumState, TolerancesMixin):
260
260
  """
261
261
  if not isinstance(other, DensityMatrix):
262
262
  other = DensityMatrix(other)
263
- ret = copy.copy(self)
263
+ ret = _copy.copy(self)
264
264
  ret._data = np.kron(other._data, self._data)
265
265
  ret._op_shape = self._op_shape.expand(other._op_shape)
266
266
  return ret
@@ -281,7 +281,7 @@ class DensityMatrix(QuantumState, TolerancesMixin):
281
281
  if not isinstance(other, DensityMatrix):
282
282
  other = DensityMatrix(other)
283
283
  self._op_shape._validate_add(other._op_shape)
284
- ret = copy.copy(self)
284
+ ret = _copy.copy(self)
285
285
  ret._data = self.data + other.data
286
286
  return ret
287
287
 
@@ -299,7 +299,7 @@ class DensityMatrix(QuantumState, TolerancesMixin):
299
299
  """
300
300
  if not isinstance(other, Number):
301
301
  raise QiskitError("other is not a number")
302
- ret = copy.copy(self)
302
+ ret = _copy.copy(self)
303
303
  ret._data = other * self.data
304
304
  return ret
305
305
 
@@ -356,7 +356,7 @@ class DensityMatrix(QuantumState, TolerancesMixin):
356
356
  Returns:
357
357
  DensityMatrix: the state with reversed subsystem order.
358
358
  """
359
- ret = copy.copy(self)
359
+ ret = _copy.copy(self)
360
360
  axes = tuple(range(self._op_shape._num_qargs_l - 1, -1, -1))
361
361
  axes = axes + tuple(len(axes) + i for i in axes)
362
362
  ret._data = np.reshape(
@@ -523,7 +523,7 @@ class DensityMatrix(QuantumState, TolerancesMixin):
523
523
  """
524
524
  if qargs is None:
525
525
  # Resetting all qubits does not require sampling or RNG
526
- ret = copy.copy(self)
526
+ ret = _copy.copy(self)
527
527
  state = np.zeros(self._op_shape.shape, dtype=complex)
528
528
  state[0, 0] = 1
529
529
  ret._data = state
@@ -715,7 +715,7 @@ class DensityMatrix(QuantumState, TolerancesMixin):
715
715
  new_shape._dims_r = new_shape._dims_l
716
716
  new_shape._num_qargs_r = new_shape._num_qargs_l
717
717
 
718
- ret = copy.copy(self)
718
+ ret = _copy.copy(self)
719
719
  if qargs is None:
720
720
  # Evolution on full matrix
721
721
  op_mat = other.data
@@ -792,7 +792,7 @@ class DensityMatrix(QuantumState, TolerancesMixin):
792
792
  """Return a new statevector by applying an instruction."""
793
793
  if isinstance(obj, QuantumCircuit):
794
794
  obj = obj.to_instruction()
795
- vec = copy.copy(self)
795
+ vec = _copy.copy(self)
796
796
  vec._append_instruction(obj, qargs=qargs)
797
797
  return vec
798
798
 
@@ -415,7 +415,7 @@ class StabilizerState(QuantumState):
415
415
  outcome_prob = 1.0
416
416
  probs = {} # probabilities dictionary
417
417
 
418
- self._get_probablities(qubits, outcome, outcome_prob, probs)
418
+ self._get_probabilities(qubits, outcome, outcome_prob, probs)
419
419
 
420
420
  if decimals is not None:
421
421
  for key, value in probs.items():
@@ -644,7 +644,7 @@ class StabilizerState(QuantumState):
644
644
  # -----------------------------------------------------------------------
645
645
  # Helper functions for calculating the probabilities
646
646
  # -----------------------------------------------------------------------
647
- def _get_probablities(self, qubits, outcome, outcome_prob, probs):
647
+ def _get_probabilities(self, qubits, outcome, outcome_prob, probs):
648
648
  """Recursive helper function for calculating the probabilities"""
649
649
 
650
650
  qubit_for_branching = -1
@@ -679,4 +679,4 @@ class StabilizerState(QuantumState):
679
679
  stab_cpy._measure_and_update(
680
680
  qubits[len(qubits) - qubit_for_branching - 1], single_qubit_outcome
681
681
  )
682
- stab_cpy._get_probablities(qubits, new_outcome, 0.5 * outcome_prob, probs)
682
+ stab_cpy._get_probabilities(qubits, new_outcome, 0.5 * outcome_prob, probs)
@@ -14,12 +14,14 @@
14
14
  Statevector quantum state class.
15
15
  """
16
16
  from __future__ import annotations
17
- import copy
17
+ import copy as _copy
18
+ import math
18
19
  import re
19
20
  from numbers import Number
20
21
 
21
22
  import numpy as np
22
23
 
24
+ from qiskit import _numpy_compat
23
25
  from qiskit.circuit.quantumcircuit import QuantumCircuit
24
26
  from qiskit.circuit.instruction import Instruction
25
27
  from qiskit.exceptions import QiskitError
@@ -103,10 +105,9 @@ class Statevector(QuantumState, TolerancesMixin):
103
105
  raise QiskitError("Invalid input: not a vector or column-vector.")
104
106
  super().__init__(op_shape=OpShape.auto(shape=shape, dims_l=dims, num_qubits_r=0))
105
107
 
106
- def __array__(self, dtype=None):
107
- if dtype:
108
- return np.asarray(self.data, dtype=dtype)
109
- return self.data
108
+ def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
109
+ dtype = self.data.dtype if dtype is None else dtype
110
+ return np.array(self.data, dtype=dtype, copy=copy)
110
111
 
111
112
  def __eq__(self, other):
112
113
  return super().__eq__(other) and np.allclose(
@@ -276,7 +277,7 @@ class Statevector(QuantumState, TolerancesMixin):
276
277
  """
277
278
  if not isinstance(other, Statevector):
278
279
  other = Statevector(other)
279
- ret = copy.copy(self)
280
+ ret = _copy.copy(self)
280
281
  ret._op_shape = self._op_shape.tensor(other._op_shape)
281
282
  ret._data = np.kron(self._data, other._data)
282
283
  return ret
@@ -317,7 +318,7 @@ class Statevector(QuantumState, TolerancesMixin):
317
318
  """
318
319
  if not isinstance(other, Statevector):
319
320
  other = Statevector(other)
320
- ret = copy.copy(self)
321
+ ret = _copy.copy(self)
321
322
  ret._op_shape = self._op_shape.expand(other._op_shape)
322
323
  ret._data = np.kron(other._data, self._data)
323
324
  return ret
@@ -338,7 +339,7 @@ class Statevector(QuantumState, TolerancesMixin):
338
339
  if not isinstance(other, Statevector):
339
340
  other = Statevector(other)
340
341
  self._op_shape._validate_add(other._op_shape)
341
- ret = copy.copy(self)
342
+ ret = _copy.copy(self)
342
343
  ret._data = self.data + other.data
343
344
  return ret
344
345
 
@@ -356,7 +357,7 @@ class Statevector(QuantumState, TolerancesMixin):
356
357
  """
357
358
  if not isinstance(other, Number):
358
359
  raise QiskitError("other is not a number")
359
- ret = copy.copy(self)
360
+ ret = _copy.copy(self)
360
361
  ret._data = other * self.data
361
362
  return ret
362
363
 
@@ -381,7 +382,7 @@ class Statevector(QuantumState, TolerancesMixin):
381
382
  qargs = getattr(other, "qargs", None)
382
383
 
383
384
  # Get return vector
384
- ret = copy.copy(self)
385
+ ret = _copy.copy(self)
385
386
 
386
387
  # Evolution by a circuit or instruction
387
388
  if isinstance(other, QuantumCircuit):
@@ -447,7 +448,7 @@ class Statevector(QuantumState, TolerancesMixin):
447
448
  Returns:
448
449
  Statevector: the Statevector with reversed subsystem order.
449
450
  """
450
- ret = copy.copy(self)
451
+ ret = _copy.copy(self)
451
452
  axes = tuple(range(self._op_shape._num_qargs_l - 1, -1, -1))
452
453
  ret._data = np.reshape(
453
454
  np.transpose(np.reshape(self.data, self._op_shape.tensor_shape), axes),
@@ -618,7 +619,7 @@ class Statevector(QuantumState, TolerancesMixin):
618
619
  """
619
620
  if qargs is None:
620
621
  # Resetting all qubits does not require sampling or RNG
621
- ret = copy.copy(self)
622
+ ret = _copy.copy(self)
622
623
  state = np.zeros(self._op_shape.shape, dtype=complex)
623
624
  state[0] = 1
624
625
  ret._data = state
@@ -702,7 +703,7 @@ class Statevector(QuantumState, TolerancesMixin):
702
703
  state = Statevector(data)
703
704
  if xy_states:
704
705
  # Apply hadamards to all qubits in X eigenstates
705
- x_mat = np.array([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2)
706
+ x_mat = np.array([[1, 1], [1, -1]], dtype=complex) / math.sqrt(2)
706
707
  # Apply S.H to qubits in Y eigenstates
707
708
  y_mat = np.dot(np.diag([1, 1j]), x_mat)
708
709
  for qubit, char in enumerate(reversed(label)):
@@ -15,6 +15,7 @@ Quantum information utility functions for states.
15
15
  """
16
16
 
17
17
  from __future__ import annotations
18
+ import math
18
19
 
19
20
  import numpy as np
20
21
 
@@ -102,17 +103,18 @@ def shannon_entropy(pvec: list | np.ndarray, base: int = 2) -> float:
102
103
  if base == 2:
103
104
 
104
105
  def logfn(x):
105
- return -x * np.log2(x)
106
+ return -x * math.log2(x)
106
107
 
107
108
  elif base == np.e:
108
109
 
109
110
  def logfn(x):
110
- return -x * np.log(x)
111
+ return -x * math.log(x)
111
112
 
112
113
  else:
114
+ log_base = math.log(base)
113
115
 
114
116
  def logfn(x):
115
- return -x * np.log(x) / np.log(base)
117
+ return -x * math.log(x) / log_base
116
118
 
117
119
  h_val = 0.0
118
120
  for x in pvec:
@@ -13,6 +13,7 @@
13
13
  Readout mitigator class based on the A-matrix inversion method
14
14
  """
15
15
 
16
+ import math
16
17
  from typing import Optional, List, Tuple, Iterable, Callable, Union, Dict
17
18
  import numpy as np
18
19
 
@@ -46,7 +47,7 @@ class CorrelatedReadoutMitigator(BaseReadoutMitigator):
46
47
  if np.any(assignment_matrix < 0) or not np.allclose(np.sum(assignment_matrix, axis=0), 1):
47
48
  raise QiskitError("Assignment matrix columns must be valid probability distributions")
48
49
  assignment_matrix = np.asarray(assignment_matrix, dtype=float)
49
- matrix_qubits_num = int(np.log2(assignment_matrix.shape[0]))
50
+ matrix_qubits_num = int(math.log2(assignment_matrix.shape[0]))
50
51
  if qubits is None:
51
52
  self._num_qubits = matrix_qubits_num
52
53
  self._qubits = range(self._num_qubits)
@@ -260,7 +261,7 @@ class CorrelatedReadoutMitigator(BaseReadoutMitigator):
260
261
  float: the standard deviation upper bound.
261
262
  """
262
263
  gamma = self._compute_gamma()
263
- return gamma / np.sqrt(shots)
264
+ return gamma / math.sqrt(shots)
264
265
 
265
266
  @property
266
267
  def qubits(self) -> Tuple[int]:
@@ -14,6 +14,7 @@ Readout mitigator class based on the 1-qubit local tensored mitigation method
14
14
  """
15
15
 
16
16
 
17
+ import math
17
18
  from typing import Optional, List, Tuple, Iterable, Callable, Union, Dict
18
19
  import numpy as np
19
20
 
@@ -288,7 +289,7 @@ class LocalReadoutMitigator(BaseReadoutMitigator):
288
289
  float: the standard deviation upper bound.
289
290
  """
290
291
  gamma = self._compute_gamma(qubits=qubits)
291
- return gamma / np.sqrt(shots)
292
+ return gamma / math.sqrt(shots)
292
293
 
293
294
  def _from_backend(self, backend, qubits):
294
295
  """Calculates amats from backend properties readout_error"""
@@ -14,6 +14,7 @@ Readout mitigation data handling utils
14
14
  """
15
15
 
16
16
  import logging
17
+ import math
17
18
  from typing import Optional, List, Tuple, Dict
18
19
  import numpy as np
19
20
 
@@ -55,7 +56,7 @@ def expval_with_stddev(coeffs: np.ndarray, probs: np.ndarray, shots: int) -> Tup
55
56
  "(%f). Setting standard deviation of result to 0.",
56
57
  variance,
57
58
  )
58
- calc_stddev = np.sqrt(variance) if variance > 0 else 0.0
59
+ calc_stddev = math.sqrt(variance) if variance > 0 else 0.0
59
60
  return [expval, calc_stddev]
60
61
 
61
62
 
@@ -63,7 +64,7 @@ def stddev(probs, shots):
63
64
  """Calculate stddev dict"""
64
65
  ret = {}
65
66
  for key, prob in probs.items():
66
- std_err = np.sqrt(prob * (1 - prob) / shots)
67
+ std_err = math.sqrt(prob * (1 - prob) / shots)
67
68
  ret[key] = std_err
68
69
  return ret
69
70
 
@@ -51,6 +51,7 @@ Permutation Synthesis
51
51
  .. autofunction:: synth_permutation_depth_lnn_kms
52
52
  .. autofunction:: synth_permutation_basic
53
53
  .. autofunction:: synth_permutation_acg
54
+ .. autofunction:: synth_permutation_reverse_lnn_kms
54
55
 
55
56
  Clifford Synthesis
56
57
  ==================
@@ -140,6 +141,7 @@ from .permutation import (
140
141
  synth_permutation_depth_lnn_kms,
141
142
  synth_permutation_basic,
142
143
  synth_permutation_acg,
144
+ synth_permutation_reverse_lnn_kms,
143
145
  )
144
146
  from .linear import (
145
147
  synth_cnot_count_full_pmh,
@@ -92,8 +92,8 @@ def _solve_decomposition_angle(matrix: np.ndarray) -> float:
92
92
  lhs = math.sin(angle / 2)
93
93
 
94
94
  def objective(phi):
95
- sin_sq = np.sin(phi / 2) ** 2
96
- return 2 * sin_sq * np.sqrt(1 - sin_sq**2) - lhs
95
+ sin_sq = math.sin(phi.item() / 2) ** 2
96
+ return 2 * sin_sq * math.sqrt(1 - sin_sq**2) - lhs
97
97
 
98
98
  decomposition_angle = fsolve(objective, angle)[0]
99
99
  return decomposition_angle
@@ -76,7 +76,6 @@ class LieTrotter(ProductFormula):
76
76
 
77
77
  # construct the evolution circuit
78
78
  evolution_circuit = QuantumCircuit(operators[0].num_qubits)
79
- first_barrier = False
80
79
 
81
80
  if not isinstance(operators, list):
82
81
  pauli_list = [(Pauli(op), np.real(coeff)) for op, coeff in operators.to_list()]
@@ -86,20 +85,14 @@ class LieTrotter(ProductFormula):
86
85
  # if we only evolve a single Pauli we don't need to additionally wrap it
87
86
  wrap = not (len(pauli_list) == 1 and self.reps == 1)
88
87
 
89
- for _ in range(self.reps):
90
- for op, coeff in pauli_list:
91
- # add barriers
92
- if first_barrier:
93
- if self.insert_barriers:
94
- evolution_circuit.barrier()
95
- else:
96
- first_barrier = True
97
-
98
- evolution_circuit.compose(
99
- self.atomic_evolution(op, coeff * time / self.reps), wrap=wrap, inplace=True
100
- )
88
+ for i, (op, coeff) in enumerate(pauli_list):
89
+ evolution_circuit.compose(
90
+ self.atomic_evolution(op, coeff * time / self.reps), wrap=wrap, inplace=True
91
+ )
92
+ if self.insert_barriers and i != len(pauli_list) - 1:
93
+ evolution_circuit.barrier()
101
94
 
102
- return evolution_circuit
95
+ return evolution_circuit.repeat(self.reps).decompose()
103
96
 
104
97
  @property
105
98
  def settings(self) -> Dict[str, Any]:
@@ -12,6 +12,7 @@
12
12
 
13
13
  """QDrift Class"""
14
14
 
15
+ import math
15
16
  from typing import Union, Optional, Callable
16
17
  import numpy as np
17
18
  from qiskit.circuit.quantumcircuit import QuantumCircuit
@@ -73,7 +74,7 @@ class QDrift(ProductFormula):
73
74
  weights = np.abs(coeffs)
74
75
  lambd = np.sum(weights)
75
76
 
76
- num_gates = int(np.ceil(2 * (lambd**2) * (time**2) * self.reps))
77
+ num_gates = math.ceil(2 * (lambd**2) * (time**2) * self.reps)
77
78
  # The protocol calls for the removal of the individual coefficients,
78
79
  # and multiplication by a constant evolution time.
79
80
  evolution_time = lambd * time / num_gates
@@ -83,8 +84,6 @@ class QDrift(ProductFormula):
83
84
  size=(num_gates,),
84
85
  p=weights / lambd,
85
86
  )
86
- # Update the coefficients of sampled_ops
87
- self.sampled_ops = [(op, evolution_time) for op, coeff in self.sampled_ops]
88
87
 
89
88
  # pylint: disable=cyclic-import
90
89
  from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
@@ -94,7 +93,7 @@ class QDrift(ProductFormula):
94
93
  insert_barriers=self.insert_barriers, atomic_evolution=self.atomic_evolution
95
94
  )
96
95
  evolution_circuit = PauliEvolutionGate(
97
- sum(SparsePauliOp(op) for op, coeff in self.sampled_ops),
96
+ sum(SparsePauliOp(np.sign(coeff) * op) for op, coeff in self.sampled_ops),
98
97
  time=evolution_time,
99
98
  synthesis=lie_trotter,
100
99
  ).definition
@@ -37,9 +37,7 @@ def synth_cnot_count_full_pmh(
37
37
  Args:
38
38
  state: :math:`n \\times n` boolean invertible matrix, describing
39
39
  the state of the input circuit
40
- section_size: The size of each section, used in the
41
- Patel–Markov–Hayes algorithm [1]. ``section_size`` must be a factor of the number
42
- of qubits.
40
+ section_size: The size of each section in the Patel–Markov–Hayes algorithm [1].
43
41
 
44
42
  Returns:
45
43
  QuantumCircuit: a CX-only circuit implementing the linear transformation.
@@ -15,7 +15,7 @@
15
15
  import copy
16
16
  from typing import Callable
17
17
  import numpy as np
18
- from qiskit import QuantumCircuit
18
+ from qiskit.circuit import QuantumCircuit
19
19
  from qiskit.exceptions import QiskitError
20
20
  from qiskit.circuit.exceptions import CircuitError
21
21
  from . import calc_inverse_matrix, check_invertible_binary_matrix
@@ -24,24 +24,10 @@ References:
24
24
 
25
25
  import numpy as np
26
26
  from qiskit.circuit import QuantumCircuit
27
-
28
-
29
- def _append_cx_stage1(qc, n):
30
- """A single layer of CX gates."""
31
- for i in range(n // 2):
32
- qc.cx(2 * i, 2 * i + 1)
33
- for i in range((n + 1) // 2 - 1):
34
- qc.cx(2 * i + 2, 2 * i + 1)
35
- return qc
36
-
37
-
38
- def _append_cx_stage2(qc, n):
39
- """A single layer of CX gates."""
40
- for i in range(n // 2):
41
- qc.cx(2 * i + 1, 2 * i)
42
- for i in range((n + 1) // 2 - 1):
43
- qc.cx(2 * i + 1, 2 * i + 2)
44
- return qc
27
+ from qiskit.synthesis.permutation.permutation_reverse_lnn import (
28
+ _append_cx_stage1,
29
+ _append_cx_stage2,
30
+ )
45
31
 
46
32
 
47
33
  def _odd_pattern1(n):
@@ -15,3 +15,4 @@
15
15
 
16
16
  from .permutation_lnn import synth_permutation_depth_lnn_kms
17
17
  from .permutation_full import synth_permutation_basic, synth_permutation_acg
18
+ from .permutation_reverse_lnn import synth_permutation_reverse_lnn_kms
@@ -0,0 +1,90 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2024
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+ """
13
+ Synthesis of a reverse permutation for LNN connectivity.
14
+ """
15
+
16
+ from qiskit.circuit import QuantumCircuit
17
+
18
+
19
+ def _append_cx_stage1(qc, n):
20
+ """A single layer of CX gates."""
21
+ for i in range(n // 2):
22
+ qc.cx(2 * i, 2 * i + 1)
23
+ for i in range((n + 1) // 2 - 1):
24
+ qc.cx(2 * i + 2, 2 * i + 1)
25
+ return qc
26
+
27
+
28
+ def _append_cx_stage2(qc, n):
29
+ """A single layer of CX gates."""
30
+ for i in range(n // 2):
31
+ qc.cx(2 * i + 1, 2 * i)
32
+ for i in range((n + 1) // 2 - 1):
33
+ qc.cx(2 * i + 1, 2 * i + 2)
34
+ return qc
35
+
36
+
37
+ def _append_reverse_permutation_lnn_kms(qc: QuantumCircuit, num_qubits: int) -> None:
38
+ """
39
+ Append reverse permutation to a QuantumCircuit for linear nearest-neighbor architectures
40
+ using Kutin, Moulton, Smithline method.
41
+
42
+ Synthesis algorithm for reverse permutation from [1], section 5.
43
+ This algorithm synthesizes the reverse permutation on :math:`n` qubits over
44
+ a linear nearest-neighbor architecture using CX gates with depth :math:`2 * n + 2`.
45
+
46
+ Args:
47
+ qc: The original quantum circuit.
48
+ num_qubits: The number of qubits.
49
+
50
+ Returns:
51
+ The quantum circuit with appended reverse permutation.
52
+
53
+ References:
54
+ 1. Kutin, S., Moulton, D. P., Smithline, L.,
55
+ *Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
56
+ `arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
57
+ """
58
+
59
+ for _ in range((num_qubits + 1) // 2):
60
+ _append_cx_stage1(qc, num_qubits)
61
+ _append_cx_stage2(qc, num_qubits)
62
+ if (num_qubits % 2) == 0:
63
+ _append_cx_stage1(qc, num_qubits)
64
+
65
+
66
+ def synth_permutation_reverse_lnn_kms(num_qubits: int) -> QuantumCircuit:
67
+ """
68
+ Synthesize reverse permutation for linear nearest-neighbor architectures using
69
+ Kutin, Moulton, Smithline method.
70
+
71
+ Synthesis algorithm for reverse permutation from [1], section 5.
72
+ This algorithm synthesizes the reverse permutation on :math:`n` qubits over
73
+ a linear nearest-neighbor architecture using CX gates with depth :math:`2 * n + 2`.
74
+
75
+ Args:
76
+ num_qubits: The number of qubits.
77
+
78
+ Returns:
79
+ The synthesized quantum circuit.
80
+
81
+ References:
82
+ 1. Kutin, S., Moulton, D. P., Smithline, L.,
83
+ *Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
84
+ `arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
85
+ """
86
+
87
+ qc = QuantumCircuit(num_qubits)
88
+ _append_reverse_permutation_lnn_kms(qc, num_qubits)
89
+
90
+ return qc
@@ -15,7 +15,7 @@ Circuit synthesis for a QFT circuit.
15
15
 
16
16
  import numpy as np
17
17
  from qiskit.circuit import QuantumCircuit
18
- from qiskit.synthesis.linear_phase.cz_depth_lnn import _append_cx_stage1, _append_cx_stage2
18
+ from qiskit.synthesis.permutation.permutation_reverse_lnn import _append_reverse_permutation_lnn_kms
19
19
 
20
20
 
21
21
  def synth_qft_line(
@@ -65,10 +65,6 @@ def synth_qft_line(
65
65
  if not do_swaps:
66
66
  # Add a reversal network for LNN connectivity in depth 2*n+2,
67
67
  # based on Kutin at al., https://arxiv.org/abs/quant-ph/0701194, Section 5.
68
- for _ in range((num_qubits + 1) // 2):
69
- qc = _append_cx_stage1(qc, num_qubits)
70
- qc = _append_cx_stage2(qc, num_qubits)
71
- if (num_qubits % 2) == 0:
72
- qc = _append_cx_stage1(qc, num_qubits)
68
+ _append_reverse_permutation_lnn_kms(qc, num_qubits)
73
69
 
74
70
  return qc