qiskit 1.0.2__cp38-abi3-win32.whl → 1.1.0__cp38-abi3-win32.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 (263) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +27 -16
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +5 -10
  6. qiskit/assembler/disassemble.py +5 -6
  7. qiskit/circuit/__init__.py +1061 -232
  8. qiskit/circuit/_classical_resource_map.py +10 -6
  9. qiskit/circuit/_utils.py +18 -8
  10. qiskit/circuit/annotated_operation.py +21 -0
  11. qiskit/circuit/barrier.py +10 -13
  12. qiskit/circuit/bit.py +0 -1
  13. qiskit/circuit/classical/__init__.py +2 -2
  14. qiskit/circuit/classical/expr/__init__.py +39 -5
  15. qiskit/circuit/classical/expr/constructors.py +84 -1
  16. qiskit/circuit/classical/expr/expr.py +83 -13
  17. qiskit/circuit/classical/expr/visitors.py +83 -0
  18. qiskit/circuit/classical/types/__init__.py +5 -4
  19. qiskit/circuit/classicalfunction/__init__.py +1 -0
  20. qiskit/circuit/commutation_checker.py +86 -51
  21. qiskit/circuit/controlflow/_builder_utils.py +9 -1
  22. qiskit/circuit/controlflow/break_loop.py +8 -22
  23. qiskit/circuit/controlflow/builder.py +116 -1
  24. qiskit/circuit/controlflow/continue_loop.py +8 -22
  25. qiskit/circuit/controlflow/control_flow.py +47 -8
  26. qiskit/circuit/controlflow/for_loop.py +8 -23
  27. qiskit/circuit/controlflow/if_else.py +13 -27
  28. qiskit/circuit/controlflow/switch_case.py +14 -21
  29. qiskit/circuit/controlflow/while_loop.py +9 -23
  30. qiskit/circuit/controlledgate.py +2 -2
  31. qiskit/circuit/delay.py +7 -5
  32. qiskit/circuit/gate.py +20 -7
  33. qiskit/circuit/instruction.py +31 -30
  34. qiskit/circuit/instructionset.py +9 -22
  35. qiskit/circuit/library/__init__.py +3 -13
  36. qiskit/circuit/library/arithmetic/integer_comparator.py +2 -2
  37. qiskit/circuit/library/arithmetic/quadratic_form.py +3 -2
  38. qiskit/circuit/library/blueprintcircuit.py +29 -7
  39. qiskit/circuit/library/data_preparation/state_preparation.py +6 -5
  40. qiskit/circuit/library/generalized_gates/diagonal.py +5 -4
  41. qiskit/circuit/library/generalized_gates/isometry.py +51 -254
  42. qiskit/circuit/library/generalized_gates/pauli.py +2 -2
  43. qiskit/circuit/library/generalized_gates/permutation.py +4 -1
  44. qiskit/circuit/library/generalized_gates/rv.py +15 -11
  45. qiskit/circuit/library/generalized_gates/uc.py +2 -98
  46. qiskit/circuit/library/generalized_gates/unitary.py +9 -4
  47. qiskit/circuit/library/hamiltonian_gate.py +11 -5
  48. qiskit/circuit/library/n_local/efficient_su2.py +5 -5
  49. qiskit/circuit/library/n_local/n_local.py +100 -49
  50. qiskit/circuit/library/n_local/two_local.py +3 -59
  51. qiskit/circuit/library/overlap.py +3 -3
  52. qiskit/circuit/library/phase_oracle.py +1 -1
  53. qiskit/circuit/library/quantum_volume.py +39 -38
  54. qiskit/circuit/library/standard_gates/equivalence_library.py +50 -0
  55. qiskit/circuit/library/standard_gates/global_phase.py +4 -2
  56. qiskit/circuit/library/standard_gates/i.py +1 -2
  57. qiskit/circuit/library/standard_gates/iswap.py +1 -2
  58. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +11 -5
  59. qiskit/circuit/library/standard_gates/p.py +31 -15
  60. qiskit/circuit/library/standard_gates/r.py +4 -3
  61. qiskit/circuit/library/standard_gates/rx.py +7 -4
  62. qiskit/circuit/library/standard_gates/rxx.py +4 -3
  63. qiskit/circuit/library/standard_gates/ry.py +7 -4
  64. qiskit/circuit/library/standard_gates/ryy.py +4 -3
  65. qiskit/circuit/library/standard_gates/rz.py +7 -4
  66. qiskit/circuit/library/standard_gates/rzx.py +4 -3
  67. qiskit/circuit/library/standard_gates/rzz.py +4 -3
  68. qiskit/circuit/library/standard_gates/s.py +4 -8
  69. qiskit/circuit/library/standard_gates/t.py +2 -4
  70. qiskit/circuit/library/standard_gates/u.py +16 -11
  71. qiskit/circuit/library/standard_gates/u1.py +6 -2
  72. qiskit/circuit/library/standard_gates/u2.py +4 -2
  73. qiskit/circuit/library/standard_gates/u3.py +9 -5
  74. qiskit/circuit/library/standard_gates/x.py +22 -11
  75. qiskit/circuit/library/standard_gates/xx_minus_yy.py +4 -3
  76. qiskit/circuit/library/standard_gates/xx_plus_yy.py +7 -5
  77. qiskit/circuit/library/standard_gates/z.py +1 -2
  78. qiskit/circuit/measure.py +4 -1
  79. qiskit/circuit/operation.py +13 -8
  80. qiskit/circuit/parameter.py +11 -6
  81. qiskit/circuit/quantumcircuit.py +1910 -260
  82. qiskit/circuit/quantumcircuitdata.py +2 -2
  83. qiskit/circuit/reset.py +5 -2
  84. qiskit/circuit/store.py +95 -0
  85. qiskit/compiler/assembler.py +22 -22
  86. qiskit/compiler/transpiler.py +63 -112
  87. qiskit/converters/__init__.py +17 -2
  88. qiskit/converters/circuit_to_dag.py +7 -0
  89. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  90. qiskit/converters/circuit_to_gate.py +2 -0
  91. qiskit/converters/circuit_to_instruction.py +22 -0
  92. qiskit/converters/dag_to_circuit.py +4 -0
  93. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  94. qiskit/dagcircuit/collect_blocks.py +15 -10
  95. qiskit/dagcircuit/dagcircuit.py +434 -124
  96. qiskit/dagcircuit/dagdependency.py +19 -12
  97. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  98. qiskit/dagcircuit/dagdepnode.py +19 -16
  99. qiskit/dagcircuit/dagnode.py +14 -4
  100. qiskit/passmanager/passmanager.py +11 -11
  101. qiskit/primitives/__init__.py +22 -12
  102. qiskit/primitives/backend_estimator.py +3 -5
  103. qiskit/primitives/backend_estimator_v2.py +410 -0
  104. qiskit/primitives/backend_sampler_v2.py +287 -0
  105. qiskit/primitives/base/base_estimator.py +4 -9
  106. qiskit/primitives/base/base_sampler.py +2 -2
  107. qiskit/primitives/containers/__init__.py +6 -4
  108. qiskit/primitives/containers/bit_array.py +293 -2
  109. qiskit/primitives/containers/data_bin.py +123 -50
  110. qiskit/primitives/containers/estimator_pub.py +10 -3
  111. qiskit/primitives/containers/observables_array.py +2 -2
  112. qiskit/primitives/containers/pub_result.py +1 -1
  113. qiskit/primitives/containers/sampler_pub.py +19 -3
  114. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  115. qiskit/primitives/containers/shape.py +4 -4
  116. qiskit/primitives/statevector_estimator.py +4 -4
  117. qiskit/primitives/statevector_sampler.py +7 -12
  118. qiskit/providers/__init__.py +65 -34
  119. qiskit/providers/backend.py +2 -2
  120. qiskit/providers/backend_compat.py +8 -10
  121. qiskit/providers/basic_provider/__init__.py +2 -23
  122. qiskit/providers/basic_provider/basic_provider_tools.py +67 -31
  123. qiskit/providers/basic_provider/basic_simulator.py +81 -21
  124. qiskit/providers/fake_provider/__init__.py +1 -1
  125. qiskit/providers/fake_provider/fake_1q.py +1 -1
  126. qiskit/providers/fake_provider/fake_backend.py +3 -408
  127. qiskit/providers/fake_provider/generic_backend_v2.py +26 -14
  128. qiskit/providers/models/__init__.py +2 -2
  129. qiskit/providers/provider.py +16 -0
  130. qiskit/pulse/builder.py +4 -1
  131. qiskit/pulse/parameter_manager.py +60 -4
  132. qiskit/pulse/schedule.py +29 -13
  133. qiskit/pulse/utils.py +61 -20
  134. qiskit/qasm2/__init__.py +1 -5
  135. qiskit/qasm2/parse.py +1 -4
  136. qiskit/qasm3/__init__.py +42 -5
  137. qiskit/qasm3/ast.py +19 -0
  138. qiskit/qasm3/exporter.py +178 -106
  139. qiskit/qasm3/printer.py +27 -5
  140. qiskit/qobj/converters/pulse_instruction.py +6 -6
  141. qiskit/qpy/__init__.py +299 -67
  142. qiskit/qpy/binary_io/circuits.py +216 -47
  143. qiskit/qpy/binary_io/schedules.py +42 -36
  144. qiskit/qpy/binary_io/value.py +201 -22
  145. qiskit/qpy/common.py +1 -1
  146. qiskit/qpy/exceptions.py +20 -0
  147. qiskit/qpy/formats.py +29 -0
  148. qiskit/qpy/type_keys.py +21 -0
  149. qiskit/quantum_info/analysis/distance.py +3 -3
  150. qiskit/quantum_info/analysis/make_observable.py +2 -1
  151. qiskit/quantum_info/analysis/z2_symmetries.py +2 -1
  152. qiskit/quantum_info/operators/channel/chi.py +9 -8
  153. qiskit/quantum_info/operators/channel/choi.py +10 -9
  154. qiskit/quantum_info/operators/channel/kraus.py +2 -1
  155. qiskit/quantum_info/operators/channel/ptm.py +10 -9
  156. qiskit/quantum_info/operators/channel/quantum_channel.py +2 -1
  157. qiskit/quantum_info/operators/channel/stinespring.py +2 -1
  158. qiskit/quantum_info/operators/channel/superop.py +12 -11
  159. qiskit/quantum_info/operators/channel/transformations.py +12 -11
  160. qiskit/quantum_info/operators/dihedral/dihedral.py +5 -4
  161. qiskit/quantum_info/operators/operator.py +43 -30
  162. qiskit/quantum_info/operators/scalar_op.py +10 -9
  163. qiskit/quantum_info/operators/symplectic/base_pauli.py +70 -59
  164. qiskit/quantum_info/operators/symplectic/clifford.py +36 -9
  165. qiskit/quantum_info/operators/symplectic/pauli.py +53 -6
  166. qiskit/quantum_info/operators/symplectic/pauli_list.py +36 -14
  167. qiskit/quantum_info/operators/symplectic/random.py +3 -2
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +61 -36
  169. qiskit/quantum_info/states/densitymatrix.py +13 -13
  170. qiskit/quantum_info/states/stabilizerstate.py +3 -3
  171. qiskit/quantum_info/states/statevector.py +14 -13
  172. qiskit/quantum_info/states/utils.py +5 -3
  173. qiskit/result/__init__.py +6 -0
  174. qiskit/result/mitigation/correlated_readout_mitigator.py +3 -2
  175. qiskit/result/mitigation/local_readout_mitigator.py +2 -1
  176. qiskit/result/mitigation/utils.py +3 -2
  177. qiskit/scheduler/__init__.py +10 -1
  178. qiskit/scheduler/methods/__init__.py +1 -8
  179. qiskit/synthesis/__init__.py +3 -6
  180. qiskit/synthesis/discrete_basis/commutator_decompose.py +2 -2
  181. qiskit/synthesis/evolution/lie_trotter.py +7 -14
  182. qiskit/synthesis/evolution/qdrift.py +3 -4
  183. qiskit/synthesis/linear/cnot_synth.py +1 -3
  184. qiskit/synthesis/linear/linear_circuits_utils.py +1 -1
  185. qiskit/synthesis/linear_phase/cz_depth_lnn.py +4 -18
  186. qiskit/synthesis/permutation/__init__.py +1 -0
  187. qiskit/synthesis/permutation/permutation_reverse_lnn.py +90 -0
  188. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -6
  189. qiskit/synthesis/two_qubit/two_qubit_decompose.py +165 -954
  190. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +13 -12
  191. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +7 -1
  192. qiskit/synthesis/unitary/aqc/__init__.py +1 -1
  193. qiskit/synthesis/unitary/aqc/cnot_structures.py +2 -1
  194. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +2 -1
  195. qiskit/synthesis/unitary/qsd.py +3 -2
  196. qiskit/transpiler/__init__.py +7 -3
  197. qiskit/transpiler/layout.py +140 -61
  198. qiskit/transpiler/passes/__init__.py +10 -2
  199. qiskit/transpiler/passes/basis/basis_translator.py +9 -4
  200. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  201. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  202. qiskit/transpiler/passes/calibration/rzx_builder.py +2 -1
  203. qiskit/transpiler/passes/layout/apply_layout.py +8 -3
  204. qiskit/transpiler/passes/layout/sabre_layout.py +15 -3
  205. qiskit/transpiler/passes/layout/set_layout.py +1 -1
  206. qiskit/transpiler/passes/optimization/__init__.py +2 -0
  207. qiskit/transpiler/passes/optimization/commutation_analysis.py +2 -2
  208. qiskit/transpiler/passes/optimization/commutative_cancellation.py +1 -1
  209. qiskit/transpiler/passes/optimization/consolidate_blocks.py +1 -1
  210. qiskit/transpiler/passes/optimization/cx_cancellation.py +10 -0
  211. qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
  212. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +9 -3
  213. qiskit/transpiler/passes/optimization/optimize_annotated.py +248 -12
  214. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  215. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +1 -3
  216. qiskit/transpiler/passes/routing/__init__.py +1 -0
  217. qiskit/transpiler/passes/routing/basic_swap.py +13 -2
  218. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +8 -1
  219. qiskit/transpiler/passes/routing/lookahead_swap.py +7 -1
  220. qiskit/transpiler/passes/routing/sabre_swap.py +10 -6
  221. qiskit/transpiler/passes/routing/star_prerouting.py +417 -0
  222. qiskit/transpiler/passes/routing/stochastic_swap.py +24 -8
  223. qiskit/transpiler/passes/scheduling/__init__.py +1 -1
  224. qiskit/transpiler/passes/scheduling/alap.py +1 -2
  225. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +1 -2
  226. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +9 -6
  227. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +8 -0
  228. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +13 -4
  229. qiskit/transpiler/passes/scheduling/asap.py +1 -2
  230. qiskit/transpiler/passes/scheduling/base_scheduler.py +21 -2
  231. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +26 -4
  232. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +24 -2
  233. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +28 -4
  234. qiskit/transpiler/passes/synthesis/aqc_plugin.py +2 -2
  235. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +120 -13
  236. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +162 -55
  237. qiskit/transpiler/passes/utils/gates_basis.py +3 -3
  238. qiskit/transpiler/passmanager.py +44 -1
  239. qiskit/transpiler/preset_passmanagers/__init__.py +3 -3
  240. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +34 -16
  241. qiskit/transpiler/preset_passmanagers/common.py +4 -6
  242. qiskit/transpiler/preset_passmanagers/plugin.py +9 -1
  243. qiskit/utils/__init__.py +3 -2
  244. qiskit/utils/optionals.py +6 -2
  245. qiskit/utils/parallel.py +24 -15
  246. qiskit/visualization/array.py +1 -1
  247. qiskit/visualization/bloch.py +2 -3
  248. qiskit/visualization/circuit/matplotlib.py +44 -14
  249. qiskit/visualization/circuit/text.py +38 -18
  250. qiskit/visualization/counts_visualization.py +3 -6
  251. qiskit/visualization/dag_visualization.py +6 -7
  252. qiskit/visualization/gate_map.py +9 -1
  253. qiskit/visualization/pulse_v2/interface.py +8 -3
  254. qiskit/visualization/state_visualization.py +3 -2
  255. qiskit/visualization/timeline/interface.py +18 -8
  256. {qiskit-1.0.2.dist-info → qiskit-1.1.0.dist-info}/METADATA +12 -8
  257. {qiskit-1.0.2.dist-info → qiskit-1.1.0.dist-info}/RECORD +261 -251
  258. {qiskit-1.0.2.dist-info → qiskit-1.1.0.dist-info}/WHEEL +1 -1
  259. qiskit/_qasm2.pyd +0 -0
  260. qiskit/_qasm3.pyd +0 -0
  261. {qiskit-1.0.2.dist-info → qiskit-1.1.0.dist-info}/LICENSE.txt +0 -0
  262. {qiskit-1.0.2.dist-info → qiskit-1.1.0.dist-info}/entry_points.txt +0 -0
  263. {qiskit-1.0.2.dist-info → qiskit-1.1.0.dist-info}/top_level.txt +0 -0
