qiskit 1.3.0__cp39-abi3-win32.whl → 1.3.0b1__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 (361) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +1 -20
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/assembler/assemble_schedules.py +0 -2
  5. qiskit/circuit/__init__.py +1 -44
  6. qiskit/circuit/_standard_gates_commutations.py +0 -585
  7. qiskit/circuit/barrier.py +0 -2
  8. qiskit/circuit/controlflow/builder.py +3 -3
  9. qiskit/circuit/controlflow/if_else.py +5 -13
  10. qiskit/circuit/controlflow/while_loop.py +2 -10
  11. qiskit/circuit/delay.py +3 -20
  12. qiskit/circuit/equivalence.py +214 -13
  13. qiskit/circuit/gate.py +1 -3
  14. qiskit/circuit/instruction.py +11 -32
  15. qiskit/circuit/instructionset.py +0 -2
  16. qiskit/circuit/library/__init__.py +14 -110
  17. qiskit/circuit/library/arithmetic/__init__.py +2 -9
  18. qiskit/circuit/library/arithmetic/adders/__init__.py +0 -1
  19. qiskit/circuit/library/arithmetic/adders/adder.py +2 -154
  20. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +56 -20
  21. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +1 -14
  22. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +91 -21
  23. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  24. qiskit/circuit/library/arithmetic/multipliers/__init__.py +0 -1
  25. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -8
  26. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +3 -94
  27. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +1 -8
  28. qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
  29. qiskit/circuit/library/basis_change/qft.py +38 -20
  30. qiskit/circuit/library/blueprintcircuit.py +0 -64
  31. qiskit/circuit/library/boolean_logic/__init__.py +4 -4
  32. qiskit/circuit/library/boolean_logic/inner_product.py +4 -81
  33. qiskit/circuit/library/boolean_logic/quantum_and.py +4 -107
  34. qiskit/circuit/library/boolean_logic/quantum_or.py +3 -107
  35. qiskit/circuit/library/boolean_logic/quantum_xor.py +3 -97
  36. qiskit/circuit/library/data_preparation/__init__.py +3 -6
  37. qiskit/circuit/library/data_preparation/pauli_feature_map.py +29 -342
  38. qiskit/circuit/library/data_preparation/{_z_feature_map.py → z_feature_map.py} +34 -45
  39. qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
  40. qiskit/circuit/library/fourier_checking.py +11 -72
  41. qiskit/circuit/library/generalized_gates/__init__.py +1 -1
  42. qiskit/circuit/library/generalized_gates/diagonal.py +51 -45
  43. qiskit/circuit/library/generalized_gates/gms.py +14 -67
  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 +6 -12
  47. qiskit/circuit/library/generalized_gates/mcmt.py +107 -167
  48. qiskit/circuit/library/generalized_gates/permutation.py +6 -8
  49. qiskit/circuit/library/generalized_gates/rv.py +9 -8
  50. qiskit/circuit/library/graph_state.py +10 -93
  51. qiskit/circuit/library/grover_operator.py +2 -270
  52. qiskit/circuit/library/hidden_linear_function.py +20 -83
  53. qiskit/circuit/library/iqp.py +20 -99
  54. qiskit/circuit/library/n_local/__init__.py +7 -19
  55. qiskit/circuit/library/n_local/efficient_su2.py +5 -118
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +0 -259
  57. qiskit/circuit/library/n_local/excitation_preserving.py +6 -130
  58. qiskit/circuit/library/n_local/n_local.py +5 -406
  59. qiskit/circuit/library/n_local/pauli_two_design.py +4 -106
  60. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -80
  61. qiskit/circuit/library/n_local/real_amplitudes.py +7 -127
  62. qiskit/circuit/library/n_local/two_local.py +7 -14
  63. qiskit/circuit/library/overlap.py +26 -91
  64. qiskit/circuit/library/pauli_evolution.py +15 -17
  65. qiskit/circuit/library/phase_estimation.py +4 -80
  66. qiskit/circuit/library/quantum_volume.py +20 -72
  67. qiskit/circuit/library/standard_gates/__init__.py +1 -20
  68. qiskit/circuit/library/standard_gates/dcx.py +1 -2
  69. qiskit/circuit/library/standard_gates/ecr.py +2 -2
  70. qiskit/circuit/library/standard_gates/h.py +3 -4
  71. qiskit/circuit/library/standard_gates/i.py +1 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +2 -2
  73. qiskit/circuit/library/standard_gates/p.py +12 -20
  74. qiskit/circuit/library/standard_gates/r.py +1 -1
  75. qiskit/circuit/library/standard_gates/rx.py +3 -4
  76. qiskit/circuit/library/standard_gates/rxx.py +2 -2
  77. qiskit/circuit/library/standard_gates/ry.py +3 -4
  78. qiskit/circuit/library/standard_gates/ryy.py +2 -2
  79. qiskit/circuit/library/standard_gates/rz.py +12 -13
  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 +3 -4
  85. qiskit/circuit/library/standard_gates/t.py +2 -2
  86. qiskit/circuit/library/standard_gates/u.py +3 -11
  87. qiskit/circuit/library/standard_gates/u1.py +15 -65
  88. qiskit/circuit/library/standard_gates/u2.py +1 -4
  89. qiskit/circuit/library/standard_gates/u3.py +3 -31
  90. qiskit/circuit/library/standard_gates/x.py +5 -7
  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 +3 -4
  94. qiskit/circuit/library/standard_gates/z.py +3 -3
  95. qiskit/circuit/library/templates/clifford/clifford_2_1.py +8 -9
  96. qiskit/circuit/library/templates/clifford/clifford_2_2.py +9 -10
  97. qiskit/circuit/library/templates/clifford/clifford_2_3.py +7 -9
  98. qiskit/circuit/library/templates/clifford/clifford_2_4.py +8 -9
  99. qiskit/circuit/library/templates/clifford/clifford_3_1.py +8 -9
  100. qiskit/circuit/library/templates/clifford/clifford_4_1.py +9 -10
  101. qiskit/circuit/library/templates/clifford/clifford_4_2.py +9 -10
  102. qiskit/circuit/library/templates/clifford/clifford_4_3.py +9 -10
  103. qiskit/circuit/library/templates/clifford/clifford_4_4.py +9 -10
  104. qiskit/circuit/library/templates/clifford/clifford_5_1.py +9 -10
  105. qiskit/circuit/library/templates/clifford/clifford_6_1.py +9 -10
  106. qiskit/circuit/library/templates/clifford/clifford_6_2.py +9 -10
  107. qiskit/circuit/library/templates/clifford/clifford_6_3.py +9 -10
  108. qiskit/circuit/library/templates/clifford/clifford_6_4.py +8 -9
  109. qiskit/circuit/library/templates/clifford/clifford_6_5.py +9 -10
  110. qiskit/circuit/library/templates/clifford/clifford_8_1.py +9 -10
  111. qiskit/circuit/library/templates/clifford/clifford_8_2.py +9 -10
  112. qiskit/circuit/library/templates/clifford/clifford_8_3.py +9 -10
  113. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +7 -9
  114. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +8 -10
  115. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +10 -12
  116. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +14 -16
  117. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +12 -14
  118. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +10 -12
  119. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +12 -14
  120. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +10 -12
  121. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +10 -12
  122. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +10 -12
  123. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +10 -12
  124. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +9 -11
  125. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +9 -11
  126. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +10 -12
  127. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +10 -12
  128. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +10 -12
  129. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +10 -12
  130. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +10 -12
  131. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +10 -12
  132. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +11 -13
  133. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +11 -13
  134. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +11 -13
  135. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +11 -13
  136. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +11 -13
  137. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +11 -13
  138. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +9 -11
  139. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +10 -12
  140. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +10 -12
  141. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +10 -12
  142. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +10 -12
  143. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +10 -12
  144. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +10 -12
  145. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +10 -12
  146. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +10 -12
  147. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +10 -12
  148. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +10 -12
  149. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +10 -12
  150. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +9 -11
  151. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +10 -12
  152. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +10 -12
  153. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +10 -12
  154. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +10 -12
  155. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +10 -12
  156. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +10 -12
  157. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +10 -12
  158. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +10 -12
  159. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +10 -12
  160. qiskit/circuit/library/templates/rzx/rzx_cy.py +10 -11
  161. qiskit/circuit/library/templates/rzx/rzx_xz.py +15 -16
  162. qiskit/circuit/library/templates/rzx/rzx_yz.py +10 -12
  163. qiskit/circuit/library/templates/rzx/rzx_zz1.py +20 -22
  164. qiskit/circuit/library/templates/rzx/rzx_zz2.py +15 -16
  165. qiskit/circuit/library/templates/rzx/rzx_zz3.py +15 -17
  166. qiskit/circuit/parameter.py +0 -4
  167. qiskit/circuit/parameterexpression.py +34 -167
  168. qiskit/circuit/quantumcircuit.py +126 -162
  169. qiskit/circuit/singleton.py +0 -2
  170. qiskit/circuit/store.py +0 -2
  171. qiskit/compiler/assembler.py +4 -17
  172. qiskit/compiler/scheduler.py +0 -2
  173. qiskit/compiler/sequencer.py +0 -2
  174. qiskit/compiler/transpiler.py +26 -81
  175. qiskit/converters/circuit_to_dag.py +2 -2
  176. qiskit/converters/circuit_to_dagdependency.py +1 -1
  177. qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
  178. qiskit/converters/circuit_to_instruction.py +1 -1
  179. qiskit/converters/dag_to_circuit.py +5 -7
  180. qiskit/converters/dag_to_dagdependency.py +1 -1
  181. qiskit/converters/dag_to_dagdependency_v2.py +1 -1
  182. qiskit/converters/dagdependency_to_circuit.py +1 -5
  183. qiskit/converters/dagdependency_to_dag.py +1 -6
  184. qiskit/dagcircuit/collect_blocks.py +3 -3
  185. qiskit/dagcircuit/dagdependency.py +5 -18
  186. qiskit/dagcircuit/dagdependency_v2.py +1 -1
  187. qiskit/dagcircuit/dagnode.py +2 -2
  188. qiskit/passmanager/__init__.py +2 -2
  189. qiskit/primitives/backend_estimator.py +2 -5
  190. qiskit/primitives/backend_sampler_v2.py +18 -61
  191. qiskit/primitives/base/base_estimator.py +2 -2
  192. qiskit/primitives/containers/data_bin.py +1 -9
  193. qiskit/primitives/statevector_sampler.py +1 -1
  194. qiskit/primitives/utils.py +1 -1
  195. qiskit/providers/__init__.py +3 -3
  196. qiskit/providers/backend.py +1 -12
  197. qiskit/providers/backend_compat.py +3 -23
  198. qiskit/providers/basic_provider/basic_simulator.py +2 -12
  199. qiskit/providers/fake_provider/fake_pulse_backend.py +1 -6
  200. qiskit/providers/fake_provider/generic_backend_v2.py +30 -46
  201. qiskit/providers/models/pulsedefaults.py +0 -2
  202. qiskit/pulse/builder.py +18 -59
  203. qiskit/pulse/calibration_entries.py +1 -4
  204. qiskit/pulse/channels.py +0 -2
  205. qiskit/pulse/exceptions.py +0 -2
  206. qiskit/pulse/instruction_schedule_map.py +6 -21
  207. qiskit/pulse/instructions/acquire.py +0 -2
  208. qiskit/pulse/instructions/delay.py +0 -2
  209. qiskit/pulse/instructions/directives.py +0 -8
  210. qiskit/pulse/instructions/frequency.py +0 -3
  211. qiskit/pulse/instructions/instruction.py +0 -2
  212. qiskit/pulse/instructions/phase.py +0 -3
  213. qiskit/pulse/instructions/play.py +0 -2
  214. qiskit/pulse/instructions/reference.py +0 -2
  215. qiskit/pulse/instructions/snapshot.py +0 -2
  216. qiskit/pulse/library/pulse.py +0 -2
  217. qiskit/pulse/library/symbolic_pulses.py +0 -28
  218. qiskit/pulse/library/waveform.py +0 -2
  219. qiskit/pulse/macros.py +1 -1
  220. qiskit/pulse/schedule.py +13 -12
  221. qiskit/pulse/transforms/alignments.py +3 -5
  222. qiskit/pulse/transforms/dag.py +0 -7
  223. qiskit/qasm2/export.py +3 -5
  224. qiskit/qasm2/parse.py +2 -46
  225. qiskit/qasm3/__init__.py +0 -1
  226. qiskit/qasm3/ast.py +15 -123
  227. qiskit/qasm3/exporter.py +77 -103
  228. qiskit/qobj/converters/pulse_instruction.py +4 -6
  229. qiskit/qpy/__init__.py +0 -181
  230. qiskit/qpy/binary_io/circuits.py +5 -20
  231. qiskit/qpy/binary_io/schedules.py +4 -3
  232. qiskit/qpy/binary_io/value.py +13 -310
  233. qiskit/qpy/common.py +2 -46
  234. qiskit/qpy/formats.py +0 -7
  235. qiskit/qpy/interface.py +4 -40
  236. qiskit/quantum_info/__init__.py +0 -4
  237. qiskit/quantum_info/operators/channel/transformations.py +21 -28
  238. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  239. qiskit/quantum_info/operators/operator.py +8 -54
  240. qiskit/quantum_info/operators/symplectic/base_pauli.py +19 -11
  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 +0 -2
  244. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  245. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +2 -23
  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 +6 -6
  249. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  250. qiskit/result/mitigation/correlated_readout_mitigator.py +1 -9
  251. qiskit/result/mitigation/local_readout_mitigator.py +1 -9
  252. qiskit/result/mitigation/utils.py +0 -57
  253. qiskit/scheduler/config.py +0 -2
  254. qiskit/scheduler/methods/basic.py +0 -3
  255. qiskit/scheduler/schedule_circuit.py +0 -2
  256. qiskit/scheduler/sequence.py +0 -2
  257. qiskit/synthesis/__init__.py +0 -25
  258. qiskit/synthesis/clifford/clifford_decompose_bm.py +2 -1
  259. qiskit/synthesis/clifford/clifford_decompose_greedy.py +2 -3
  260. qiskit/synthesis/clifford/clifford_decompose_layers.py +1 -2
  261. qiskit/synthesis/evolution/__init__.py +0 -1
  262. qiskit/synthesis/evolution/lie_trotter.py +42 -16
  263. qiskit/synthesis/evolution/product_formula.py +238 -165
  264. qiskit/synthesis/evolution/qdrift.py +29 -36
  265. qiskit/synthesis/evolution/suzuki_trotter.py +27 -87
  266. qiskit/synthesis/multi_controlled/__init__.py +0 -1
  267. qiskit/synthesis/qft/qft_decompose_full.py +1 -19
  268. qiskit/synthesis/qft/qft_decompose_lnn.py +1 -2
  269. qiskit/synthesis/stabilizer/stabilizer_decompose.py +1 -2
  270. qiskit/synthesis/two_qubit/two_qubit_decompose.py +63 -4
  271. qiskit/synthesis/two_qubit/weyl.py +97 -0
  272. qiskit/synthesis/unitary/qsd.py +5 -5
  273. qiskit/transpiler/__init__.py +14 -21
  274. qiskit/transpiler/basepasses.py +1 -1
  275. qiskit/transpiler/passes/__init__.py +0 -2
  276. qiskit/transpiler/passes/basis/basis_translator.py +565 -9
  277. qiskit/transpiler/passes/basis/decompose.py +12 -45
  278. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  279. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  280. qiskit/transpiler/passes/calibration/pulse_gate.py +2 -4
  281. qiskit/transpiler/passes/calibration/rx_builder.py +7 -11
  282. qiskit/transpiler/passes/calibration/rzx_builder.py +30 -46
  283. qiskit/transpiler/passes/layout/disjoint_utils.py +13 -15
  284. qiskit/transpiler/passes/layout/sabre_layout.py +2 -7
  285. qiskit/transpiler/passes/layout/sabre_pre_layout.py +0 -5
  286. qiskit/transpiler/passes/optimization/__init__.py +0 -1
  287. qiskit/transpiler/passes/optimization/collect_cliffords.py +3 -19
  288. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  289. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  290. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  291. qiskit/transpiler/passes/optimization/consolidate_blocks.py +131 -48
  292. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +2 -4
  293. qiskit/transpiler/passes/optimization/elide_permutations.py +32 -9
  294. qiskit/transpiler/passes/optimization/inverse_cancellation.py +0 -2
  295. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +11 -5
  296. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  297. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  298. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  299. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  300. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  301. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  302. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  303. qiskit/transpiler/passes/routing/sabre_swap.py +3 -7
  304. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  305. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  306. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  307. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  308. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -2
  309. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  310. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  311. qiskit/transpiler/passes/scheduling/base_scheduler.py +12 -14
  312. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +4 -9
  313. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  314. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +5 -16
  315. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +1 -4
  316. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +2 -6
  317. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -9
  318. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +99 -262
  319. qiskit/transpiler/passes/synthesis/hls_plugins.py +7 -638
  320. qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
  321. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  322. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -55
  323. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +56 -2
  324. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -5
  325. qiskit/transpiler/passes/utils/gate_direction.py +275 -12
  326. qiskit/transpiler/passes/utils/gates_basis.py +30 -7
  327. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +1 -2
  328. qiskit/transpiler/passmanager_config.py +4 -22
  329. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +14 -40
  330. qiskit/transpiler/preset_passmanagers/common.py +3 -5
  331. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +42 -125
  332. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  333. qiskit/transpiler/target.py +16 -74
  334. qiskit/visualization/circuit/_utils.py +2 -2
  335. qiskit/visualization/circuit/circuit_visualization.py +2 -3
  336. qiskit/visualization/circuit/matplotlib.py +1 -1
  337. qiskit/visualization/dag_visualization.py +1 -1
  338. qiskit/visualization/pass_manager_visualization.py +14 -3
  339. qiskit/visualization/pulse_v2/interface.py +1 -3
  340. qiskit/visualization/timeline/core.py +2 -25
  341. qiskit/visualization/timeline/interface.py +0 -12
  342. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/METADATA +19 -20
  343. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/RECORD +347 -358
  344. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/WHEEL +1 -1
  345. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/entry_points.txt +0 -19
  346. qiskit/circuit/library/data_preparation/_zz_feature_map.py +0 -150
  347. qiskit/circuit/twirling.py +0 -145
  348. qiskit/synthesis/arithmetic/__init__.py +0 -16
  349. qiskit/synthesis/arithmetic/adders/__init__.py +0 -17
  350. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +0 -154
  351. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +0 -103
  352. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +0 -161
  353. qiskit/synthesis/arithmetic/multipliers/__init__.py +0 -16
  354. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +0 -102
  355. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +0 -99
  356. qiskit/synthesis/evolution/pauli_network.py +0 -80
  357. qiskit/synthesis/multi_controlled/mcmt_vchain.py +0 -52
  358. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +0 -69
  359. qiskit/utils/deprecate_pulse.py +0 -119
  360. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/LICENSE.txt +0 -0
  361. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/top_level.txt +0 -0
