qiskit 1.3.0b1__cp39-abi3-macosx_11_0_arm64.whl → 1.3.0rc1__cp39-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 (359) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +20 -1
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/assembler/assemble_schedules.py +2 -0
  5. qiskit/circuit/__init__.py +44 -1
  6. qiskit/circuit/_standard_gates_commutations.py +585 -0
  7. qiskit/circuit/barrier.py +2 -0
  8. qiskit/circuit/controlflow/builder.py +3 -3
  9. qiskit/circuit/controlflow/if_else.py +13 -5
  10. qiskit/circuit/controlflow/while_loop.py +10 -2
  11. qiskit/circuit/delay.py +20 -3
  12. qiskit/circuit/equivalence.py +13 -214
  13. qiskit/circuit/gate.py +3 -1
  14. qiskit/circuit/instruction.py +32 -11
  15. qiskit/circuit/instructionset.py +2 -0
  16. qiskit/circuit/library/__init__.py +83 -14
  17. qiskit/circuit/library/arithmetic/__init__.py +9 -2
  18. qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
  19. qiskit/circuit/library/arithmetic/adders/adder.py +153 -1
  20. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
  21. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
  22. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
  23. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  24. qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
  25. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
  26. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
  27. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
  28. qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
  29. qiskit/circuit/library/basis_change/qft.py +20 -38
  30. qiskit/circuit/library/blueprintcircuit.py +64 -0
  31. qiskit/circuit/library/boolean_logic/__init__.py +4 -4
  32. qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
  33. qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
  34. qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
  35. qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
  36. qiskit/circuit/library/data_preparation/__init__.py +6 -3
  37. qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
  38. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  39. qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
  40. qiskit/circuit/library/fourier_checking.py +72 -11
  41. qiskit/circuit/library/generalized_gates/__init__.py +1 -1
  42. qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
  43. qiskit/circuit/library/generalized_gates/gms.py +67 -14
  44. qiskit/circuit/library/generalized_gates/gr.py +4 -4
  45. qiskit/circuit/library/generalized_gates/isometry.py +2 -2
  46. qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
  47. qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
  48. qiskit/circuit/library/generalized_gates/permutation.py +8 -6
  49. qiskit/circuit/library/generalized_gates/rv.py +8 -9
  50. qiskit/circuit/library/graph_state.py +93 -10
  51. qiskit/circuit/library/grover_operator.py +270 -2
  52. qiskit/circuit/library/hidden_linear_function.py +83 -20
  53. qiskit/circuit/library/iqp.py +99 -20
  54. qiskit/circuit/library/n_local/__init__.py +19 -7
  55. qiskit/circuit/library/n_local/efficient_su2.py +118 -5
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
  57. qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
  58. qiskit/circuit/library/n_local/n_local.py +406 -5
  59. qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
  60. qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
  61. qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
  62. qiskit/circuit/library/n_local/two_local.py +14 -7
  63. qiskit/circuit/library/overlap.py +91 -26
  64. qiskit/circuit/library/pauli_evolution.py +17 -15
  65. qiskit/circuit/library/phase_estimation.py +80 -4
  66. qiskit/circuit/library/quantum_volume.py +72 -20
  67. qiskit/circuit/library/standard_gates/__init__.py +20 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +2 -1
  69. qiskit/circuit/library/standard_gates/ecr.py +2 -2
  70. qiskit/circuit/library/standard_gates/h.py +4 -3
  71. qiskit/circuit/library/standard_gates/i.py +2 -1
  72. qiskit/circuit/library/standard_gates/iswap.py +2 -2
  73. qiskit/circuit/library/standard_gates/p.py +20 -12
  74. qiskit/circuit/library/standard_gates/r.py +1 -1
  75. qiskit/circuit/library/standard_gates/rx.py +4 -3
  76. qiskit/circuit/library/standard_gates/rxx.py +2 -2
  77. qiskit/circuit/library/standard_gates/ry.py +4 -3
  78. qiskit/circuit/library/standard_gates/ryy.py +2 -2
  79. qiskit/circuit/library/standard_gates/rz.py +13 -12
  80. qiskit/circuit/library/standard_gates/rzx.py +6 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +1 -1
  82. qiskit/circuit/library/standard_gates/s.py +4 -4
  83. qiskit/circuit/library/standard_gates/swap.py +3 -3
  84. qiskit/circuit/library/standard_gates/sx.py +4 -3
  85. qiskit/circuit/library/standard_gates/t.py +2 -2
  86. qiskit/circuit/library/standard_gates/u.py +11 -3
  87. qiskit/circuit/library/standard_gates/u1.py +65 -15
  88. qiskit/circuit/library/standard_gates/u2.py +4 -1
  89. qiskit/circuit/library/standard_gates/u3.py +31 -3
  90. qiskit/circuit/library/standard_gates/x.py +7 -5
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
  93. qiskit/circuit/library/standard_gates/y.py +4 -3
  94. qiskit/circuit/library/standard_gates/z.py +3 -3
  95. qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
  96. qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
  97. qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
  98. qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
  99. qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
  100. qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
  101. qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
  102. qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
  103. qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
  104. qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
  105. qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
  106. qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
  107. qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
  108. qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
  109. qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
  110. qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
  111. qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
  112. qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
  113. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
  114. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
  115. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
  116. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
  117. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
  118. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
  119. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
  120. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
  121. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
  122. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
  123. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
  124. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
  125. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
  126. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
  127. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
  128. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
  129. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
  130. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
  131. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
  132. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
  133. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
  134. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
  135. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
  136. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
  137. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
  138. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
  139. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
  140. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
  141. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
  142. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
  143. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
  144. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
  145. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
  146. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
  147. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
  148. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
  149. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
  150. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
  151. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
  152. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
  153. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
  154. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
  155. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
  156. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
  157. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
  158. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
  159. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
  160. qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
  161. qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
  162. qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
  163. qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
  164. qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
  165. qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
  166. qiskit/circuit/parameter.py +4 -0
  167. qiskit/circuit/parameterexpression.py +167 -34
  168. qiskit/circuit/quantumcircuit.py +162 -126
  169. qiskit/circuit/singleton.py +2 -0
  170. qiskit/circuit/store.py +2 -0
  171. qiskit/circuit/twirling.py +145 -0
  172. qiskit/compiler/assembler.py +17 -4
  173. qiskit/compiler/scheduler.py +2 -0
  174. qiskit/compiler/sequencer.py +2 -0
  175. qiskit/compiler/transpiler.py +81 -26
  176. qiskit/converters/circuit_to_dag.py +2 -2
  177. qiskit/converters/circuit_to_dagdependency.py +1 -1
  178. qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
  179. qiskit/converters/circuit_to_instruction.py +1 -1
  180. qiskit/converters/dag_to_circuit.py +7 -5
  181. qiskit/converters/dag_to_dagdependency.py +1 -1
  182. qiskit/converters/dag_to_dagdependency_v2.py +1 -1
  183. qiskit/converters/dagdependency_to_circuit.py +5 -1
  184. qiskit/converters/dagdependency_to_dag.py +6 -1
  185. qiskit/dagcircuit/collect_blocks.py +3 -3
  186. qiskit/dagcircuit/dagdependency.py +18 -5
  187. qiskit/dagcircuit/dagdependency_v2.py +1 -1
  188. qiskit/dagcircuit/dagnode.py +2 -2
  189. qiskit/passmanager/__init__.py +2 -2
  190. qiskit/primitives/backend_estimator.py +5 -2
  191. qiskit/primitives/backend_sampler_v2.py +61 -18
  192. qiskit/primitives/base/base_estimator.py +2 -2
  193. qiskit/primitives/containers/data_bin.py +9 -1
  194. qiskit/primitives/statevector_sampler.py +1 -1
  195. qiskit/providers/__init__.py +1 -1
  196. qiskit/providers/backend.py +12 -1
  197. qiskit/providers/backend_compat.py +23 -3
  198. qiskit/providers/basic_provider/basic_simulator.py +12 -2
  199. qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
  200. qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
  201. qiskit/providers/models/pulsedefaults.py +2 -0
  202. qiskit/pulse/builder.py +59 -18
  203. qiskit/pulse/calibration_entries.py +4 -1
  204. qiskit/pulse/channels.py +2 -0
  205. qiskit/pulse/exceptions.py +2 -0
  206. qiskit/pulse/instruction_schedule_map.py +21 -6
  207. qiskit/pulse/instructions/acquire.py +2 -0
  208. qiskit/pulse/instructions/delay.py +2 -0
  209. qiskit/pulse/instructions/directives.py +8 -0
  210. qiskit/pulse/instructions/frequency.py +3 -0
  211. qiskit/pulse/instructions/instruction.py +2 -0
  212. qiskit/pulse/instructions/phase.py +3 -0
  213. qiskit/pulse/instructions/play.py +2 -0
  214. qiskit/pulse/instructions/reference.py +2 -0
  215. qiskit/pulse/instructions/snapshot.py +2 -0
  216. qiskit/pulse/library/pulse.py +2 -0
  217. qiskit/pulse/library/symbolic_pulses.py +28 -0
  218. qiskit/pulse/library/waveform.py +2 -0
  219. qiskit/pulse/macros.py +1 -1
  220. qiskit/pulse/schedule.py +12 -13
  221. qiskit/pulse/transforms/alignments.py +5 -3
  222. qiskit/pulse/transforms/dag.py +7 -0
  223. qiskit/qasm2/export.py +5 -3
  224. qiskit/qasm2/parse.py +46 -2
  225. qiskit/qasm3/__init__.py +1 -0
  226. qiskit/qasm3/ast.py +123 -15
  227. qiskit/qasm3/exporter.py +103 -77
  228. qiskit/qobj/converters/pulse_instruction.py +6 -4
  229. qiskit/qpy/__init__.py +181 -0
  230. qiskit/qpy/binary_io/circuits.py +20 -5
  231. qiskit/qpy/binary_io/schedules.py +3 -4
  232. qiskit/qpy/binary_io/value.py +310 -13
  233. qiskit/qpy/common.py +46 -2
  234. qiskit/qpy/formats.py +7 -0
  235. qiskit/qpy/interface.py +40 -4
  236. qiskit/quantum_info/__init__.py +4 -0
  237. qiskit/quantum_info/operators/channel/transformations.py +28 -21
  238. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  239. qiskit/quantum_info/operators/operator.py +54 -8
  240. qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
  241. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  242. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
  244. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  245. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
  246. qiskit/quantum_info/states/densitymatrix.py +5 -5
  247. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  248. qiskit/quantum_info/states/statevector.py +5 -5
  249. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  250. qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
  251. qiskit/result/mitigation/local_readout_mitigator.py +9 -1
  252. qiskit/result/mitigation/utils.py +57 -0
  253. qiskit/scheduler/config.py +2 -0
  254. qiskit/scheduler/methods/basic.py +3 -0
  255. qiskit/scheduler/schedule_circuit.py +2 -0
  256. qiskit/scheduler/sequence.py +2 -0
  257. qiskit/synthesis/__init__.py +25 -0
  258. qiskit/synthesis/arithmetic/__init__.py +16 -0
  259. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  260. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  261. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  262. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  263. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  264. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  265. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  266. qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
  267. qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
  268. qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
  269. qiskit/synthesis/evolution/__init__.py +1 -0
  270. qiskit/synthesis/evolution/lie_trotter.py +16 -42
  271. qiskit/synthesis/evolution/pauli_network.py +80 -0
  272. qiskit/synthesis/evolution/product_formula.py +165 -238
  273. qiskit/synthesis/evolution/qdrift.py +36 -29
  274. qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
  275. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  276. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  277. qiskit/synthesis/qft/qft_decompose_full.py +19 -1
  278. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
  279. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
  280. qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
  281. qiskit/synthesis/unitary/qsd.py +5 -5
  282. qiskit/transpiler/__init__.py +21 -14
  283. qiskit/transpiler/basepasses.py +1 -1
  284. qiskit/transpiler/passes/__init__.py +2 -0
  285. qiskit/transpiler/passes/basis/basis_translator.py +9 -565
  286. qiskit/transpiler/passes/basis/decompose.py +45 -12
  287. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  288. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  289. qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
  290. qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
  291. qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
  292. qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
  293. qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
  294. qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
  295. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  296. qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
  297. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  298. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  299. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  300. qiskit/transpiler/passes/optimization/consolidate_blocks.py +40 -130
  301. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
  302. qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
  303. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
  304. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  305. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  306. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  307. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  308. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  309. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  310. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  311. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  312. qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
  313. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  314. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  315. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  316. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  317. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
  318. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  319. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  320. qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
  321. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
  322. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  323. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
  324. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
  325. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
  326. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
  327. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +257 -93
  328. qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
  329. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  330. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
  331. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
  332. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
  333. qiskit/transpiler/passes/utils/gate_direction.py +12 -275
  334. qiskit/transpiler/passes/utils/gates_basis.py +7 -30
  335. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
  336. qiskit/transpiler/passmanager_config.py +22 -4
  337. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
  338. qiskit/transpiler/preset_passmanagers/common.py +5 -3
  339. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +124 -42
  340. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  341. qiskit/transpiler/target.py +74 -16
  342. qiskit/utils/deprecate_pulse.py +119 -0
  343. qiskit/visualization/circuit/_utils.py +2 -2
  344. qiskit/visualization/circuit/circuit_visualization.py +3 -2
  345. qiskit/visualization/circuit/matplotlib.py +1 -1
  346. qiskit/visualization/dag_visualization.py +1 -1
  347. qiskit/visualization/pass_manager_visualization.py +3 -14
  348. qiskit/visualization/pulse_v2/interface.py +3 -1
  349. qiskit/visualization/timeline/core.py +25 -2
  350. qiskit/visualization/timeline/interface.py +12 -0
  351. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/METADATA +3 -2
  352. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/RECORD +356 -345
  353. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/WHEEL +1 -1
  354. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/entry_points.txt +19 -0
  355. qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
  356. qiskit/synthesis/two_qubit/weyl.py +0 -97
  357. qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
  358. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/LICENSE.txt +0 -0
  359. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -14,3 +14,4 @@