@@ -11,7 +11,8 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """Two-pulse single-qubit gate."""
14
- import copy
14
+ import cmath
15
+ import copy as _copy
15
16
  import math
16
17
  from cmath import exp
17
18
  from typing import Optional, Union
@@ -135,8 +136,10 @@ class UGate(Gate):
135
136
  )
136
137
  return gate
137
138
 
138
- def __array__(self, dtype=complex):
139
+ def __array__(self, dtype=None, copy=None):
139
140
  """Return a numpy.array for the U gate."""
141
+ if copy is False:
142
+ raise ValueError("unable to avoid copy while creating an array as requested")
140
143
  theta, phi, lam = (float(param) for param in self.params)
141
144
  cos = math.cos(theta / 2)
142
145
  sin = math.sin(theta / 2)
@@ -145,7 +148,7 @@ class UGate(Gate):
145
148
  [cos, -exp(1j * lam) * sin],
146
149
  [exp(1j * phi) * sin, exp(1j * (phi + lam)) * cos],
147
150
  ],
148
- dtype=dtype,
151
+ dtype=dtype or complex,
149
152
  )
150
153
 
151
154
  def __eq__(self, other):
@@ -336,15 +339,17 @@ class CUGate(ControlledGate):
336
339
  ctrl_state=self.ctrl_state,