@@ -16,19 +16,14 @@ from __future__ import annotations
16
16
 
17
17
  import inspect
18
18
  import math
19
- import typing
20
- from itertools import chain
21
19
  from collections.abc import Callable
22
20
  import numpy as np
23
21
  from qiskit.circuit.quantumcircuit import QuantumCircuit
24
22
  from qiskit.quantum_info.operators import SparsePauliOp, Pauli
25
23
  from qiskit.utils.deprecation import deprecate_arg
26
- from qiskit.exceptions import QiskitError
27
24
 
28
- from .product_formula import ProductFormula, reorder_paulis
29
-
30
- if typing.TYPE_CHECKING:
31
- from qiskit.circuit.library import PauliEvolutionGate
25
+ from .product_formula import ProductFormula
26
+ from .lie_trotter import LieTrotter
32
27
 
33
28
 
34
29
  class QDrift(ProductFormula):
@@ -68,7 +63,6 @@ class QDrift(ProductFormula):
68
63
  ) = None,
69
64
  seed: int | None = None,
70
65
  wrap: bool = False,
71
- preserve_order: bool = True,
72
66
  ) -> None:
73
67
  r"""
74
68
  Args:
@@ -89,50 +83,49 @@ class QDrift(ProductFormula):
89
83
  seed: An optional seed for reproducibility of the random sampling process.
90
84
  wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
91
85
  effect when ``atomic_evolution is None``.
92
- preserve_order: If ``False``, allows reordering the terms of the operator to
93
- potentially yield a shallower evolution circuit. Not relevant
94
- when synthesizing operator with a single term.
95
86
  """
