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
@@ -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,12 +11,14 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
 
14
- """Implementations of boolean logic quantum circuits."""
14
+ """Boolean OR circuit and gate."""
15
+
15
16
  from __future__ import annotations
16
17
  from typing import List, Optional
17
18
 
18
- from qiskit.circuit import QuantumRegister, QuantumCircuit, AncillaRegister
19
+ from qiskit.circuit import QuantumRegister, QuantumCircuit, AncillaRegister, Gate
19
20
  from qiskit.circuit.library.standard_gates import MCXGate
21
+ from qiskit.utils.deprecation import deprecate_func
20
22
 
21
23
 
22
24
  class OR(QuantumCircuit):
@@ -50,6 +52,11 @@ class OR(QuantumCircuit):
50
52
 
51
53
  """
52
54
 
55
+ @deprecate_func(
56
+ since="1.3",
57
+ additional_msg="Use qiskit.circuit.library.OrGate instead.",
58
+ pending=True,
59
+ )
53
60
  def __init__(
54
61
  self,
55
62
  num_variable_qubits: int,
@@ -96,3 +103,100 @@ class OR(QuantumCircuit):
96
103
 
97
104
  super().__init__(*circuit.qregs, name="or")
98
105
  self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
106
+
107
+
108
+ class OrGate(Gate):
109
+ r"""A gate representing the logical OR operation on a number of qubits.
110
+
111
+ For the OR operation the state :math:`|1\rangle` is interpreted as ``True``. The result
112
+ qubit is flipped, if the state of any variable qubit is ``True``. The OR is implemented using
113
+ a multi-open-controlled X gate (i.e. flips if the state is :math:`|0\rangle`) and
114
+ applying an X gate on the result qubit.
115
+ Using a list of flags, qubits can be skipped or negated.
116
+
117
+ The OrGate gate without special flags:
118
+
119
+ .. plot::
120
+
121
+ from qiskit.circuit import QuantumCircuit
122
+ from qiskit.circuit.library import OrGate
123
+ from qiskit.visualization.library import _generate_circuit_library_visualization
124
+ circuit = QuantumCircuit(6)
125
+ circuit.append(OrGate(5), [0, 1, 2, 3, 4, 5])
126
+ _generate_circuit_library_visualization(circuit)
127
+
128
+ Using flags we can negate qubits or skip them. For instance, if we have 5 qubits and want to
129
+ return ``True`` if the first qubit is ``False`` or one of the last two are ``True`` we use the
130
+ flags ``[-1, 0, 0, 1, 1]``.
131
+
132
+ .. plot::
133
+
134
+ from qiskit.circuit import QuantumCircuit
135
+ from qiskit.circuit.library import OrGate
136
+ from qiskit.visualization.library import _generate_circuit_library_visualization
137
+ circuit = QuantumCircuit(6)
138
+ circuit.append(OrGate(5, flags=[-1, 0, 0, 1, 1]), [0, 1, 2, 3, 4, 5])
139
+ _generate_circuit_library_visualization(circuit)
140
+
141
+ """
142
+
143
+ def __init__(
144
+ self,
145
+ num_variable_qubits: int,
146
+ flags: list[int] | None = None,
147
+ ) -> None:
148
+ """
149
+ Args:
150
+ num_variable_qubits: The qubits of which the AND is computed. The result will be written
151
+ into an additional result qubit.
152
+ flags: A list of +1/0/-1 marking negations or omissions of qubits.
153
+ """
154
+ super().__init__("and", num_variable_qubits + 1, [])
155
+ self.num_variable_qubits = num_variable_qubits
156
+ self.flags = flags
157
+
158
+ def _define(self):
159
+ # add registers
160
+ qr_variable = QuantumRegister(self.num_variable_qubits, name="variable")
161
+ qr_result = QuantumRegister(1, name="result")
162
+
163
+ # determine the control qubits: all that have a nonzero flag
164
+ flags = self.flags or [1] * self.num_variable_qubits
165
+ control_qubits = [q for q, flag in zip(qr_variable, flags) if flag != 0]
166
+
167
+ # determine the qubits that need to be flipped (if a flag is > 0)
168
+ flip_qubits = [q for q, flag in zip(qr_variable, flags) if flag > 0]
169
+
170
+ # create the definition circuit
171
+ circuit = QuantumCircuit(qr_variable, qr_result, name="or")
172
+
173
+ circuit.x(qr_result)
174
+ if len(flip_qubits) > 0:
175
+ circuit.x(flip_qubits)
176
+ circuit.mcx(control_qubits, qr_result[:])
177
+ if len(flip_qubits) > 0:
178
+ circuit.x(flip_qubits)
179
+
180
+ self.definition = circuit
181
+
182
+ # pylint: disable=unused-argument
183
+ def inverse(self, annotated: bool = False):
184
+ r"""Return inverted OR gate (itself).
185
+
186
+ Args:
187
+ annotated: when set to ``True``, this is typically used to return an
188
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
189
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
190
+ is self-inverse.
191
+
192
+ Returns:
193
+ OrGate: inverse gate (self-inverse).
194
+ """
195
+ return OrGate(self.num_variable_qubits, self.flags)
196
+
197
+ def __eq__(self, other):
198
+ return (
199
+ isinstance(other, OrGate)
200
+ and self.num_variable_qubits == other.num_variable_qubits
201
+ and self.flags == other.flags
202
+ )
@@ -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,13 +11,14 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
 
14
- """XOR circuit."""
14
+ """Bitwise XOR circuit and gate."""
15
15
 
16
16
  from typing import Optional
17
17
 
18
18
  import numpy as np
19
- from qiskit.circuit import QuantumCircuit
19
+ from qiskit.circuit import QuantumCircuit, Gate
20
20
  from qiskit.circuit.exceptions import CircuitError
21
+ from qiskit.utils.deprecation import deprecate_func
21
22
 
22
23
 
23
24
  class XOR(QuantumCircuit):
@@ -28,6 +29,12 @@ class XOR(QuantumCircuit):
28
29
  This circuit can also represent addition by ``amount`` over the finite field GF(2).
29
30
  """
