qiskit 1.3.0__cp39-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (836) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +146 -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 +367 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1313 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3849 -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 +50 -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 +511 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +171 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +123 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +94 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +263 -0
  54. qiskit/circuit/instruction.py +697 -0
  55. qiskit/circuit/instructionset.py +179 -0
  56. qiskit/circuit/library/__init__.py +668 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +34 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -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 +17 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -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 +313 -0
  80. qiskit/circuit/library/blueprintcircuit.py +280 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  87. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  88. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  89. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  90. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  91. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  92. qiskit/circuit/library/fourier_checking.py +158 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +174 -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 +318 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +194 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +96 -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 +169 -0
  111. qiskit/circuit/library/grover_operator.py +579 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +161 -0
  114. qiskit/circuit/library/iqp.py +175 -0
  115. qiskit/circuit/library/n_local/__init__.py +45 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +277 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
  119. qiskit/circuit/library/n_local/n_local.py +1472 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
  123. qiskit/circuit/library/n_local/two_local.py +289 -0
  124. qiskit/circuit/library/overlap.py +182 -0
  125. qiskit/circuit/library/pauli_evolution.py +186 -0
  126. qiskit/circuit/library/phase_estimation.py +175 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +167 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +142 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +78 -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 +258 -0
  135. qiskit/circuit/library/standard_gates/i.py +76 -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 +441 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +303 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +298 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +319 -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 +315 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +403 -0
  152. qiskit/circuit/library/standard_gates/u1.py +501 -0
  153. qiskit/circuit/library/standard_gates/u2.py +149 -0
  154. qiskit/circuit/library/standard_gates/u3.py +436 -0
  155. qiskit/circuit/library/standard_gates/x.py +1529 -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 +262 -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 +34 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +178 -0
  238. qiskit/circuit/parameterexpression.py +692 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6829 -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 +606 -0
  249. qiskit/circuit/store.py +97 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/circuit/twirling.py +145 -0
  253. qiskit/compiler/__init__.py +33 -0
  254. qiskit/compiler/assembler.py +681 -0
  255. qiskit/compiler/scheduler.py +109 -0
  256. qiskit/compiler/sequencer.py +71 -0
  257. qiskit/compiler/transpiler.py +533 -0
  258. qiskit/converters/__init__.py +74 -0
  259. qiskit/converters/circuit_to_dag.py +78 -0
  260. qiskit/converters/circuit_to_dagdependency.py +51 -0
  261. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  262. qiskit/converters/circuit_to_gate.py +107 -0
  263. qiskit/converters/circuit_to_instruction.py +155 -0
  264. qiskit/converters/dag_to_circuit.py +79 -0
  265. qiskit/converters/dag_to_dagdependency.py +55 -0
  266. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  267. qiskit/converters/dagdependency_to_circuit.py +46 -0
  268. qiskit/converters/dagdependency_to_dag.py +54 -0
  269. qiskit/dagcircuit/__init__.py +44 -0
  270. qiskit/dagcircuit/collect_blocks.py +391 -0
  271. qiskit/dagcircuit/dagcircuit.py +24 -0
  272. qiskit/dagcircuit/dagdependency.py +646 -0
  273. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  274. qiskit/dagcircuit/dagdepnode.py +160 -0
  275. qiskit/dagcircuit/dagnode.py +176 -0
  276. qiskit/dagcircuit/exceptions.py +42 -0
  277. qiskit/exceptions.py +153 -0
  278. qiskit/passmanager/__init__.py +240 -0
  279. qiskit/passmanager/base_tasks.py +230 -0
  280. qiskit/passmanager/compilation_status.py +74 -0
  281. qiskit/passmanager/exceptions.py +19 -0
  282. qiskit/passmanager/flow_controllers.py +116 -0
  283. qiskit/passmanager/passmanager.py +333 -0
  284. qiskit/primitives/__init__.py +481 -0
  285. qiskit/primitives/backend_estimator.py +486 -0
  286. qiskit/primitives/backend_estimator_v2.py +434 -0
  287. qiskit/primitives/backend_sampler.py +222 -0
  288. qiskit/primitives/backend_sampler_v2.py +339 -0
  289. qiskit/primitives/base/__init__.py +20 -0
  290. qiskit/primitives/base/base_estimator.py +252 -0
  291. qiskit/primitives/base/base_primitive.py +45 -0
  292. qiskit/primitives/base/base_primitive_job.py +78 -0
  293. qiskit/primitives/base/base_result.py +65 -0
  294. qiskit/primitives/base/base_sampler.py +204 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/containers/__init__.py +26 -0
  299. qiskit/primitives/containers/bindings_array.py +389 -0
  300. qiskit/primitives/containers/bit_array.py +741 -0
  301. qiskit/primitives/containers/data_bin.py +173 -0
  302. qiskit/primitives/containers/estimator_pub.py +222 -0
  303. qiskit/primitives/containers/object_array.py +94 -0
  304. qiskit/primitives/containers/observables_array.py +279 -0
  305. qiskit/primitives/containers/primitive_result.py +53 -0
  306. qiskit/primitives/containers/pub_result.py +51 -0
  307. qiskit/primitives/containers/sampler_pub.py +193 -0
  308. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  309. qiskit/primitives/containers/shape.py +129 -0
  310. qiskit/primitives/estimator.py +172 -0
  311. qiskit/primitives/primitive_job.py +81 -0
  312. qiskit/primitives/sampler.py +162 -0
  313. qiskit/primitives/statevector_estimator.py +174 -0
  314. qiskit/primitives/statevector_sampler.py +292 -0
  315. qiskit/primitives/utils.py +247 -0
  316. qiskit/providers/__init__.py +803 -0
  317. qiskit/providers/backend.py +667 -0
  318. qiskit/providers/backend_compat.py +472 -0
  319. qiskit/providers/basic_provider/__init__.py +45 -0
  320. qiskit/providers/basic_provider/basic_provider.py +101 -0
  321. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  322. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  323. qiskit/providers/basic_provider/basic_simulator.py +821 -0
  324. qiskit/providers/basic_provider/exceptions.py +30 -0
  325. qiskit/providers/exceptions.py +45 -0
  326. qiskit/providers/fake_provider/__init__.py +105 -0
  327. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  351. qiskit/providers/fake_provider/fake_1q.py +91 -0
  352. qiskit/providers/fake_provider/fake_backend.py +165 -0
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  357. qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
  358. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  359. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  360. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  361. qiskit/providers/job.py +147 -0
  362. qiskit/providers/jobstatus.py +30 -0
  363. qiskit/providers/models/__init__.py +89 -0
  364. qiskit/providers/models/backendconfiguration.py +1040 -0
  365. qiskit/providers/models/backendproperties.py +517 -0
  366. qiskit/providers/models/backendstatus.py +94 -0
  367. qiskit/providers/models/jobstatus.py +66 -0
  368. qiskit/providers/models/pulsedefaults.py +305 -0
  369. qiskit/providers/options.py +273 -0
  370. qiskit/providers/provider.py +95 -0
  371. qiskit/providers/providerutils.py +110 -0
  372. qiskit/pulse/__init__.py +158 -0
  373. qiskit/pulse/builder.py +2254 -0
  374. qiskit/pulse/calibration_entries.py +381 -0
  375. qiskit/pulse/channels.py +227 -0
  376. qiskit/pulse/configuration.py +245 -0
  377. qiskit/pulse/exceptions.py +45 -0
  378. qiskit/pulse/filters.py +309 -0
  379. qiskit/pulse/instruction_schedule_map.py +424 -0
  380. qiskit/pulse/instructions/__init__.py +67 -0
  381. qiskit/pulse/instructions/acquire.py +150 -0
  382. qiskit/pulse/instructions/delay.py +71 -0
  383. qiskit/pulse/instructions/directives.py +154 -0
  384. qiskit/pulse/instructions/frequency.py +135 -0
  385. qiskit/pulse/instructions/instruction.py +270 -0
  386. qiskit/pulse/instructions/phase.py +152 -0
  387. qiskit/pulse/instructions/play.py +99 -0
  388. qiskit/pulse/instructions/reference.py +100 -0
  389. qiskit/pulse/instructions/snapshot.py +82 -0
  390. qiskit/pulse/library/__init__.py +97 -0
  391. qiskit/pulse/library/continuous.py +430 -0
  392. qiskit/pulse/library/pulse.py +148 -0
  393. qiskit/pulse/library/samplers/__init__.py +15 -0
  394. qiskit/pulse/library/samplers/decorators.py +295 -0
  395. qiskit/pulse/library/samplers/strategies.py +71 -0
  396. qiskit/pulse/library/symbolic_pulses.py +1988 -0
  397. qiskit/pulse/library/waveform.py +136 -0
  398. qiskit/pulse/macros.py +262 -0
  399. qiskit/pulse/parameter_manager.py +445 -0
  400. qiskit/pulse/parser.py +314 -0
  401. qiskit/pulse/reference_manager.py +58 -0
  402. qiskit/pulse/schedule.py +1854 -0
  403. qiskit/pulse/transforms/__init__.py +106 -0
  404. qiskit/pulse/transforms/alignments.py +406 -0
  405. qiskit/pulse/transforms/base_transforms.py +71 -0
  406. qiskit/pulse/transforms/canonicalization.py +498 -0
  407. qiskit/pulse/transforms/dag.py +122 -0
  408. qiskit/pulse/utils.py +149 -0
  409. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  410. qiskit/qasm/libs/qelib1.inc +266 -0
  411. qiskit/qasm/libs/stdgates.inc +82 -0
  412. qiskit/qasm2/__init__.py +654 -0
  413. qiskit/qasm2/exceptions.py +27 -0
  414. qiskit/qasm2/export.py +372 -0
  415. qiskit/qasm2/parse.py +452 -0
  416. qiskit/qasm3/__init__.py +367 -0
  417. qiskit/qasm3/ast.py +738 -0
  418. qiskit/qasm3/exceptions.py +27 -0
  419. qiskit/qasm3/experimental.py +70 -0
  420. qiskit/qasm3/exporter.py +1299 -0
  421. qiskit/qasm3/printer.py +577 -0
  422. qiskit/qobj/__init__.py +75 -0
  423. qiskit/qobj/common.py +81 -0
  424. qiskit/qobj/converters/__init__.py +18 -0
  425. qiskit/qobj/converters/lo_config.py +177 -0
  426. qiskit/qobj/converters/pulse_instruction.py +897 -0
  427. qiskit/qobj/pulse_qobj.py +709 -0
  428. qiskit/qobj/qasm_qobj.py +708 -0
  429. qiskit/qobj/utils.py +46 -0
  430. qiskit/qpy/__init__.py +1822 -0
  431. qiskit/qpy/binary_io/__init__.py +36 -0
  432. qiskit/qpy/binary_io/circuits.py +1475 -0
  433. qiskit/qpy/binary_io/schedules.py +635 -0
  434. qiskit/qpy/binary_io/value.py +1025 -0
  435. qiskit/qpy/common.py +350 -0
  436. qiskit/qpy/exceptions.py +53 -0
  437. qiskit/qpy/formats.py +401 -0
  438. qiskit/qpy/interface.py +377 -0
  439. qiskit/qpy/type_keys.py +572 -0
  440. qiskit/quantum_info/__init__.py +162 -0
  441. qiskit/quantum_info/analysis/__init__.py +17 -0
  442. qiskit/quantum_info/analysis/average.py +47 -0
  443. qiskit/quantum_info/analysis/distance.py +102 -0
  444. qiskit/quantum_info/analysis/make_observable.py +44 -0
  445. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  446. qiskit/quantum_info/operators/__init__.py +28 -0
  447. qiskit/quantum_info/operators/base_operator.py +145 -0
  448. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  449. qiskit/quantum_info/operators/channel/chi.py +191 -0
  450. qiskit/quantum_info/operators/channel/choi.py +218 -0
  451. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  452. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  453. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  454. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  455. qiskit/quantum_info/operators/channel/superop.py +377 -0
  456. qiskit/quantum_info/operators/channel/transformations.py +475 -0
  457. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  458. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  460. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  461. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  462. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  463. qiskit/quantum_info/operators/linear_op.py +25 -0
  464. qiskit/quantum_info/operators/measures.py +418 -0
  465. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  466. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  467. qiskit/quantum_info/operators/mixins/group.py +171 -0
  468. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  469. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  470. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  471. qiskit/quantum_info/operators/op_shape.py +525 -0
  472. qiskit/quantum_info/operators/operator.py +865 -0
  473. qiskit/quantum_info/operators/operator_utils.py +76 -0
  474. qiskit/quantum_info/operators/predicates.py +183 -0
  475. qiskit/quantum_info/operators/random.py +154 -0
  476. qiskit/quantum_info/operators/scalar_op.py +254 -0
  477. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  478. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  479. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  480. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  481. qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  483. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  484. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  485. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
  486. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  487. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  489. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  490. qiskit/quantum_info/quaternion.py +156 -0
  491. qiskit/quantum_info/random.py +26 -0
  492. qiskit/quantum_info/states/__init__.py +28 -0
  493. qiskit/quantum_info/states/densitymatrix.py +845 -0
  494. qiskit/quantum_info/states/measures.py +288 -0
  495. qiskit/quantum_info/states/quantum_state.py +503 -0
  496. qiskit/quantum_info/states/random.py +157 -0
  497. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  498. qiskit/quantum_info/states/statevector.py +958 -0
  499. qiskit/quantum_info/states/utils.py +247 -0
  500. qiskit/result/__init__.py +73 -0
  501. qiskit/result/counts.py +189 -0
  502. qiskit/result/distributions/__init__.py +17 -0
  503. qiskit/result/distributions/probability.py +100 -0
  504. qiskit/result/distributions/quasi.py +154 -0
  505. qiskit/result/exceptions.py +40 -0
  506. qiskit/result/mitigation/__init__.py +13 -0
  507. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  508. qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
  509. qiskit/result/mitigation/local_readout_mitigator.py +328 -0
  510. qiskit/result/mitigation/utils.py +217 -0
  511. qiskit/result/models.py +234 -0
  512. qiskit/result/postprocess.py +239 -0
  513. qiskit/result/result.py +392 -0
  514. qiskit/result/sampled_expval.py +75 -0
  515. qiskit/result/utils.py +295 -0
  516. qiskit/scheduler/__init__.py +40 -0
  517. qiskit/scheduler/config.py +37 -0
  518. qiskit/scheduler/lowering.py +187 -0
  519. qiskit/scheduler/methods/__init__.py +15 -0
  520. qiskit/scheduler/methods/basic.py +140 -0
  521. qiskit/scheduler/schedule_circuit.py +69 -0
  522. qiskit/scheduler/sequence.py +104 -0
  523. qiskit/synthesis/__init__.py +220 -0
  524. qiskit/synthesis/arithmetic/__init__.py +16 -0
  525. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  526. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  527. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  528. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  529. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  530. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  531. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  532. qiskit/synthesis/clifford/__init__.py +19 -0
  533. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  534. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  535. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  536. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  537. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  538. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  539. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  540. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  541. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  542. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  543. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  544. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  545. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  546. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  547. qiskit/synthesis/evolution/__init__.py +21 -0
  548. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  549. qiskit/synthesis/evolution/lie_trotter.py +117 -0
  550. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  551. qiskit/synthesis/evolution/pauli_network.py +80 -0
  552. qiskit/synthesis/evolution/product_formula.py +311 -0
  553. qiskit/synthesis/evolution/qdrift.py +138 -0
  554. qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
  555. qiskit/synthesis/linear/__init__.py +26 -0
  556. qiskit/synthesis/linear/cnot_synth.py +69 -0
  557. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  558. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  559. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  560. qiskit/synthesis/linear_phase/__init__.py +17 -0
  561. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  562. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  563. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  564. qiskit/synthesis/multi_controlled/__init__.py +24 -0
  565. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  566. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  567. qiskit/synthesis/one_qubit/__init__.py +15 -0
  568. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  569. qiskit/synthesis/permutation/__init__.py +18 -0
  570. qiskit/synthesis/permutation/permutation_full.py +78 -0
  571. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  572. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  573. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  574. qiskit/synthesis/qft/__init__.py +16 -0
  575. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  576. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  577. qiskit/synthesis/stabilizer/__init__.py +16 -0
  578. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  579. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  580. qiskit/synthesis/two_qubit/__init__.py +19 -0
  581. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  582. qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
  583. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  584. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  585. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  586. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  587. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  588. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  589. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  590. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  591. qiskit/synthesis/unitary/__init__.py +13 -0
  592. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  593. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  594. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  595. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  596. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  597. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  598. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  599. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  600. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  601. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  602. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  603. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  604. qiskit/synthesis/unitary/qsd.py +288 -0
  605. qiskit/transpiler/__init__.py +1290 -0
  606. qiskit/transpiler/basepasses.py +221 -0
  607. qiskit/transpiler/coupling.py +500 -0
  608. qiskit/transpiler/exceptions.py +59 -0
  609. qiskit/transpiler/instruction_durations.py +281 -0
  610. qiskit/transpiler/layout.py +737 -0
  611. qiskit/transpiler/passes/__init__.py +312 -0
  612. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  613. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  614. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  615. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  616. qiskit/transpiler/passes/analysis/depth.py +33 -0
  617. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  618. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  619. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  620. qiskit/transpiler/passes/analysis/size.py +36 -0
  621. qiskit/transpiler/passes/analysis/width.py +27 -0
  622. qiskit/transpiler/passes/basis/__init__.py +19 -0
  623. qiskit/transpiler/passes/basis/basis_translator.py +137 -0
  624. qiskit/transpiler/passes/basis/decompose.py +131 -0
  625. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  626. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  627. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  628. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  629. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  630. qiskit/transpiler/passes/calibration/builders.py +20 -0
  631. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  632. qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
  633. qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
  634. qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
  635. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  636. qiskit/transpiler/passes/layout/__init__.py +26 -0
  637. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  638. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  639. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  640. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  641. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  642. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  643. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  644. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  645. qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
  646. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  647. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  648. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  649. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  650. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  651. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  652. qiskit/transpiler/passes/optimization/__init__.py +43 -0
  653. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  654. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  655. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  656. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  657. qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
  658. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  659. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  660. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  661. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  662. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  663. qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
  664. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  665. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
  666. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  667. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  668. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  669. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  670. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  671. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
  672. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  673. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  674. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  675. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  676. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  677. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  678. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  679. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  680. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  681. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  682. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  683. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  684. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  685. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  686. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  687. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  688. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  689. qiskit/transpiler/passes/routing/__init__.py +22 -0
  690. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  691. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  692. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  693. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  694. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  695. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  696. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  697. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  698. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  699. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  700. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  701. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  702. qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
  703. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  704. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  705. qiskit/transpiler/passes/routing/utils.py +35 -0
  706. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  707. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  708. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  709. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  710. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  711. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
  712. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  713. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  714. qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
  715. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
  716. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  717. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  718. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
  719. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
  720. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  721. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  722. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  723. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
  724. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  725. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
  726. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  727. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  728. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
  729. qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
  730. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  731. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  732. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  733. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
  734. qiskit/transpiler/passes/utils/__init__.py +33 -0
  735. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  736. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  737. qiskit/transpiler/passes/utils/check_map.py +78 -0
  738. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  739. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  740. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
  741. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  742. qiskit/transpiler/passes/utils/error.py +69 -0
  743. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  744. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  745. qiskit/transpiler/passes/utils/gate_direction.py +86 -0
  746. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  747. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  748. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  749. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  750. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  751. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  752. qiskit/transpiler/passmanager.py +490 -0
  753. qiskit/transpiler/passmanager_config.py +216 -0
  754. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  755. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
  756. qiskit/transpiler/preset_passmanagers/common.py +649 -0
  757. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
  758. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  759. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  760. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  761. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  762. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  763. qiskit/transpiler/target.py +1319 -0
  764. qiskit/transpiler/timing_constraints.py +59 -0
  765. qiskit/user_config.py +262 -0
  766. qiskit/utils/__init__.py +89 -0
  767. qiskit/utils/classtools.py +146 -0
  768. qiskit/utils/deprecate_pulse.py +119 -0
  769. qiskit/utils/deprecation.py +490 -0
  770. qiskit/utils/lazy_tester.py +363 -0
  771. qiskit/utils/multiprocessing.py +56 -0
  772. qiskit/utils/optionals.py +347 -0
  773. qiskit/utils/parallel.py +191 -0
  774. qiskit/utils/units.py +143 -0
  775. qiskit/version.py +84 -0
  776. qiskit/visualization/__init__.py +288 -0
  777. qiskit/visualization/array.py +204 -0
  778. qiskit/visualization/bloch.py +778 -0
  779. qiskit/visualization/circuit/__init__.py +15 -0
  780. qiskit/visualization/circuit/_utils.py +675 -0
  781. qiskit/visualization/circuit/circuit_visualization.py +727 -0
  782. qiskit/visualization/circuit/latex.py +661 -0
  783. qiskit/visualization/circuit/matplotlib.py +2029 -0
  784. qiskit/visualization/circuit/qcstyle.py +278 -0
  785. qiskit/visualization/circuit/styles/__init__.py +13 -0
  786. qiskit/visualization/circuit/styles/bw.json +202 -0
  787. qiskit/visualization/circuit/styles/clifford.json +202 -0
  788. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  789. qiskit/visualization/circuit/styles/iqp.json +214 -0
  790. qiskit/visualization/circuit/styles/textbook.json +202 -0
  791. qiskit/visualization/circuit/text.py +1844 -0
  792. qiskit/visualization/circuit_visualization.py +19 -0
  793. qiskit/visualization/counts_visualization.py +481 -0
  794. qiskit/visualization/dag_visualization.py +316 -0
  795. qiskit/visualization/exceptions.py +21 -0
  796. qiskit/visualization/gate_map.py +1485 -0
  797. qiskit/visualization/library.py +37 -0
  798. qiskit/visualization/pass_manager_visualization.py +308 -0
  799. qiskit/visualization/pulse_v2/__init__.py +21 -0
  800. qiskit/visualization/pulse_v2/core.py +901 -0
  801. qiskit/visualization/pulse_v2/device_info.py +173 -0
  802. qiskit/visualization/pulse_v2/drawings.py +253 -0
  803. qiskit/visualization/pulse_v2/events.py +254 -0
  804. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  805. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  806. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  807. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  808. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  809. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  810. qiskit/visualization/pulse_v2/interface.py +458 -0
  811. qiskit/visualization/pulse_v2/layouts.py +387 -0
  812. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  813. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  814. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  815. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  816. qiskit/visualization/pulse_v2/types.py +242 -0
  817. qiskit/visualization/state_visualization.py +1518 -0
  818. qiskit/visualization/timeline/__init__.py +21 -0
  819. qiskit/visualization/timeline/core.py +480 -0
  820. qiskit/visualization/timeline/drawings.py +260 -0
  821. qiskit/visualization/timeline/generators.py +506 -0
  822. qiskit/visualization/timeline/interface.py +436 -0
  823. qiskit/visualization/timeline/layouts.py +115 -0
  824. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  825. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  826. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  827. qiskit/visualization/timeline/stylesheet.py +301 -0
  828. qiskit/visualization/timeline/types.py +148 -0
  829. qiskit/visualization/transition_visualization.py +369 -0
  830. qiskit/visualization/utils.py +49 -0
  831. qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
  832. qiskit-1.3.0.dist-info/METADATA +222 -0
  833. qiskit-1.3.0.dist-info/RECORD +836 -0
  834. qiskit-1.3.0.dist-info/WHEEL +5 -0
  835. qiskit-1.3.0.dist-info/entry_points.txt +76 -0
  836. qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,865 @@
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
+
13
+ """
14
+ Matrix Operator class.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import cmath
20
+ import copy as _copy
21
+ import re
22
+ from numbers import Number
23
+ from typing import TYPE_CHECKING
24
+
25
+ import numpy as np
26
+
27
+ from qiskit import _numpy_compat
28
+ from qiskit.circuit.instruction import Instruction
29
+ from qiskit.circuit.library.standard_gates import HGate, IGate, SGate, TGate, XGate, YGate, ZGate
30
+ from qiskit.circuit.operation import Operation
31
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
32
+ from qiskit.exceptions import QiskitError
33
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
34
+ from qiskit.quantum_info.operators.linear_op import LinearOp
35
+ from qiskit.quantum_info.operators.mixins import generate_apidocs
36
+ from qiskit.quantum_info.operators.predicates import is_unitary_matrix, matrix_equal
37
+
38
+ if TYPE_CHECKING:
39
+ from qiskit.transpiler.layout import Layout
40
+
41
+
42
+ class Operator(LinearOp):
43
+ r"""Matrix operator class
44
+
45
+ This represents a matrix operator :math:`M` that will
46
+ :meth:`~Statevector.evolve` a :class:`Statevector` :math:`|\psi\rangle`
47
+ by matrix-vector multiplication
48
+
49
+ .. math::
50
+
51
+ |\psi\rangle \mapsto M|\psi\rangle,
52
+
53
+ and will :meth:`~DensityMatrix.evolve` a :class:`DensityMatrix` :math:`\rho`
54
+ by left and right multiplication
55
+
56
+ .. math::
57
+
58
+ \rho \mapsto M \rho M^\dagger.
59
+
60
+ For example, the following operator :math:`M = X` applied to the zero state
61
+ :math:`|\psi\rangle=|0\rangle (\rho = |0\rangle\langle 0|)` changes it to the
62
+ one state :math:`|\psi\rangle=|1\rangle (\rho = |1\rangle\langle 1|)`:
63
+
64
+ .. code-block:: python
65
+
66
+ >>> import numpy as np
67
+ >>> from qiskit.quantum_info import Operator
68
+ >>> op = Operator(np.array([[0.0, 1.0], [1.0, 0.0]])) # Represents Pauli X operator
69
+
70
+ >>> from qiskit.quantum_info import Statevector
71
+ >>> sv = Statevector(np.array([1.0, 0.0]))
72
+ >>> sv.evolve(op)
73
+ Statevector([0.+0.j, 1.+0.j],
74
+ dims=(2,))
75
+
76
+ >>> from qiskit.quantum_info import DensityMatrix
77
+ >>> dm = DensityMatrix(np.array([[1.0, 0.0], [0.0, 0.0]]))
78
+ >>> dm.evolve(op)
79
+ DensityMatrix([[0.+0.j, 0.+0.j],
80
+ [0.+0.j, 1.+0.j]],
81
+ dims=(2,))
82
+
83
+ """
84
+
85
+ def __init__(
86
+ self,
87
+ data: QuantumCircuit | Operation | BaseOperator | np.ndarray,
88
+ input_dims: tuple | None = None,
89
+ output_dims: tuple | None = None,
90
+ ):
91
+ """Initialize an operator object.
92
+
93
+ Args:
94
+ data (QuantumCircuit or Operation or BaseOperator or matrix):
95
+ data to initialize operator.
96
+ input_dims (tuple): the input subsystem dimensions.
97
+ [Default: None]
98
+ output_dims (tuple): the output subsystem dimensions.
99
+ [Default: None]
100
+
101
+ Raises:
102
+ QiskitError: if input data cannot be initialized as an operator.
103
+
104
+ Additional Information:
105
+ If the input or output dimensions are None, they will be
106
+ automatically determined from the input data. If the input data is
107
+ a Numpy array of shape (2**N, 2**N) qubit systems will be used. If
108
+ the input operator is not an N-qubit operator, it will assign a
109
+ single subsystem with dimension specified by the shape of the input.
110
+ Note that two operators initialized via this method are only considered equivalent if they
111
+ match up to their canonical qubit order (or: permutation). See :meth:`.Operator.from_circuit`
112
+ to specify a different qubit permutation.
113
+ """
114
+ op_shape = None
115
+ if isinstance(data, (list, np.ndarray)):
116
+ # Default initialization from list or numpy array matrix
117
+ self._data = np.asarray(data, dtype=complex)
118
+ elif isinstance(data, (QuantumCircuit, Operation)):
119
+ # If the input is a Terra QuantumCircuit or Operation we
120
+ # perform a simulation to construct the unitary operator.
121
+ # This will only work if the circuit or instruction can be
122
+ # defined in terms of unitary gate instructions which have a
123
+ # 'to_matrix' method defined. Any other instructions such as
124
+ # conditional gates, measure, or reset will cause an
125
+ # exception to be raised.
126
+ self._data = self._init_instruction(data).data
127
+ elif hasattr(data, "to_operator"):
128
+ # If the data object has a 'to_operator' attribute this is given
129
+ # higher preference than the 'to_matrix' method for initializing
130
+ # an Operator object.
131
+ data = data.to_operator()
132
+ self._data = data.data
133
+ op_shape = data._op_shape
134
+ elif hasattr(data, "to_matrix"):
135
+ # If no 'to_operator' attribute exists we next look for a
136
+ # 'to_matrix' attribute to a matrix that will be cast into
137
+ # a complex numpy matrix.
138
+ self._data = np.asarray(data.to_matrix(), dtype=complex)
139
+ else:
140
+ raise QiskitError("Invalid input data format for Operator")
141
+
142
+ super().__init__(
143
+ op_shape=op_shape,
144
+ input_dims=input_dims,
145
+ output_dims=output_dims,
146
+ shape=self._data.shape,
147
+ )
148
+
149
+ def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
150
+ dtype = self.data.dtype if dtype is None else dtype
151
+ return np.array(self.data, dtype=dtype, copy=copy)
152
+
153
+ def __repr__(self):
154
+ prefix = "Operator("
155
+ pad = len(prefix) * " "
156
+ return (
157
+ f"{prefix}{np.array2string(self.data, separator=', ', prefix=prefix)},\n"
158
+ f"{pad}input_dims={self.input_dims()}, output_dims={self.output_dims()})"
159
+ )
160
+
161
+ def __eq__(self, other):
162
+ """Test if two Operators are equal."""
163
+ if not super().__eq__(other):
164
+ return False
165
+ return np.allclose(self.data, other.data, rtol=self.rtol, atol=self.atol)
166
+
167
+ @property
168
+ def data(self):
169
+ """The underlying Numpy array."""
170
+ return self._data
171
+
172
+ @property
173
+ def settings(self):
174
+ """Return operator settings."""
175
+ return {
176
+ "data": self._data,
177
+ "input_dims": self.input_dims(),
178
+ "output_dims": self.output_dims(),
179
+ }
180
+
181
+ def draw(self, output=None, **drawer_args):
182
+ """Return a visualization of the Operator.
183
+
184
+ **repr**: String of the state's ``__repr__``.
185
+
186
+ **text**: ASCII TextMatrix that can be printed in the console.
187
+
188
+ **latex**: An IPython Latex object for displaying in Jupyter Notebooks.
189
+
190
+ **latex_source**: Raw, uncompiled ASCII source to generate array using LaTeX.
191
+
192
+ Args:
193
+ output (str): Select the output method to use for drawing the
194
+ state. Valid choices are `repr`, `text`, `latex`, `latex_source`,
195
+ Default is `repr`.
196
+ drawer_args: Arguments to be passed directly to the relevant drawing
197
+ function or constructor (`TextMatrix()`, `array_to_latex()`).
198
+ See the relevant function under `qiskit.visualization` for that function's
199
+ documentation.
200
+
201
+ Returns:
202
+ :class:`str` or :class:`TextMatrix` or :class:`IPython.display.Latex`:
203
+ Drawing of the Operator.
204
+
205
+ Raises:
206
+ ValueError: when an invalid output method is selected.
207
+
208
+ """
209
+ # pylint: disable=cyclic-import
210
+ from qiskit.visualization import array_to_latex
211
+
212
+ default_output = "repr"
213
+ if output is None:
214
+ output = default_output
215
+
216
+ if output == "repr":
217
+ return self.__repr__()
218
+
219
+ elif output == "text":
220
+ from qiskit.visualization.state_visualization import TextMatrix
221
+
222
+ return TextMatrix(self, **drawer_args)
223
+
224
+ elif output == "latex":
225
+ return array_to_latex(self, **drawer_args)
226
+
227
+ elif output == "latex_source":
228
+ return array_to_latex(self, source=True, **drawer_args)
229
+
230
+ else:
231
+ raise ValueError(
232
+ f"""'{output}' is not a valid option for drawing {type(self).__name__} objects.
233
+ Please choose from: 'text', 'latex', or 'latex_source'."""
234
+ )
235
+
236
+ def _ipython_display_(self):
237
+ out = self.draw()
238
+ if isinstance(out, str):
239
+ print(out)
240
+ else:
241
+ from IPython.display import display
242
+
243
+ display(out)
244
+
245
+ @classmethod
246
+ def from_label(cls, label: str) -> Operator:
247
+ """Return a tensor product of single-qubit operators.
248
+
249
+ Args:
250
+ label (string): single-qubit operator string.
251
+
252
+ Returns:
253
+ Operator: The N-qubit operator.
254
+
255
+ Raises:
256
+ QiskitError: if the label contains invalid characters, or the
257
+ length of the label is larger than an explicitly
258
+ specified num_qubits.
259
+
260
+ Additional Information:
261
+ The labels correspond to the single-qubit matrices:
262
+ 'I': [[1, 0], [0, 1]]
263
+ 'X': [[0, 1], [1, 0]]
264
+ 'Y': [[0, -1j], [1j, 0]]
265
+ 'Z': [[1, 0], [0, -1]]
266
+ 'H': [[1, 1], [1, -1]] / sqrt(2)
267
+ 'S': [[1, 0], [0 , 1j]]
268
+ 'T': [[1, 0], [0, (1+1j) / sqrt(2)]]
269
+ '0': [[1, 0], [0, 0]]
270
+ '1': [[0, 0], [0, 1]]
271
+ '+': [[0.5, 0.5], [0.5 , 0.5]]
272
+ '-': [[0.5, -0.5], [-0.5 , 0.5]]
273
+ 'r': [[0.5, -0.5j], [0.5j , 0.5]]
274
+ 'l': [[0.5, 0.5j], [-0.5j , 0.5]]
275
+ """
276
+ # Check label is valid
277
+ label_mats = {
278
+ "I": IGate().to_matrix(),
279
+ "X": XGate().to_matrix(),
280
+ "Y": YGate().to_matrix(),
281
+ "Z": ZGate().to_matrix(),
282
+ "H": HGate().to_matrix(),
283
+ "S": SGate().to_matrix(),
284
+ "T": TGate().to_matrix(),
285
+ "0": np.array([[1, 0], [0, 0]], dtype=complex),
286
+ "1": np.array([[0, 0], [0, 1]], dtype=complex),
287
+ "+": np.array([[0.5, 0.5], [0.5, 0.5]], dtype=complex),
288
+ "-": np.array([[0.5, -0.5], [-0.5, 0.5]], dtype=complex),
289
+ "r": np.array([[0.5, -0.5j], [0.5j, 0.5]], dtype=complex),
290
+ "l": np.array([[0.5, 0.5j], [-0.5j, 0.5]], dtype=complex),
291
+ }
292
+ if re.match(r"^[IXYZHST01rl\-+]+$", label) is None:
293
+ raise QiskitError("Label contains invalid characters.")
294
+ # Initialize an identity matrix and apply each gate
295
+ num_qubits = len(label)
296
+ op = Operator(np.eye(2**num_qubits, dtype=complex))
297
+ for qubit, char in enumerate(reversed(label)):
298
+ if char != "I":
299
+ op = op.compose(label_mats[char], qargs=[qubit])
300
+ return op
301
+
302
+ def apply_permutation(self, perm: list, front: bool = False) -> Operator:
303
+ """Modifies operator's data by composing it with a permutation.
304
+
305
+ Args:
306
+ perm (list): permutation pattern, describing which qubits
307
+ occupy the positions 0, 1, 2, etc. after applying the permutation.
308
+ front (bool): When set to ``True`` the permutation is applied before the
309
+ operator, when set to ``False`` the permutation is applied after the
310
+ operator.
311
+ Returns:
312
+ Operator: The modified operator.
313
+
314
+ Raises:
315
+ QiskitError: if the size of the permutation pattern does not match the
316
+ dimensions of the operator.
317
+ """
318
+
319
+ # See https://github.com/Qiskit/qiskit-terra/pull/9403 for the math
320
+ # behind the following code.
321
+
322
+ inv_perm = np.argsort(perm)
323
+ raw_shape_l = self._op_shape.dims_l()
324
+ n_dims_l = len(raw_shape_l)
325
+ raw_shape_r = self._op_shape.dims_r()
326
+ n_dims_r = len(raw_shape_r)
327
+
328
+ if front:
329
+ # The permutation is applied first, the operator is applied after;
330
+ # however, in terms of matrices, we compute [O][P].
331
+
332
+ if len(perm) != n_dims_r:
333
+ raise QiskitError(
334
+ "The size of the permutation pattern does not match dimensions of the operator."
335
+ )
336
+
337
+ # shape: original on left, permuted on right
338
+ shape_l = self._op_shape.dims_l()
339
+ shape_r = tuple(raw_shape_r[n_dims_r - n - 1] for n in reversed(perm))
340
+
341
+ # axes order: id on left, inv-permuted on right
342
+ axes_l = tuple(x for x in range(self._op_shape._num_qargs_l))
343
+ axes_r = tuple(self._op_shape._num_qargs_l + x for x in (np.argsort(perm[::-1]))[::-1])
344
+
345
+ # updated shape: original on left, permuted on right
346
+ new_shape_l = self._op_shape.dims_l()
347
+ new_shape_r = tuple(raw_shape_r[n_dims_r - n - 1] for n in reversed(inv_perm))
348
+
349
+ else:
350
+ # The operator is applied first, the permutation is applied after;
351
+ # however, in terms of matrices, we compute [P][O].
352
+
353
+ if len(perm) != n_dims_l:
354
+ raise QiskitError(
355
+ "The size of the permutation pattern does not match dimensions of the operator."
356
+ )
357
+
358
+ # shape: inv-permuted on left, original on right
359
+ shape_l = tuple(raw_shape_l[n_dims_l - n - 1] for n in reversed(inv_perm))
360
+ shape_r = self._op_shape.dims_r()
361
+
362
+ # axes order: permuted on left, id on right
363
+ axes_l = tuple((np.argsort(inv_perm[::-1]))[::-1])
364
+ axes_r = tuple(
365
+ self._op_shape._num_qargs_l + x for x in range(self._op_shape._num_qargs_r)
366
+ )
367
+
368
+ # updated shape: permuted on left, original on right
369
+ new_shape_l = tuple(raw_shape_l[n_dims_l - n - 1] for n in reversed(perm))
370
+ new_shape_r = self._op_shape.dims_r()
371
+
372
+ # Computing the new operator
373
+ split_shape = shape_l + shape_r
374
+ axes_order = axes_l + axes_r
375
+ new_mat = (
376
+ self._data.reshape(split_shape).transpose(axes_order).reshape(self._op_shape.shape)
377
+ )
378
+ new_op = Operator(new_mat, input_dims=new_shape_r, output_dims=new_shape_l)
379
+ return new_op
380
+
381
+ @classmethod
382
+ def from_circuit(
383
+ cls,
384
+ circuit: QuantumCircuit,
385
+ ignore_set_layout: bool = False,
386
+ layout: Layout | None = None,
387
+ final_layout: Layout | None = None,
388
+ ) -> Operator:
389
+ """Create a new Operator object from a :class:`.QuantumCircuit`
390
+
391
+ While a :class:`~.QuantumCircuit` object can passed directly as ``data``
392
+ to the class constructor this provides no options on how the circuit
393
+ is used to create an :class:`.Operator`. This constructor method lets
394
+ you control how the :class:`.Operator` is created so it can be adjusted
395
+ for a particular use case.
396
+
397
+ By default this constructor method will permute the qubits based on a
398
+ configured initial layout (i.e. after it was transpiled). It also
399
+ provides an option to manually provide a :class:`.Layout` object
400
+ directly.
401
+
402
+ Args:
403
+ circuit (QuantumCircuit): The :class:`.QuantumCircuit` to create an Operator
404
+ object from.
405
+ ignore_set_layout (bool): When set to ``True`` if the input ``circuit``
406
+ has a layout set it will be ignored
407
+ layout (Layout): If specified this kwarg can be used to specify a
408
+ particular layout to use to permute the qubits in the created
409
+ :class:`.Operator`. If this is specified it will be used instead
410
+ of a layout contained in the ``circuit`` input. If specified
411
+ the virtual bits in the :class:`~.Layout` must be present in the
412
+ ``circuit`` input.
413
+ final_layout (Layout): If specified this kwarg can be used to represent the
414
+ output permutation caused by swap insertions during the routing stage
415
+ of the transpiler.
416
+ Returns:
417
+ Operator: An operator representing the input circuit
418
+ """
419
+
420
+ if layout is None:
421
+ if not ignore_set_layout:
422
+ layout = getattr(circuit, "_layout", None)
423
+ else:
424
+ from qiskit.transpiler.layout import TranspileLayout # pylint: disable=cyclic-import
425
+
426
+ layout = TranspileLayout(
427
+ initial_layout=layout,
428
+ input_qubit_mapping={qubit: index for index, qubit in enumerate(circuit.qubits)},
429
+ )
430
+
431
+ initial_layout = layout.initial_layout if layout is not None else None
432
+
433
+ if final_layout is None:
434
+ if not ignore_set_layout and layout is not None:
435
+ final_layout = getattr(layout, "final_layout", None)
436
+
437
+ from qiskit.synthesis.permutation.permutation_utils import _inverse_pattern
438
+
439
+ op = Operator(circuit)
440
+
441
+ if initial_layout is not None:
442
+ input_qubits = [None] * len(layout.input_qubit_mapping)
443
+ for q, p in layout.input_qubit_mapping.items():
444
+ input_qubits[p] = q
445
+
446
+ initial_permutation = initial_layout.to_permutation(input_qubits)
447
+ initial_permutation_inverse = _inverse_pattern(initial_permutation)
448
+ op = op.apply_permutation(initial_permutation, True)
449
+
450
+ if final_layout is not None:
451
+ final_permutation = final_layout.to_permutation(circuit.qubits)
452
+ final_permutation_inverse = _inverse_pattern(final_permutation)
453
+ op = op.apply_permutation(final_permutation_inverse, False)
454
+ op = op.apply_permutation(initial_permutation_inverse, False)
455
+ elif final_layout is not None:
456
+ final_permutation = final_layout.to_permutation(circuit.qubits)
457
+ final_permutation_inverse = _inverse_pattern(final_permutation)
458
+ op = op.apply_permutation(final_permutation_inverse, False)
459
+
460
+ return op
461
+
462
+ def is_unitary(self, atol=None, rtol=None):
463
+ """Return True if operator is a unitary matrix."""
464
+ if atol is None:
465
+ atol = self.atol
466
+ if rtol is None:
467
+ rtol = self.rtol
468
+ return is_unitary_matrix(self._data, rtol=rtol, atol=atol)
469
+
470
+ def to_operator(self) -> Operator:
471
+ """Convert operator to matrix operator class"""
472
+ return self
473
+
474
+ def to_instruction(self):
475
+ """Convert to a UnitaryGate instruction."""
476
+ # pylint: disable=cyclic-import
477
+ from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate
478
+
479
+ return UnitaryGate(self.data)
480
+
481
+ def conjugate(self):
482
+ # Make a shallow copy and update array
483
+ ret = _copy.copy(self)
484
+ ret._data = np.conj(self._data)
485
+ return ret
486
+
487
+ def transpose(self):
488
+ # Make a shallow copy and update array
489
+ ret = _copy.copy(self)
490
+ ret._data = np.transpose(self._data)
491
+ ret._op_shape = self._op_shape.transpose()
492
+ return ret
493
+
494
+ def compose(self, other: Operator, qargs: list | None = None, front: bool = False) -> Operator:
495
+ if qargs is None:
496
+ qargs = getattr(other, "qargs", None)
497
+ if not isinstance(other, Operator):
498
+ other = Operator(other)
499
+
500
+ # Validate dimensions are compatible and return the composed
501
+ # operator dimensions
502
+ new_shape = self._op_shape.compose(other._op_shape, qargs, front)
503
+ input_dims = new_shape.dims_r()
504
+ output_dims = new_shape.dims_l()
505
+
506
+ # Full composition of operators
507
+ if qargs is None:
508
+ if front:
509
+ # Composition self * other
510
+ data = np.dot(self._data, other.data)
511
+ else:
512
+ # Composition other * self
513
+ data = np.dot(other.data, self._data)
514
+ ret = Operator(data, input_dims, output_dims)
515
+ ret._op_shape = new_shape
516
+ return ret
517
+
518
+ # Compose with other on subsystem
519
+ num_qargs_l, num_qargs_r = self._op_shape.num_qargs
520
+ if front:
521
+ num_indices = num_qargs_r
522
+ shift = num_qargs_l
523
+ right_mul = True
524
+ else:
525
+ num_indices = num_qargs_l
526
+ shift = 0
527
+ right_mul = False
528
+
529
+ # Reshape current matrix
530
+ # Note that we must reverse the subsystem dimension order as
531
+ # qubit 0 corresponds to the right-most position in the tensor
532
+ # product, which is the last tensor wire index.
533
+ tensor = np.reshape(self.data, self._op_shape.tensor_shape)
534
+ mat = np.reshape(other.data, other._op_shape.tensor_shape)
535
+ indices = [num_indices - 1 - qubit for qubit in qargs]
536
+ final_shape = [int(np.prod(output_dims)), int(np.prod(input_dims))]
537
+ data = np.reshape(
538
+ Operator._einsum_matmul(tensor, mat, indices, shift, right_mul), final_shape
539
+ )
540
+ ret = Operator(data, input_dims, output_dims)
541
+ ret._op_shape = new_shape
542
+ return ret
543
+
544
+ def power(
545
+ self, n: float, branch_cut_rotation=cmath.pi * 1e-12, assume_unitary=False
546
+ ) -> Operator:
547
+ """Return the matrix power of the operator.
548
+
549
+ Non-integer powers of operators with an eigenvalue whose complex phase is :math:`\\pi` have
550
+ a branch cut in the complex plane, which makes the calculation of the principal root around
551
+ this cut subject to precision / differences in BLAS implementation. For example, the square
552
+ root of Pauli Y can return the :math:`\\pi/2` or :math:`-\\pi/2` Y rotation depending on
553
+ whether the -1 eigenvalue is found as ``complex(-1, tiny)`` or ``complex(-1, -tiny)``. Such
554
+ eigenvalues are really common in quantum information, so this function first phase-rotates
555
+ the input matrix to shift the branch cut to a far less common point. The underlying
556
+ numerical precision issues around the branch-cut point remain, if an operator has an
557
+ eigenvalue close to this phase. The magnitude of this rotation can be controlled with the
558
+ ``branch_cut_rotation`` parameter.
559
+
560
+ The choice of ``branch_cut_rotation`` affects the principal root that is found. For
561
+ example, the square root of :class:`.ZGate` will be calculated as either :class:`.SGate` or
562
+ :class:`.SdgGate` depending on which way the rotation is done::
563
+
564
+ from qiskit.circuit import library
565
+ from qiskit.quantum_info import Operator
566
+
567
+ z_op = Operator(library.ZGate())
568
+ assert z_op.power(0.5, branch_cut_rotation=1e-3) == Operator(library.SGate())
569
+ assert z_op.power(0.5, branch_cut_rotation=-1e-3) == Operator(library.SdgGate())
570
+
571
+ Args:
572
+ n (float): the power to raise the matrix to.
573
+ branch_cut_rotation (float): The rotation angle to apply to the branch cut in the
574
+ complex plane. This shifts the branch cut away from the common point of :math:`-1`,
575
+ but can cause a different root to be selected as the principal root. The rotation
576
+ is anticlockwise, following the standard convention for complex phase.
577
+ assume_unitary (bool): if ``True``, the operator is assumed to be unitary. In this case,
578
+ for fractional powers we employ a faster implementation based on Schur's decomposition.
579
+
580
+ Returns:
581
+ Operator: the resulting operator ``O ** n``.
582
+
583
+ Raises:
584
+ QiskitError: if the input and output dimensions of the operator
585
+ are not equal.
586
+
587
+ .. note::
588
+ It is only safe to set the argument ``assume_unitary`` to ``True`` when the operator
589
+ is unitary (or, more generally, normal). Otherwise, the function will return an
590
+ incorrect output.
591
+ """
592
+ if self.input_dims() != self.output_dims():
593
+ raise QiskitError("Can only power with input_dims = output_dims.")
594
+ ret = _copy.copy(self)
595
+ if isinstance(n, int):
596
+ ret._data = np.linalg.matrix_power(self.data, n)
597
+ else:
598
+ import scipy.linalg
599
+
600
+ if assume_unitary:
601
+ # Experimentally, for fractional powers this seems to be 3x faster than
602
+ # calling scipy.linalg.fractional_matrix_power(self.data, exponent)
603
+ decomposition, unitary = scipy.linalg.schur(
604
+ cmath.rect(1, -branch_cut_rotation) * self.data, output="complex"
605
+ )
606
+ decomposition_diagonal = decomposition.diagonal()
607
+ decomposition_power = [pow(element, n) for element in decomposition_diagonal]
608
+ unitary_power = unitary @ np.diag(decomposition_power) @ unitary.conj().T
609
+ ret._data = cmath.rect(1, branch_cut_rotation * n) * unitary_power
610
+ else:
611
+ ret._data = cmath.rect(
612
+ 1, branch_cut_rotation * n
613
+ ) * scipy.linalg.fractional_matrix_power(
614
+ cmath.rect(1, -branch_cut_rotation) * self.data, n
615
+ )
616
+
617
+ return ret
618
+
619
+ def tensor(self, other: Operator) -> Operator:
620
+ if not isinstance(other, Operator):
621
+ other = Operator(other)
622
+ return self._tensor(self, other)
623
+
624
+ def expand(self, other: Operator) -> Operator:
625
+ if not isinstance(other, Operator):
626
+ other = Operator(other)
627
+ return self._tensor(other, self)
628
+
629
+ @classmethod
630
+ def _tensor(cls, a, b):
631
+ ret = _copy.copy(a)
632
+ ret._op_shape = a._op_shape.tensor(b._op_shape)
633
+ ret._data = np.kron(a.data, b.data)
634
+ return ret
635
+
636
+ def _add(self, other, qargs=None):
637
+ """Return the operator self + other.
638
+
639
+ If ``qargs`` are specified the other operator will be added
640
+ assuming it is identity on all other subsystems.
641
+
642
+ Args:
643
+ other (Operator): an operator object.
644
+ qargs (None or list): optional subsystems to add on
645
+ (Default: None)
646
+
647
+ Returns:
648
+ Operator: the operator self + other.
649
+
650
+ Raises:
651
+ QiskitError: if other is not an operator, or has incompatible
652
+ dimensions.
653
+ """
654
+ # pylint: disable=cyclic-import
655
+ from qiskit.quantum_info.operators.scalar_op import ScalarOp
656
+
657
+ if qargs is None:
658
+ qargs = getattr(other, "qargs", None)
659
+
660
+ if not isinstance(other, Operator):
661
+ other = Operator(other)
662
+
663
+ self._op_shape._validate_add(other._op_shape, qargs)
664
+ other = ScalarOp._pad_with_identity(self, other, qargs)
665
+
666
+ ret = _copy.copy(self)
667
+ ret._data = self.data + other.data
668
+ return ret
669
+
670
+ def _multiply(self, other):
671
+ """Return the operator self * other.
672
+
673
+ Args:
674
+ other (complex): a complex number.
675
+
676
+ Returns:
677
+ Operator: the operator other * self.
678
+
679
+ Raises:
680
+ QiskitError: if other is not a valid complex number.
681
+ """
682
+ if not isinstance(other, Number):
683
+ raise QiskitError("other is not a number")
684
+ ret = _copy.copy(self)
685
+ ret._data = other * self._data
686
+ return ret
687
+
688
+ def equiv(self, other: Operator, rtol: float | None = None, atol: float | None = None) -> bool:
689
+ """Return True if operators are equivalent up to global phase.
690
+
691
+ Args:
692
+ other (Operator): an operator object.
693
+ rtol (float): relative tolerance value for comparison.
694
+ atol (float): absolute tolerance value for comparison.
695
+
696
+ Returns:
697
+ bool: True if operators are equivalent up to global phase.
698
+ """
699
+ if not isinstance(other, Operator):
700
+ try:
701
+ other = Operator(other)
702
+ except QiskitError:
703
+ return False
704
+ if self.dim != other.dim:
705
+ return False
706
+ if atol is None:
707
+ atol = self.atol
708
+ if rtol is None:
709
+ rtol = self.rtol
710
+ return matrix_equal(self.data, other.data, ignore_phase=True, rtol=rtol, atol=atol)
711
+
712
+ def reverse_qargs(self) -> Operator:
713
+ r"""Return an Operator with reversed subsystem ordering.
714
+
715
+ For a tensor product operator this is equivalent to reversing
716
+ the order of tensor product subsystems. For an operator
717
+ :math:`A = A_{n-1} \otimes ... \otimes A_0`
718
+ the returned operator will be
719
+ :math:`A_0 \otimes ... \otimes A_{n-1}`.
720
+
721
+ Returns:
722
+ Operator: the operator with reversed subsystem order.
723
+ """
724
+ ret = _copy.copy(self)
725
+ axes = tuple(range(self._op_shape._num_qargs_l - 1, -1, -1))
726
+ axes = axes + tuple(len(axes) + i for i in axes)
727
+ ret._data = np.reshape(
728
+ np.transpose(np.reshape(self.data, self._op_shape.tensor_shape), axes),
729
+ self._op_shape.shape,
730
+ )
731
+ ret._op_shape = self._op_shape.reverse()
732
+ return ret
733
+
734
+ def to_matrix(self):
735
+ """Convert operator to NumPy matrix."""
736
+ return self.data
737
+
738
+ @classmethod
739
+ def _einsum_matmul(cls, tensor, mat, indices, shift=0, right_mul=False):
740
+ """Perform a contraction using Numpy.einsum
741
+
742
+ Args:
743
+ tensor (np.array): a vector or matrix reshaped to a rank-N tensor.
744
+ mat (np.array): a matrix reshaped to a rank-2M tensor.
745
+ indices (list): tensor indices to contract with mat.
746
+ shift (int): shift for indices of tensor to contract [Default: 0].
747
+ right_mul (bool): if True right multiply tensor by mat
748
+ (else left multiply) [Default: False].
749
+
750
+ Returns:
751
+ Numpy.ndarray: the matrix multiplied rank-N tensor.
752
+
753
+ Raises:
754
+ QiskitError: if mat is not an even rank tensor.
755
+ """
756
+ rank = tensor.ndim
757
+ rank_mat = mat.ndim
758
+ if rank_mat % 2 != 0:
759
+ raise QiskitError("Contracted matrix must have an even number of indices.")
760
+ # Get einsum indices for tensor
761
+ indices_tensor = list(range(rank))
762
+ for j, index in enumerate(indices):
763
+ indices_tensor[index + shift] = rank + j
764
+ # Get einsum indices for mat
765
+ mat_contract = list(reversed(range(rank, rank + len(indices))))
766
+ mat_free = [index + shift for index in reversed(indices)]
767
+ if right_mul:
768
+ indices_mat = mat_contract + mat_free
769
+ else:
770
+ indices_mat = mat_free + mat_contract
771
+ return np.einsum(tensor, indices_tensor, mat, indices_mat)
772
+
773
+ @classmethod
774
+ def _init_instruction(cls, instruction):
775
+ """Convert a QuantumCircuit or Operation to an Operator."""
776
+ # Initialize an identity operator of the correct size of the circuit
777
+ if hasattr(instruction, "__array__"):
778
+ return Operator(np.array(instruction, dtype=complex))
779
+
780
+ dimension = 2**instruction.num_qubits
781
+ op = Operator(np.eye(dimension))
782
+ # Convert circuit to an instruction
783
+ if isinstance(instruction, QuantumCircuit):
784
+ instruction = instruction.to_instruction()
785
+ op._append_instruction(instruction)
786
+ return op
787
+
788
+ @classmethod
789
+ def _instruction_to_matrix(cls, obj):
790
+ """Return Operator for instruction if defined or None otherwise."""
791
+ # Note: to_matrix() is not a required method for Operations, so for now
792
+ # we do not allow constructing matrices for general Operations.
793
+ # However, for backward compatibility we need to support constructing matrices
794
+ # for Cliffords, which happen to have a to_matrix() method.
795
+
796
+ # pylint: disable=cyclic-import
797
+ from qiskit.quantum_info import Clifford
798
+ from qiskit.circuit.annotated_operation import AnnotatedOperation
799
+
800
+ if not isinstance(obj, (Instruction, Clifford, AnnotatedOperation)):
801
+ raise QiskitError("Input is neither Instruction, Clifford or AnnotatedOperation.")
802
+ mat = None
803
+ if hasattr(obj, "to_matrix"):
804
+ # If instruction is a gate first we see if it has a
805
+ # `to_matrix` definition and if so use that.
806
+ try:
807
+ mat = obj.to_matrix()
808
+ except QiskitError:
809
+ pass
810
+ return mat
811
+
812
+ def _append_instruction(self, obj, qargs=None):
813
+ """Update the current Operator by apply an instruction."""
814
+ from qiskit.circuit.barrier import Barrier
815
+ from .scalar_op import ScalarOp
816
+
817
+ mat = self._instruction_to_matrix(obj)
818
+ if mat is not None:
819
+ # Perform the composition and inplace update the current state
820
+ # of the operator
821
+ op = self.compose(mat, qargs=qargs)
822
+ self._data = op.data
823
+ elif isinstance(obj, Barrier):
824
+ return
825
+ else:
826
+ # If the instruction doesn't have a matrix defined we use its
827
+ # circuit decomposition definition if it exists, otherwise we
828
+ # cannot compose this gate and raise an error.
829
+ if obj.definition is None:
830
+ raise QiskitError(f"Cannot apply Operation: {obj.name}")
831
+ if not isinstance(obj.definition, QuantumCircuit):
832
+ raise QiskitError(
833
+ f'Operation "{obj.name}" '
834
+ f"definition is {type(obj.definition)} but expected QuantumCircuit."
835
+ )
836
+ if obj.definition.global_phase:
837
+ dimension = 2**obj.num_qubits
838
+ op = self.compose(
839
+ ScalarOp(dimension, np.exp(1j * float(obj.definition.global_phase))),
840
+ qargs=qargs,
841
+ )
842
+ self._data = op.data
843
+ flat_instr = obj.definition
844
+ bit_indices = {
845
+ bit: index
846
+ for bits in [flat_instr.qubits, flat_instr.clbits]
847
+ for index, bit in enumerate(bits)
848
+ }
849
+
850
+ for instruction in flat_instr:
851
+ if instruction.clbits:
852
+ raise QiskitError(
853
+ "Cannot apply operation with classical bits:"
854
+ f" {instruction.operation.name}"
855
+ )
856
+ # Get the integer position of the flat register
857
+ if qargs is None:
858
+ new_qargs = [bit_indices[tup] for tup in instruction.qubits]
859
+ else:
860
+ new_qargs = [qargs[bit_indices[tup]] for tup in instruction.qubits]
861
+ self._append_instruction(instruction.operation, qargs=new_qargs)
862
+
863
+
864
+ # Update docstrings for API docs
865
+ generate_apidocs(Operator)