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
@@ -12,13 +12,14 @@
12
12
 
13
13
  """Fourier checking circuit."""
14
14
 
15
- from typing import List
16
-
15
+ from collections.abc import Sequence
17
16
  import math
17
+
18
18
  from qiskit.circuit import QuantumCircuit
19
19
  from qiskit.circuit.exceptions import CircuitError
20
+ from qiskit.utils.deprecation import deprecate_func
20
21
 
21
- from .generalized_gates.diagonal import Diagonal
22
+ from .generalized_gates.diagonal import Diagonal, DiagonalGate
22
23
 
23
24
 
24
25
  class FourierChecking(QuantumCircuit):
@@ -52,7 +53,12 @@ class FourierChecking(QuantumCircuit):
52
53
  `arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
53
54
  """
54
55
 
55
- def __init__(self, f: List[int], g: List[int]) -> None:
56
+ @deprecate_func(
57
+ since="1.3",
58
+ additional_msg="Use qiskit.circuit.library.fourier_checking instead.",
59
+ pending=True,
60
+ )
61
+ def __init__(self, f: Sequence[int], g: Sequence[int]) -> None:
56
62
  """Create Fourier checking circuit.
57
63
 
58
64
  Args:
@@ -81,17 +87,72 @@ class FourierChecking(QuantumCircuit):
81
87
  "{1, -1}."
82
88
  )
83
89
 
84
- circuit = QuantumCircuit(num_qubits, name=f"fc: {f}, {g}")
85
-
90
+ # This definition circuit is not replaced by the circuit produced by fourier_checking,
91
+ # as the latter produces a slightly different circuit, with DiagonalGates instead
92
+ # of Diagonal circuits.
93
+ circuit = QuantumCircuit(int(num_qubits), name=f"fc: {f}, {g}")
86
94
  circuit.h(circuit.qubits)
87
-
88
95
  circuit.compose(Diagonal(f), inplace=True)
89
-
90
96
  circuit.h(circuit.qubits)
91
-
92
97
  circuit.compose(Diagonal(g), inplace=True)
93
-
94
98
  circuit.h(circuit.qubits)
95
-
96
99
  super().__init__(*circuit.qregs, name=circuit.name)
97
100
  self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
101
+
102
+
103
+ def fourier_checking(f: Sequence[int], g: Sequence[int]) -> QuantumCircuit:
104
+ """Fourier checking circuit.
105
+
106
+ The circuit for the Fourier checking algorithm, introduced in [1],
107
+ involves a layer of Hadamards, the function :math:`f`, another layer of
108
+ Hadamards, the function :math:`g`, followed by a final layer of Hadamards.
109
+ The functions :math:`f` and :math:`g` are classical functions realized
110
+ as phase oracles (diagonal operators with {-1, 1} on the diagonal).
111
+
112
+ The probability of observing the all-zeros string is :math:`p(f,g)`.
113
+ The algorithm solves the promise Fourier checking problem,
114
+ which decides if f is correlated with the Fourier transform
115
+ of g, by testing if :math:`p(f,g) <= 0.01` or :math:`p(f,g) >= 0.05`,
116
+ promised that one or the other of these is true.
117
+
118
+ The functions :math:`f` and :math:`g` are currently implemented
119
+ from their truth tables but could be represented concisely and
120
+ implemented efficiently for special classes of functions.
121
+
122
+ Fourier checking is a special case of :math:`k`-fold forrelation [2].
123
+
124
+ **Reference Circuit:**
125
+
126
+ .. plot::
127
+ :include-source:
128
+
129
+ from qiskit.circuit.library import fourier_checking
130
+ circuit = fourier_checking([1, -1, -1, -1], [1, 1, -1, -1])
131
+ circuit.draw('mpl')
132
+
133
+ **Reference:**
134
+
135
+ [1] S. Aaronson, BQP and the Polynomial Hierarchy, 2009 (Section 3.2).
136
+ `arXiv:0910.4698 <https://arxiv.org/abs/0910.4698>`_
137
+
138
+ [2] S. Aaronson, A. Ambainis, Forrelation: a problem that
139
+ optimally separates quantum from classical computing, 2014.
140
+ `arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
141
+ """
142
+ num_qubits = math.log2(len(f))
143
+
144
+ if len(f) != len(g) or num_qubits == 0 or not num_qubits.is_integer():
145
+ raise CircuitError(
146
+ "The functions f and g must be given as truth "
147
+ "tables, each as a list of 2**n entries of "
148
+ "{1, -1}."
149
+ )
150
+ num_qubits = int(num_qubits)
151
+
152
+ circuit = QuantumCircuit(num_qubits, name=f"fc: {f}, {g}")
153
+ circuit.h(circuit.qubits)
154
+ circuit.append(DiagonalGate(f), range(num_qubits))
155
+ circuit.h(circuit.qubits)
156
+ circuit.append(DiagonalGate(g), range(num_qubits))
157
+ circuit.h(circuit.qubits)
158
+ return circuit
@@ -14,7 +14,7 @@
14
14
 
15
15
  from .diagonal import Diagonal, DiagonalGate
16
16
  from .permutation import Permutation, PermutationGate
17
- from .mcmt import MCMT, MCMTVChain
17
+ from .mcmt import MCMT, MCMTVChain, MCMTGate
18
18
  from .gms import GMS, MSGate
19
19
  from .gr import GR, GRX, GRY, GRZ
20
20
  from .pauli import PauliGate
@@ -23,6 +23,8 @@ import numpy as np
23
23
  from qiskit.circuit.gate import Gate
24
24
  from qiskit.circuit.quantumcircuit import QuantumCircuit
25
25
  from qiskit.circuit.exceptions import CircuitError
26
+ from qiskit.circuit.annotated_operation import AnnotatedOperation, InverseModifier
27
+ from qiskit.utils.deprecation import deprecate_func
26
28
 
27
29
  from .ucrz import UCRZGate
28
30
 
@@ -30,19 +32,28 @@ _EPS = 1e-10
30
32
 
31
33
 
32
34
  class Diagonal(QuantumCircuit):
33
- r"""Diagonal circuit.
35
+ """Circuit implementing a diagonal transformation."""
34
36
 
35
- Circuit symbol:
37
+ @deprecate_func(since="1.3", additional_msg="Use DiagonalGate instead.", pending=True)
38
+ def __init__(self, diag: Sequence[complex]) -> None:
39
+ r"""
40
+ Args:
41
+ diag: List of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
42
+
43
+ Raises:
44
+ CircuitError: if the list of the diagonal entries or the qubit list is in bad format;
45
+ if the number of diagonal entries is not :math:`2^k`, where :math:`k` denotes the
46
+ number of qubits.
47
+ """
48
+ DiagonalGate._check_input(diag)
49
+ num_qubits = int(math.log2(len(diag)))
50
+
51
+ super().__init__(num_qubits, name="Diagonal")
52
+ self.append(DiagonalGate(diag), self.qubits)
36
53
 
37
- .. parsed-literal::
38
54
 
39
- ┌───────────┐
40
- q_0: ┤0 ├
41
- │ │
42
- q_1: ┤1 Diagonal ├
43
- │ │
44
- q_2: ┤2 ├
45
- └───────────┘
55
+ class DiagonalGate(Gate):
56
+ r"""A generic diagonal quantum gate.
46
57
 
47
58
  Matrix form:
48
59
 
@@ -80,30 +91,28 @@ class Diagonal(QuantumCircuit):
80
91
  def __init__(self, diag: Sequence[complex]) -> None:
81
92
  r"""
82
93
  Args:
83
- diag: List of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
84
-
85
- Raises:
86
- CircuitError: if the list of the diagonal entries or the qubit list is in bad format;
87
- if the number of diagonal entries is not :math:`2^k`, where :math:`k` denotes the
88
- number of qubits.
94
+ diag: list of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
89
95
  """
90
96
  self._check_input(diag)
91
97
  num_qubits = int(math.log2(len(diag)))
92
98
 
93
- circuit = QuantumCircuit(num_qubits, name="Diagonal")
99
+ super().__init__("diagonal", num_qubits, diag)
94
100
 
101
+ def _define(self):
95
102
  # Since the diagonal is a unitary, all its entries have absolute value
96
103
  # one and the diagonal is fully specified by the phases of its entries.
97
- diag_phases = [cmath.phase(z) for z in diag]
98
- n = len(diag)
104
+ diag_phases = [cmath.phase(z) for z in self.params]
105
+ n = len(diag_phases)
106
+ circuit = QuantumCircuit(self.num_qubits)
107
+
99
108
  while n >= 2:
100
109
  angles_rz = []
101
110
  for i in range(0, n, 2):
102
111
  diag_phases[i // 2], rz_angle = _extract_rz(diag_phases[i], diag_phases[i + 1])
103
112
  angles_rz.append(rz_angle)
104
113
  num_act_qubits = int(math.log2(n))
105
- ctrl_qubits = list(range(num_qubits - num_act_qubits + 1, num_qubits))
106
- target_qubit = num_qubits - num_act_qubits
114
+ ctrl_qubits = list(range(self.num_qubits - num_act_qubits + 1, self.num_qubits))
115
+ target_qubit = self.num_qubits - num_act_qubits
107
116
 
108
117
  ucrz = UCRZGate(angles_rz)
109
118
  circuit.append(ucrz, [target_qubit] + ctrl_qubits)
@@ -111,36 +120,7 @@ class Diagonal(QuantumCircuit):
111
120
  n //= 2
112
121
  circuit.global_phase += diag_phases[0]
113
122
 
114
- super().__init__(num_qubits, name="Diagonal")
115
- self.append(circuit.to_gate(), self.qubits)
116
-
117
- @staticmethod
118
- def _check_input(diag):
119
- """Check if ``diag`` is in valid format."""
120
- if not isinstance(diag, (list, np.ndarray)):
121
- raise CircuitError("Diagonal entries must be in a list or numpy array.")
122
- num_qubits = math.log2(len(diag))
123
- if num_qubits < 1 or not num_qubits.is_integer():
124
- raise CircuitError("The number of diagonal entries is not a positive power of 2.")
125
- if not np.allclose(np.abs(diag), 1, atol=_EPS):
126
- raise CircuitError("A diagonal element does not have absolute value one.")
127
-
128
-
129
- class DiagonalGate(Gate):
130
- """Gate implementing a diagonal transformation."""
131
-
132
- def __init__(self, diag: Sequence[complex]) -> None:
133
- r"""
134
- Args:
135
- diag: list of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
136
- """
137
- Diagonal._check_input(diag)
138
- num_qubits = int(math.log2(len(diag)))
139
-
140
- super().__init__("diagonal", num_qubits, diag)
141
-
142
- def _define(self):
143
- self.definition = Diagonal(self.params).decompose()
123
+ self.definition = circuit
144
124
 
145
125
  def validate_parameter(self, parameter):
146
126
  """Diagonal Gate parameter should accept complex
@@ -152,8 +132,22 @@ class DiagonalGate(Gate):
152
132
 
153
133
  def inverse(self, annotated: bool = False):
154
134
  """Return the inverse of the diagonal gate."""
135
+ if annotated:
136
+ return AnnotatedOperation(self.copy(), InverseModifier)
137
+
155
138
  return DiagonalGate([np.conj(entry) for entry in self.params])
156
139
 
140
+ @staticmethod
141
+ def _check_input(diag):
142
+ """Check if ``diag`` is in valid format."""
143
+ if not isinstance(diag, (list, np.ndarray)):
144
+ raise CircuitError("Diagonal entries must be in a list or numpy array.")
145
+ num_qubits = math.log2(len(diag))
146
+ if num_qubits < 1 or not num_qubits.is_integer():
147
+ raise CircuitError("The number of diagonal entries is not a positive power of 2.")
148
+ if not np.allclose(np.abs(diag), 1, atol=_EPS):
149
+ raise CircuitError("A diagonal element does not have absolute value one.")
150
+
157
151
 
158
152
  def _extract_rz(phi1, phi2):
159
153
  """
@@ -15,13 +15,16 @@
15
15
  Global Mølmer–Sørensen gate.
16
16
  """
17
17
 
18
- from typing import Union, List
18
+ from __future__ import annotations
19
+ from collections.abc import Sequence
19
20
 
20
21
  import numpy as np
21
22
  from qiskit.circuit.quantumcircuit import QuantumCircuit
22
23
  from qiskit.circuit.quantumregister import QuantumRegister
24
+ from qiskit.circuit.parameterexpression import ParameterValueType
23
25
  from qiskit.circuit.library.standard_gates import RXXGate
24
26
  from qiskit.circuit.gate import Gate
27
+ from qiskit.utils.deprecation import deprecate_func
25
28
 
26
29
 
27
30
  class GMS(QuantumCircuit):
@@ -29,7 +32,7 @@ class GMS(QuantumCircuit):
29
32
 
30
33
  **Circuit symbol:**
31
34
 
32
- .. parsed-literal::
35
+ .. code-block:: text
33
36
 
34
37
  ┌───────────┐
35
38
  q_0: ┤0 ├
@@ -74,7 +77,8 @@ class GMS(QuantumCircuit):
74
77
  `arXiv:1707.06356 <https://arxiv.org/abs/1707.06356>`_