96
- super().__init__(
97
- 1, reps, insert_barriers, cx_structure, atomic_evolution, wrap, preserve_order
98
- )
87
+ super().__init__(1, reps, insert_barriers, cx_structure, atomic_evolution, wrap)
99
88
  self.sampled_ops = None
100
89
  self.rng = np.random.default_rng(seed)
101
90
 
102
- def expand(self, evolution: PauliEvolutionGate) -> list[tuple[str, tuple[int], float]]:
91
+ def synthesize(self, evolution):
92
+ # get operators and time to evolve
103
93
  operators = evolution.operator
104
- time = evolution.time # used to determine the number of gates
94
+ time = evolution.time
105
95
 
106
- # QDrift is based on first-order Lie-Trotter, hence we can just concatenate all
107
- # Pauli terms and ignore commutations
108
- if isinstance(operators, list):
109
- paulis = list(chain.from_iterable([op.to_sparse_list() for op in operators]))
96
+ if not isinstance(operators, list):
97
+ pauli_list = [(Pauli(op), coeff) for op, coeff in operators.to_list()]
98
+ coeffs = [np.real(coeff) for op, coeff in operators.to_list()]
110
99
  else:
111
- paulis = operators.to_sparse_list()
112
-
113
- try:
114
- coeffs = [float(np.real_if_close(coeff)) for _, _, coeff in paulis]
115
- except TypeError as exc:
116
- raise QiskitError("QDrift requires bound, real coefficients.") from exc
100
+ pauli_list = [(op, 1) for op in operators]
101
+ coeffs = [1 for op in operators]
117
102
 
