qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__cp39-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 (360) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +20 -1
  3. qiskit/_accelerate.pyd +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 +110 -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 +154 -2
  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/primitives/utils.py +1 -1
  196. qiskit/providers/__init__.py +3 -3
  197. qiskit/providers/backend.py +12 -1
  198. qiskit/providers/backend_compat.py +23 -3
  199. qiskit/providers/basic_provider/basic_simulator.py +12 -2
  200. qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
  201. qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
  202. qiskit/providers/models/pulsedefaults.py +2 -0
  203. qiskit/pulse/builder.py +59 -18
  204. qiskit/pulse/calibration_entries.py +4 -1
  205. qiskit/pulse/channels.py +2 -0
  206. qiskit/pulse/exceptions.py +2 -0
  207. qiskit/pulse/instruction_schedule_map.py +21 -6
  208. qiskit/pulse/instructions/acquire.py +2 -0
  209. qiskit/pulse/instructions/delay.py +2 -0
  210. qiskit/pulse/instructions/directives.py +8 -0
  211. qiskit/pulse/instructions/frequency.py +3 -0
  212. qiskit/pulse/instructions/instruction.py +2 -0
  213. qiskit/pulse/instructions/phase.py +3 -0
  214. qiskit/pulse/instructions/play.py +2 -0
  215. qiskit/pulse/instructions/reference.py +2 -0
  216. qiskit/pulse/instructions/snapshot.py +2 -0
  217. qiskit/pulse/library/pulse.py +2 -0
  218. qiskit/pulse/library/symbolic_pulses.py +28 -0
  219. qiskit/pulse/library/waveform.py +2 -0
  220. qiskit/pulse/macros.py +1 -1
  221. qiskit/pulse/schedule.py +12 -13
  222. qiskit/pulse/transforms/alignments.py +5 -3
  223. qiskit/pulse/transforms/dag.py +7 -0
  224. qiskit/qasm2/export.py +5 -3
  225. qiskit/qasm2/parse.py +46 -2
  226. qiskit/qasm3/__init__.py +1 -0
  227. qiskit/qasm3/ast.py +123 -15
  228. qiskit/qasm3/exporter.py +103 -77
  229. qiskit/qobj/converters/pulse_instruction.py +6 -4
  230. qiskit/qpy/__init__.py +181 -0
  231. qiskit/qpy/binary_io/circuits.py +20 -5
  232. qiskit/qpy/binary_io/schedules.py +3 -4
  233. qiskit/qpy/binary_io/value.py +310 -13
  234. qiskit/qpy/common.py +46 -2
  235. qiskit/qpy/formats.py +7 -0
  236. qiskit/qpy/interface.py +40 -4
  237. qiskit/quantum_info/__init__.py +4 -0
  238. qiskit/quantum_info/operators/channel/transformations.py +28 -21
  239. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  240. qiskit/quantum_info/operators/operator.py +54 -8
  241. qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
  242. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  244. qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
  245. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  246. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
  247. qiskit/quantum_info/states/densitymatrix.py +5 -5
  248. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  249. qiskit/quantum_info/states/statevector.py +6 -6
  250. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  251. qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
  252. qiskit/result/mitigation/local_readout_mitigator.py +9 -1
  253. qiskit/result/mitigation/utils.py +57 -0
  254. qiskit/scheduler/config.py +2 -0
  255. qiskit/scheduler/methods/basic.py +3 -0
  256. qiskit/scheduler/schedule_circuit.py +2 -0
  257. qiskit/scheduler/sequence.py +2 -0
  258. qiskit/synthesis/__init__.py +25 -0
  259. qiskit/synthesis/arithmetic/__init__.py +16 -0
  260. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  261. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  262. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  263. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  264. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  265. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  266. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  267. qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
  268. qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
  269. qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
  270. qiskit/synthesis/evolution/__init__.py +1 -0
  271. qiskit/synthesis/evolution/lie_trotter.py +16 -42
  272. qiskit/synthesis/evolution/pauli_network.py +80 -0
  273. qiskit/synthesis/evolution/product_formula.py +165 -238
  274. qiskit/synthesis/evolution/qdrift.py +36 -29
  275. qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
  276. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  277. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  278. qiskit/synthesis/qft/qft_decompose_full.py +19 -1
  279. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
  280. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
  281. qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
  282. qiskit/synthesis/unitary/qsd.py +5 -5
  283. qiskit/transpiler/__init__.py +21 -14
  284. qiskit/transpiler/basepasses.py +1 -1
  285. qiskit/transpiler/passes/__init__.py +2 -0
  286. qiskit/transpiler/passes/basis/basis_translator.py +9 -565
  287. qiskit/transpiler/passes/basis/decompose.py +45 -12
  288. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  289. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  290. qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
  291. qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
  292. qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
  293. qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
  294. qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
  295. qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
  296. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  297. qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
  298. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  299. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  300. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  301. qiskit/transpiler/passes/optimization/consolidate_blocks.py +48 -131
  302. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
  303. qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
  304. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
  305. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  306. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  307. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  308. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  309. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  310. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  311. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  312. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  313. qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
  314. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  315. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  316. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  317. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  318. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
  319. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  320. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  321. qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
  322. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
  323. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  324. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
  325. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
  326. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
  327. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
  328. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
  329. qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
  330. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  331. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
  332. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
  333. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
  334. qiskit/transpiler/passes/utils/gate_direction.py +12 -275
  335. qiskit/transpiler/passes/utils/gates_basis.py +7 -30
  336. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
  337. qiskit/transpiler/passmanager_config.py +22 -4
  338. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
  339. qiskit/transpiler/preset_passmanagers/common.py +5 -3
  340. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
  341. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  342. qiskit/transpiler/target.py +74 -16
  343. qiskit/utils/deprecate_pulse.py +119 -0
  344. qiskit/visualization/circuit/_utils.py +2 -2
  345. qiskit/visualization/circuit/circuit_visualization.py +3 -2
  346. qiskit/visualization/circuit/matplotlib.py +1 -1
  347. qiskit/visualization/dag_visualization.py +1 -1
  348. qiskit/visualization/pass_manager_visualization.py +3 -14
  349. qiskit/visualization/pulse_v2/interface.py +3 -1
  350. qiskit/visualization/timeline/core.py +25 -2
  351. qiskit/visualization/timeline/interface.py +12 -0
  352. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
  353. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
  354. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
  355. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
  356. qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
  357. qiskit/synthesis/two_qubit/weyl.py +0 -97
  358. qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
  359. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
  360. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