75
78
  """
76
79
 
77
- def __init__(self, num_qubits: int, theta: Union[List[List[float]], np.ndarray]) -> None:
80
+ @deprecate_func(since="1.3", additional_msg="Use the MSGate instead.", pending=True)
81
+ def __init__(self, num_qubits: int, theta: list[list[float]] | np.ndarray) -> None:
78
82
  """Create a new Global Mølmer–Sørensen (GMS) gate.
79
83
 
80
84
  Args:
@@ -94,28 +98,77 @@ class GMS(QuantumCircuit):
94
98
 
95
99
 
96
100
  class MSGate(Gate):
97
- """MSGate has been deprecated.
98
- Please use ``GMS`` in ``qiskit.circuit.generalized_gates`` instead.
101
+ r"""The Mølmer–Sørensen gate.
99
102
 
100
- Global Mølmer–Sørensen gate.
103
+ The Mølmer–Sørensen gate is native to ion-trap systems. The global MS
104
+ can be applied to multiple ions to entangle multiple qubits simultaneously [1].
101
105
 
102
- The Mølmer–Sørensen gate is native to ion-trap systems. The global MS can be
103
- applied to multiple ions to entangle multiple qubits simultaneously.
106
+ In the two-qubit case, this is equivalent to an XX interaction,
107
+ and is thus reduced to the :class:`.RXXGate`. The global MS gate is a sum of XX
108
+ interactions on all pairs [2].
104
109
 