118
103
  # We artificially make the weights positive
119
104
  weights = np.abs(coeffs)
120
105
  lambd = np.sum(weights)
121
106
 
122
107
  num_gates = math.ceil(2 * (lambd**2) * (time**2) * self.reps)
123
-
124
108
  # The protocol calls for the removal of the individual coefficients,
125
109
  # and multiplication by a constant evolution time.
126
- sampled = self.rng.choice(
127
- np.array(paulis, dtype=object), size=(num_gates,), p=weights / lambd
110
+ evolution_time = lambd * time / num_gates
111
+
112
+ self.sampled_ops = self.rng.choice(
113
+ np.array(pauli_list, dtype=object),
114
+ size=(num_gates,),
115
+ p=weights / lambd,
128
116
  )
129
117
 
130
- rescaled_time = 2 * lambd / num_gates * time
131
- sampled_paulis = [
132
- (pauli[0], pauli[1], np.real(np.sign(pauli[2])) * rescaled_time) for pauli in sampled
133
- ]
118
+ # pylint: disable=cyclic-import
119
+ from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
134
120
 
135
- if not self.preserve_order:
136
- sampled_paulis = reorder_paulis(sampled_paulis)
121
+ # Build the evolution circuit using the LieTrotter synthesis with the sampled operators
122
+ lie_trotter = LieTrotter(
123
+ insert_barriers=self.insert_barriers, atomic_evolution=self.atomic_evolution
124
+ )
125
+ evolution_circuit = PauliEvolutionGate(
126
+ sum(SparsePauliOp(np.sign(coeff) * op) for op, coeff in self.sampled_ops),
127
+ time=evolution_time,
128
+ synthesis=lie_trotter,
129
+ ).definition
137
130
 
138
- return sampled_paulis
131
+ return evolution_circuit
@@ -15,19 +15,16 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import inspect
18
- import typing
19
18
  from collections.abc import Callable
20
- from itertools import chain
19
+
20
+ import numpy as np
21
21
 
22
22
  from qiskit.circuit.quantumcircuit import QuantumCircuit
23
23
  from qiskit.quantum_info.operators import SparsePauliOp, Pauli
24
24
  from qiskit.utils.deprecation import deprecate_arg
25
25
 
26
- from .product_formula import ProductFormula, reorder_paulis
27
26
 
28
- if typing.TYPE_CHECKING:
29
- from qiskit.circuit.quantumcircuit import ParameterValueType
30
- from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
27
+ from .product_formula import ProductFormula
31
28
 
32
29
 
33
30
  class SuzukiTrotter(ProductFormula):
@@ -47,7 +44,7 @@ class SuzukiTrotter(ProductFormula):
47
44
 
48
45
  .. math::
49
46
 
50
- e^{-it(XI + ZZ)} = e^{-it/2 XI}e^{-it ZZ}e^{-it/2 XI} + \mathcal{O}(t^3).
47
+ e^{-it(XX + ZZ)} = e^{-it/2 ZZ}e^{-it XX}e^{-it/2 ZZ} + \mathcal{O}(t^3).
51
48
 
52
49
  References:
53
50
  [1]: D. Berry, G. Ahokas, R. Cleve and B. Sanders,
@@ -85,7 +82,6 @@ class SuzukiTrotter(ProductFormula):
85
82
  | None
86
83
  ) = None,
