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,727 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2023
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
+ Optimized list of Pauli operators
14
+ """
15
+ # pylint: disable=invalid-name
16
+
17
+ from __future__ import annotations
18
+ import copy
19
+ from typing import Literal, TYPE_CHECKING
20
+
21
+ import numpy as np
22
+
23
+ from qiskit.circuit import QuantumCircuit
24
+ from qiskit.circuit.barrier import Barrier
25
+ from qiskit.circuit.delay import Delay
26
+ from qiskit.exceptions import QiskitError
27
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
28
+ from qiskit.quantum_info.operators.mixins import AdjointMixin, MultiplyMixin
29
+
30
+ if TYPE_CHECKING:
31
+ from qiskit.quantum_info.operators.symplectic.clifford import Clifford
32
+
33
+
34
+ # utility for _to_matrix
35
+ _PARITY = np.array([-1 if bin(i).count("1") % 2 else 1 for i in range(256)], dtype=complex)
36
+
37
+
38
+ class BasePauli(BaseOperator, AdjointMixin, MultiplyMixin):
39
+ r"""Symplectic representation of a list of N-qubit Paulis.
40
+
41
+ Base class for Pauli and PauliList.
42
+ """
43
+
44
+ def __init__(self, z: np.ndarray, x: np.ndarray, phase: np.ndarray):
45
+ """Initialize the BasePauli.
46
+
47
+ This is an array of M N-qubit Paulis defined as
48
+ P = (-i)^phase Z^z X^x.
49
+
50
+ Args:
51
+ z (np.ndarray): input z matrix.
52
+ x (np.ndarray): input x matrix.
53
+ phase (np.ndarray): input phase vector.
54
+ """
55
+ self._z = z
56
+ self._x = x
57
+ self._phase = phase
58
+ self._num_paulis, num_qubits = self._z.shape
59
+ super().__init__(num_qubits=num_qubits)
60
+
61
+ def copy(self):
62
+ """Make a deep copy of current operator."""
63
+ # Deepcopy has terrible performance on objects with Numpy arrays
64
+ # attributes so we make a shallow copy and then manually copy the
65
+ # Numpy arrays to efficiently mimic a deepcopy
66
+ ret = copy.copy(self)
67
+ ret._z = self._z.copy()
68
+ ret._x = self._x.copy()
69
+ ret._phase = self._phase.copy()
70
+ return ret
71
+
72
+ # ---------------------------------------------------------------------
73
+ # BaseOperator methods
74
+ # ---------------------------------------------------------------------
75
+
76
+ def tensor(self, other):
77
+ return self._tensor(self, other)
78
+
79
+ def expand(self, other):
80
+ return self._tensor(other, self)
81
+
82
+ @classmethod
83
+ def _tensor(cls, a, b):
84
+ x1 = cls._stack(a._x, b._num_paulis, False)
85
+ x2 = cls._stack(b._x, a._num_paulis)
86
+ z1 = cls._stack(a._z, b._num_paulis, False)
87
+ z2 = cls._stack(b._z, a._num_paulis)
88
+ phase1 = (
89
+ np.vstack(b._num_paulis * [a._phase])
90
+ .transpose(1, 0)
91
+ .reshape(a._num_paulis * b._num_paulis)
92
+ )
93
+ phase2 = cls._stack(b._phase, a._num_paulis)
94
+ z = np.hstack([z2, z1])
95
+ x = np.hstack([x2, x1])
96
+ phase = np.mod(phase1 + phase2, 4)
97
+ return BasePauli(z, x, phase)
98
+
99
+ def compose(self, other, qargs: list | None = None, front: bool = False, inplace=False):
100
+ """Return the composition of Paulis.
101
+
102
+ Args:
103
+ a ({cls}): an operator object.
104
+ b ({cls}): an operator object.
105
+ qargs (list or None): Optional, qubits to apply dot product
106
+ on (default: None).
107
+ inplace (bool): If True update in-place (default: False).
108
+
109
+ Returns:
110
+ {cls}: The operator a.compose(b)
111
+
112
+ Raises:
113
+ QiskitError: if number of qubits of other does not match qargs.
114
+ """.format(
115
+ cls=type(self).__name__
116
+ )
117
+ # Validation
118
+ if qargs is None and other.num_qubits != self.num_qubits:
119
+ raise QiskitError(f"other {type(self).__name__} must be on the same number of qubits.")
120
+
121
+ if qargs and other.num_qubits != len(qargs):
122
+ raise QiskitError(
123
+ f"Number of qubits of the other {type(self).__name__} does not match qargs."
124
+ )
125
+
126
+ if other._num_paulis not in [1, self._num_paulis]:
127
+ raise QiskitError(
128
+ "Incompatible BasePaulis. Second list must "
129
+ "either have 1 or the same number of Paulis."
130
+ )
131
+
132
+ # Compute phase shift
133
+ if qargs is not None:
134
+ x1, z1 = self._x[:, qargs], self._z[:, qargs]
135
+ else:
136
+ x1, z1 = self._x, self._z
137
+ x2, z2 = other._x, other._z
138
+
139
+ # Get phase shift
140
+ phase = self._phase + other._phase
141
+ if front:
142
+ phase += 2 * _count_y(x1, z2, dtype=phase.dtype)
143
+ else:
144
+ phase += 2 * _count_y(x2, z1, dtype=phase.dtype)
145
+
146
+ # Update Pauli
147
+ x = np.logical_xor(x1, x2)
148
+ z = np.logical_xor(z1, z2)
149
+
150
+ if qargs is None:
151
+ if not inplace:
152
+ return BasePauli(z, x, phase)
153
+ # Inplace update
154
+ self._x = x
155
+ self._z = z
156
+ self._phase = phase
157
+ return self
158
+
159
+ # Qargs update
160
+ ret = self if inplace else self.copy()
161
+ ret._x[:, qargs] = x
162
+ ret._z[:, qargs] = z
163
+ ret._phase = np.mod(phase, 4)
164
+ return ret
165
+
166
+ def _multiply(self, other):
167
+ """Return the {cls} other * self.
168
+
169
+ Args:
170
+ other (complex): a complex number in ``[1, -1j, -1, 1j]``.
171
+
172
+ Returns:
173
+ {cls}: the {cls} other * self.
174
+
175
+ Raises:
176
+ QiskitError: if the phase is not in the set ``[1, -1j, -1, 1j]``.
177
+ """.format(
178
+ cls=type(self).__name__
179
+ )
180
+ if isinstance(other, (np.ndarray, list, tuple)):
181
+ phase = np.array([self._phase_from_complex(phase) for phase in other])
182
+ else:
183
+ phase = self._phase_from_complex(other)
184
+ return BasePauli(self._z, self._x, np.mod(self._phase + phase, 4))
185
+
186
+ def conjugate(self):
187
+ """Return the conjugate of each Pauli in the list."""
188
+ complex_phase = np.mod(self._phase, 2)
189
+ if np.all(complex_phase == 0):
190
+ return self
191
+ return BasePauli(self._z, self._x, np.mod(self._phase + 2 * complex_phase, 4))
192
+
193
+ def transpose(self):
194
+ """Return the transpose of each Pauli in the list."""
195
+ # Transpose sets Y -> -Y. This has effect on changing the phase
196
+ parity_y = self._count_y(dtype=self._phase.dtype) % 2
197
+ if np.all(parity_y == 0):
198
+ return self
199
+ return BasePauli(self._z, self._x, np.mod(self._phase + 2 * parity_y, 4))
200
+
201
+ def commutes(self, other: BasePauli, qargs: list | None = None) -> np.ndarray:
202
+ """Return ``True`` if Pauli commutes with ``other``.
203
+
204
+ Args:
205
+ other (BasePauli): another BasePauli operator.
206
+ qargs (list): qubits to apply dot product on (default: ``None``).
207
+
208
+ Returns:
209
+ np.array: Boolean array of ``True`` if Paulis commute, ``False`` if
210
+ they anti-commute.
211
+
212
+ Raises:
213
+ QiskitError: if number of qubits of ``other`` does not match ``qargs``.
214
+ """
215
+ if qargs is not None and len(qargs) != other.num_qubits:
216
+ raise QiskitError(
217
+ "Number of qubits of other Pauli does not match number of "
218
+ f"qargs ({other.num_qubits} != {len(qargs)})."
219
+ )
220
+ if qargs is None and self.num_qubits != other.num_qubits:
221
+ raise QiskitError(
222
+ "Number of qubits of other Pauli does not match the current "
223
+ f"Pauli ({other.num_qubits} != {self.num_qubits})."
224
+ )
225
+ if qargs is not None:
226
+ inds = list(qargs)
227
+ x1, z1 = self._x[:, inds], self._z[:, inds]
228
+ else:
229
+ x1, z1 = self._x, self._z
230
+ a_dot_b = np.mod(_count_y(x1, other._z), 2)
231
+ b_dot_a = np.mod(_count_y(other._x, z1), 2)
232
+ return a_dot_b == b_dot_a
233
+
234
+ def evolve(
235
+ self,
236
+ other: BasePauli | QuantumCircuit | Clifford,
237
+ qargs: list | None = None,
238
+ frame: Literal["h", "s"] = "h",
239
+ ) -> BasePauli:
240
+ r"""Performs either Heisenberg (default) or Schrödinger picture
241
+ evolution of the Pauli by a Clifford and returns the evolved Pauli.
242
+
243
+ Schrödinger picture evolution can be chosen by passing parameter ``frame='s'``.
244
+ This option yields a faster calculation.
245
+
246
+ Heisenberg picture evolves the Pauli as :math:`P^\prime = C^\dagger.P.C`.
247
+
248
+ Schrödinger picture evolves the Pauli as :math:`P^\prime = C.P.C^\dagger`.
249
+
250
+ Args:
251
+ other (BasePauli or QuantumCircuit): The Clifford circuit to evolve by.
252
+ qargs (list): a list of qubits to apply the Clifford to.
253
+ frame (string): ``'h'`` for Heisenberg or ``'s'`` for Schrödinger framework.
254
+
255
+ Returns:
256
+ BasePauli: the Pauli :math:`C^\dagger.P.C` (Heisenberg picture)
257
+ or the Pauli :math:`C.P.C^\dagger` (Schrödinger picture).
258
+
259
+ Raises:
260
+ QiskitError: if the Clifford number of qubits and ``qargs`` don't match.
261
+ """
262
+ # Check dimension
263
+ if qargs is not None and len(qargs) != other.num_qubits:
264
+ raise QiskitError(
265
+ f"Incorrect number of qubits for Clifford circuit ({other.num_qubits} != {len(qargs)})."
266
+ )
267
+ if qargs is None and self.num_qubits != other.num_qubits:
268
+ raise QiskitError(
269
+ f"Incorrect number of qubits for Clifford circuit "
270
+ f"({other.num_qubits} != {self.num_qubits})."
271
+ )
272
+
273
+ # Evolve via Pauli
274
+ if isinstance(other, BasePauli):
275
+ if frame == "s":
276
+ ret = self.compose(other, qargs=qargs)
277
+ ret = ret.compose(other.adjoint(), front=True, qargs=qargs)
278
+ else:
279
+ ret = self.compose(other.adjoint(), qargs=qargs)
280
+ ret = ret.compose(other, front=True, qargs=qargs)
281
+ return ret
282
+
283
+ # pylint: disable=cyclic-import
284
+ from qiskit.quantum_info.operators.symplectic.clifford import Clifford
285
+
286
+ # Convert Clifford to quantum circuits
287
+ if isinstance(other, Clifford):
288
+ return self._evolve_clifford(other, qargs=qargs, frame=frame)
289
+
290
+ # Otherwise evolve by the inverse circuit to compute C^dg.P.C
291
+ if frame == "s":
292
+ return self.copy()._append_circuit(other, qargs=qargs)
293
+ return self.copy()._append_circuit(other.inverse(), qargs=qargs)
294
+
295
+ def _evolve_clifford(self, other, qargs=None, frame="h"):
296
+ """Heisenberg picture evolution of a Pauli by a Clifford."""
297
+
298
+ if frame == "s":
299
+ adj = other
300
+ else:
301
+ adj = other.adjoint()
302
+
303
+ if qargs is None:
304
+ qargs_ = slice(None)
305
+ else:
306
+ qargs_ = list(qargs)
307
+
308
+ # pylint: disable=cyclic-import
309
+ from qiskit.quantum_info.operators.symplectic.pauli_list import PauliList
310
+
311
+ num_paulis = self._x.shape[0]
312
+
313
+ ret = self.copy()
314
+ ret._x[:, qargs_] = False
315
+ ret._z[:, qargs_] = False
316
+
317
+ idx = np.concatenate((self._x[:, qargs_], self._z[:, qargs_]), axis=1)
318
+ for idx_, row in zip(
319
+ idx.T,
320
+ PauliList.from_symplectic(z=adj.z, x=adj.x, phase=2 * adj.phase),
321
+ ):
322
+ # most of the logic below is to properly index if self is a PauliList (2D),
323
+ # while not trying to index if the object is just a Pauli (1D).
324
+ if idx_.any():
325
+ if np.sum(idx_) == num_paulis:
326
+ ret.compose(row, qargs=qargs, inplace=True)
327
+ else:
328
+ ret[idx_] = ret[idx_].compose(row, qargs=qargs)
329
+
330
+ return ret
331
+
332
+ def _eq(self, other):
333
+ """Entrywise comparison of Pauli equality."""
334
+ return (
335
+ self.num_qubits == other.num_qubits
336
+ and np.all(np.mod(self._phase, 4) == np.mod(other._phase, 4))
337
+ and np.all(self._z == other._z)
338
+ and np.all(self._x == other._x)
339
+ )
340
+
341
+ # ---------------------------------------------------------------------
342
+ # Helper Methods
343
+ # ---------------------------------------------------------------------
344
+
345
+ def __imul__(self, other):
346
+ return self.compose(other, front=True, inplace=True)
347
+
348
+ def __neg__(self):
349
+ ret = copy.copy(self)
350
+ ret._phase = np.mod(self._phase + 2, 4)
351
+ return ret
352
+
353
+ def _count_y(self, dtype=None):
354
+ """Count the number of I Paulis"""
355
+ return _count_y(self._x, self._z, dtype=dtype)
356
+
357
+ @staticmethod
358
+ def _stack(array, size, vertical=True):
359
+ """Stack array."""
360
+ if size == 1:
361
+ return array
362
+ if vertical:
363
+ return np.vstack(size * [array]).reshape((size * len(array),) + array.shape[1:])
364
+ return np.hstack(size * [array]).reshape((size * len(array),) + array.shape[1:])
365
+
366
+ @staticmethod
367
+ def _phase_from_complex(coeff):
368
+ """Return the phase from a label"""
369
+ if np.isclose(coeff, 1):
370
+ return 0
371
+ if np.isclose(coeff, -1j):
372
+ return 1
373
+ if np.isclose(coeff, -1):
374
+ return 2
375
+ if np.isclose(coeff, 1j):
376
+ return 3
377
+ raise QiskitError("Pauli can only be multiplied by 1, -1j, -1, 1j.")
378
+
379
+ @staticmethod
380
+ def _from_array(z, x, phase=0):
381
+ """Convert array data to BasePauli data."""
382
+ if isinstance(z, np.ndarray) and z.dtype == bool:
383
+ base_z = z
384
+ else:
385
+ base_z = np.asarray(z, dtype=bool)
386
+ if base_z.ndim == 1:
387
+ base_z = base_z.reshape((1, base_z.size))
388
+ elif base_z.ndim != 2:
389
+ raise QiskitError("Invalid Pauli z vector shape.")
390
+
391
+ if isinstance(x, np.ndarray) and x.dtype == bool:
392
+ base_x = x
393
+ else:
394
+ base_x = np.asarray(x, dtype=bool)
395
+ if base_x.ndim == 1:
396
+ base_x = base_x.reshape((1, base_x.size))
397
+ elif base_x.ndim != 2:
398
+ raise QiskitError("Invalid Pauli x vector shape.")
399
+
400
+ if base_z.shape != base_x.shape:
401
+ raise QiskitError("z and x vectors are different size.")
402
+
403
+ # Convert group phase convention to internal ZX-phase conversion.
404
+ dtype = getattr(phase, "dtype", None)
405
+ base_phase = np.mod(_count_y(base_x, base_z, dtype=dtype) + phase, 4)
406
+ return base_z, base_x, base_phase
407
+
408
+ @staticmethod
409
+ def _to_matrix(z, x, phase=0, group_phase=False, sparse=False):
410
+ """Return the matrix from symplectic representation.
411
+
412
+ The Pauli is defined as :math:`P = (-i)^{phase + z.x} * Z^z.x^x`
413
+ where ``array = [x, z]``.
414
+
415
+ Args:
416
+ z (array): The symplectic representation z vector.
417
+ x (array): The symplectic representation x vector.
418
+ phase (int): Pauli phase.
419
+ group_phase (bool): Optional. If ``True`` use group-phase convention
420
+ instead of BasePauli ZX-phase convention.
421
+ (default: ``False``).
422
+ sparse (bool): Optional. Of ``True`` return a sparse CSR matrix,
423
+ otherwise return a dense Numpy array
424
+ (default: ``False``).
425
+
426
+ Returns:
427
+ array: if ``sparse=False``.
428
+ csr_matrix: if ``sparse=True``.
429
+ """
430
+ num_qubits = z.size
431
+
432
+ # Convert to zx_phase
433
+ if group_phase:
434
+ phase += np.sum(x & z)
435
+ phase %= 4
436
+
437
+ dim = 2**num_qubits
438
+ twos_array = 1 << np.arange(num_qubits, dtype=np.uint)
439
+ x_indices = np.asarray(x).dot(twos_array)
440
+ z_indices = np.asarray(z).dot(twos_array)
441
+
442
+ indptr = np.arange(dim + 1, dtype=np.uint)
443
+ indices = indptr ^ x_indices
444
+ if phase:
445
+ coeff = (-1j) ** phase
446
+ else:
447
+ coeff = 1
448
+
449
+ # Compute parities of `z_indices & indptr`, i.e.,
450
+ # np.array([(-1) ** bin(i).count("1") for i in z_indices & indptr])
451
+ vec_u64 = z_indices & indptr
452
+ mat_u8 = np.zeros((vec_u64.size, 8), dtype=np.uint8)
453
+ for i in range(8):
454
+ mat_u8[:, i] = vec_u64 & 255
455
+ vec_u64 >>= 8
456
+ if np.all(vec_u64 == 0):
457
+ break
458
+ parity = _PARITY[np.bitwise_xor.reduce(mat_u8, axis=1)]
459
+
460
+ data = coeff * parity
461
+ if sparse:
462
+ # Return sparse matrix
463
+ from scipy.sparse import csr_matrix
464
+
465
+ return csr_matrix((data, indices, indptr), shape=(dim, dim), dtype=complex)
466
+
467
+ # Build dense matrix using csr format
468
+ mat = np.zeros((dim, dim), dtype=complex)
469
+ mat[range(dim), indices[:dim]] = data[:dim]
470
+ return mat
471
+
472
+ @staticmethod
473
+ def _to_label(z, x, phase, group_phase=False, full_group=True, return_phase=False):
474
+ """Return the label string for a Pauli.
475
+
476
+ Args:
477
+ z (array): The symplectic representation z vector.
478
+ x (array): The symplectic representation x vector.
479
+ phase (int): Pauli phase.
480
+ group_phase (bool): Optional. If ``True`` use group-phase convention
481
+ instead of BasePauli ZX-phase convention.
482
+ (default: ``False``).
483
+ full_group (bool): If True return the Pauli label from the full Pauli group
484
+ including complex coefficient from [1, -1, 1j, -1j]. If
485
+ ``False`` return the unsigned Pauli label with coefficient 1
486
+ (default: ``True``).
487
+ return_phase (bool): If ``True`` return the adjusted phase for the coefficient
488
+ of the returned Pauli label. This can be used even if
489
+ ``full_group=False``.
490
+
491
+ Returns:
492
+ str: the Pauli label from the full Pauli group (if ``full_group=True``) or
493
+ from the unsigned Pauli group (if ``full_group=False``).
494
+ tuple[str, int]: if ``return_phase=True`` returns a tuple of the Pauli
495
+ label (from either the full or unsigned Pauli group) and
496
+ the phase ``q`` for the coefficient :math:`(-i)^(q + x.z)`
497
+ for the label from the full Pauli group.
498
+ """
499
+ num_qubits = z.size
500
+ phase = int(phase)
501
+ coeff_labels = {0: "", 1: "-i", 2: "-", 3: "i"}
502
+ label = ""
503
+ for i in range(num_qubits):
504
+ if not z[num_qubits - 1 - i]:
505
+ if not x[num_qubits - 1 - i]:
506
+ label += "I"
507
+ else:
508
+ label += "X"
509
+ elif not x[num_qubits - 1 - i]:
510
+ label += "Z"
511
+ else:
512
+ label += "Y"
513
+ if not group_phase:
514
+ phase -= 1
515
+ phase %= 4
516
+ if phase and full_group:
517
+ label = coeff_labels[phase] + label
518
+ if return_phase:
519
+ return label, phase
520
+ return label
521
+
522
+ def _append_circuit(self, circuit, qargs=None):
523
+ """Update BasePauli inplace by applying a Clifford circuit.
524
+
525
+ Args:
526
+ circuit (QuantumCircuit or Instruction): the gate or composite gate to apply.
527
+ qargs (list or None): The qubits to apply gate to.
528
+
529
+ Returns:
530
+ BasePauli: the updated Pauli.
531
+
532
+ Raises:
533
+ QiskitError: if input gate cannot be decomposed into Clifford gates.
534
+ """
535
+ if isinstance(circuit, (Barrier, Delay)):
536
+ return self
537
+
538
+ if qargs is None:
539
+ qargs = list(range(self.num_qubits))
540
+
541
+ if not isinstance(circuit, QuantumCircuit):
542
+ gate = circuit
543
+
544
+ if isinstance(gate, str):
545
+ # Check if gate is a valid Clifford basis gate string
546
+ if gate not in _basis_1q and gate not in _basis_2q:
547
+ raise QiskitError(f"Invalid Clifford gate name string {gate}")
548
+ name = gate
549
+ else:
550
+ # Assume gate is an Instruction
551
+ name = gate.name
552
+
553
+ # Apply gate if it is a Clifford basis gate
554
+ if name in _non_clifford:
555
+ raise QiskitError(f"Cannot update Pauli with non-Clifford gate {name}")
556
+ if name in _basis_1q:
557
+ if len(qargs) != 1:
558
+ raise QiskitError("Invalid qubits for 1-qubit gate.")
559
+ return _basis_1q[name](self, qargs[0])
560
+ if name in _basis_2q:
561
+ if len(qargs) != 2:
562
+ raise QiskitError("Invalid qubits for 2-qubit gate.")
563
+ return _basis_2q[name](self, qargs[0], qargs[1])
564
+
565
+ # If not a Clifford basis gate we try to unroll the gate and
566
+ # raise an exception if unrolling reaches a non-Clifford gate.
567
+ if gate.definition is None:
568
+ raise QiskitError(f"Cannot apply Instruction: {gate.name}")
569
+ if not isinstance(gate.definition, QuantumCircuit):
570
+ raise QiskitError(
571
+ f"{gate.name} instruction definition is {type(gate.definition)};"
572
+ f" expected QuantumCircuit"
573
+ )
574
+
575
+ circuit = gate.definition
576
+
577
+ for instruction in circuit:
578
+ if instruction.clbits:
579
+ raise QiskitError(
580
+ f"Cannot apply Instruction with classical bits: {instruction.operation.name}"
581
+ )
582
+ # Get the integer position of the flat register
583
+ new_qubits = [qargs[circuit.find_bit(qb)[0]] for qb in instruction.qubits]
584
+ self._append_circuit(instruction.operation, new_qubits)
585
+
586
+ # Since the individual gate evolution functions don't take mod
587
+ # of phase we update it at the end
588
+ self._phase %= 4
589
+ return self
590
+
591
+
592
+ # ---------------------------------------------------------------------
593
+ # Evolution by Clifford gates
594
+ # ---------------------------------------------------------------------
595
+
596
+
597
+ def _evolve_h(base_pauli, qubit):
598
+ """Update P -> H.P.H"""
599
+ x = base_pauli._x[:, qubit].copy()
600
+ z = base_pauli._z[:, qubit].copy()
601
+ base_pauli._x[:, qubit] = z
602
+ base_pauli._z[:, qubit] = x
603
+ base_pauli._phase += 2 * np.logical_and(x, z).T.astype(base_pauli._phase.dtype)
604
+ return base_pauli
605
+
606
+
607
+ def _evolve_s(base_pauli, qubit):
608
+ """Update P -> S.P.Sdg"""
609
+ x = base_pauli._x[:, qubit]
610
+ base_pauli._z[:, qubit] ^= x
611
+ base_pauli._phase += x.T.astype(base_pauli._phase.dtype)
612
+ return base_pauli
613
+
614
+
615
+ def _evolve_sdg(base_pauli, qubit):
616
+ """Update P -> Sdg.P.S"""
617
+ x = base_pauli._x[:, qubit]
618
+ base_pauli._z[:, qubit] ^= x
619
+ base_pauli._phase -= x.T.astype(base_pauli._phase.dtype)
620
+ return base_pauli
621
+
622
+
623
+ # pylint: disable=unused-argument
624
+ def _evolve_i(base_pauli, qubit):
625
+ """Update P -> P"""
626
+ return base_pauli
627
+
628
+
629
+ def _evolve_x(base_pauli, qubit):
630
+ """Update P -> X.P.X"""
631
+ base_pauli._phase += 2 * base_pauli._z[:, qubit].T.astype(base_pauli._phase.dtype)
632
+ return base_pauli
633
+
634
+
635
+ def _evolve_y(base_pauli, qubit):
636
+ """Update P -> Y.P.Y"""
637
+ xp = base_pauli._x[:, qubit].T.astype(base_pauli._phase.dtype)
638
+ zp = base_pauli._z[:, qubit].T.astype(base_pauli._phase.dtype)
639
+ base_pauli._phase += 2 * (xp + zp)
640
+ return base_pauli
641
+
642
+
643
+ def _evolve_z(base_pauli, qubit):
644
+ """Update P -> Z.P.Z"""
645
+ base_pauli._phase += 2 * base_pauli._x[:, qubit].T.astype(base_pauli._phase.dtype)
646
+ return base_pauli
647
+
648
+
649
+ def _evolve_cx(base_pauli, qctrl, qtrgt):
650
+ """Update P -> CX.P.CX"""
651
+ base_pauli._x[:, qtrgt] ^= base_pauli._x[:, qctrl]
652
+ base_pauli._z[:, qctrl] ^= base_pauli._z[:, qtrgt]
653
+ return base_pauli
654
+
655
+
656
+ def _evolve_cz(base_pauli, q1, q2):
657
+ """Update P -> CZ.P.CZ"""
658
+ x1 = base_pauli._x[:, q1].copy()
659
+ x2 = base_pauli._x[:, q2].copy()
660
+ base_pauli._z[:, q1] ^= x2
661
+ base_pauli._z[:, q2] ^= x1
662
+ base_pauli._phase += 2 * np.logical_and(x1, x2).T.astype(base_pauli._phase.dtype)
663
+ return base_pauli
664
+
665
+
666
+ def _evolve_cy(base_pauli, qctrl, qtrgt):
667
+ """Update P -> CY.P.CY"""
668
+ x1 = base_pauli._x[:, qctrl].copy()
669
+ x2 = base_pauli._x[:, qtrgt].copy()
670
+ z2 = base_pauli._z[:, qtrgt].copy()
671
+ base_pauli._x[:, qtrgt] ^= x1
672
+ base_pauli._z[:, qtrgt] ^= x1
673
+ base_pauli._z[:, qctrl] ^= np.logical_xor(x2, z2)
674
+ base_pauli._phase += x1 + 2 * np.logical_and(x1, x2).T.astype(base_pauli._phase.dtype)
675
+ return base_pauli
676
+
677
+
678
+ def _evolve_swap(base_pauli, q1, q2):
679
+ """Update P -> SWAP.P.SWAP"""
680
+ x1 = base_pauli._x[:, q1].copy()
681
+ z1 = base_pauli._z[:, q1].copy()
682
+ base_pauli._x[:, q1] = base_pauli._x[:, q2]
683
+ base_pauli._z[:, q1] = base_pauli._z[:, q2]
684
+ base_pauli._x[:, q2] = x1
685
+ base_pauli._z[:, q2] = z1
686
+ return base_pauli
687
+
688
+
689
+ def _evolve_ecr(base_pauli, q1, q2):
690
+ """Update P -> ECR.P.ECR"""
691
+ base_pauli = _evolve_s(base_pauli, q1)
692
+ base_pauli = _evolve_h(base_pauli, q2)
693
+ base_pauli = _evolve_s(base_pauli, q2)
694
+ base_pauli = _evolve_h(base_pauli, q2)
695
+ base_pauli = _evolve_cx(base_pauli, q1, q2)
696
+ base_pauli = _evolve_x(base_pauli, q1)
697
+ return base_pauli
698
+
699
+
700
+ def _count_y(x, z, dtype=None):
701
+ """Count the number of I Paulis"""
702
+ return (x & z).sum(axis=1, dtype=dtype)
703
+
704
+
705
+ # Basis Clifford Gates
706
+ _basis_1q = {
707
+ "i": _evolve_i,
708
+ "id": _evolve_i,
709
+ "iden": _evolve_i,
710
+ "x": _evolve_x,
711
+ "y": _evolve_y,
712
+ "z": _evolve_z,
713
+ "h": _evolve_h,
714
+ "s": _evolve_s,
715
+ "sdg": _evolve_sdg,
716
+ "sinv": _evolve_sdg,
717
+ }
718
+ _basis_2q = {
719
+ "cx": _evolve_cx,
720
+ "cz": _evolve_cz,
721
+ "cy": _evolve_cy,
722
+ "swap": _evolve_swap,
723
+ "ecr": _evolve_ecr,
724
+ }
725
+
726
+ # Non-Clifford gates
727
+ _non_clifford = ["t", "tdg", "ccx", "ccz"]