337
340
  )
338
341
 
339
- def __array__(self, dtype=None):
342
+ def __array__(self, dtype=None, copy=None):
340
343
  """Return a numpy.array for the CU gate."""
344
+ if copy is False:
345
+ raise ValueError("unable to avoid copy while creating an array as requested")
341
346
  theta, phi, lam, gamma = (float(param) for param in self.params)
342
- cos = numpy.cos(theta / 2)
343
- sin = numpy.sin(theta / 2)
344
- a = numpy.exp(1j * gamma) * cos
345
- b = -numpy.exp(1j * (gamma + lam)) * sin
346
- c = numpy.exp(1j * (gamma + phi)) * sin
347
- d = numpy.exp(1j * (gamma + phi + lam)) * cos
347
+ cos = math.cos(theta / 2)
348
+ sin = math.sin(theta / 2)
349
+ a = cmath.exp(1j * gamma) * cos
350
+ b = -cmath.exp(1j * (gamma + lam)) * sin
351
+ c = cmath.exp(1j * (gamma + phi)) * sin
352
+ d = cmath.exp(1j * (gamma + phi + lam)) * cos
348
353
  if self.ctrl_state:
349
354
  return numpy.array(
350
355
  [[1, 0, 0, 0], [0, a, 0, b], [0, 0, 1, 0], [0, c, 0, d]], dtype=dtype
@@ -371,5 +376,5 @@ class CUGate(ControlledGate):
371
376
  # assuming that `params` will be a view onto the base gate's `_params`.
372
377
  memo = memo if memo is not None else {}
373
378
  out = super().__deepcopy__(memo)
374
- out._params = copy.deepcopy(out._params, memo)
379
+ out._params = _copy.deepcopy(out._params, memo)
375
380
  return out
@@ -160,8 +160,10 @@ class U1Gate(Gate):
160
160
  """
161
161
  return U1Gate(-self.params[0])
162
162
 
163
- def __array__(self, dtype=None):
163
+ def __array__(self, dtype=None, copy=None):
164
164
  """Return a numpy.array for the U1 gate."""
165
+ if copy is False:
166
+ raise ValueError("unable to avoid copy while creating an array as requested")
165
167
  lam = float(self.params[0])
166
168
  return numpy.array([[1, 0], [0, numpy.exp(1j * lam)]], dtype=dtype)
167
169
 
@@ -304,8 +306,10 @@ class CU1Gate(ControlledGate):
304
306
  """
305
307
  return CU1Gate(-self.params[0], ctrl_state=self.ctrl_state)
306
308
 
307
- def __array__(self, dtype=None):
309
+ def __array__(self, dtype=None, copy=None):
308
310
  """Return a numpy.array for the CU1 gate."""
311
+ if copy is False:
312
+ raise ValueError("unable to avoid copy while creating an array as requested")
309
313
  eith = exp(1j * float(self.params[0]))
310
314
  if self.ctrl_state:
311
315
  return numpy.array(
@@ -127,8 +127,10 @@ class U2Gate(Gate):
127
127
  """
128
128
  return U2Gate(-self.params[1] - pi, -self.params[0] + pi)
129
129
 
130
- def __array__(self, dtype=complex):
130
+ def __array__(self, dtype=None, copy=None):
131
131
  """Return a Numpy.array for the U2 gate."""
132
+ if copy is False:
133
+ raise ValueError("unable to avoid copy while creating an array as requested")
132
134
  isqrt2 = 1 / sqrt(2)
133
135
  phi, lam = self.params
134
136
  phi, lam = float(phi), float(lam)
@@ -137,5 +139,5 @@ class U2Gate(Gate):
137
139
  [isqrt2, -exp(1j * lam) * isqrt2],
138
140
  [exp(1j * phi) * isqrt2, exp(1j * (phi + lam)) * isqrt2],
139
141
  ],
140
- dtype=dtype,
142
+ dtype=dtype or complex,
141
143
  )
@@ -149,8 +149,10 @@ class U3Gate(Gate):
149
149
  qc.u(self.params[0], self.params[1], self.params[2], 0)
150
150
  self.definition = qc
151
151
 
152
- def __array__(self, dtype=complex):
152
+ def __array__(self, dtype=None, copy=None):
153
153
  """Return a Numpy.array for the U3 gate."""
154
+ if copy is False:
155
+ raise ValueError("unable to avoid copy while creating an array as requested")
154
156
  theta, phi, lam = self.params
155
157
  theta, phi, lam = float(theta), float(phi), float(lam)
156
158
  cos = math.cos(theta / 2)
@@ -160,7 +162,7 @@ class U3Gate(Gate):
160
162
  [cos, -exp(1j * lam) * sin],
161
163
  [exp(1j * phi) * sin, exp(1j * (phi + lam)) * cos],
162
164
  ],
163
- dtype=dtype,
165
+ dtype=dtype or complex,
164
166
  )
165
167
 
166
168
 
@@ -305,8 +307,10 @@ class CU3Gate(ControlledGate):
305
307
  -self.params[0], -self.params[2], -self.params[1], ctrl_state=self.ctrl_state
306
308
  )
307
309
 
308
- def __array__(self, dtype=complex):
310
+ def __array__(self, dtype=None, copy=None):
309
311
  """Return a numpy.array for the CU3 gate."""
312
+ if copy is False:
313
+ raise ValueError("unable to avoid copy while creating an array as requested")
310
314
  theta, phi, lam = self.params
311
315
  theta, phi, lam = float(theta), float(phi), float(lam)
312
316
  cos = math.cos(theta / 2)
@@ -319,7 +323,7 @@ class CU3Gate(ControlledGate):
319
323
  [0, 0, 1, 0],
320
324
  [0, exp(1j * phi) * sin, 0, exp(1j * (phi + lam)) * cos],
321
325
  ],
322
- dtype=dtype,
326
+ dtype=dtype or complex,
323
327
  )
324
328
  else:
325
329
  return numpy.array(
@@ -329,7 +333,7 @@ class CU3Gate(ControlledGate):
329
333
  [exp(1j * phi) * sin, 0, exp(1j * (phi + lam)) * cos, 0],
330
334
  [0, 0, 0, 1],
331
335
  ],
332
- dtype=dtype,
336
+ dtype=dtype or complex,
333
337
  )
334
338
 
335
339
 
@@ -107,7 +107,7 @@ class XGate(SingletonGate):
107
107
  num_ctrl_qubits: number of control qubits.
108
108
  label: An optional label for the gate [Default: ``None``]
109
109
  ctrl_state: control state expressed as integer,
110
- string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
110
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
111
111
  annotated: indicates whether the controlled gate can be implemented
112
112
  as an annotated gate.
113
113
 
@@ -250,7 +250,7 @@ class CXGate(SingletonControlledGate):
250
250
  num_ctrl_qubits: number of control qubits.
251
251
  label: An optional label for the gate [Default: ``None``]
252
252
  ctrl_state: control state expressed as integer,
253
- string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
253
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
254
254
  annotated: indicates whether the controlled gate can be implemented
255
255
  as an annotated gate.
256
256
 
@@ -444,7 +444,7 @@ class CCXGate(SingletonControlledGate):
444
444
  num_ctrl_qubits: number of control qubits.
445
445
  label: An optional label for the gate [Default: ``None``]
446
446
  ctrl_state: control state expressed as integer,
447
- string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
447
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
448
448
  annotated: indicates whether the controlled gate can be implemented
449
449
  as an annotated gate.
450
450
 
@@ -585,7 +585,7 @@ class C3SXGate(SingletonControlledGate):
585
585
  Args:
586
586
  label: An optional label for the gate [Default: ``None``]
587
587
  ctrl_state: control state expressed as integer,
588
- string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
588
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
589
589
  """
590
590
  from .sx import SXGate
591
591
 
@@ -785,7 +785,7 @@ class C3XGate(SingletonControlledGate):
785
785
  num_ctrl_qubits: number of control qubits.
786
786
  label: An optional label for the gate [Default: ``None``]
787
787
  ctrl_state: control state expressed as integer,
788
- string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
788
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
789
789
  annotated: indicates whether the controlled gate can be implemented
790
790
  as an annotated gate.
791
791
 
@@ -1029,7 +1029,7 @@ class C4XGate(SingletonControlledGate):
1029
1029
  num_ctrl_qubits: number of control qubits.
1030
1030
  label: An optional label for the gate [Default: ``None``]
1031
1031
  ctrl_state: control state expressed as integer,
1032
- string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
1032
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
1033
1033
  annotated: indicates whether the controlled gate can be implemented
1034
1034
  as an annotated gate.
1035
1035
 
@@ -1095,7 +1095,7 @@ class MCXGate(ControlledGate):
1095
1095
  explicit CX, CCX, C3X or C4X instance or a generic MCX gate.
1096
1096
  """
1097
1097
  # The CXGate and CCXGate will be implemented for all modes of the MCX, and
1098
- # the C3XGate and C4XGate will be implemented in the MCXGrayCode class.
1098
+ # the C3XGate and C4XGate are handled in the gate definition.
1099
1099
  explicit: dict[int, Type[ControlledGate]] = {1: CXGate, 2: CCXGate}
1100
1100
  gate_class = explicit.get(num_ctrl_qubits, None)
1101
1101
  if gate_class is not None:
@@ -1166,14 +1166,25 @@ class MCXGate(ControlledGate):
1166
1166
  raise AttributeError(f"Unsupported mode ({mode}) specified!")
1167
1167
 
1168
1168
  def _define(self):
1169
- """The standard definition used the Gray code implementation."""
1169
+ """This definition is based on MCPhaseGate implementation."""
1170
1170
  # pylint: disable=cyclic-import
1171
1171
  from qiskit.circuit.quantumcircuit import QuantumCircuit
1172
1172
 
1173
1173
  q = QuantumRegister(self.num_qubits, name="q")
1174
1174
  qc = QuantumCircuit(q)
1175
- qc._append(MCXGrayCode(self.num_ctrl_qubits), q[:], [])
1176
- self.definition = qc
1175
+ if self.num_qubits == 4:
1176
+ qc._append(C3XGate(), q[:], [])
1177
+ self.definition = qc
1178
+ elif self.num_qubits == 5:
1179
+ qc._append(C4XGate(), q[:], [])
1180
+ self.definition = qc
1181
+ else:
1182
+ q_controls = list(range(self.num_ctrl_qubits))
1183
+ q_target = self.num_ctrl_qubits
1184
+ qc.h(q_target)
1185
+ qc.mcp(numpy.pi, q_controls, q_target)
1186
+ qc.h(q_target)
1187
+ self.definition = qc
1177
1188
 
1178
1189
  @property
1179
1190
  def num_ancilla_qubits(self):
@@ -1193,7 +1204,7 @@ class MCXGate(ControlledGate):
1193
1204
  num_ctrl_qubits: number of control qubits.
1194
1205
  label: An optional label for the gate [Default: ``None``]
1195
1206
  ctrl_state: control state expressed as integer,
1196
- string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
1207
+ string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
1197
1208
  annotated: indicates whether the controlled gate can be implemented
1198
1209
  as an annotated gate.
1199
1210
 
@@ -169,8 +169,10 @@ class XXMinusYYGate(Gate):
169
169
  theta, beta = self.params
170
170
  return XXMinusYYGate(-theta, beta)
171
171
 
172
- def __array__(self, dtype=complex):
172
+ def __array__(self, dtype=None, copy=None):
173
173
  """Gate matrix."""
174
+ if copy is False:
175
+ raise ValueError("unable to avoid copy while creating an array as requested")
174
176
  theta, beta = self.params
175
177
  cos = math.cos(theta / 2)
176
178
  sin = math.sin(theta / 2)
@@ -184,8 +186,7 @@ class XXMinusYYGate(Gate):
184
186
  dtype=dtype,
185
187
  )
186
188
 
187
- def power(self, exponent: float):
188
- """Raise gate to a power."""
189
+ def power(self, exponent: float, annotated: bool = False):
189
190
  theta, beta = self.params
190
191
  return XXMinusYYGate(exponent * theta, beta)
191
192
 
@@ -15,6 +15,9 @@ import math
15
15
  from cmath import exp
16
16
  from math import pi
17
17
  from typing import Optional
18
+
19
+ import numpy
20
+
18
21
  from qiskit.circuit.gate import Gate
19
22
  from qiskit.circuit.quantumregister import QuantumRegister
20
23
  from qiskit.circuit.parameterexpression import ParameterValueType
@@ -167,10 +170,10 @@ class XXPlusYYGate(Gate):
167
170
  """
168
171
  return XXPlusYYGate(-self.params[0], self.params[1])
169
172
 
170
- def __array__(self, dtype=complex):
173
+ def __array__(self, dtype=None, copy=None):
171
174
  """Return a numpy.array for the XX+YY gate."""
172
- import numpy
173
-
175
+ if copy is False:
176
+ raise ValueError("unable to avoid copy while creating an array as requested")
174
177
  half_theta = float(self.params[0]) / 2
175
178
  beta = float(self.params[1])
176
179
  cos = math.cos(half_theta)
@@ -185,8 +188,7 @@ class XXPlusYYGate(Gate):
185
188
  dtype=dtype,
186
189
  )
187
190
 
188
- def power(self, exponent: float):
189
- """Raise gate to a power."""
191
+ def power(self, exponent: float, annotated: bool = False):
190
192
  theta, beta = self.params
191
193
  return XXPlusYYGate(exponent * theta, beta)
192
194
 
@@ -140,8 +140,7 @@ class ZGate(SingletonGate):
140
140
  """
141
141
  return ZGate() # self-inverse
142
142
 
143
- def power(self, exponent: float):
144
- """Raise gate to a power."""
143
+ def power(self, exponent: float, annotated: bool = False):
145
144
  return PhaseGate(numpy.pi * exponent)
146
145
 
147
146
  def __eq__(self, other):
qiskit/circuit/measure.py CHANGED
@@ -22,7 +22,10 @@ class Measure(SingletonInstruction):
22
22
  """Quantum measurement in the computational basis."""
23
23
 
24
24
  def __init__(self, label=None, *, duration=None, unit="dt"):
25
- """Create new measurement instruction."""
25
+ """
26
+ Args:
27
+ label: optional string label for this instruction.
28
+ """
26
29
  super().__init__("measure", 1, 1, [], label=label, duration=duration, unit=unit)
27
30
 
28
31
  _singleton_lookup_key = stdlib_singleton_key()
@@ -16,17 +16,22 @@ from abc import ABC, abstractmethod
16
16
 
17
17
 
18
18
  class Operation(ABC):
19
- """Quantum Operation Interface Class.
20
- For objects that can be added to a :class:`~qiskit.circuit.QuantumCircuit`.
21
- These objects include :class:`~qiskit.circuit.Gate`, :class:`~qiskit.circuit.Reset`,
22
- :class:`~qiskit.circuit.Barrier`, :class:`~qiskit.circuit.Measure`,
23
- and operators such as :class:`~qiskit.quantum_info.Clifford`.
24
- The main purpose is to add an :class:`~qiskit.circuit.Operation` to a
25
- :class:`~qiskit.circuit.QuantumCircuit` without synthesizing it before the transpilation.
19
+ """Quantum operation interface.
20
+
21
+ The minimal interface that any object must fulfil in order to be added to a
22
+ :class:`.QuantumCircuit`.
23
+
24
+ Concrete instances of this interface include :class:`~qiskit.circuit.Gate`,
25
+ :class:`~qiskit.circuit.Reset`, :class:`~qiskit.circuit.Barrier`,
26
+ :class:`~qiskit.circuit.Measure`, and operators such as :class:`~qiskit.quantum_info.Clifford`.
27
+
28
+ The main purpose is to add allow abstract mathematical objects to be added directly onto
29
+ abstract circuits, and for the exact syntheses of these to be determined later, during
30
+ compilation.
26
31
 
27
32
  Example:
28
33
 
29
- Add a Clifford and a Toffoli gate to a QuantumCircuit.
34
+ Add a Clifford and a Toffoli gate to a :class:`QuantumCircuit`.
30
35
 
31
36
  .. plot::
32
37
  :include-source:
@@ -25,10 +25,16 @@ from .parameterexpression import ParameterExpression
25
25
 
26
26
 
27
27
  class Parameter(ParameterExpression):
28
- """Parameter Class for variable parameters.
28
+ """A compile-time symbolic parameter.
29
29
 
30
- A parameter is a variable value that is not required to be fixed
31
- at circuit definition.
30
+ The value of a :class:`Parameter` must be entirely determined before a circuit begins execution.
31
+ Typically this will mean that you should supply values for all :class:`Parameter`\\ s in a
32
+ circuit using :meth:`.QuantumCircuit.assign_parameters`, though certain hardware vendors may
33
+ allow you to give them a circuit in terms of these parameters, provided you also pass the values
34
+ separately.
35
+
36
+ This is the atom of :class:`.ParameterExpression`, and is itself an expression. The numeric
37
+ value of a parameter need not be fixed while the circuit is being defined.
32
38
 
33
39
  Examples:
34
40
 
@@ -62,11 +68,10 @@ class Parameter(ParameterExpression):
62
68
  def __init__(
63
69
  self, name: str, *, uuid: UUID | None = None
64
70
  ): # pylint: disable=super-init-not-called
65
- """Create a new named :class:`Parameter`.
66
-
71
+ """
67
72
  Args:
68
73
  name: name of the ``Parameter``, used for visual representation. This can
69
- be any unicode string, e.g. "ϕ".
74
+ be any Unicode string, e.g. "ϕ".
70
75
  uuid: For advanced usage only. Override the UUID of this parameter, in order to make it
71
76
  compare equal to some other parameter object. By default, two parameters with the
72
77
  same name do not compare equal to help catch shadowing bugs when two circuits