30
31
 
32
+ @deprecate_func(
33
+ since="1.3",
34
+ additional_msg="Instead, for xor-ing with a specified amount, use BitwiseXorGate,"
35
+ "and for xor-ing with a random amount, use random_bitwise_xor.",
36
+ pending=True,
37
+ )
31
38
  def __init__(
32
39
  self,
33
40
  num_qubits: int,
@@ -69,3 +76,90 @@ class XOR(QuantumCircuit):
69
76
 
70
77
  super().__init__(*circuit.qregs, name="xor")
71
78
  self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
79
+
80
+
81
+ class BitwiseXorGate(Gate):
82
+ """An n-qubit gate for bitwise xor-ing the input with some integer ``amount``.
83
+
84
+ The ``amount`` is xor-ed in bitstring form with the input.
85
+
86
+ This gate can also represent addition by ``amount`` over the finite field GF(2).
87
+
88
+ Reference Circuit:
89
+
90
+ .. plot::
91
+
92
+ from qiskit.circuit import QuantumCircuit
93
+ from qiskit.circuit.library import BitwiseXorGate
94
+ from qiskit.visualization.library import _generate_circuit_library_visualization
95
+ circuit = QuantumCircuit(5)
96
+ circuit.append(BitwiseXorGate(5, amount=12), [0, 1, 2, 3, 4])
97
+ _generate_circuit_library_visualization(circuit)
98
+
99
+ """
100
+
101
+ def __init__(
102
+ self,
103
+ num_qubits: int,
104
+ amount: int,
105
+ ) -> None:
106
+ """
107
+ Args:
108
+ num_qubits: the width of circuit.
109
+ amount: the xor amount in decimal form.
110
+
111
+ Raises:
112
+ CircuitError: if the xor bitstring exceeds available qubits.
113
+ """
114
+ if len(bin(amount)[2:]) > num_qubits:
115
+ raise CircuitError("Bits in 'amount' exceed circuit width")
116
+
117
+ super().__init__("xor", num_qubits, [])
118
+ self.amount = amount
119
+
120
+ def _define(self):
121
+ circuit = QuantumCircuit(self.num_qubits, name="xor")
122
+ amount = self.amount
123
+ for i in range(self.num_qubits):
124
+ bit = amount & 1
125
+ amount = amount >> 1
126
+ if bit == 1:
127
+ circuit.x(i)
128
+
129
+ self.definition = circuit
130
+
131
+ def __eq__(self, other):
132
+ return (
133
+ isinstance(other, BitwiseXorGate)
134
+ and self.num_qubits == other.num_qubits
135
+ and self.amount == other.amount
136
+ )
137
+
138
+ # pylint: disable=unused-argument
139
+ def inverse(self, annotated: bool = False):
140
+ r"""Return inverted BitwiseXorGate gate (itself).
141
+
142
+ Args:
143
+ annotated: when set to ``True``, this is typically used to return an
144
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
145
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
146
+ is self-inverse.
147
+
148
+ Returns:
149
+ BitwiseXorGate: inverse gate (self-inverse).
150
+ """
151
+ return BitwiseXorGate(self.num_qubits, self.amount)
152
+
153
+
154
+ def random_bitwise_xor(num_qubits: int, seed: int) -> BitwiseXorGate:
155
+ """
156
+ Create a random BitwiseXorGate.
157
+
158
+ Args:
159
+ num_qubits: the width of circuit.
160
+ seed: random seed in case a random xor is requested.
161
+ """
162
+
163
+ rng = np.random.default_rng(seed)
164
+ amount = rng.integers(0, 2**num_qubits)
165
+ return BitwiseXorGate(num_qubits, amount)
@@ -38,15 +38,18 @@ of the complete initial data.
38
38
 
39
39
  """
40
40
 
41
- from .pauli_feature_map import PauliFeatureMap
42
- from .z_feature_map import ZFeatureMap
43
- from .zz_feature_map import ZZFeatureMap
41
+ from .pauli_feature_map import PauliFeatureMap, pauli_feature_map, z_feature_map, zz_feature_map
42
+ from ._z_feature_map import ZFeatureMap
43
+ from ._zz_feature_map import ZZFeatureMap
44
44
  from .state_preparation import StatePreparation, UniformSuperpositionGate
45
45
  from .initializer import Initialize
46
46
 
47
47
  __all__ = [
48
+ "pauli_feature_map",
48
49
  "PauliFeatureMap",
50
+ "z_feature_map",
49
51
  "ZFeatureMap",
52
+ "zz_feature_map",
50
53
  "ZZFeatureMap",
51
54
  "StatePreparation",
52
55
  "UniformSuperpositionGate",
@@ -14,6 +14,7 @@
14
14
 
15
15
  from typing import Callable, Optional
16
16
  import numpy as np
17
+ from qiskit.utils.deprecation import deprecate_func
17
18
 
18
19
  from .pauli_feature_map import PauliFeatureMap
19
20
 
@@ -23,15 +24,15 @@ class ZFeatureMap(PauliFeatureMap):
23
24
 
24
25
  On 3 qubits and with 2 repetitions the circuit is represented by:
25
26
 
26
- .. parsed-literal::
27
+ .. code-block:: text
27
28
 
28
- ┌───┐┌──────────────┐┌───┐┌──────────────┐
29
- ┤ H ├┤ U1(2.0*x[0]) ├┤ H ├┤ U1(2.0*x[0]) ├
30
- ├───┤├──────────────┤├───┤├──────────────┤
31
- ┤ H ├┤ U1(2.0*x[1]) ├┤ H ├┤ U1(2.0*x[1]) ├
32
- ├───┤├──────────────┤├───┤├──────────────┤
33
- ┤ H ├┤ U1(2.0*x[2]) ├┤ H ├┤ U1(2.0*x[2]) ├
34
- └───┘└──────────────┘└───┘└──────────────┘
29
+ ┌───┐┌─────────────┐┌───┐┌─────────────┐
30
+ ┤ H ├┤ P(2.0*x[0]) ├┤ H ├┤ P(2.0*x[0]) ├
31
+ ├───┤├─────────────┤├───┤├─────────────┤
32
+ ┤ H ├┤ U(2.0*x[1]) ├┤ H ├┤ P(2.0*x[1]) ├
33
+ ├───┤├─────────────┤├───┤├─────────────┤
34
+ ┤ H ├┤ P(2.0*x[2]) ├┤ H ├┤ P(2.0*x[2]) ├
35
+ └───┘└─────────────┘└───┘└─────────────┘
35
36
 
36
37
  This is a sub-class of :class:`~qiskit.circuit.library.PauliFeatureMap` where the Pauli
37
38
  strings are fixed as `['Z']`. As a result the first order expansion will be a circuit without
@@ -40,38 +41,48 @@ class ZFeatureMap(PauliFeatureMap):
40
41
  Examples:
41
42
 
42
43
  >>> prep = ZFeatureMap(3, reps=3, insert_barriers=True)
43
- >>> print(prep)
44
- ┌───┐ ░ ┌──────────────┐ ░ ┌───┐ ░ ┌──────────────┐ ░ ┌───┐ ░ ┌──────────────┐
45
- q_0: ┤ H ├─░─┤ U1(2.0*x[0]) ├─░─┤ H ├─░─┤ U1(2.0*x[0]) ├─░─┤ H ├─░─┤ U1(2.0*x[0]) ├
46
- ├───┤ ░ ├──────────────┤ ░ ├───┤ ░ ├──────────────┤ ░ ├───┤ ░ ├──────────────┤
47
- q_1: ┤ H ├─░─┤ U1(2.0*x[1]) ├─░─┤ H ├─░─┤ U1(2.0*x[1]) ├─░─┤ H ├─░─┤ U1(2.0*x[1]) ├
48
- ├───┤ ░ ├──────────────┤ ░ ├───┤ ░ ├──────────────┤ ░ ├───┤ ░ ├──────────────┤
49
- q_2: ┤ H ├─░─┤ U1(2.0*x[2]) ├─░─┤ H ├─░─┤ U1(2.0*x[2]) ├─░─┤ H ├─░─┤ U1(2.0*x[2]) ├
50
- └───┘ ░ └──────────────┘ ░ └───┘ ░ └──────────────┘ ░ └───┘ ░ └──────────────┘
44
+ >>> print(prep.decompose())
45
+ ┌───┐ ░ ┌─────────────┐ ░ ┌───┐ ░ ┌─────────────┐ ░ ┌───┐ ░ ┌─────────────┐
46
+ q_0: ┤ H ├─░─┤ P(2.0*x[0]) ├─░─┤ H ├─░─┤ P(2.0*x[0]) ├─░─┤ H ├─░─┤ P(2.0*x[0]) ├
47
+ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤
48
+ q_1: ┤ H ├─░─┤ P(2.0*x[1]) ├─░─┤ H ├─░─┤ P(2.0*x[1]) ├─░─┤ H ├─░─┤ P(2.0*x[1]) ├
49
+ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤
50
+ q_2: ┤ H ├─░─┤ P(2.0*x[2]) ├─░─┤ H ├─░─┤ P(2.0*x[2]) ├─░─┤ H ├─░─┤ P(2.0*x[2]) ├
51
+ └───┘ ░ └─────────────┘ ░ └───┘ ░ └─────────────┘ ░ └───┘ ░ └─────────────┘
51
52
 
52
53
  >>> data_map = lambda x: x[0]*x[0] + 1 # note: input is an array
53
54
  >>> prep = ZFeatureMap(3, reps=1, data_map_func=data_map)
54
- >>> print(prep)
55
- ┌───┐┌───────────────────────┐
56
- q_0: ┤ H ├┤ U1(2.0*x[0]**2 + 2.0) ├
57
- ├───┤├───────────────────────┤
58
- q_1: ┤ H ├┤ U1(2.0*x[1]**2 + 2.0) ├
59
- ├───┤├───────────────────────┤
60
- q_2: ┤ H ├┤ U1(2.0*x[2]**2 + 2.0) ├
61
- └───┘└───────────────────────┘
62
-
63
- >>> classifier = ZFeatureMap(3, reps=1) + RY(3, reps=1)
64
- >>> print(classifier)
65
- ┌───┐┌──────────────┐┌──────────┐ ┌──────────┐
66
- q_0: ┤ H ├┤ U1(2.0*x[0]) ├┤ RY(θ[0]) ├─■──■─┤ RY(θ[3]) ├────────────
67
- ├───┤├──────────────┤├──────────┤ │ │ └──────────┘┌──────────┐
68
- q_1: ┤ H ├┤ U1(2.0*x[1]) ├┤ RY(θ[1]) ├─■──┼──────■──────┤ RY(θ[4])
69
- ├───┤├──────────────┤├──────────┤ ├──────────┤
70
- q_2: ┤ H ├┤ U1(2.0*x[2]) ├┤ RY(θ[2]) ├────■──────■──────┤ RY(θ[5]) ├
71
- └───┘└──────────────┘└──────────┘ └──────────┘
55
+ >>> print(prep.decompose())
56
+ ┌───┐┌──────────────────────┐
57
+ q_0: ┤ H ├┤ P(2.0*x[0]**2 + 2.0) ├
58
+ ├───┤├──────────────────────┤
59
+ q_1: ┤ H ├┤ P(2.0*x[1]**2 + 2.0) ├
60
+ ├───┤├──────────────────────┤
61
+ q_2: ┤ H ├┤ P(2.0*x[2]**2 + 2.0) ├
62
+ └───┘└──────────────────────┘
63
+
64
+ >>> from qiskit.circuit.library import TwoLocal
65
+ >>> ry = TwoLocal(3, "ry", "cz", reps=1)
66
+ >>> classifier = ZFeatureMap(3, reps=1) + ry
67
+ >>> print(classifier.decompose())
68
+ ┌───┐┌─────────────┐┌──────────┐ ┌──────────┐
69
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ RY(θ[0]) ├─■──■─┤ RY(θ[3]) ├────────────
70
+ ├───┤├─────────────┤├──────────┤ └──────────┘┌──────────┐
71
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ RY(θ[1]) ├─■──┼──────■──────┤ RY(θ[4]) ├
72
+ ├───┤├─────────────┤├──────────┤ │ │ ├──────────┤
73
+ q_2: ┤ H ├┤ P(2.0*x[2]) ├┤ RY(θ[2]) ├────■──────■──────┤ RY(θ[5]) ├
74
+ └───┘└─────────────┘└──────────┘ └──────────┘
72
75
 
73
76
  """
74
77
 
78
+ @deprecate_func(
79
+ since="1.3",
80
+ additional_msg=(
81
+ "Use the z_feature_map function as a replacement. Note that this will no longer "
82
+ "return a BlueprintCircuit, but just a plain QuantumCircuit."
83
+ ),
84
+ pending=True,
85
+ )
75
86
  def __init__(
76
87
  self,
77
88
  feature_dimension: int,
@@ -0,0 +1,150 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Second-order Pauli-Z expansion circuit."""
14
+
15
+ from typing import Callable, List, Union, Optional, Dict, Tuple
16
+ import numpy as np
17
+ from qiskit.utils.deprecation import deprecate_func
18
+ from .pauli_feature_map import PauliFeatureMap
19
+
20
+
21
+ class ZZFeatureMap(PauliFeatureMap):
22
+ r"""Second-order Pauli-Z evolution circuit.
23
+
24
+ For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
25
+
26
+ .. code-block:: text
27
+
28
+ ┌───┐┌────────────────┐
29
+ ┤ H ├┤ P(2.0*φ(x[0])) ├──■───────────────────────────■───────────────────────────────────
30
+ ├───┤├────────────────┤┌─┴─┐┌─────────────────────┐┌─┴─┐
31
+ ┤ H ├┤ P(2.0*φ(x[1])) ├┤ X ├┤ P(2.0*φ(x[0],x[1])) ├┤ X ├──■───────────────────────────■──
32
+ ├───┤├────────────────┤└───┘└─────────────────────┘└───┘┌─┴─┐┌─────────────────────┐┌─┴─┐
33
+ ┤ H ├┤ P(2.0*φ(x[2])) ├─────────────────────────────────┤ X ├┤ P(2.0*φ(x[1],x[2])) ├┤ X ├
34
+ └───┘└────────────────┘ └───┘└─────────────────────┘└───┘
35
+
36
+ where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
37
+ if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
38
+
39
+ Examples:
40
+
41
+ .. code-block::
42
+
43
+ from qiskit.circuit.library import ZZFeatureMap
44
+ prep = ZZFeatureMap(2, reps=1)
45
+ print(prep.decompose())
46
+
47
+ .. code-block:: text
48
+
49
+ ┌───┐┌─────────────┐
50
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├──■──────────────────────────────────────■──
51
+ ├───┤├─────────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
52
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
53
+ └───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
54
+
55
+ .. code-block::
56
+
57
+ from qiskit.circuit.library import EfficientSU2
58
+ classifier = ZZFeatureMap(3).compose(EfficientSU2(3))
59
+ classifier.num_parameters
60
+
61
+ .. code-block:: text
62
+
63
+ 27
64
+
65
+ .. code-block::
66
+
67
+ classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
68
+
69
+ .. code-block:: text
70
+
71
+ ParameterView([
72
+ ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
73
+ ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
74
+ ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
75
+ ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
76
+ ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
77
+ ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
78
+ ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
79
+ ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
80
+ ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
81
+ ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
82
+ ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
83
+ ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
84
+ ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
85
+ ParameterVectorElement(θ[23])
86
+ ])
87
+
88
+ .. code-block::
89
+
90
+ classifier.count_ops()
91
+
92
+ .. code-block:: text
93
+
94
+ OrderedDict([('ZZFeatureMap', 1), ('EfficientSU2', 1)])
95
+
96
+ """
97
+
98
+ @deprecate_func(
99
+ since="1.3",
100
+ additional_msg=(
101
+ "Use the z_feature_map function as a replacement. Note that this will no longer "
102
+ "return a BlueprintCircuit, but just a plain QuantumCircuit."
103
+ ),
104
+ pending=True,
105
+ )
106
+ def __init__(
107
+ self,
108
+ feature_dimension: int,
109
+ reps: int = 2,
110
+ entanglement: Union[
111
+ str,
112
+ Dict[int, List[Tuple[int]]],
113
+ Callable[[int], Union[str, Dict[int, List[Tuple[int]]]]],
114
+ ] = "full",
115
+ data_map_func: Optional[Callable[[np.ndarray], float]] = None,
116
+ parameter_prefix: str = "x",
117
+ insert_barriers: bool = False,
118
+ name: str = "ZZFeatureMap",
119
+ ) -> None:
120
+ """Create a new second-order Pauli-Z expansion.
121
+
122
+ Args:
123
+ feature_dimension: Number of features.
124
+ reps: The number of repeated circuits, has a min. value of 1.
125
+ entanglement: Specifies the entanglement structure. Refer to
126
+ :class:`~qiskit.circuit.library.PauliFeatureMap` for detail.
127
+ data_map_func: A mapping function for data x.
128
+ parameter_prefix: The prefix used if default parameters are generated.
129
+ insert_barriers: If True, barriers are inserted in between the evolution instructions
130
+ and hadamard layers.
131
+
132
+ Raises:
133
+ ValueError: If the feature dimension is smaller than 2.
134
+ """
135
+ if feature_dimension < 2:
136
+ raise ValueError(
137
+ "The ZZFeatureMap contains 2-local interactions and cannot be "
138
+ f"defined for less than 2 qubits. You provided {feature_dimension}."
139
+ )
140
+
141
+ super().__init__(
142
+ feature_dimension=feature_dimension,
143
+ reps=reps,
144
+ entanglement=entanglement,
145
+ paulis=["Z", "ZZ"],
146
+ data_map_func=data_map_func,
147
+ parameter_prefix=parameter_prefix,
148
+ insert_barriers=insert_barriers,
149
+ name=name,
150
+ )