87
84
  wrap: bool = False,
88
- preserve_order: bool = True,
89
85
  ) -> None:
90
86
  """
91
87
  Args:
@@ -105,111 +101,55 @@ class SuzukiTrotter(ProductFormula):
105
101
  built.
106
102
  wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
107
103
  effect when ``atomic_evolution is None``.
108
- preserve_order: If ``False``, allows reordering the terms of the operator to
109
- potentially yield a shallower evolution circuit. Not relevant
110
- when synthesizing operator with a single term.
111
104
  Raises:
112
105
  ValueError: If order is not even
113
106
  """
114
107
 
115
- if order > 1 and order % 2 == 1:
108
+ if order % 2 == 1:
116
109
  raise ValueError(
117
110
  "Suzuki product formulae are symmetric and therefore only defined "
118
- f"for when the order is 1 or even, not {order}."
111
+ "for even orders."
119
112
  )
120
- super().__init__(
121
- order,
122
- reps,
123
- insert_barriers,
124
- cx_structure,
125
- atomic_evolution,
126
- wrap,
127
- preserve_order=preserve_order,
128
- )
129
-
130
- def expand(
131
- self, evolution: PauliEvolutionGate
132
- ) -> list[tuple[str, list[int], ParameterValueType]]:
133
- """Expand the Hamiltonian into a Suzuki-Trotter sequence of sparse gates.
134
-
135
- For example, the Hamiltonian ``H = IX + ZZ`` for an evolution time ``t`` and
136
- 1 repetition for an order 2 formula would get decomposed into a list of 3-tuples
137
- containing ``(pauli, indices, rz_rotation_angle)``, that is:
138
-
139
- .. code-block:: text
140
-
141
- ("X", [0], t), ("ZZ", [0, 1], 2t), ("X", [0], 2)
142
-
143
- Note that the rotation angle contains a factor of 2, such that that evolution
144
- of a Pauli :math:`P` over time :math:`t`, which is :math:`e^{itP}`, is represented
145
- by ``(P, indices, 2 * t)``.
146
-
147
- For ``N`` repetitions, this sequence would be repeated ``N`` times and the coefficients
148
- divided by ``N``.
113
+ super().__init__(order, reps, insert_barriers, cx_structure, atomic_evolution, wrap)
149
114
 
150
- Args:
151
- evolution: The evolution gate to expand.
152
-
153
- Returns:
154
- The Pauli network implementing the Trotter expansion.
155
- """
156
- operators = evolution.operator # type: SparsePauliOp | list[SparsePauliOp]
115
+ def synthesize(self, evolution):
116
+ # get operators and time to evolve
117
+ operators = evolution.operator
157
118
  time = evolution.time
158
119
 
159
- def to_sparse_list(operator):
160
- paulis = (time * (2 / self.reps) * operator).to_sparse_list()
161
- if not self.preserve_order:
162
- return reorder_paulis(paulis)
120
+ if not isinstance(operators, list):
121
+ pauli_list = [(Pauli(op), np.real(coeff)) for op, coeff in operators.to_list()]
122
+ else:
123
+ pauli_list = [(op, 1) for op in operators]
163
124
 