14
14
 
15
15
  from .hrs_cumulative_multiplier import HRSCumulativeMultiplier
16
16
  from .rg_qft_multiplier import RGQFTMultiplier
17
+ from .multiplier import MultiplierGate
@@ -26,7 +26,7 @@ class HRSCumulativeMultiplier(Multiplier):
26
26
  the default adder is as follows (where ``Adder`` denotes the
27
27
  ``CDKMRippleCarryAdder``):
28
28
 
29
- .. parsed-literal::
29
+ .. code-block:: text
30
30
 
31
31
  a_0: ────■─────────────────────────
32
32
 
@@ -59,6 +59,13 @@ class HRSCumulativeMultiplier(Multiplier):
59
59
  a series of shifted additions using one of the input registers while the qubits
60
60
  from the other input register act as control qubits for the adders.
61
61
 
62
+ .. seealso::
63
+
64
+ The :class:`.MultiplierGate` objects represents a multiplication, like this circuit class,
65
+ but allows the compiler to select the optimal decomposition based on the context.
66
+ Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
67
+ can be chosen via ``Multiplier=["cumulative_h18"]``.
68
+
62
69
  **References:**
63
70
 
64
71
  [1] Häner et al., Optimizing Quantum Circuits for Arithmetic, 2018.
@@ -12,9 +12,10 @@
12
12
 
