qiskit 1.3.0b1__cp39-abi3-macosx_10_9_x86_64.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 (825) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +127 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +365 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1270 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3264 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +48 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +503 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +163 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +106 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +295 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +261 -0
  54. qiskit/circuit/instruction.py +676 -0
  55. qiskit/circuit/instructionset.py +177 -0
  56. qiskit/circuit/library/__init__.py +572 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +16 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +331 -0
  80. qiskit/circuit/library/blueprintcircuit.py +216 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +54 -0
  87. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  88. qiskit/circuit/library/data_preparation/pauli_feature_map.py +343 -0
  89. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  90. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  91. qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
  92. qiskit/circuit/library/fourier_checking.py +97 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +165 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +121 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +312 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +256 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +192 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +97 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +86 -0
  111. qiskit/circuit/library/grover_operator.py +311 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +98 -0
  114. qiskit/circuit/library/iqp.py +96 -0
  115. qiskit/circuit/library/n_local/__init__.py +33 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +164 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +256 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +173 -0
  119. qiskit/circuit/library/n_local/n_local.py +1071 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +141 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +287 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +186 -0
  123. qiskit/circuit/library/n_local/two_local.py +282 -0
  124. qiskit/circuit/library/overlap.py +117 -0
  125. qiskit/circuit/library/pauli_evolution.py +184 -0
  126. qiskit/circuit/library/phase_estimation.py +99 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +115 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +123 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +257 -0
  135. qiskit/circuit/library/standard_gates/i.py +75 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +433 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +302 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +297 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +318 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +314 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +395 -0
  152. qiskit/circuit/library/standard_gates/u1.py +451 -0
  153. qiskit/circuit/library/standard_gates/u2.py +146 -0
  154. qiskit/circuit/library/standard_gates/u3.py +408 -0
  155. qiskit/circuit/library/standard_gates/x.py +1527 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +261 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +33 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +174 -0
  238. qiskit/circuit/parameterexpression.py +559 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6793 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +604 -0
  249. qiskit/circuit/store.py +95 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/compiler/__init__.py +33 -0
  253. qiskit/compiler/assembler.py +668 -0
  254. qiskit/compiler/scheduler.py +107 -0
  255. qiskit/compiler/sequencer.py +69 -0
  256. qiskit/compiler/transpiler.py +478 -0
  257. qiskit/converters/__init__.py +74 -0
  258. qiskit/converters/circuit_to_dag.py +78 -0
  259. qiskit/converters/circuit_to_dagdependency.py +51 -0
  260. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  261. qiskit/converters/circuit_to_gate.py +107 -0
  262. qiskit/converters/circuit_to_instruction.py +155 -0
  263. qiskit/converters/dag_to_circuit.py +77 -0
  264. qiskit/converters/dag_to_dagdependency.py +55 -0
  265. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  266. qiskit/converters/dagdependency_to_circuit.py +42 -0
  267. qiskit/converters/dagdependency_to_dag.py +49 -0
  268. qiskit/dagcircuit/__init__.py +44 -0
  269. qiskit/dagcircuit/collect_blocks.py +391 -0
  270. qiskit/dagcircuit/dagcircuit.py +24 -0
  271. qiskit/dagcircuit/dagdependency.py +633 -0
  272. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  273. qiskit/dagcircuit/dagdepnode.py +160 -0
  274. qiskit/dagcircuit/dagnode.py +176 -0
  275. qiskit/dagcircuit/exceptions.py +42 -0
  276. qiskit/exceptions.py +153 -0
  277. qiskit/passmanager/__init__.py +240 -0
  278. qiskit/passmanager/base_tasks.py +230 -0
  279. qiskit/passmanager/compilation_status.py +74 -0
  280. qiskit/passmanager/exceptions.py +19 -0
  281. qiskit/passmanager/flow_controllers.py +116 -0
  282. qiskit/passmanager/passmanager.py +333 -0
  283. qiskit/primitives/__init__.py +481 -0
  284. qiskit/primitives/backend_estimator.py +483 -0
  285. qiskit/primitives/backend_estimator_v2.py +434 -0
  286. qiskit/primitives/backend_sampler.py +222 -0
  287. qiskit/primitives/backend_sampler_v2.py +296 -0
  288. qiskit/primitives/base/__init__.py +20 -0
  289. qiskit/primitives/base/base_estimator.py +252 -0
  290. qiskit/primitives/base/base_primitive.py +45 -0
  291. qiskit/primitives/base/base_primitive_job.py +78 -0
  292. qiskit/primitives/base/base_result.py +65 -0
  293. qiskit/primitives/base/base_sampler.py +204 -0
  294. qiskit/primitives/base/estimator_result.py +46 -0
  295. qiskit/primitives/base/sampler_result.py +45 -0
  296. qiskit/primitives/base/validation.py +231 -0
  297. qiskit/primitives/containers/__init__.py +26 -0
  298. qiskit/primitives/containers/bindings_array.py +389 -0
  299. qiskit/primitives/containers/bit_array.py +741 -0
  300. qiskit/primitives/containers/data_bin.py +165 -0
  301. qiskit/primitives/containers/estimator_pub.py +222 -0
  302. qiskit/primitives/containers/object_array.py +94 -0
  303. qiskit/primitives/containers/observables_array.py +279 -0
  304. qiskit/primitives/containers/primitive_result.py +53 -0
  305. qiskit/primitives/containers/pub_result.py +51 -0
  306. qiskit/primitives/containers/sampler_pub.py +193 -0
  307. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  308. qiskit/primitives/containers/shape.py +129 -0
  309. qiskit/primitives/estimator.py +172 -0
  310. qiskit/primitives/primitive_job.py +81 -0
  311. qiskit/primitives/sampler.py +162 -0
  312. qiskit/primitives/statevector_estimator.py +174 -0
  313. qiskit/primitives/statevector_sampler.py +292 -0
  314. qiskit/primitives/utils.py +247 -0
  315. qiskit/providers/__init__.py +803 -0
  316. qiskit/providers/backend.py +656 -0
  317. qiskit/providers/backend_compat.py +452 -0
  318. qiskit/providers/basic_provider/__init__.py +45 -0
  319. qiskit/providers/basic_provider/basic_provider.py +101 -0
  320. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  321. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  322. qiskit/providers/basic_provider/basic_simulator.py +811 -0
  323. qiskit/providers/basic_provider/exceptions.py +30 -0
  324. qiskit/providers/exceptions.py +45 -0
  325. qiskit/providers/fake_provider/__init__.py +105 -0
  326. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  350. qiskit/providers/fake_provider/fake_1q.py +91 -0
  351. qiskit/providers/fake_provider/fake_backend.py +165 -0
  352. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  353. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  354. qiskit/providers/fake_provider/fake_pulse_backend.py +44 -0
  355. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  356. qiskit/providers/fake_provider/generic_backend_v2.py +1019 -0
  357. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  358. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  359. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  360. qiskit/providers/job.py +147 -0
  361. qiskit/providers/jobstatus.py +30 -0
  362. qiskit/providers/models/__init__.py +89 -0
  363. qiskit/providers/models/backendconfiguration.py +1040 -0
  364. qiskit/providers/models/backendproperties.py +517 -0
  365. qiskit/providers/models/backendstatus.py +94 -0
  366. qiskit/providers/models/jobstatus.py +66 -0
  367. qiskit/providers/models/pulsedefaults.py +303 -0
  368. qiskit/providers/options.py +273 -0
  369. qiskit/providers/provider.py +95 -0
  370. qiskit/providers/providerutils.py +110 -0
  371. qiskit/pulse/__init__.py +158 -0
  372. qiskit/pulse/builder.py +2213 -0
  373. qiskit/pulse/calibration_entries.py +378 -0
  374. qiskit/pulse/channels.py +225 -0
  375. qiskit/pulse/configuration.py +245 -0
  376. qiskit/pulse/exceptions.py +43 -0
  377. qiskit/pulse/filters.py +309 -0
  378. qiskit/pulse/instruction_schedule_map.py +409 -0
  379. qiskit/pulse/instructions/__init__.py +67 -0
  380. qiskit/pulse/instructions/acquire.py +148 -0
  381. qiskit/pulse/instructions/delay.py +69 -0
  382. qiskit/pulse/instructions/directives.py +146 -0
  383. qiskit/pulse/instructions/frequency.py +132 -0
  384. qiskit/pulse/instructions/instruction.py +268 -0
  385. qiskit/pulse/instructions/phase.py +149 -0
  386. qiskit/pulse/instructions/play.py +97 -0
  387. qiskit/pulse/instructions/reference.py +98 -0
  388. qiskit/pulse/instructions/snapshot.py +80 -0
  389. qiskit/pulse/library/__init__.py +97 -0
  390. qiskit/pulse/library/continuous.py +430 -0
  391. qiskit/pulse/library/pulse.py +146 -0
  392. qiskit/pulse/library/samplers/__init__.py +15 -0
  393. qiskit/pulse/library/samplers/decorators.py +295 -0
  394. qiskit/pulse/library/samplers/strategies.py +71 -0
  395. qiskit/pulse/library/symbolic_pulses.py +1960 -0
  396. qiskit/pulse/library/waveform.py +134 -0
  397. qiskit/pulse/macros.py +262 -0
  398. qiskit/pulse/parameter_manager.py +445 -0
  399. qiskit/pulse/parser.py +314 -0
  400. qiskit/pulse/reference_manager.py +58 -0
  401. qiskit/pulse/schedule.py +1855 -0
  402. qiskit/pulse/transforms/__init__.py +106 -0
  403. qiskit/pulse/transforms/alignments.py +404 -0
  404. qiskit/pulse/transforms/base_transforms.py +71 -0
  405. qiskit/pulse/transforms/canonicalization.py +498 -0
  406. qiskit/pulse/transforms/dag.py +115 -0
  407. qiskit/pulse/utils.py +149 -0
  408. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  409. qiskit/qasm/libs/qelib1.inc +266 -0
  410. qiskit/qasm/libs/stdgates.inc +82 -0
  411. qiskit/qasm2/__init__.py +654 -0
  412. qiskit/qasm2/exceptions.py +27 -0
  413. qiskit/qasm2/export.py +370 -0
  414. qiskit/qasm2/parse.py +408 -0
  415. qiskit/qasm3/__init__.py +366 -0
  416. qiskit/qasm3/ast.py +630 -0
  417. qiskit/qasm3/exceptions.py +27 -0
  418. qiskit/qasm3/experimental.py +70 -0
  419. qiskit/qasm3/exporter.py +1273 -0
  420. qiskit/qasm3/printer.py +577 -0
  421. qiskit/qobj/__init__.py +75 -0
  422. qiskit/qobj/common.py +81 -0
  423. qiskit/qobj/converters/__init__.py +18 -0
  424. qiskit/qobj/converters/lo_config.py +177 -0
  425. qiskit/qobj/converters/pulse_instruction.py +895 -0
  426. qiskit/qobj/pulse_qobj.py +709 -0
  427. qiskit/qobj/qasm_qobj.py +708 -0
  428. qiskit/qobj/utils.py +46 -0
  429. qiskit/qpy/__init__.py +1641 -0
  430. qiskit/qpy/binary_io/__init__.py +36 -0
  431. qiskit/qpy/binary_io/circuits.py +1460 -0
  432. qiskit/qpy/binary_io/schedules.py +636 -0
  433. qiskit/qpy/binary_io/value.py +728 -0
  434. qiskit/qpy/common.py +306 -0
  435. qiskit/qpy/exceptions.py +53 -0
  436. qiskit/qpy/formats.py +394 -0
  437. qiskit/qpy/interface.py +341 -0
  438. qiskit/qpy/type_keys.py +572 -0
  439. qiskit/quantum_info/__init__.py +158 -0
  440. qiskit/quantum_info/analysis/__init__.py +17 -0
  441. qiskit/quantum_info/analysis/average.py +47 -0
  442. qiskit/quantum_info/analysis/distance.py +102 -0
  443. qiskit/quantum_info/analysis/make_observable.py +44 -0
  444. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  445. qiskit/quantum_info/operators/__init__.py +28 -0
  446. qiskit/quantum_info/operators/base_operator.py +145 -0
  447. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  448. qiskit/quantum_info/operators/channel/chi.py +191 -0
  449. qiskit/quantum_info/operators/channel/choi.py +218 -0
  450. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  451. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  452. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  453. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  454. qiskit/quantum_info/operators/channel/superop.py +377 -0
  455. qiskit/quantum_info/operators/channel/transformations.py +468 -0
  456. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  457. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  458. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  460. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  461. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  462. qiskit/quantum_info/operators/linear_op.py +25 -0
  463. qiskit/quantum_info/operators/measures.py +418 -0
  464. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  465. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  466. qiskit/quantum_info/operators/mixins/group.py +171 -0
  467. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  468. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  469. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  470. qiskit/quantum_info/operators/op_shape.py +525 -0
  471. qiskit/quantum_info/operators/operator.py +819 -0
  472. qiskit/quantum_info/operators/operator_utils.py +76 -0
  473. qiskit/quantum_info/operators/predicates.py +183 -0
  474. qiskit/quantum_info/operators/random.py +154 -0
  475. qiskit/quantum_info/operators/scalar_op.py +254 -0
  476. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  477. qiskit/quantum_info/operators/symplectic/base_pauli.py +727 -0
  478. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  479. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  480. qiskit/quantum_info/operators/symplectic/pauli.py +751 -0
  481. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  483. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  484. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1175 -0
  485. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  486. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  487. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  489. qiskit/quantum_info/quaternion.py +156 -0
  490. qiskit/quantum_info/random.py +26 -0
  491. qiskit/quantum_info/states/__init__.py +28 -0
  492. qiskit/quantum_info/states/densitymatrix.py +845 -0
  493. qiskit/quantum_info/states/measures.py +288 -0
  494. qiskit/quantum_info/states/quantum_state.py +503 -0
  495. qiskit/quantum_info/states/random.py +157 -0
  496. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  497. qiskit/quantum_info/states/statevector.py +958 -0
  498. qiskit/quantum_info/states/utils.py +247 -0
  499. qiskit/result/__init__.py +73 -0
  500. qiskit/result/counts.py +189 -0
  501. qiskit/result/distributions/__init__.py +17 -0
  502. qiskit/result/distributions/probability.py +100 -0
  503. qiskit/result/distributions/quasi.py +154 -0
  504. qiskit/result/exceptions.py +40 -0
  505. qiskit/result/mitigation/__init__.py +13 -0
  506. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  507. qiskit/result/mitigation/correlated_readout_mitigator.py +269 -0
  508. qiskit/result/mitigation/local_readout_mitigator.py +320 -0
  509. qiskit/result/mitigation/utils.py +160 -0
  510. qiskit/result/models.py +234 -0
  511. qiskit/result/postprocess.py +239 -0
  512. qiskit/result/result.py +392 -0
  513. qiskit/result/sampled_expval.py +75 -0
  514. qiskit/result/utils.py +295 -0
  515. qiskit/scheduler/__init__.py +40 -0
  516. qiskit/scheduler/config.py +35 -0
  517. qiskit/scheduler/lowering.py +187 -0
  518. qiskit/scheduler/methods/__init__.py +15 -0
  519. qiskit/scheduler/methods/basic.py +137 -0
  520. qiskit/scheduler/schedule_circuit.py +67 -0
  521. qiskit/scheduler/sequence.py +102 -0
  522. qiskit/synthesis/__init__.py +195 -0
  523. qiskit/synthesis/clifford/__init__.py +19 -0
  524. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  525. qiskit/synthesis/clifford/clifford_decompose_bm.py +47 -0
  526. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  527. qiskit/synthesis/clifford/clifford_decompose_greedy.py +57 -0
  528. qiskit/synthesis/clifford/clifford_decompose_layers.py +446 -0
  529. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  530. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  531. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  532. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  533. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  534. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  535. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  536. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  537. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  538. qiskit/synthesis/evolution/__init__.py +20 -0
  539. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  540. qiskit/synthesis/evolution/lie_trotter.py +143 -0
  541. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  542. qiskit/synthesis/evolution/product_formula.py +384 -0
  543. qiskit/synthesis/evolution/qdrift.py +131 -0
  544. qiskit/synthesis/evolution/suzuki_trotter.py +155 -0
  545. qiskit/synthesis/linear/__init__.py +26 -0
  546. qiskit/synthesis/linear/cnot_synth.py +69 -0
  547. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  548. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  549. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  550. qiskit/synthesis/linear_phase/__init__.py +17 -0
  551. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  552. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  553. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  554. qiskit/synthesis/multi_controlled/__init__.py +23 -0
  555. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  556. qiskit/synthesis/one_qubit/__init__.py +15 -0
  557. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  558. qiskit/synthesis/permutation/__init__.py +18 -0
  559. qiskit/synthesis/permutation/permutation_full.py +78 -0
  560. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  561. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  562. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  563. qiskit/synthesis/qft/__init__.py +16 -0
  564. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  565. qiskit/synthesis/qft/qft_decompose_lnn.py +78 -0
  566. qiskit/synthesis/stabilizer/__init__.py +16 -0
  567. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  568. qiskit/synthesis/stabilizer/stabilizer_decompose.py +193 -0
  569. qiskit/synthesis/two_qubit/__init__.py +19 -0
  570. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  571. qiskit/synthesis/two_qubit/two_qubit_decompose.py +759 -0
  572. qiskit/synthesis/two_qubit/weyl.py +97 -0
  573. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  574. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  575. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  576. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  577. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  578. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  579. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  580. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  581. qiskit/synthesis/unitary/__init__.py +13 -0
  582. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  583. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  584. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  585. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  586. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  587. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  588. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  589. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  590. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  591. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  592. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  593. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  594. qiskit/synthesis/unitary/qsd.py +288 -0
  595. qiskit/transpiler/__init__.py +1283 -0
  596. qiskit/transpiler/basepasses.py +221 -0
  597. qiskit/transpiler/coupling.py +500 -0
  598. qiskit/transpiler/exceptions.py +59 -0
  599. qiskit/transpiler/instruction_durations.py +281 -0
  600. qiskit/transpiler/layout.py +737 -0
  601. qiskit/transpiler/passes/__init__.py +310 -0
  602. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  603. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  604. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  605. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  606. qiskit/transpiler/passes/analysis/depth.py +33 -0
  607. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  608. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  609. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  610. qiskit/transpiler/passes/analysis/size.py +36 -0
  611. qiskit/transpiler/passes/analysis/width.py +27 -0
  612. qiskit/transpiler/passes/basis/__init__.py +19 -0
  613. qiskit/transpiler/passes/basis/basis_translator.py +693 -0
  614. qiskit/transpiler/passes/basis/decompose.py +98 -0
  615. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  616. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  617. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  618. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  619. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  620. qiskit/transpiler/passes/calibration/builders.py +20 -0
  621. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  622. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  623. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  624. qiskit/transpiler/passes/calibration/rzx_builder.py +395 -0
  625. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  626. qiskit/transpiler/passes/layout/__init__.py +26 -0
  627. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  628. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  629. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  630. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  631. qiskit/transpiler/passes/layout/disjoint_utils.py +217 -0
  632. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  633. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  634. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  635. qiskit/transpiler/passes/layout/sabre_layout.py +482 -0
  636. qiskit/transpiler/passes/layout/sabre_pre_layout.py +220 -0
  637. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  638. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  639. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  640. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  641. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  642. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  643. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  644. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  645. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  646. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  647. qiskit/transpiler/passes/optimization/collect_cliffords.py +88 -0
  648. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  649. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  650. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  651. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  652. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  653. qiskit/transpiler/passes/optimization/consolidate_blocks.py +232 -0
  654. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  655. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  656. qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
  657. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  658. qiskit/transpiler/passes/optimization/inverse_cancellation.py +93 -0
  659. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  660. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  661. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +260 -0
  662. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  663. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  664. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  665. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  666. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  667. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  668. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  669. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  670. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  671. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  672. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  673. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  674. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  675. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  676. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  677. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  678. qiskit/transpiler/passes/routing/__init__.py +22 -0
  679. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  680. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  681. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  682. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  683. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  684. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  685. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  686. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  687. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  688. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  689. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  690. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  691. qiskit/transpiler/passes/routing/sabre_swap.py +443 -0
  692. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  693. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  694. qiskit/transpiler/passes/routing/utils.py +35 -0
  695. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  696. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  697. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  698. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  699. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  700. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +105 -0
  701. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  702. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  703. qiskit/transpiler/passes/scheduling/base_scheduler.py +308 -0
  704. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +307 -0
  705. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  706. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  707. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +441 -0
  708. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  709. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  710. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  711. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  712. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +90 -0
  713. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  714. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +160 -0
  715. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  716. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  717. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +691 -0
  718. qiskit/transpiler/passes/synthesis/hls_plugins.py +928 -0
  719. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  720. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  721. qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
  722. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  723. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1055 -0
  724. qiskit/transpiler/passes/utils/__init__.py +33 -0
  725. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  726. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  727. qiskit/transpiler/passes/utils/check_map.py +78 -0
  728. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  729. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  730. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +88 -0
  731. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  732. qiskit/transpiler/passes/utils/error.py +69 -0
  733. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  734. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  735. qiskit/transpiler/passes/utils/gate_direction.py +349 -0
  736. qiskit/transpiler/passes/utils/gates_basis.py +74 -0
  737. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  738. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  739. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  740. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  741. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  742. qiskit/transpiler/passmanager.py +490 -0
  743. qiskit/transpiler/passmanager_config.py +198 -0
  744. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  745. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1019 -0
  746. qiskit/transpiler/preset_passmanagers/common.py +647 -0
  747. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +543 -0
  748. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  749. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  750. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  751. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  752. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  753. qiskit/transpiler/target.py +1261 -0
  754. qiskit/transpiler/timing_constraints.py +59 -0
  755. qiskit/user_config.py +262 -0
  756. qiskit/utils/__init__.py +89 -0
  757. qiskit/utils/classtools.py +146 -0
  758. qiskit/utils/deprecation.py +490 -0
  759. qiskit/utils/lazy_tester.py +363 -0
  760. qiskit/utils/multiprocessing.py +56 -0
  761. qiskit/utils/optionals.py +347 -0
  762. qiskit/utils/parallel.py +191 -0
  763. qiskit/utils/units.py +143 -0
  764. qiskit/version.py +84 -0
  765. qiskit/visualization/__init__.py +288 -0
  766. qiskit/visualization/array.py +204 -0
  767. qiskit/visualization/bloch.py +778 -0
  768. qiskit/visualization/circuit/__init__.py +15 -0
  769. qiskit/visualization/circuit/_utils.py +675 -0
  770. qiskit/visualization/circuit/circuit_visualization.py +726 -0
  771. qiskit/visualization/circuit/latex.py +661 -0
  772. qiskit/visualization/circuit/matplotlib.py +2029 -0
  773. qiskit/visualization/circuit/qcstyle.py +278 -0
  774. qiskit/visualization/circuit/styles/__init__.py +13 -0
  775. qiskit/visualization/circuit/styles/bw.json +202 -0
  776. qiskit/visualization/circuit/styles/clifford.json +202 -0
  777. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  778. qiskit/visualization/circuit/styles/iqp.json +214 -0
  779. qiskit/visualization/circuit/styles/textbook.json +202 -0
  780. qiskit/visualization/circuit/text.py +1844 -0
  781. qiskit/visualization/circuit_visualization.py +19 -0
  782. qiskit/visualization/counts_visualization.py +481 -0
  783. qiskit/visualization/dag_visualization.py +316 -0
  784. qiskit/visualization/exceptions.py +21 -0
  785. qiskit/visualization/gate_map.py +1485 -0
  786. qiskit/visualization/library.py +37 -0
  787. qiskit/visualization/pass_manager_visualization.py +319 -0
  788. qiskit/visualization/pulse_v2/__init__.py +21 -0
  789. qiskit/visualization/pulse_v2/core.py +901 -0
  790. qiskit/visualization/pulse_v2/device_info.py +173 -0
  791. qiskit/visualization/pulse_v2/drawings.py +253 -0
  792. qiskit/visualization/pulse_v2/events.py +254 -0
  793. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  794. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  795. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  796. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  797. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  798. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  799. qiskit/visualization/pulse_v2/interface.py +456 -0
  800. qiskit/visualization/pulse_v2/layouts.py +387 -0
  801. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  802. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  803. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  804. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  805. qiskit/visualization/pulse_v2/types.py +242 -0
  806. qiskit/visualization/state_visualization.py +1518 -0
  807. qiskit/visualization/timeline/__init__.py +21 -0
  808. qiskit/visualization/timeline/core.py +457 -0
  809. qiskit/visualization/timeline/drawings.py +260 -0
  810. qiskit/visualization/timeline/generators.py +506 -0
  811. qiskit/visualization/timeline/interface.py +424 -0
  812. qiskit/visualization/timeline/layouts.py +115 -0
  813. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  814. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  815. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  816. qiskit/visualization/timeline/stylesheet.py +301 -0
  817. qiskit/visualization/timeline/types.py +148 -0
  818. qiskit/visualization/transition_visualization.py +369 -0
  819. qiskit/visualization/utils.py +49 -0
  820. qiskit-1.3.0b1.dist-info/LICENSE.txt +203 -0
  821. qiskit-1.3.0b1.dist-info/METADATA +221 -0
  822. qiskit-1.3.0b1.dist-info/RECORD +825 -0
  823. qiskit-1.3.0b1.dist-info/WHEEL +5 -0
  824. qiskit-1.3.0b1.dist-info/entry_points.txt +57 -0
  825. qiskit-1.3.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,759 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2024.
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
+ # pylint: disable=invalid-name
14
+
15
+ """
16
+ Expand 2-qubit Unitary operators into an equivalent
17
+ decomposition over SU(2)+fixed 2q basis gate, using the KAK method.
18
+
19
+ May be exact or approximate expansion. In either case uses the minimal
20
+ number of basis applications.
21
+
22
+ Method is described in Appendix B of Cross, A. W., Bishop, L. S., Sheldon, S., Nation, P. D. &
23
+ Gambetta, J. M. Validating quantum computers using randomized model circuits.
24
+ arXiv:1811.12926 [quant-ph] (2018).
25
+ """
26
+ from __future__ import annotations
27
+ import cmath
28
+ import math
29
+ import io
30
+ import base64
31
+ import warnings
32
+ from typing import Optional, Type, TYPE_CHECKING
33
+
34
+ import logging
35
+
36
+ import numpy as np
37
+
38
+ from qiskit.circuit import QuantumRegister, QuantumCircuit, Gate, CircuitInstruction
39
+ from qiskit.circuit.library.standard_gates import (
40
+ CXGate,
41
+ U3Gate,
42
+ U2Gate,
43
+ U1Gate,
44
+ UGate,
45
+ PhaseGate,
46
+ RXGate,
47
+ RYGate,
48
+ RZGate,
49
+ SXGate,
50
+ XGate,
51
+ RGate,
52
+ )
53
+ from qiskit.exceptions import QiskitError
54
+ from qiskit.quantum_info.operators import Operator
55
+ from qiskit.synthesis.one_qubit.one_qubit_decompose import (
56
+ OneQubitEulerDecomposer,
57
+ DEFAULT_ATOL,
58
+ )
59
+ from qiskit.utils.deprecation import deprecate_func
60
+ from qiskit._accelerate import two_qubit_decompose
61
+
62
+ if TYPE_CHECKING:
63
+ from qiskit.dagcircuit.dagcircuit import DAGCircuit, DAGOpNode
64
+
65
+ logger = logging.getLogger(__name__)
66
+
67
+
68
+ GATE_NAME_MAP = {
69
+ "cx": CXGate,
70
+ "rx": RXGate,
71
+ "sx": SXGate,
72
+ "x": XGate,
73
+ "rz": RZGate,
74
+ "u": UGate,
75
+ "p": PhaseGate,
76
+ "u1": U1Gate,
77
+ "u2": U2Gate,
78
+ "u3": U3Gate,
79
+ "ry": RYGate,
80
+ "r": RGate,
81
+ }
82
+
83
+
84
+ def decompose_two_qubit_product_gate(special_unitary_matrix: np.ndarray):
85
+ r"""Decompose :math:`U = U_l \otimes U_r` where :math:`U \in SU(4)`,
86
+ and :math:`U_l,~U_r \in SU(2)`.
87
+
88
+ Args:
89
+ special_unitary_matrix: special unitary matrix to decompose
90
+ Raises:
91
+ QiskitError: if decomposition isn't possible.
92
+ """
93
+ special_unitary_matrix = np.asarray(special_unitary_matrix, dtype=complex)
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
113
+
114
+ temp = np.kron(L, R)
115
+ deviation = abs(abs(temp.conj().T.dot(special_unitary_matrix).trace()) - 4)
116
+ if deviation > 1.0e-13:
117
+ raise QiskitError(
118
+ "decompose_two_qubit_product_gate: decomposition failed: "
119
+ f"deviation too large: {deviation}"
120
+ )
121
+
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)
129
+
130
+
131
+ class TwoQubitWeylDecomposition:
132
+ r"""Two-qubit Weyl decomposition.
133
+
134
+ Decompose two-qubit unitary
135
+
136
+ .. math::
137
+
138
+ U = ({K_1}^l \otimes {K_1}^r) e^{(i a XX + i b YY + i c ZZ)} ({K_2}^l \otimes {K_2}^r)
139
+
140
+ where
141
+
142
+ .. math::
143
+
144
+ U \in U(4),~
145
+ {K_1}^l, {K_1}^r, {K_2}^l, {K_2}^r \in SU(2)
146
+
147
+ and we stay in the "Weyl Chamber"
148
+
149
+ .. math::
150
+
151
+ \pi /4 \geq a \geq b \geq |c|
152
+
153
+ This class avoids some problems of numerical instability near high-symmetry loci within the Weyl
154
+ chamber. If there is a high-symmetry gate "nearby" (in terms of the requested average gate fidelity),
155
+ then it return a canonicalized decomposition of that high-symmetry gate.
156
+
157
+ References:
158
+ 1. Cross, A. W., Bishop, L. S., Sheldon, S., Nation, P. D. & Gambetta, J. M.,
159
+ *Validating quantum computers using randomized model circuits*,
160
+ `arXiv:1811.12926 [quant-ph] <https://arxiv.org/abs/1811.12926>`_
161
+ 2. B. Kraus, J. I. Cirac, *Optimal Creation of Entanglement Using a Two-Qubit Gate*,
162
+ `arXiv:0011050 [quant-ph] <https://arxiv.org/abs/quant-ph/0011050>`_
163
+ 3. B. Drury, P. J. Love, *Constructive Quantum Shannon Decomposition from Cartan
164
+ Involutions*, `arXiv:0806.4015 [quant-ph] <https://arxiv.org/abs/0806.4015>`_
165
+
166
+ """
167
+
168
+ # The parameters of the decomposition:
169
+ a: float
170
+ b: float
171
+ c: float
172
+ global_phase: float
173
+ K1l: np.ndarray
174
+ K2l: np.ndarray
175
+ K1r: np.ndarray
176
+ K2r: np.ndarray
177
+
178
+ unitary_matrix: np.ndarray # The unitary that was input
179
+ requested_fidelity: Optional[float] # None means no automatic specialization
180
+ calculated_fidelity: float # Fidelity after specialization
181
+
182
+ _specializations = two_qubit_decompose.Specialization
183
+
184
+ def __init__(
185
+ self,
186
+ unitary_matrix: np.ndarray,
187
+ fidelity: float | None = 1.0 - 1.0e-9,
188
+ *,
189
+ _specialization: two_qubit_decompose.Specialization | None = None,
190
+ ):
191
+ unitary_matrix = np.asarray(unitary_matrix, dtype=complex)
192
+ self._inner_decomposition = two_qubit_decompose.TwoQubitWeylDecomposition(
193
+ unitary_matrix, fidelity=fidelity, _specialization=_specialization
194
+ )
195
+ self.a = self._inner_decomposition.a
196
+ self.b = self._inner_decomposition.b
197
+ self.c = self._inner_decomposition.c
198
+ self.global_phase = self._inner_decomposition.global_phase
199
+ self.K1l = self._inner_decomposition.K1l
200
+ self.K1r = self._inner_decomposition.K1r
201
+ self.K2l = self._inner_decomposition.K2l
202
+ self.K2r = self._inner_decomposition.K2r
203
+ self.unitary_matrix = unitary_matrix
204
+ self.requested_fidelity = fidelity
205
+ self.calculated_fidelity = self._inner_decomposition.calculated_fidelity
206
+ if logger.isEnabledFor(logging.DEBUG):
207
+ actual_fidelity = self.actual_fidelity()
208
+ logger.debug(
209
+ "Requested fidelity: %s calculated fidelity: %s actual fidelity %s",
210
+ self.requested_fidelity,
211
+ self.calculated_fidelity,
212
+ actual_fidelity,
213
+ )
214
+ if abs(self.calculated_fidelity - actual_fidelity) > 1.0e-12:
215
+ logger.warning(
216
+ "Requested fidelity different from actual by %s",
217
+ self.calculated_fidelity - actual_fidelity,
218
+ )
219
+
220
+ @deprecate_func(since="1.1.0", removal_timeline="in the 2.0.0 release")
221
+ def specialize(self):
222
+ """Make changes to the decomposition to comply with any specializations.
223
+
224
+ This method will always raise a ``NotImplementedError`` because
225
+ there are no specializations to comply with in the current implementation.
226
+ """
227
+ raise NotImplementedError
228
+
229
+ def circuit(
230
+ self, *, euler_basis: str | None = None, simplify: bool = False, atol: float = DEFAULT_ATOL
231
+ ) -> QuantumCircuit:
232
+ """Returns Weyl decomposition in circuit form."""
233
+ circuit_data = self._inner_decomposition.circuit(
234
+ euler_basis=euler_basis, simplify=simplify, atol=atol
235
+ )
236
+ return QuantumCircuit._from_circuit_data(circuit_data, add_regs=True)
237
+
238
+ def actual_fidelity(self, **kwargs) -> float:
239
+ """Calculates the actual fidelity of the decomposed circuit to the input unitary."""
240
+ circ = self.circuit(**kwargs)
241
+ trace = np.trace(Operator(circ).data.T.conj() @ self.unitary_matrix)
242
+ return trace_to_fid(trace)
243
+
244
+ def __repr__(self):
245
+ """Represent with enough precision to allow copy-paste debugging of all corner cases"""
246
+ prefix = f"{type(self).__qualname__}.from_bytes("
247
+ with io.BytesIO() as f:
248
+ np.save(f, self.unitary_matrix, allow_pickle=False)
249
+ b64 = base64.encodebytes(f.getvalue()).splitlines()
250
+ b64ascii = [repr(x) for x in b64]
251
+ b64ascii[-1] += ","
252
+ pretty = [f"# {x.rstrip()}" for x in str(self).splitlines()]
253
+ indent = "\n" + " " * 4
254
+ specialization_variant = str(self._inner_decomposition.specialization).split(".")[1]
255
+ specialization_repr = f"{type(self).__qualname__}._specializations.{specialization_variant}"
256
+ lines = (
257
+ [prefix]
258
+ + pretty
259
+ + b64ascii
260
+ + [
261
+ f"requested_fidelity={self.requested_fidelity},",
262
+ f"_specialization={specialization_repr},",
263
+ f"calculated_fidelity={self.calculated_fidelity},",
264
+ f"actual_fidelity={self.actual_fidelity()},",
265
+ f"abc={(self.a, self.b, self.c)})",
266
+ ]
267
+ )
268
+ return indent.join(lines)
269
+
270
+ @classmethod
271
+ def from_bytes(
272
+ cls,
273
+ bytes_in: bytes,
274
+ *,
275
+ requested_fidelity: float,
276
+ _specialization: two_qubit_decompose.Specialization | None = None,
277
+ **kwargs,
278
+ ) -> "TwoQubitWeylDecomposition":
279
+ """Decode bytes into :class:`.TwoQubitWeylDecomposition`."""
280
+ # Used by __repr__
281
+ del kwargs # Unused (just for display)
282
+ b64 = base64.decodebytes(bytes_in)
283
+ with io.BytesIO(b64) as f:
284
+ arr = np.load(f, allow_pickle=False)
285
+ return cls(arr, fidelity=requested_fidelity, _specialization=_specialization)
286
+
287
+ def __str__(self):
288
+ specialization = str(self._inner_decomposition.specialization).split(".")[1]
289
+ pre = f"{self.__class__.__name__} [specialization={specialization}] (\n\t"
290
+ circ_indent = "\n\t".join(self.circuit(simplify=True).draw("text").lines(-1))
291
+ return f"{pre}{circ_indent}\n)"
292
+
293
+
294
+ class TwoQubitControlledUDecomposer:
295
+ r"""Decompose two-qubit unitary in terms of a desired
296
+ :math:`U \sim U_d(\alpha, 0, 0) \sim \text{Ctrl-U}`
297
+ gate that is locally equivalent to an :class:`.RXXGate`."""
298
+
299
+ def __init__(self, rxx_equivalent_gate: Type[Gate]):
300
+ r"""Initialize the KAK decomposition.
301
+
302
+ Args:
303
+ rxx_equivalent_gate: Gate that is locally equivalent to an :class:`.RXXGate`:
304
+ :math:`U \sim U_d(\alpha, 0, 0) \sim \text{Ctrl-U}` gate.
305
+ Raises:
306
+ QiskitError: If the gate is not locally equivalent to an :class:`.RXXGate`.
307
+ """
308
+ atol = DEFAULT_ATOL
309
+
310
+ scales, test_angles, scale = [], [0.2, 0.3, np.pi / 2], None
311
+
312
+ for test_angle in test_angles:
313
+ # Check that gate takes a single angle parameter
314
+ try:
315
+ rxx_equivalent_gate(test_angle, label="foo")
316
+ except TypeError as _:
317
+ raise QiskitError("Equivalent gate needs to take exactly 1 angle parameter.") from _
318
+ decomp = TwoQubitWeylDecomposition(rxx_equivalent_gate(test_angle))
319
+
320
+ circ = QuantumCircuit(2)
321
+ circ.rxx(test_angle, 0, 1)
322
+ decomposer_rxx = TwoQubitWeylDecomposition(
323
+ Operator(circ).data,
324
+ fidelity=None,
325
+ _specialization=two_qubit_decompose.Specialization.ControlledEquiv,
326
+ )
327
+
328
+ circ = QuantumCircuit(2)
329
+ circ.append(rxx_equivalent_gate(test_angle), qargs=[0, 1])
330
+ decomposer_equiv = TwoQubitWeylDecomposition(
331
+ Operator(circ).data,
332
+ fidelity=None,
333
+ _specialization=two_qubit_decompose.Specialization.ControlledEquiv,
334
+ )
335
+
336
+ scale = decomposer_rxx.a / decomposer_equiv.a
337
+
338
+ if abs(decomp.a * 2 - test_angle / scale) > atol:
339
+ raise QiskitError(
340
+ f"{rxx_equivalent_gate.__name__} is not equivalent to an RXXGate."
341
+ )
342
+
343
+ scales.append(scale)
344
+
345
+ # Check that all three tested angles give the same scale
346
+ if not np.allclose(scales, [scale] * len(test_angles)):
347
+ raise QiskitError(
348
+ f"Cannot initialize {self.__class__.__name__}: with gate {rxx_equivalent_gate}. "
349
+ "Inconsistent scaling parameters in checks."
350
+ )
351
+
352
+ self.scale = scales[0]
353
+
354
+ self.rxx_equivalent_gate = rxx_equivalent_gate
355
+
356
+ def __call__(self, unitary, *, atol=DEFAULT_ATOL) -> QuantumCircuit:
357
+ """Returns the Weyl decomposition in circuit form.
358
+
359
+ Note: atol ist passed to OneQubitEulerDecomposer.
360
+ """
361
+
362
+ # pylint: disable=attribute-defined-outside-init
363
+ self.decomposer = TwoQubitWeylDecomposition(unitary)
364
+
365
+ oneq_decompose = OneQubitEulerDecomposer("ZYZ")
366
+ c1l, c1r, c2l, c2r = (
367
+ oneq_decompose(k, atol=atol)
368
+ for k in (
369
+ self.decomposer.K1l,
370
+ self.decomposer.K1r,
371
+ self.decomposer.K2l,
372
+ self.decomposer.K2r,
373
+ )
374
+ )
375
+ circ = QuantumCircuit(2, global_phase=self.decomposer.global_phase)
376
+ circ.compose(c2r, [0], inplace=True)
377
+ circ.compose(c2l, [1], inplace=True)
378
+ self._weyl_gate(circ)
379
+ circ.compose(c1r, [0], inplace=True)
380
+ circ.compose(c1l, [1], inplace=True)
381
+ return circ
382
+
383
+ def _to_rxx_gate(self, angle: float) -> QuantumCircuit:
384
+ """
385
+ Takes an angle and returns the circuit equivalent to an RXXGate with the
386
+ RXX equivalent gate as the two-qubit unitary.
387
+
388
+ Args:
389
+ angle: Rotation angle (in this case one of the Weyl parameters a, b, or c)
390
+
391
+ Returns:
392
+ Circuit: Circuit equivalent to an RXXGate.
393
+
394
+ Raises:
395
+ QiskitError: If the circuit is not equivalent to an RXXGate.
396
+ """
397
+
398
+ # The user-provided RXXGate equivalent gate may be locally equivalent to the RXXGate
399
+ # but with some scaling in the rotation angle. For example, RXXGate(angle) has Weyl
400
+ # parameters (angle, 0, 0) for angle in [0, pi/2] but the user provided gate, i.e.
401
+ # :code:`self.rxx_equivalent_gate(angle)` might produce the Weyl parameters
402
+ # (scale * angle, 0, 0) where scale != 1. This is the case for the CPhaseGate.
403
+
404
+ circ = QuantumCircuit(2)
405
+ circ.append(self.rxx_equivalent_gate(self.scale * angle), qargs=[0, 1])
406
+ decomposer_inv = TwoQubitWeylDecomposition(Operator(circ).data)
407
+
408
+ oneq_decompose = OneQubitEulerDecomposer("ZYZ")
409
+
410
+ # Express the RXXGate in terms of the user-provided RXXGate equivalent gate.
411
+ rxx_circ = QuantumCircuit(2, global_phase=-decomposer_inv.global_phase)
412
+ rxx_circ.compose(oneq_decompose(decomposer_inv.K2r).inverse(), inplace=True, qubits=[0])
413
+ rxx_circ.compose(oneq_decompose(decomposer_inv.K2l).inverse(), inplace=True, qubits=[1])
414
+ rxx_circ.compose(circ, inplace=True)
415
+ rxx_circ.compose(oneq_decompose(decomposer_inv.K1r).inverse(), inplace=True, qubits=[0])
416
+ rxx_circ.compose(oneq_decompose(decomposer_inv.K1l).inverse(), inplace=True, qubits=[1])
417
+
418
+ return rxx_circ
419
+
420
+ def _weyl_gate(self, circ: QuantumCircuit, atol=1.0e-13):
421
+ """Appends U_d(a, b, c) to the circuit."""
422
+
423
+ circ_rxx = self._to_rxx_gate(-2 * self.decomposer.a)
424
+ circ.compose(circ_rxx, inplace=True)
425
+
426
+ # translate the RYYGate(b) into a circuit based on the desired Ctrl-U gate.
427
+ if abs(self.decomposer.b) > atol:
428
+ circ_ryy = QuantumCircuit(2)
429
+ circ_ryy.sdg(0)
430
+ circ_ryy.sdg(1)
431
+ circ_ryy.compose(self._to_rxx_gate(-2 * self.decomposer.b), inplace=True)
432
+ circ_ryy.s(0)
433
+ circ_ryy.s(1)
434
+ circ.compose(circ_ryy, inplace=True)
435
+
436
+ # translate the RZZGate(c) into a circuit based on the desired Ctrl-U gate.
437
+ if abs(self.decomposer.c) > atol:
438
+ # Since the Weyl chamber is here defined as a > b > |c| we may have
439
+ # negative c. This will cause issues in _to_rxx_gate
440
+ # as TwoQubitWeylControlledEquiv will map (c, 0, 0) to (|c|, 0, 0).
441
+ # We therefore produce RZZGate(|c|) and append its inverse to the
442
+ # circuit if c < 0.
443
+ gamma, invert = -2 * self.decomposer.c, False
444
+ if gamma > 0:
445
+ gamma *= -1
446
+ invert = True
447
+
448
+ circ_rzz = QuantumCircuit(2)
449
+ circ_rzz.h(0)
450
+ circ_rzz.h(1)
451
+ circ_rzz.compose(self._to_rxx_gate(gamma), inplace=True)
452
+ circ_rzz.h(0)
453
+ circ_rzz.h(1)
454
+
455
+ if invert:
456
+ circ.compose(circ_rzz.inverse(), inplace=True)
457
+ else:
458
+ circ.compose(circ_rzz, inplace=True)
459
+
460
+ return circ
461
+
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
+
497
+ class TwoQubitBasisDecomposer:
498
+ """A class for decomposing 2-qubit unitaries into minimal number of uses of a 2-qubit
499
+ basis gate.
500
+
501
+ Args:
502
+ gate: Two-qubit gate to be used in the KAK decomposition.
503
+ basis_fidelity: Fidelity to be assumed for applications of KAK Gate. Defaults to ``1.0``.
504
+ euler_basis: Basis string to be provided to :class:`.OneQubitEulerDecomposer` for 1Q synthesis.
505
+ Valid options are [``'ZYZ'``, ``'ZXZ'``, ``'XYX'``, ``'U'``, ``'U3'``, ``'U1X'``,
506
+ ``'PSX'``, ``'ZSX'``, ``'RR'``].
507
+ pulse_optimize: If ``True``, try to do decomposition which minimizes
508
+ local unitaries in between entangling gates. This will raise an exception if an
509
+ optimal decomposition is not implemented. Currently, only [{CX, SX, RZ}] is known.
510
+ If ``False``, don't attempt optimization. If ``None``, attempt optimization but don't raise
511
+ if unknown.
512
+
513
+
514
+ .. automethod:: __call__
515
+ """
516
+
517
+ def __init__(
518
+ self,
519
+ gate: Gate,
520
+ basis_fidelity: float = 1.0,
521
+ euler_basis: str = "U",
522
+ pulse_optimize: bool | None = None,
523
+ ):
524
+ self.gate = gate
525
+ self.basis_fidelity = basis_fidelity
526
+ self.pulse_optimize = pulse_optimize
527
+ # Use cx as gate name for pulse optimal decomposition detection
528
+ # otherwise use USER_GATE as a unique key to support custom gates
529
+ # including parameterized gates like UnitaryGate.
530
+ if isinstance(gate, CXGate):
531
+ gate_name = "cx"
532
+ else:
533
+ gate_name = "USER_GATE"
534
+
535
+ self._inner_decomposer = two_qubit_decompose.TwoQubitBasisDecomposer(
536
+ gate_name,
537
+ Operator(gate).data,
538
+ basis_fidelity=basis_fidelity,
539
+ euler_basis=euler_basis,
540
+ pulse_optimize=pulse_optimize,
541
+ )
542
+ self.is_supercontrolled = self._inner_decomposer.super_controlled
543
+ if not self.is_supercontrolled:
544
+ warnings.warn(
545
+ "Only know how to decompose properly for a supercontrolled basis gate.",
546
+ stacklevel=2,
547
+ )
548
+
549
+ def num_basis_gates(self, unitary):
550
+ """Computes the number of basis gates needed in
551
+ a decomposition of input unitary
552
+ """
553
+ unitary = np.asarray(unitary, dtype=complex)
554
+ return self._inner_decomposer.num_basis_gates(unitary)
555
+
556
+ @staticmethod
557
+ def decomp0(target):
558
+ r"""
559
+ Decompose target :math:`\sim U_d(x, y, z)` with :math:`0` uses of the basis gate.
560
+ Result :math:`U_r` has trace:
561
+
562
+ .. math::
563
+
564
+ \Big\vert\text{Tr}(U_r\cdot U_\text{target}^{\dag})\Big\vert =
565
+ 4\Big\vert (\cos(x)\cos(y)\cos(z)+ j \sin(x)\sin(y)\sin(z)\Big\vert
566
+
567
+ which is optimal for all targets and bases
568
+ """
569
+
570
+ return two_qubit_decompose.TwoQubitBasisDecomposer.decomp0(target)
571
+
572
+ def decomp1(self, target):
573
+ r"""Decompose target :math:`\sim U_d(x, y, z)` with :math:`1` use of the basis gate
574
+ :math:`\sim U_d(a, b, c)`.
575
+ Result :math:`U_r` has trace:
576
+
577
+ .. math::
578
+
579
+ \Big\vert\text{Tr}(U_r \cdot U_\text{target}^{\dag})\Big\vert =
580
+ 4\Big\vert \cos(x-a)\cos(y-b)\cos(z-c) + j \sin(x-a)\sin(y-b)\sin(z-c)\Big\vert
581
+
582
+ which is optimal for all targets and bases with ``z==0`` or ``c==0``.
583
+ """
584
+ return self._inner_decomposer.decomp1(target)
585
+
586
+ def decomp2_supercontrolled(self, target):
587
+ r"""
588
+ Decompose target :math:`\sim U_d(x, y, z)` with :math:`2` uses of the basis gate.
589
+
590
+ For supercontrolled basis :math:`\sim U_d(\pi/4, b, 0)`, all b, result :math:`U_r` has trace
591
+
592
+ .. math::
593
+
594
+ \Big\vert\text{Tr}(U_r \cdot U_\text{target}^\dag) \Big\vert = 4\cos(z)
595
+
596
+ which is the optimal approximation for basis of CNOT-class :math:`\sim U_d(\pi/4, 0, 0)`
597
+ or DCNOT-class :math:`\sim U_d(\pi/4, \pi/4, 0)` and any target. It may
598
+ be sub-optimal for :math:`b \neq 0` (i.e. there exists an exact decomposition for any target
599
+ using :math:`B \sim U_d(\pi/4, \pi/8, 0)`, but it may not be this decomposition).
600
+ This is an exact decomposition for supercontrolled basis and target :math:`\sim U_d(x, y, 0)`.
601
+ No guarantees for non-supercontrolled basis.
602
+ """
603
+ return self._inner_decomposer.decomp2_supercontrolled(target)
604
+
605
+ def decomp3_supercontrolled(self, target):
606
+ r"""
607
+ Decompose target with :math:`3` uses of the basis.
608
+ This is an exact decomposition for supercontrolled basis :math:`\sim U_d(\pi/4, b, 0)`, all b,
609
+ and any target. No guarantees for non-supercontrolled basis.
610
+ """
611
+ return self._inner_decomposer.decomp3_supercontrolled(target)
612
+
613
+ def __call__(
614
+ self,
615
+ unitary: Operator | np.ndarray,
616
+ basis_fidelity: float | None = None,
617
+ approximate: bool = True,
618
+ use_dag: bool = False,
619
+ *,
620
+ _num_basis_uses: int | None = None,
621
+ ) -> QuantumCircuit | DAGCircuit:
622
+ r"""Decompose a two-qubit ``unitary`` over fixed basis and :math:`SU(2)` using the best
623
+ approximation given that each basis application has a finite ``basis_fidelity``.
624
+
625
+ Args:
626
+ unitary (Operator or ndarray): :math:`4 \times 4` unitary to synthesize.
627
+ basis_fidelity (float or None): Fidelity to be assumed for applications of KAK Gate.
628
+ If given, overrides ``basis_fidelity`` given at init.
629
+ approximate (bool): Approximates if basis fidelities are less than 1.0.
630
+ use_dag (bool): If true a :class:`.DAGCircuit` is returned instead of a
631
+ :class:`QuantumCircuit` when this class is called.
632
+ _num_basis_uses (int): force a particular approximation by passing a number in [0, 3].
633
+
634
+ Returns:
635
+ QuantumCircuit: Synthesized quantum circuit.
636
+
637
+ Raises:
638
+ QiskitError: if ``pulse_optimize`` is True but we don't know how to do it.
639
+ """
640
+
641
+ if use_dag:
642
+ from qiskit.dagcircuit.dagcircuit import DAGCircuit
643
+ from qiskit.dagcircuit.dagnode import DAGOpNode
644
+
645
+ sequence = self._inner_decomposer(
646
+ np.asarray(unitary, dtype=complex),
647
+ basis_fidelity,
648
+ approximate,
649
+ _num_basis_uses=_num_basis_uses,
650
+ )
651
+ q = QuantumRegister(2)
652
+
653
+ dag = DAGCircuit()
654
+ dag.global_phase = sequence.global_phase
655
+ dag.add_qreg(q)
656
+ for gate, params, qubits in sequence:
657
+ if gate is None:
658
+ dag.apply_operation_back(self.gate, tuple(q[x] for x in qubits), check=False)
659
+ else:
660
+ op = CircuitInstruction.from_standard(
661
+ gate, qubits=tuple(q[x] for x in qubits), params=params
662
+ )
663
+ node = DAGOpNode.from_instruction(op)
664
+ dag._apply_op_node_back(node)
665
+ return dag
666
+ else:
667
+ if getattr(self.gate, "_standard_gate", None):
668
+ circ_data = self._inner_decomposer.to_circuit(
669
+ np.asarray(unitary, dtype=complex),
670
+ self.gate,
671
+ basis_fidelity,
672
+ approximate,
673
+ _num_basis_uses=_num_basis_uses,
674
+ )
675
+ return QuantumCircuit._from_circuit_data(circ_data, add_regs=True)
676
+ else:
677
+ sequence = self._inner_decomposer(
678
+ np.asarray(unitary, dtype=complex),
679
+ basis_fidelity,
680
+ approximate,
681
+ _num_basis_uses=_num_basis_uses,
682
+ )
683
+ q = QuantumRegister(2)
684
+ circ = QuantumCircuit(q, global_phase=sequence.global_phase)
685
+ for gate, params, qubits in sequence:
686
+ if gate is None:
687
+ circ._append(self.gate, qargs=tuple(q[x] for x in qubits))
688
+ else:
689
+ inst = CircuitInstruction.from_standard(
690
+ gate, qubits=tuple(q[x] for x in qubits), params=params
691
+ )
692
+ circ._append(inst)
693
+ return circ
694
+
695
+ def traces(self, target):
696
+ r"""
697
+ Give the expected traces :math:`\Big\vert\text{Tr}(U \cdot U_\text{target}^{\dag})\Big\vert`
698
+ for a different number of basis gates.
699
+ """
700
+ return self._inner_decomposer.traces(target._inner_decomposition)
701
+
702
+
703
+ # This weird duplicated lazy structure is for backwards compatibility; Qiskit has historically
704
+ # always made ``two_qubit_cnot_decompose`` available publicly immediately on import, but it's quite
705
+ # expensive to construct, and we want to defer the object's creation until it's actually used. We
706
+ # only need to pass through the public methods that take `self` as a parameter. Using `__getattr__`
707
+ # doesn't work because it is only called if the normal resolution methods fail. Using
708
+ # `__getattribute__` is too messy for a simple one-off use object.
709
+
710
+
711
+ class _LazyTwoQubitCXDecomposer(TwoQubitBasisDecomposer):
712
+ __slots__ = ("_inner",)
713
+
714
+ def __init__(self): # pylint: disable=super-init-not-called
715
+ self._inner = None
716
+
717
+ def _load(self):
718
+ if self._inner is None:
719
+ self._inner = TwoQubitBasisDecomposer(CXGate())
720
+
721
+ def __call__(self, *args, **kwargs) -> QuantumCircuit:
722
+ self._load()
723
+ return self._inner(*args, **kwargs)
724
+
725
+ def traces(self, target):
726
+ self._load()
727
+ return self._inner.traces(target)
728
+
729
+ def decomp1(self, target):
730
+ self._load()
731
+ return self._inner.decomp1(target)
732
+
733
+ def decomp2_supercontrolled(self, target):
734
+ self._load()
735
+ return self._inner.decomp2_supercontrolled(target)
736
+
737
+ def decomp3_supercontrolled(self, target):
738
+ self._load()
739
+ return self._inner.decomp3_supercontrolled(target)
740
+
741
+ def num_basis_gates(self, unitary):
742
+ self._load()
743
+ return self._inner.num_basis_gates(unitary)
744
+
745
+
746
+ two_qubit_cnot_decompose = _LazyTwoQubitCXDecomposer()
747
+ """
748
+ This is an instance of :class:`.TwoQubitBasisDecomposer` that always uses
749
+ ``cx`` as the KAK gate for the basis decomposition. You can use this function
750
+ as a quick access to ``cx``-based 2-qubit decompositions.
751
+
752
+ Args:
753
+ unitary (Operator or np.ndarray): The 4x4 unitary to synthesize.
754
+ basis_fidelity (float or None): If given the assumed fidelity for applications of :class:`.CXGate`.
755
+ approximate (bool): If ``True`` approximate if ``basis_fidelity`` is less than 1.0.
756
+
757
+ Returns:
758
+ QuantumCircuit: The synthesized circuit of the input unitary.
759
+ """