105
- In the two-qubit case, this is equivalent to an XX(theta) interaction,
106
- and is thus reduced to the RXXGate.
110
+ .. math::
111
+
112
+ MS(\chi_{12}, \chi_{13}, ..., \chi_{n-1 n}) =
113
+ exp(-i \sum_{i=1}^{n} \sum_{j=i+1}^{n} X{\otimes}X \frac{\chi_{ij}}{2})
114
+
115
+ Example::
116
+
117
+ import numpy as np
118
+ from qiskit.circuit.library import MSGate
119
+ from qiskit.quantum_info import Operator
120
+
121
+ gate = MSGate(num_qubits=3, theta=[[0, np.pi/4, np.pi/8],
122
+ [0, 0, np.pi/2],
123
+ [0, 0, 0]])
124
+ print(Operator(gate))
125
+
126
+
127
+ **References:**
128
+
129
+ [1] Sørensen, A. and Mølmer, K., Multi-particle entanglement of hot trapped ions.
130
+ Physical Review Letters. 82 (9): 1835–1838.
131
+ `arXiv:9810040 <https://arxiv.org/abs/quant-ph/9810040>`_
132
+
133
+ [2] Maslov, D. and Nam, Y., Use of global interactions in efficient quantum circuit
134
+ constructions. New Journal of Physics, 20(3), p.033018.
135
+ `arXiv:1707.06356 <https://arxiv.org/abs/1707.06356>`_
107
136
  """
108
137
 
109
- def __init__(self, num_qubits, theta, label=None):
110
- """Create new MS gate."""
138
+ def __init__(
139
+ self,
140
+ num_qubits: int,
141
+ theta: ParameterValueType | Sequence[Sequence[ParameterValueType]],
142
+ label: str | None = None,
143
+ ):
144
+ """
145
+ Args:
146
+ num_qubits: The number of qubits the MS gate acts on.
147
+ theta: The XX rotation angles. If a single value, the same angle is used on all
148
+ interactions. Alternatively an upper-triangular, square matrix with width
149
+ ``num_qubits`` can be provided with interaction angles for each qubit pair.
150
+ label: A gate label.
151
+ """
111
152
  super().__init__("ms", num_qubits, [theta], label=label)
112
153
 
113
154
  def _define(self):
114
- theta = self.params[0]
115
- q = QuantumRegister(self.num_qubits, "q")
155
+ thetas = self.params[0]
156
+ q = QuantumRegister(self.num_qubits, name="q")
116
157
  qc = QuantumCircuit(q, name=self.name)
117
158
  for i in range(self.num_qubits):
118
159
  for j in range(i + 1, self.num_qubits):
160
+ # if theta is just a single angle, use that, otherwise use the correct index
161
+ theta = thetas if not isinstance(thetas, Sequence) else thetas[i][j]
119
162
  qc._append(RXXGate(theta), [q[i], q[j]], [])
120
163
 
121
164
  self.definition = qc
165
+
166
+ def validate_parameter(self, parameter):
167
+ if isinstance(parameter, Sequence):
168
+ # pylint: disable=super-with-arguments
169
+ return [
170
+ [super(MSGate, self).validate_parameter(theta) for theta in row]
171
+ for row in parameter
172
+ ]
173
+
174
+ return super().validate_parameter(parameter)
@@ -21,7 +21,7 @@ class GR(QuantumCircuit):
21
21
 
22
22
  **Circuit symbol:**
23
23
 
24
- .. parsed-literal::
24
+ .. code-block:: text
25
25
 
26
26
  ┌──────────┐
27
27
  q_0: ┤0 ├
@@ -75,7 +75,7 @@ class GRX(GR):
75
75
 
76
76
  **Circuit symbol:**
77
77
 
78
- .. parsed-literal::
78
+ .. code-block:: text
79
79
 
80
80
  ┌──────────┐
81
81
  q_0: ┤0 ├
@@ -123,7 +123,7 @@ class GRY(GR):
123
123
 
124
124
  **Circuit symbol:**
125
125
 
126
- .. parsed-literal::
126
+ .. code-block:: text
127
127
 
128
128
  ┌──────────┐
129
129
  q_0: ┤0 ├
@@ -171,7 +171,7 @@ class GRZ(QuantumCircuit):
171
171
 
172
172
  **Circuit symbol:**
173
173
 
174
- .. parsed-literal::
174
+ .. code-block:: text
175
175
 
176
176
  ┌──────────┐
177
177
  q_0: ┤0 ├
@@ -31,7 +31,7 @@ from qiskit.exceptions import QiskitError
31
31
  from qiskit.quantum_info.operators.predicates import is_isometry
32
32
  from qiskit._accelerate import isometry as isometry_rs
33
33
 
34
- from .diagonal import Diagonal
34
+ from .diagonal import DiagonalGate
35
35
  from .uc import UCGate
36
36
  from .mcg_up_to_diagonal import MCGupDiag
37
37
 
@@ -167,7 +167,7 @@ class Isometry(Instruction):
167
167
  if len(diag) > 1 and not isometry_rs.diag_is_identity_up_to_global_phase(
168
168
  diag, self._epsilon
169
169
  ):
170
- diagonal = Diagonal(np.conj(diag))
170
+ diagonal = DiagonalGate(np.conj(diag))
171
171
  circuit.append(diagonal, q_input)
172
172
  return circuit
173
173
 
@@ -17,6 +17,7 @@ import numpy as np
17
17
  from qiskit.circuit.quantumcircuit import QuantumCircuit, Gate
18
18
  from qiskit.circuit.exceptions import CircuitError
19
19
  from qiskit.circuit.library.generalized_gates.permutation import PermutationGate
20
+ from qiskit.utils.deprecation import deprecate_func
20
21
 
21
22
  # pylint: disable=cyclic-import
22
23
  from qiskit.quantum_info import Clifford
@@ -37,7 +38,7 @@ class LinearFunction(Gate):
37
38
 
38
39
  **Example:** the circuit
39
40
 
40
- .. parsed-literal::
41
+ .. code-block:: text
41
42
 
42
43
  q_0: ──■──
43
44
  ┌─┴─┐
@@ -67,7 +68,7 @@ class LinearFunction(Gate):
67
68
  def __init__(
68
69
  self,
69
70
  linear: (
70
- list[list]
71
+ list[list[bool]]
71
72
  | np.ndarray[bool]
72
73
  | QuantumCircuit
73
74
  | LinearFunction
@@ -221,17 +222,22 @@ class LinearFunction(Gate):
221
222
 
222
223
  def _define(self):
223
224
  """Populates self.definition with a decomposition of this gate."""
224
- self.definition = self.synthesize()
225
+ from qiskit.synthesis.linear import synth_cnot_count_full_pmh
226
+
227
+ self.definition = synth_cnot_count_full_pmh(self.linear)
225
228
 
229
+ @deprecate_func(
230
+ since="1.3",
231
+ pending=True,
232
+ additional_msg="Call LinearFunction.definition instead, or compile the circuit.",
233
+ )
226
234
  def synthesize(self):
227
235
  """Synthesizes the linear function into a quantum circuit.
228
236
 
229
237
  Returns:
230
238
  QuantumCircuit: A circuit implementing the evolution.
231
239
  """
232
- from qiskit.synthesis.linear import synth_cnot_count_full_pmh
233
-
234
- return synth_cnot_count_full_pmh(self.linear)
240
+ return self.definition
235
241
 
236
242
  @property
237
243
  def linear(self):