13
13
  """Compute the product of two equally sized qubit registers."""
14
14
 
15
- from typing import Optional
15
+ from __future__ import annotations
16
16
 
17
- from qiskit.circuit import QuantumCircuit
17
+ from qiskit.circuit import QuantumCircuit, Gate
18
+ from qiskit.utils.deprecation import deprecate_func
18
19
 
19
20
 
20
21
  class Multiplier(QuantumCircuit):
@@ -45,10 +46,19 @@ class Multiplier(QuantumCircuit):
45
46
 
46
47
  """
47
48
 
49
+ @deprecate_func(
50
+ since="1.3",
51
+ additional_msg=(
52
+ "Use the MultiplierGate provided in qiskit.circuit.library.arithmetic instead. "
53
+ "For different multiplier implementations, see "
54
+ "https://docs.quantum.ibm.com/api/qiskit/synthesis.",
55
+ ),
56
+ pending=True,
57
+ )
48
58
  def __init__(
49
59
  self,
50
60
  num_state_qubits: int,
51
- num_result_qubits: Optional[int] = None,
61
+ num_result_qubits: int | None = None,
52
62
  name: str = "Multiplier",
53
63
  ) -> None:
54
64
  """
@@ -99,3 +109,84 @@ class Multiplier(QuantumCircuit):
99
109
  The number of result qubits.