@@ -11,11 +11,9 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """Compute the sum of two qubit registers using Classical Addition."""
14
- from __future__ import annotations
15
- from qiskit.circuit.bit import Bit
16
-
17
- from qiskit.circuit import QuantumCircuit, QuantumRegister, AncillaRegister
18
14
 
15
+ from __future__ import annotations
16
+ from qiskit.synthesis.arithmetic import adder_ripple_v95
19
17
  from .adder import Adder
20
18
 
21
19
 
@@ -26,7 +24,7 @@ class VBERippleCarryAdder(Adder):
26
24
  As an example, a classical adder circuit that performs full addition (i.e. including
27
25
  a carry-in bit) on two 2-qubit sized registers is as follows:
28
26
 
29
- .. parsed-literal::
27
+ .. code-block:: text
30
28
 
31
29
  ┌────────┐ ┌───────────┐┌──────┐
32
30
  cin_0: ┤0 ├───────────────────────┤0 ├┤0 ├
@@ -52,6 +50,22 @@ class VBERippleCarryAdder(Adder):
52
50
  This is different ordering as compared to Figure 2 in [1], which leads to a different
53
51
  drawing of the circuit.
54
52
 
53
+ .. seealso::
54
+
55
+ The following generic gate objects perform additions, like this circuit class,
56
+ but allow the compiler to select the optimal decomposition based on the context.
57
+ Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
58
+ can be chosen via ``Adder=["ripple_v95"]``.
59
+
60
+ :class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
61
+ is functionally equivalent to ``kind="fixed"``.
62
+
63
+ :class:`.AdderGate`: A generic inplace adder. This
64
+ is functionally equivalent to ``kind="half"``.
65
+
66
+ :class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
67
+ is functionally equivalent to ``kind="full"``.
68
+
55
69
  **References:**
56
70
 
57
71
  [1] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
@@ -74,92 +88,8 @@ class VBERippleCarryAdder(Adder):
74
88
  Raises:
75
89
  ValueError: If ``num_state_qubits`` is lower than 1.