164
- return paulis
125
+ ops_to_evolve = self._recurse(self.order, time / self.reps, pauli_list)
165
126
 
166
127
  # construct the evolution circuit
167
- if isinstance(operators, list): # already sorted into commuting bits
168
- non_commuting = [to_sparse_list(operator) for operator in operators]
169
- else:
170
- # Assume no commutativity here. If we were to group commuting Paulis,
171
- # here would be the location to do so.
172
- non_commuting = [[op] for op in to_sparse_list(operators)]
173
-
174
- # normalize coefficients, i.e. ensure they are float or ParameterExpression
175
- non_commuting = self._normalize_coefficients(non_commuting)
128
+ single_rep = QuantumCircuit(operators[0].num_qubits)
176
129
 
177
- # we're already done here since Lie Trotter does not do any operator repetition
178
- product_formula = self._recurse(self.order, non_commuting)
179
- flattened = self.reps * list(chain.from_iterable(product_formula))
130
+ for i, (op, coeff) in enumerate(ops_to_evolve):
131
+ self.atomic_evolution(single_rep, op, coeff)
132
+ if self.insert_barriers and i != len(ops_to_evolve) - 1:
133
+ single_rep.barrier()
180
134
 
181
- return flattened
135
+ return single_rep.repeat(self.reps, insert_barriers=self.insert_barriers).decompose()
182
136
 
183
137
  @staticmethod
184
- def _recurse(order, grouped_paulis):
138
+ def _recurse(order, time, pauli_list):
185
139
  if order == 1:
186
- return grouped_paulis
140
+ return pauli_list
187
141
 
188
142
  elif order == 2:
189
- halves = [
190
- [(label, qubits, coeff / 2) for label, qubits, coeff in paulis]
191
- for paulis in grouped_paulis[:-1]
192
- ]
193
- full = [grouped_paulis[-1]]
143
+ halves = [(op, coeff * time / 2) for op, coeff in pauli_list[:-1]]
144
+ full = [(pauli_list[-1][0], time * pauli_list[-1][1])]
194
145
  return halves + full + list(reversed(halves))
195
146
 
196
147
  else:
197
148
  reduction = 1 / (4 - 4 ** (1 / (order - 1)))
198
149
  outer = 2 * SuzukiTrotter._recurse(
199
- order - 2,
200
- [
201
- [(label, qubits, coeff * reduction) for label, qubits, coeff in paulis]
202
- for paulis in grouped_paulis
203
- ],
150
+ order - 2, time=reduction * time, pauli_list=pauli_list
204
151
  )
205
152
  inner = SuzukiTrotter._recurse(
206
- order - 2,
207
- [
208
- [
209
- (label, qubits, coeff * (1 - 4 * reduction))
210
- for label, qubits, coeff in paulis
211
- ]
212
- for paulis in grouped_paulis
213
- ],
153
+ order - 2, time=(1 - 4 * reduction) * time, pauli_list=pauli_list
214
154
  )
215
155
  return outer + inner + outer
@@ -12,7 +12,6 @@
12
12
 
13
13
  """Module containing multi-controlled circuits synthesis"""
14
14
 