100
110
  """
101
111
  return self._num_result_qubits
112
+
113
+
114
+ class MultiplierGate(Gate):
115
+ r"""Compute the product of two equally sized qubit registers into a new register.
116
+
117
+ For two input registers :math:`|a\rangle_n`, :math:`|b\rangle_n` with :math:`n` qubits each
118
+ and an output register with :math:`2n` qubits, a multiplier performs the following operation
119
+
120
+ .. math::
121
+
122
+ |a\rangle_n |b\rangle_n |0\rangle_{t} \mapsto |a\rangle_n |b\rangle_n |a \cdot b\rangle_t
123
+
124
+ where :math:`t` is the number of bits used to represent the result. To completely store the result
125
+ of the multiplication without overflow we need :math:`t = 2n` bits.
126
+
127
+ The quantum register :math:`|a\rangle_n` (analogously :math:`|b\rangle_n` and
128
+ output register)
129
+
130
+ .. math::
131
+
132
+ |a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
133
+
134
+ for :math:`a_i \in \{0, 1\}`, is associated with the integer value
135
+
136
+ .. math::
137
+
138
+ a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
139
+
140
+ """
141
+
142
+ def __init__(
143
+ self,
144
+ num_state_qubits: int,
145
+ num_result_qubits: int | None = None,
146
+ label: str | None = None,
147
+ ) -> None:
148
+ """
149
+ Args:
150
+ num_state_qubits: The number of qubits in each of the input registers.
151
+ num_result_qubits: The number of result qubits to limit the output to.
152
+ Default value is ``2 * num_state_qubits`` to represent any possible
153
+ result from the multiplication of the two inputs.
154
+ name: The name of the circuit.
155
+ Raises:
156
+ ValueError: If ``num_state_qubits`` is smaller than 1.
157
+ ValueError: If ``num_result_qubits`` is smaller than ``num_state_qubits``.
158
+ ValueError: If ``num_result_qubits`` is larger than ``2 * num_state_qubits``.
159
+ """
160
+ if num_state_qubits < 1:
161
+ raise ValueError("The number of state qubits must be at least 1.")
162
+
163
+ if num_result_qubits is None:
164
+ num_result_qubits = 2 * num_state_qubits
165
+ elif num_result_qubits < num_state_qubits or num_result_qubits > 2 * num_state_qubits:
166
+ raise ValueError(
167
+ f"num_result_qubits ({num_result_qubits}) must be in between num_state_qubits "
168
+ f"({num_state_qubits}) and 2 * num_state_qubits ({2 * num_state_qubits})"
169
+ )
170
+
171
+ super().__init__("Multiplier", 2 * num_state_qubits + num_result_qubits, [], label=label)
172
+
173
+ self._num_state_qubits = num_state_qubits
174
+ self._num_result_qubits = num_result_qubits
175
+
176
+ @property
177
+ def num_state_qubits(self) -> int:
178
+ """The number of state qubits, i.e. the number of bits in each input register.
179
+
180
+ Returns:
181
+ The number of state qubits.
182
+ """
183
+ return self._num_state_qubits
184
+
185
+ @property
186
+ def num_result_qubits(self) -> int:
187
+ """The number of result qubits to limit the output to.
188
+
189
+ Returns:
190
+ The number of result qubits.
191
+ """
192
+ return self._num_result_qubits
@@ -33,7 +33,7 @@ class RGQFTMultiplier(Multiplier):
33
33
  As an example, a circuit that performs a modular QFT multiplication on two 2-qubit
34
34
  sized input registers with an output register of 2 qubits, is as follows:
35
35
 
36
- .. parsed-literal::
36
+ .. code-block:: text
37
37
 
38
38
  a_0: ────────────────────────────────────────■───────■──────■──────■────────────────
39
39
  │ │ │ │
@@ -48,6 +48,13 @@ class RGQFTMultiplier(Multiplier):
48
48
  out_1: ┤1 ├─────────■───────────────■──────────────■─────────────■───────┤1 ├
49
49
  └──────┘ └───────┘
50
50
 
51
+ .. seealso::
52
+
53
+ The :class:`.MultiplierGate` objects represents a multiplication, like this circuit class,
54
+ but allows the compiler to select the optimal decomposition based on the context.
55
+ Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
56
+ can be chosen via ``Multiplier=["qft_r17"]``.
57
+
51
58
  **References:**
52
59
 
53
60
  [1] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017.
@@ -45,7 +45,7 @@ class WeightedAdder(BlueprintCircuit):
45
45
  For an example where the state of 4 qubits is added into a sum register, the circuit can
46
46
  be schematically drawn as
47
47
 
48
- .. parsed-literal::
48
+ .. code-block:: text
49
49
 
50
50
  ┌────────┐
51
51
  state_0: ┤0 ├ | state_0 * weights[0]
@@ -13,10 +13,10 @@
13
13
  """Define a Quantum Fourier Transform circuit (QFT) and a native gate (QFTGate)."""
14
14
 
15
15
  from __future__ import annotations
16
- import warnings
17
16
  import numpy as np
18
17
 
19
- from qiskit.circuit.quantumcircuit import QuantumCircuit, QuantumRegister, CircuitInstruction, Gate
18
+ from qiskit.circuit.quantumcircuit import QuantumRegister, CircuitInstruction, Gate
19
+ from qiskit.utils.deprecation import deprecate_func
20
20
  from ..blueprintcircuit import BlueprintCircuit
21
21
 
22
22
 
@@ -72,6 +72,14 @@ class QFT(BlueprintCircuit):
72
72
 
73
73
  """