76
90
  """
77
- if num_state_qubits < 1:
78
- raise ValueError("The number of qubits must be at least 1.")
79
-
80
91
  super().__init__(num_state_qubits, name=name)
92
+ circuit = adder_ripple_v95(num_state_qubits, kind)
81
93
 
82
- # define the input registers
83
- registers: list[QuantumRegister | list[Bit]] = []
84
- if kind == "full":
85
- qr_cin = QuantumRegister(1, name="cin")
86
- registers.append(qr_cin)
87
- else:
88
- qr_cin = QuantumRegister(0)
89
-
90
- qr_a = QuantumRegister(num_state_qubits, name="a")
91
- qr_b = QuantumRegister(num_state_qubits, name="b")
92
-
93
- registers += [qr_a, qr_b]
94
-
95
- if kind in ["half", "full"]:
96
- qr_cout = QuantumRegister(1, name="cout")
97
- registers.append(qr_cout)
98
- else:
99
- qr_cout = QuantumRegister(0)
100
-
101
- self.add_register(*registers)
102
-
103
- if num_state_qubits > 1:
104
- qr_help = AncillaRegister(num_state_qubits - 1, name="helper")
105
- self.add_register(qr_help)
106
- else:
107
- qr_help = AncillaRegister(0)
108
-
109
- # the code is simplified a lot if we create a list of all carries and helpers
110
- carries = qr_cin[:] + qr_help[:] + qr_cout[:]
111
-
112
- # corresponds to Carry gate in [1]
113
- qc_carry = QuantumCircuit(4, name="Carry")
114
- qc_carry.ccx(1, 2, 3)
115
- qc_carry.cx(1, 2)
116
- qc_carry.ccx(0, 2, 3)
117
- carry_gate = qc_carry.to_gate()
118
- carry_gate_dg = carry_gate.inverse()
119
-
120
- # corresponds to Sum gate in [1]
121
- qc_sum = QuantumCircuit(3, name="Sum")
122
- qc_sum.cx(1, 2)
123
- qc_sum.cx(0, 2)
124
- sum_gate = qc_sum.to_gate()
125
-
126
- circuit = QuantumCircuit(*self.qregs, name=name)
127
-
128
- # handle all cases for the first qubits, depending on whether cin is available
129
- i = 0
130
- if kind == "half":
131
- i += 1
132
- circuit.ccx(qr_a[0], qr_b[0], carries[0])
133
- elif kind == "fixed":
134
- i += 1
135
- if num_state_qubits == 1:
136
- circuit.cx(qr_a[0], qr_b[0])
137
- else:
138
- circuit.ccx(qr_a[0], qr_b[0], carries[0])
139
-
140
- for inp, out in zip(carries[:-1], carries[1:]):
141
- circuit.append(carry_gate, [inp, qr_a[i], qr_b[i], out])
142
- i += 1
143
-
144
- if kind in ["full", "half"]: # final CX (cancels for the 'fixed' case)
145
- circuit.cx(qr_a[-1], qr_b[-1])
146
-
147
- if len(carries) > 1:
148
- circuit.append(sum_gate, [carries[-2], qr_a[-1], qr_b[-1]])
149
-
150
- i -= 2
151
- for j, (inp, out) in enumerate(zip(reversed(carries[:-1]), reversed(carries[1:]))):
152
- if j == 0:
153
- if kind == "fixed":
154
- i += 1
155
- else:
156
- continue
157
- circuit.append(carry_gate_dg, [inp, qr_a[i], qr_b[i], out])
158
- circuit.append(sum_gate, [inp, qr_a[i], qr_b[i]])
159
- i -= 1
160
-
161
- if kind in ["half", "fixed"] and num_state_qubits > 1:
162
- circuit.ccx(qr_a[0], qr_b[0], carries[0])
163
- circuit.cx(qr_a[0], qr_b[0])
164
-
94
+ self.add_register(*circuit.qregs)
165
95
  self.append(circuit.to_gate(), self.qubits)
@@ -27,7 +27,7 @@ class LinearPauliRotations(FunctionalPauliRotations):
27
27
  For a register of state qubits :math:`|x\rangle`, a target qubit :math:`|0\rangle` and the
28
28
  basis ``'Y'`` this circuit acts as:
29
29
 
30
- .. parsed-literal::
30
+ .. code-block:: text
31
31
 
32
32
  q_0: ─────────────────────────■───────── ... ──────────────────────
33
33
 
@@ -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