15
- from .mcmt_vchain import synth_mcmt_vchain
16
15
  from .mcx_synthesis import (
17
16
  synth_mcx_n_dirty_i15,
18
17
  synth_mcx_n_clean_m15,
@@ -14,7 +14,6 @@ Circuit synthesis for a QFT circuit.
14
14
  """
15
15
 
16
16
  from __future__ import annotations
17
- import warnings
18
17
  import numpy as np
19
18
  from qiskit.circuit.quantumcircuit import QuantumCircuit
20
19
 
@@ -55,7 +54,7 @@ def synth_qft_full(
55
54
  A circuit implementing the QFT operation.
56
55
 
57
56
  """
58
- _warn_if_precision_loss(num_qubits - approximation_degree - 1)
57
+
59
58
  circuit = QuantumCircuit(num_qubits, name=name)
60
59
 
61
60
  for j in reversed(range(num_qubits)):
@@ -78,20 +77,3 @@ def synth_qft_full(
78
77
  circuit = circuit.inverse()
79
78
 
80
79
  return circuit
81
-
82
-
83
- def _warn_if_precision_loss(max_num_entanglements):
84
- """Issue a warning if constructing the circuit will lose precision.
85
-
86
- If we need an angle smaller than ``pi * 2**-1022``, we start to lose precision by going into
87
- the subnormal numbers. We won't lose _all_ precision until an exponent of about 1075, but
88
- beyond 1022 we're using fractional bits to represent leading zeros.
89
- """
90
- if max_num_entanglements > -np.finfo(float).minexp: # > 1022 for doubles.
91
- warnings.warn(
92
- "precision loss in QFT."
93
- f" The rotation needed to represent {max_num_entanglements} entanglements"
94
- " is smaller than the smallest normal floating-point number.",
95
- category=RuntimeWarning,
96
- stacklevel=4,
97
- )
@@ -16,7 +16,6 @@ Circuit synthesis for a QFT circuit.
16
16
  import numpy as np
17
17
  from qiskit.circuit import QuantumCircuit
18
18
  from qiskit.synthesis.permutation.permutation_reverse_lnn import _append_reverse_permutation_lnn_kms
19
- from .qft_decompose_full import _warn_if_precision_loss
20
19
 
21
20
 
22
21
  def synth_qft_line(
@@ -52,7 +51,7 @@ def synth_qft_line(
52
51
  Quantum Info. Comput. 4, 4 (July 2004), 237–251.
53
52
  `arXiv:quant-ph/0402196 [quant-ph] <https://arxiv.org/abs/quant-ph/0402196>`_
54
53
  """
55
- _warn_if_precision_loss(num_qubits - approximation_degree - 1)
54
+
56
55
  qc = QuantumCircuit(num_qubits)
57
56
 
58
57
  for i in range(num_qubits):
@@ -46,8 +46,7 @@ def synth_stabilizer_layers(
46
46
 
47
47
  For example, a 5-qubit stabilizer state is decomposed into the following layers:
48
48
 
49
- .. code-block:: text
50
-
49
+ .. parsed-literal::
51
50
  ┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
52
51
  q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├
53
52
  │ ││ ││ ││ ││ │
@@ -24,6 +24,8 @@ Gambetta, J. M. Validating quantum computers using randomized model circuits.
24
24
  arXiv:1811.12926 [quant-ph] (2018).
25
25
  """
26
26
  from __future__ import annotations
27
+ import cmath
28
+ import math
27
29
  import io
28
30
  import base64
29
31
  import warnings
@@ -89,18 +91,41 @@ def decompose_two_qubit_product_gate(special_unitary_matrix: np.ndarray):
89
91
  QiskitError: if decomposition isn't possible.
90
92
  """
91
93
  special_unitary_matrix = np.asarray(special_unitary_matrix, dtype=complex)
92
- (L, R, phase) = two_qubit_decompose.decompose_two_qubit_product_gate(special_unitary_matrix)
94
+ # extract the right component
95
+ R = special_unitary_matrix[:2, :2].copy()
96
+ detR = R[0, 0] * R[1, 1] - R[0, 1] * R[1, 0]
97
+ if abs(detR) < 0.1:
98
+ R = special_unitary_matrix[2:, :2].copy()
99
+ detR = R[0, 0] * R[1, 1] - R[0, 1] * R[1, 0]
100
+ if abs(detR) < 0.1:
101
+ raise QiskitError("decompose_two_qubit_product_gate: unable to decompose: detR < 0.1")
102
+ R /= np.sqrt(detR)
103
+
104
+ # extract the left component
105
+ temp = np.kron(np.eye(2), R.T.conj())
106
+ temp = special_unitary_matrix.dot(temp)
107
+ L = temp[::2, ::2]
108
+ detL = L[0, 0] * L[1, 1] - L[0, 1] * L[1, 0]
109
+ if abs(detL) < 0.9:
110
+ raise QiskitError("decompose_two_qubit_product_gate: unable to decompose: detL < 0.9")
111
+ L /= np.sqrt(detL)
112
+ phase = cmath.phase(detL) / 2
93
113
 
94
114
  temp = np.kron(L, R)
95
115
  deviation = abs(abs(temp.conj().T.dot(special_unitary_matrix).trace()) - 4)
96
-
97
116
  if deviation > 1.0e-13:
98
117
  raise QiskitError(
99
118
  "decompose_two_qubit_product_gate: decomposition failed: "
100
119
  f"deviation too large: {deviation}"
101
120
  )
102
121
 
103
- return (L, R, phase)
122
+ return L, R, phase
123
+
124
+
125
+ _ipx = np.array([[0, 1j], [1j, 0]], dtype=complex)
126
+ _ipy = np.array([[0, 1], [-1, 0]], dtype=complex)
127
+ _ipz = np.array([[1j, 0], [0, -1j]], dtype=complex)
128
+ _id = np.array([[1, 0], [0, 1]], dtype=complex)
104
129
 
105
130
 
106
131
  class TwoQubitWeylDecomposition:
@@ -214,7 +239,7 @@ class TwoQubitWeylDecomposition:
214
239
  """Calculates the actual fidelity of the decomposed circuit to the input unitary."""
215
240
  circ = self.circuit(**kwargs)
216
241
  trace = np.trace(Operator(circ).data.T.conj() @ self.unitary_matrix)
217
- return two_qubit_decompose.trace_to_fid(trace)
242
+ return trace_to_fid(trace)
218
243
 
219
244
  def __repr__(self):
220
245
  """Represent with enough precision to allow copy-paste debugging of all corner cases"""
@@ -435,6 +460,40 @@ class TwoQubitControlledUDecomposer:
435
460
  return circ
436
461
 
437
462
 
463
+ def Ud(a, b, c):
464
+ r"""Generates the array :math:`e^{(i a XX + i b YY + i c ZZ)}`"""
465
+ return np.array(
466
+ [
467
+ [cmath.exp(1j * c) * math.cos(a - b), 0, 0, 1j * cmath.exp(1j * c) * math.sin(a - b)],
468
+ [0, cmath.exp(-1j * c) * math.cos(a + b), 1j * cmath.exp(-1j * c) * math.sin(a + b), 0],
469
+ [0, 1j * cmath.exp(-1j * c) * math.sin(a + b), cmath.exp(-1j * c) * math.cos(a + b), 0],
470
+ [1j * cmath.exp(1j * c) * math.sin(a - b), 0, 0, cmath.exp(1j * c) * math.cos(a - b)],
471
+ ],
472
+ dtype=complex,
473
+ )
474
+
475
+
476
+ def trace_to_fid(trace):
477
+ r"""Average gate fidelity is
478
+
479
+ .. math::
480
+
481
+ \bar{F} = \frac{d + |\mathrm{Tr} (U_\text{target} \cdot U^{\dag})|^2}{d(d+1)}
482
+
483
+ M. Horodecki, P. Horodecki and R. Horodecki, PRA 60, 1888 (1999)"""
484
+ return (4 + abs(trace) ** 2) / 20
485
+
486
+
487
+ def rz_array(theta):
488
+ """Return numpy array for Rz(theta).
489
+
490
+ Rz(theta) = diag(exp(-i*theta/2),exp(i*theta/2))
491
+ """
492
+ return np.array(
493
+ [[cmath.exp(-1j * theta / 2.0), 0], [0, cmath.exp(1j * theta / 2.0)]], dtype=complex
494
+ )
495
+
496
+
438
497
  class TwoQubitBasisDecomposer:
439
498
  """A class for decomposing 2-qubit unitaries into minimal number of uses of a 2-qubit
440
499
  basis gate.
@@ -0,0 +1,97 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2019.
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
+ # pylint: disable=invalid-name
13
+
14
+ """Routines that compute and use the Weyl chamber coordinates.
15
+ """
16
+
17
+ from __future__ import annotations
18
+ import numpy as np
19
+
20
+ # "Magic" basis used for the Weyl decomposition. The basis and its adjoint are stored individually
21
+ # unnormalized, but such that their matrix multiplication is still the identity. This is because
22
+ # they are only used in unitary transformations (so it's safe to do so), and `sqrt(0.5)` is not
23
+ # exactly representable in floating point. Doing it this way means that every element of the matrix
24
+ # is stored exactly correctly, and the multiplication is _exactly_ the identity rather than
25
+ # differing by 1ULP.
26
+ _B_nonnormalized = np.array([[1, 1j, 0, 0], [0, 0, 1j, 1], [0, 0, 1j, -1], [1, -1j, 0, 0]])
27
+ _B_nonnormalized_dagger = 0.5 * _B_nonnormalized.conj().T
28
+
29
+
30
+ def transform_to_magic_basis(U: np.ndarray, reverse: bool = False) -> np.ndarray:
31
+ """Transform the 4-by-4 matrix ``U`` into the magic basis.
32
+
33
+ This method internally uses non-normalized versions of the basis to minimize the floating-point
34
+ errors that arise during the transformation.
35
+
36
+ Args:
37
+ U (np.ndarray): 4-by-4 matrix to transform.
38
+ reverse (bool): Whether to do the transformation forwards (``B @ U @ B.conj().T``, the
39
+ default) or backwards (``B.conj().T @ U @ B``).
40
+
41
+ Returns:
42
+ np.ndarray: The transformed 4-by-4 matrix.
43
+ """
44
+ if reverse:
45
+ return _B_nonnormalized_dagger @ U @ _B_nonnormalized
46
+ return _B_nonnormalized @ U @ _B_nonnormalized_dagger
47
+
48
+
49
+ def weyl_coordinates(U: np.ndarray) -> np.ndarray:
50
+ """Computes the Weyl coordinates for a given two-qubit unitary matrix.
51
+
52
+ Args:
53
+ U (np.ndarray): Input two-qubit unitary.
54
+
55
+ Returns:
56
+ np.ndarray: Array of the 3 Weyl coordinates.
57
+ """
58
+ import scipy.linalg as la
59
+
60
+ pi2 = np.pi / 2
61
+ pi4 = np.pi / 4
62
+
63
+ U = U / la.det(U) ** (0.25)
64
+ Up = transform_to_magic_basis(U, reverse=True)
65
+ # We only need the eigenvalues of `M2 = Up.T @ Up` here, not the full diagonalization.
66
+ D = la.eigvals(Up.T @ Up)
67
+ d = -np.angle(D) / 2
68
+ d[3] = -d[0] - d[1] - d[2]
69
+ cs = np.mod((d[:3] + d[3]) / 2, 2 * np.pi)
70
+
71
+ # Reorder the eigenvalues to get in the Weyl chamber
72
+ cstemp = np.mod(cs, pi2)
73
+ np.minimum(cstemp, pi2 - cstemp, cstemp)
74
+ order = np.argsort(cstemp)[[1, 2, 0]]
75
+ cs = cs[order]
76
+ d[:3] = d[order]
77
+
78
+ # Flip into Weyl chamber
79
+ if cs[0] > pi2:
80
+ cs[0] -= 3 * pi2
81
+ if cs[1] > pi2:
82
+ cs[1] -= 3 * pi2
83
+ conjs = 0
84
+ if cs[0] > pi4:
85
+ cs[0] = pi2 - cs[0]
86
+ conjs += 1
87
+ if cs[1] > pi4:
88
+ cs[1] = pi2 - cs[1]
89
+ conjs += 1
90
+ if cs[2] > pi2:
91
+ cs[2] -= 3 * pi2
92
+ if conjs == 1:
93
+ cs[2] = pi2 - cs[2]
94
+ if cs[2] > pi4:
95
+ cs[2] -= pi2
96
+
97
+ return cs[[1, 0, 2]]
@@ -47,8 +47,7 @@ def qs_decomposition(
47
47
 
48
48
  This decomposition is described in Shende et al. [1].
49
49
 
50
- .. code-block:: text
51
-
50
+ .. parsed-literal::
52
51
  ┌───┐ ┌───┐ ┌───┐ ┌───┐
53
52
  ─┤ ├─ ───────┤ Rz├─────┤ Ry├─────┤ Rz├─────
54
53
  │ │ ≃ ┌───┐└─┬─┘┌───┐└─┬─┘┌───┐└─┬─┘┌───┐
@@ -251,13 +250,14 @@ def _get_ucry_cz(nqubits, angles):
251
250
 
252
251
 
253
252
  def _apply_a2(circ):
253
+ from qiskit.compiler import transpile
254
254
  from qiskit.quantum_info import Operator
255
255
  from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate
256
- from qiskit.transpiler.passes.synthesis import HighLevelSynthesis
257
256
 
258
257
  decomposer = two_qubit_decompose_up_to_diagonal
259
- hls = HighLevelSynthesis(basis_gates=["u", "cx", "qsd2q"], qubits_initially_zero=False)
260
- ccirc = hls(circ)
258
+ ccirc = transpile(
259
+ circ, basis_gates=["u", "cx", "qsd2q"], optimization_level=0, qubits_initially_zero=False
260
+ )
261
261
  ind2q = []
262
262
  # collect 2q instrs
263
263
  for i, instruction in enumerate(ccirc.data):