74
74
 
75
+ @deprecate_func(
76
+ since="1.3",
77
+ additional_msg=(
78
+ "Use qiskit.circuit.library.QFTGate or qiskit.synthesis.qft.synth_qft_full instead, "
79
+ "for access to all previous arguments.",
80
+ ),
81
+ pending=True,
82
+ )
75
83
  def __init__(
76
84
  self,
77
85
  num_qubits: int | None = None,
@@ -232,22 +240,6 @@ class QFT(BlueprintCircuit):
232
240
  inverted._inverse = not self._inverse
233
241
  return inverted
234
242
 
235
- def _warn_if_precision_loss(self):
236
- """Issue a warning if constructing the circuit will lose precision.
237
-
238
- If we need an angle smaller than ``pi * 2**-1022``, we start to lose precision by going into
239
- the subnormal numbers. We won't lose _all_ precision until an exponent of about 1075, but
240
- beyond 1022 we're using fractional bits to represent leading zeros."""
241
- max_num_entanglements = self.num_qubits - self.approximation_degree - 1
242
- if max_num_entanglements > -np.finfo(float).minexp: # > 1022 for doubles.
243
- warnings.warn(
244
- "precision loss in QFT."
245
- f" The rotation needed to represent {max_num_entanglements} entanglements"
246
- " is smaller than the smallest normal floating-point number.",
247
- category=RuntimeWarning,
248
- stacklevel=3,
249
- )
250
-
251
243
  def _check_configuration(self, raise_on_failure: bool = True) -> bool:
252
244
  """Check if the current configuration is valid."""
253
245
  valid = True
@@ -255,7 +247,6 @@ class QFT(BlueprintCircuit):
255
247
  valid = False
256
248
  if raise_on_failure:
257
249
  raise AttributeError("The number of qubits has not been set.")
258
- self._warn_if_precision_loss()
259
250
  return valid
260
251
 
261
252
  def _build(self) -> None:
@@ -270,25 +261,16 @@ class QFT(BlueprintCircuit):
270
261
  if num_qubits == 0:
271
262
  return
272
263
 
273
- circuit = QuantumCircuit(*self.qregs, name=self.name)
274
- for j in reversed(range(num_qubits)):
275
- circuit.h(j)
276
- num_entanglements = max(0, j - max(0, self.approximation_degree - (num_qubits - j - 1)))
277
- for k in reversed(range(j - num_entanglements, j)):
278
- # Use negative exponents so that the angle safely underflows to zero, rather than
279
- # using a temporary variable that overflows to infinity in the worst case.
280
- lam = np.pi * (2.0 ** (k - j))
281
- circuit.cp(lam, j, k)
282
-
283
- if self.insert_barriers:
284
- circuit.barrier()
285
-
286
- if self._do_swaps:
287
- for i in range(num_qubits // 2):
288
- circuit.swap(i, num_qubits - i - 1)
289
-
290
- if self._inverse:
291
- circuit = circuit.inverse()
264
+ from qiskit.synthesis.qft import synth_qft_full
265
+
266
+ circuit = synth_qft_full(
267
+ num_qubits,
268
+ do_swaps=self._do_swaps,
269
+ insert_barriers=self._insert_barriers,
270
+ approximation_degree=self._approximation_degree,
271
+ inverse=self._inverse,
272
+ name=self.name,
273
+ )
292
274
 
293
275
  wrapped = circuit.to_instruction() if self.insert_barriers else circuit.to_gate()
294
276
  self.compose(wrapped, qubits=self.qubits, inplace=True)
@@ -94,6 +94,12 @@ class BlueprintCircuit(QuantumCircuit, ABC):
94
94
 
95
95
  @property
96
96
  def data(self):
97
+ """The circuit data (instructions and context).
98
+
99
+ Returns:
100
+ QuantumCircuitData: a list-like object containing the :class:`.CircuitInstruction`\\ s
101
+ for each instruction.
102
+ """
97
103
  if not self._is_built:
98
104
  self._build()
99
105
  return super().data
@@ -110,12 +116,70 @@ class BlueprintCircuit(QuantumCircuit, ABC):
110
116
 
111
117
  @property
112
118
  def num_parameters(self) -> int:
119
+ """The number of parameter objects in the circuit."""
113
120
  if not self._is_built:
114
121
  self._build()
115
122
  return super().num_parameters
116
123
 
117
124
  @property
118
125
  def parameters(self) -> ParameterView:
126
+ """The parameters defined in the circuit.
127
+
128
+ This attribute returns the :class:`.Parameter` objects in the circuit sorted
129
+ alphabetically. Note that parameters instantiated with a :class:`.ParameterVector`
130
+ are still sorted numerically.
131
+
132
+ Examples:
133
+
134
+ The snippet below shows that insertion order of parameters does not matter.
135
+
136
+ .. code-block:: python
137
+
138
+ >>> from qiskit.circuit import QuantumCircuit, Parameter
139
+ >>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
140
+ >>> circuit = QuantumCircuit(1)
141
+ >>> circuit.rx(b, 0)
142
+ >>> circuit.rz(elephant, 0)
143
+ >>> circuit.ry(a, 0)
144
+ >>> circuit.parameters # sorted alphabetically!
145
+ ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])
146
+
147
+ Bear in mind that alphabetical sorting might be unintuitive when it comes to numbers.
148
+ The literal "10" comes before "2" in strict alphabetical sorting.
149
+
150
+ .. code-block:: python
151
+
152
+ >>> from qiskit.circuit import QuantumCircuit, Parameter
153
+ >>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
154
+ >>> circuit = QuantumCircuit(1)
155
+ >>> circuit.u(*angles, 0)
156
+ >>> circuit.draw()
157
+ ┌─────────────────────────────┐
158
+ q: ┤ U(angle_1,angle_2,angle_10) ├
159
+ └─────────────────────────────┘
160
+ >>> circuit.parameters
161
+ ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])
162
+
163
+ To respect numerical sorting, a :class:`.ParameterVector` can be used.
164
+
165
+ .. code-block:: python
166
+
167
+ >>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
168
+ >>> x = ParameterVector("x", 12)
169
+ >>> circuit = QuantumCircuit(1)
170
+ >>> for x_i in x:
171
+ ... circuit.rx(x_i, 0)
172
+ >>> circuit.parameters
173
+ ParameterView([
174
+ ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
175
+ ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
176
+ ..., ParameterVectorElement(x[11])
177
+ ])
178
+
179
+
180
+ Returns:
181
+ The sorted :class:`.Parameter` objects in the circuit.
182
+ """
119
183
  if not self._is_built:
120
184
  self._build()
121
185
  return super().parameters
@@ -12,7 +12,7 @@
12
12
 
13
13
  """The Boolean logic circuit library."""
14
14
 
15
- from .quantum_and import AND
16
- from .quantum_or import OR
17
- from .quantum_xor import XOR
18
- from .inner_product import InnerProduct
15
+ from .quantum_and import AND, AndGate
16
+ from .quantum_or import OR, OrGate
17
+ from .quantum_xor import XOR, BitwiseXorGate, random_bitwise_xor
18
+ from .inner_product import InnerProduct, InnerProductGate
@@ -1,6 +1,6 @@
1
1
  # This code is part of Qiskit.
2
2
  #
3
- # (C) Copyright IBM 2020.
3
+ # (C) Copyright IBM 2020, 2024.
4
4
  #
5
5
  # This code is licensed under the Apache License, Version 2.0. You may
6
6
  # obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -11,10 +11,11 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
 
14
- """InnerProduct circuit."""
14
+ """InnerProduct circuit and gate."""
15
15
 
16
16
 
17
- from qiskit.circuit import QuantumRegister, QuantumCircuit
17
+ from qiskit.circuit import QuantumRegister, QuantumCircuit, Gate
18
+ from qiskit.utils.deprecation import deprecate_func
18
19
 
19
20
 
20
21
  class InnerProduct(QuantumCircuit):
@@ -32,7 +33,7 @@ class InnerProduct(QuantumCircuit):
32
33
  where the inner product of the top and bottom registers is 1. Otherwise it keeps
33
34
  the input intact.
34
35
 
35
- .. parsed-literal::
36
+ .. code-block:: text
36
37
 
37
38
 
38
39
  q0_0: ─■──────────
@@ -61,6 +62,11 @@ class InnerProduct(QuantumCircuit):
61
62
  _generate_circuit_library_visualization(circuit)
62
63
  """
63
64
 
65
+ @deprecate_func(
66
+ since="1.3",
67
+ additional_msg="Use qiskit.circuit.library.InnerProductGate instead.",
68
+ pending=True,
69
+ )
64
70
  def __init__(self, num_qubits: int) -> None:
65
71
  """Return a circuit to compute the inner product of 2 n-qubit registers.
66
72
 
@@ -76,3 +82,74 @@ class InnerProduct(QuantumCircuit):
76
82
 
77
83
  super().__init__(*inner.qregs, name="inner_product")
78
84
  self.compose(inner.to_gate(), qubits=self.qubits, inplace=True)
85
+
86
+
87
+ class InnerProductGate(Gate):
88
+ r"""A 2n-qubit Boolean function that computes the inner product of
89
+ two n-qubit vectors over :math:`F_2`.
90
+
91
+ This implementation is a phase oracle which computes the following transform.
92
+
93
+ .. math::
94
+
95
+ \mathcal{IP}_{2n} : F_2^{2n} \rightarrow {-1, 1}
96
+ \mathcal{IP}_{2n}(x_1, \cdots, x_n, y_1, \cdots, y_n) = (-1)^{x.y}
97
+
98
+ The corresponding unitary is a diagonal, which induces a -1 phase on any inputs
99
+ where the inner product of the top and bottom registers is 1. Otherwise, it keeps
100
+ the input intact.
101
+
102
+ .. parsed-literal::
103
+
104
+
105
+ q0_0: ─■──────────
106
+
107
+ q0_1: ─┼──■───────
108
+ │ │
109
+ q0_2: ─┼──┼──■────
110
+ │ │ │
111
+ q0_3: ─┼──┼──┼──■─
112
+ │ │ │ │
113
+ q1_0: ─■──┼──┼──┼─
114
+ │ │ │
115
+ q1_1: ────■──┼──┼─
116
+ │ │
117
+ q1_2: ───────■──┼─
118
+
119
+ q1_3: ──────────■─
120
+
121
+
122
+ Reference Circuit:
123
+ .. plot::
124
+
125
+ from qiskit.circuit import QuantumCircuit
126
+ from qiskit.circuit.library import InnerProductGate
127
+ from qiskit.visualization.library import _generate_circuit_library_visualization
128
+ circuit = QuantumCircuit(8)
129
+ circuit.append(InnerProductGate(4), [0, 1, 2, 3, 4, 5, 6, 7])
130
+ _generate_circuit_library_visualization(circuit)
131
+ """
132
+
133
+ def __init__(
134
+ self,
135
+ num_qubits: int,
136
+ ) -> None:
137
+ """
138
+ Args:
139
+ num_qubits: width of top and bottom registers (half total number of qubits).
140
+ """
141
+ super().__init__("inner_product", 2 * num_qubits, [])
142
+
143
+ def _define(self):
144
+ num_qubits = self.num_qubits // 2
145
+ qr_a = QuantumRegister(num_qubits, name="x")
146
+ qr_b = QuantumRegister(num_qubits, name="y")
147
+
148
+ circuit = QuantumCircuit(qr_a, qr_b, name="inner_product")
149
+ for i in range(num_qubits):
150
+ circuit.cz(qr_a[i], qr_b[i])
151
+
152
+ self.definition = circuit
153
+
154
+ def __eq__(self, other):
155
+ return isinstance(other, InnerProductGate) and self.num_qubits == other.num_qubits
@@ -1,6 +1,6 @@
1
1
  # This code is part of Qiskit.
2
2
  #
3
- # (C) Copyright IBM 2020.
3
+ # (C) Copyright IBM 2020, 2024.
4
4
  #
5
5
  # This code is licensed under the Apache License, Version 2.0. You may
6
6
  # obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -11,11 +11,13 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
 
14
- """Implementations of boolean logic quantum circuits."""
14
+ """Boolean AND circuit and gate."""
15
+
15
16
  from __future__ import annotations
16
17
 
17
- from qiskit.circuit import QuantumRegister, QuantumCircuit, AncillaRegister
18
+ from qiskit.circuit import QuantumRegister, QuantumCircuit, AncillaRegister, Gate
18
19
  from qiskit.circuit.library.standard_gates import MCXGate
20
+ from qiskit.utils.deprecation import deprecate_func
19
21
 
20
22
 
21
23
  class AND(QuantumCircuit):
@@ -49,6 +51,11 @@ class AND(QuantumCircuit):
49
51
 
50
52
  """
51
53
 
54
+ @deprecate_func(
55
+ since="1.3",
56
+ additional_msg="Use qiskit.circuit.library.AndGate instead.",
57
+ pending=True,
58
+ )
52
59
  def __init__(
53
60
  self,
54
61
  num_variable_qubits: int,
@@ -58,7 +65,7 @@ class AND(QuantumCircuit):
58
65
  """Create a new logical AND circuit.
59
66
 
60
67
  Args:
61
- num_variable_qubits: The qubits of which the OR is computed. The result will be written
68
+ num_variable_qubits: The qubits of which the AND is computed. The result will be written
62
69
  into an additional result qubit.
63
70
  flags: A list of +1/0/-1 marking negations or omissions of qubits.
64
71
  mcx_mode: The mode to be used to implement the multi-controlled X gate.
@@ -95,3 +102,99 @@ class AND(QuantumCircuit):
95
102
 
96
103
  super().__init__(*circuit.qregs, name="and")
97
104
  self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
105
+
106
+
107
+ class AndGate(Gate):
108
+ r"""A gate representing the logical AND operation on a number of qubits.
109
+
110
+ For the AND operation the state :math:`|1\rangle` is interpreted as ``True``. The result
111
+ qubit is flipped, if the state of all variable qubits is ``True``. In this format, the AND
112
+ operation equals a multi-controlled X gate, which is controlled on all variable qubits.
113
+ Using a list of flags however, qubits can be skipped or negated. Practically, the flags
114
+ allow to skip controls or to apply pre- and post-X gates to the negated qubits.
115
+
116
+ The AndGate gate without special flags equals the multi-controlled-X gate:
117
+
118
+ .. plot::
119
+
120
+ from qiskit.circuit import QuantumCircuit
121
+ from qiskit.circuit.library import AndGate
122
+ from qiskit.visualization.library import _generate_circuit_library_visualization
123
+ circuit = QuantumCircuit(6)
124
+ circuit.append(AndGate(5), [0, 1, 2, 3, 4, 5])
125
+ _generate_circuit_library_visualization(circuit)
126
+
127
+ Using flags we can negate qubits or skip them. For instance, if we have 5 qubits and want to
128
+ return ``True`` if the first qubit is ``False`` and the last two are ``True`` we use the flags
129
+ ``[-1, 0, 0, 1, 1]``.
130
+
131
+ .. plot::
132
+
133
+ from qiskit.circuit import QuantumCircuit
134
+ from qiskit.circuit.library import AndGate
135
+ from qiskit.visualization.library import _generate_circuit_library_visualization
136
+ circuit = QuantumCircuit(6)
137
+ circuit.append(AndGate(5, flags=[-1, 0, 0, 1, 1]), [0, 1, 2, 3, 4, 5])
138
+ _generate_circuit_library_visualization(circuit)
139
+
140
+ """
141
+
142
+ def __init__(
143
+ self,
144
+ num_variable_qubits: int,
145
+ flags: list[int] | None = None,
146
+ ) -> None:
147
+ """
148
+ Args:
149
+ num_variable_qubits: The qubits of which the AND is computed. The result will be written
150
+ into an additional result qubit.
151
+ flags: A list of +1/0/-1 marking negations or omissions of qubits.
152
+ """
153
+ super().__init__("and", num_variable_qubits + 1, [])
154
+ self.num_variable_qubits = num_variable_qubits
155
+ self.flags = flags
156
+
157
+ def _define(self):
158
+ # add registers
159
+ qr_variable = QuantumRegister(self.num_variable_qubits, name="variable")
160
+ qr_result = QuantumRegister(1, name="result")
161
+
162
+ # determine the control qubits: all that have a nonzero flag
163
+ flags = self.flags or [1] * self.num_variable_qubits
164
+ control_qubits = [q for q, flag in zip(qr_variable, flags) if flag != 0]
165
+
166
+ # determine the qubits that need to be flipped (if a flag is < 0)
167
+ flip_qubits = [q for q, flag in zip(qr_variable, flags) if flag < 0]
168
+
169
+ # create the definition circuit
170
+ circuit = QuantumCircuit(qr_variable, qr_result, name="and")
171
+
172
+ if len(flip_qubits) > 0:
173
+ circuit.x(flip_qubits)
174
+ circuit.mcx(control_qubits, qr_result[:])
175
+ if len(flip_qubits) > 0:
176
+ circuit.x(flip_qubits)
177
+
178
+ self.definition = circuit
179
+
180
+ # pylint: disable=unused-argument
181
+ def inverse(self, annotated: bool = False):
182
+ r"""Return inverted AND gate (itself).
183
+
184
+ Args:
185
+ annotated: when set to ``True``, this is typically used to return an
186
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
187
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
188
+ is self-inverse.
189
+
190
+ Returns:
191
+ AndGate: inverse gate (self-inverse).
192
+ """
193
+ return AndGate(self.num_variable_qubits, self.flags)
194
+
195
+ def __eq__(self, other):
196
+ return (
197
+ isinstance(other, AndGate)
198
+ and self.num_variable_qubits == other.num_variable_qubits
199
+ and self.flags == other.flags
200
+ )