qiskit 1.3.0__cp39-abi3-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (836) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +146 -0
  3. qiskit/_accelerate.pyd +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,1030 @@
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
+ Clifford operator class.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import functools
18
+ import itertools
19
+ import math
20
+ import re
21
+ from typing import Literal
22
+
23
+ import numpy as np
24
+
25
+ from qiskit.circuit import Instruction, QuantumCircuit
26
+ from qiskit.circuit.library.standard_gates import HGate, IGate, SGate, XGate, YGate, ZGate
27
+ from qiskit.circuit.operation import Operation
28
+ from qiskit.exceptions import QiskitError
29
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
30
+ from qiskit.quantum_info.operators.mixins import AdjointMixin, generate_apidocs
31
+ from qiskit.quantum_info.operators.operator import Operator
32
+ from qiskit.quantum_info.operators.scalar_op import ScalarOp
33
+ from qiskit.quantum_info.operators.symplectic.base_pauli import _count_y
34
+
35
+ from .base_pauli import BasePauli
36
+ from .clifford_circuits import _append_circuit, _append_operation
37
+
38
+
39
+ class Clifford(BaseOperator, AdjointMixin, Operation):
40
+ r"""
41
+ An N-qubit unitary operator from the Clifford group.
42
+
43
+ An N-qubit Clifford operator takes Paulis to Paulis via conjugation
44
+ (up to a global phase). More precisely, the Clifford group :math:`\mathcal{C}_N`
45
+ is defined as
46
+
47
+ .. math::
48
+
49
+ \mathcal{C}_N = \{ U \in U(2^N) | U \mathcal{P}_N U^{\dagger} = \mathcal{P}_N \} / U(1)
50
+
51
+ where :math:`\mathcal{P}_N` is the Pauli group on :math:`N` qubits
52
+ that is generated by single-qubit Pauli operators,
53
+ and :math:`U` is a unitary operator in the unitary group
54
+ :math:`U(2^N)` representing operations on :math:`N` qubits.
55
+ :math:`\mathcal{C}_N` is the quotient group by the subgroup of
56
+ scalar unitary matrices :math:`U(1)`.
57
+
58
+ **Representation**
59
+
60
+ An *N*-qubit Clifford operator is stored as a length *2N × (2N+1)*
61
+ boolean tableau using the convention from reference [1].
62
+
63
+ * Rows 0 to *N-1* are the *destabilizer* group generators
64
+ * Rows *N* to *2N-1* are the *stabilizer* group generators.
65
+
66
+ The internal boolean tableau for the Clifford
67
+ can be accessed using the :attr:`tableau` attribute. The destabilizer or
68
+ stabilizer rows can each be accessed as a length-N Stabilizer table using
69
+ :attr:`destab` and :attr:`stab` attributes.
70
+
71
+ A more easily human readable representation of the Clifford operator can
72
+ be obtained by calling the :meth:`to_dict` method. This representation is
73
+ also used if a Clifford object is printed as in the following example
74
+
75
+ .. code-block::
76
+
77
+ from qiskit import QuantumCircuit
78
+ from qiskit.quantum_info import Clifford
79
+
80
+ # Bell state generation circuit
81
+ qc = QuantumCircuit(2)
82
+ qc.h(0)
83
+ qc.cx(0, 1)
84
+ cliff = Clifford(qc)
85
+
86
+ # Print the Clifford
87
+ print(cliff)
88
+
89
+ # Print the Clifford destabilizer rows
90
+ print(cliff.to_labels(mode="D"))
91
+
92
+ # Print the Clifford stabilizer rows
93
+ print(cliff.to_labels(mode="S"))
94
+
95
+ .. code-block:: text
96
+
97
+ Clifford: Stabilizer = ['+XX', '+ZZ'], Destabilizer = ['+IZ', '+XI']
98
+ ['+IZ', '+XI']
99
+ ['+XX', '+ZZ']
100
+
101
+ **Circuit Conversion**
102
+
103
+ Clifford operators can be initialized from circuits containing *only* the
104
+ following Clifford gates: :class:`~qiskit.circuit.library.IGate`,
105
+ :class:`~qiskit.circuit.library.XGate`, :class:`~qiskit.circuit.library.YGate`,
106
+ :class:`~qiskit.circuit.library.ZGate`, :class:`~qiskit.circuit.library.HGate`,
107
+ :class:`~qiskit.circuit.library.SGate`, :class:`~qiskit.circuit.library.SdgGate`,
108
+ :class:`~qiskit.circuit.library.SXGate`, :class:`~qiskit.circuit.library.SXdgGate`,
109
+ :class:`~qiskit.circuit.library.CXGate`, :class:`~qiskit.circuit.library.CZGate`,
110
+ :class:`~qiskit.circuit.library.CYGate`, :class:`~qiskit.circuit.library.DCXGate`,
111
+ :class:`~qiskit.circuit.library.SwapGate`, :class:`~qiskit.circuit.library.iSwapGate`,
112
+ :class:`~qiskit.circuit.library.ECRGate`, :class:`~qiskit.circuit.library.LinearFunction`,
113
+ :class:`~qiskit.circuit.library.PermutationGate`.
114
+ They can be converted back into a :class:`~qiskit.circuit.QuantumCircuit`,
115
+ or :class:`~qiskit.circuit.Gate` object using the :meth:`~Clifford.to_circuit`
116
+ or :meth:`~Clifford.to_instruction` methods respectively. Note that this
117
+ decomposition is not necessarily optimal in terms of number of gates.
118
+
119
+ .. note::
120
+
121
+ A minimally generating set of gates for Clifford circuits is
122
+ the :class:`~qiskit.circuit.library.HGate` and
123
+ :class:`~qiskit.circuit.library.SGate` gate and *either* the
124
+ :class:`~qiskit.circuit.library.CXGate` or
125
+ :class:`~qiskit.circuit.library.CZGate` two-qubit gate.
126
+
127
+ Clifford operators can also be converted to
128
+ :class:`~qiskit.quantum_info.Operator` objects using the
129
+ :meth:`to_operator` method. This is done via decomposing to a circuit, and then
130
+ simulating the circuit as a unitary operator.
131
+
132
+ References:
133
+ 1. S. Aaronson, D. Gottesman, *Improved Simulation of Stabilizer Circuits*,
134
+ Phys. Rev. A 70, 052328 (2004).
135
+ `arXiv:quant-ph/0406196 <https://arxiv.org/abs/quant-ph/0406196>`_
136
+ """
137
+
138
+ _COMPOSE_PHASE_LOOKUP = None
139
+ _COMPOSE_1Q_LOOKUP = None
140
+
141
+ def __array__(self, dtype=None, copy=None):
142
+ if copy is False:
143
+ raise ValueError("unable to avoid copy while creating an array as requested")
144
+ arr = self.to_matrix()
145
+ return arr if dtype is None else arr.astype(dtype, copy=False)
146
+
147
+ def __init__(self, data, validate=True, copy=True):
148
+ """Initialize an operator object."""
149
+
150
+ # pylint: disable=cyclic-import
151
+ from qiskit.circuit.library import LinearFunction, PermutationGate
152
+
153
+ # Initialize from another Clifford
154
+ if isinstance(data, Clifford):
155
+ num_qubits = data.num_qubits
156
+ self.tableau = data.tableau.copy() if copy else data.tableau
157
+
158
+ # Initialize from ScalarOp as N-qubit identity discarding any global phase
159
+ elif isinstance(data, ScalarOp):
160
+ if not data.num_qubits or not data.is_unitary():
161
+ raise QiskitError("Can only initialize from N-qubit identity ScalarOp.")
162
+ num_qubits = data.num_qubits
163
+ self.tableau = np.fromfunction(
164
+ lambda i, j: i == j, (2 * num_qubits, 2 * num_qubits + 1)
165
+ ).astype(bool)
166
+
167
+ # Initialize from LinearFunction
168
+ elif isinstance(data, LinearFunction):
169
+ num_qubits = len(data.linear)
170
+ self.tableau = self.from_linear_function(data)
171
+
172
+ # Initialize from PermutationGate
173
+ elif isinstance(data, PermutationGate):
174
+ num_qubits = len(data.pattern)
175
+ self.tableau = self.from_permutation(data)
176
+
177
+ # Initialize from a QuantumCircuit or Instruction object
178
+ elif isinstance(data, (QuantumCircuit, Instruction)):
179
+ num_qubits = data.num_qubits
180
+ self.tableau = Clifford.from_circuit(data).tableau
181
+
182
+ # Initialize StabilizerTable directly from the data
183
+ else:
184
+ if (
185
+ isinstance(data, (list, np.ndarray))
186
+ and (data_asarray := np.asarray(data, dtype=bool)).ndim == 2
187
+ ):
188
+ # This little dance is to avoid Numpy 1/2 incompatibilities between the availability
189
+ # and meaning of the 'copy' argument in 'array' and 'asarray', when the input needs
190
+ # its dtype converting. 'asarray' prefers to return 'self' if possible in both.
191
+ if copy and np.may_share_memory(data, data_asarray):
192
+ data = data_asarray.copy()
193
+ else:
194
+ data = data_asarray
195
+ if data.shape[0] == data.shape[1]:
196
+ self.tableau = self._stack_table_phase(
197
+ data, np.zeros(data.shape[0], dtype=bool)
198
+ )
199
+ num_qubits = data.shape[0] // 2
200
+ elif data.shape[0] + 1 == data.shape[1]:
201
+ self.tableau = data
202
+ num_qubits = data.shape[0] // 2
203
+ else:
204
+ raise QiskitError("")
205
+ else:
206
+ n_paulis = len(data)
207
+ symp = self._from_label(data[0])
208
+ num_qubits = len(symp) // 2
209
+ tableau = np.zeros((n_paulis, len(symp)), dtype=bool)
210
+ tableau[0] = symp
211
+ for i in range(1, n_paulis):
212
+ tableau[i] = self._from_label(data[i])
213
+ self.tableau = tableau
214
+
215
+ # Validate table is a symplectic matrix
216
+ if validate and not Clifford._is_symplectic(self.symplectic_matrix):
217
+ raise QiskitError(
218
+ "Invalid Clifford. Input StabilizerTable is not a valid symplectic matrix."
219
+ )
220
+
221
+ # Initialize BaseOperator
222
+ super().__init__(num_qubits=num_qubits)
223
+
224
+ @property
225
+ def name(self):
226
+ """Unique string identifier for operation type."""
227
+ return "clifford"
228
+
229
+ @property
230
+ def num_clbits(self):
231
+ """Number of classical bits."""
232
+ return 0
233
+
234
+ def __repr__(self):
235
+ return f"Clifford({repr(self.tableau)})"
236
+
237
+ def __str__(self):
238
+ return (
239
+ f'Clifford: Stabilizer = {self.to_labels(mode="S")}, '
240
+ f'Destabilizer = {self.to_labels(mode="D")}'
241
+ )
242
+
243
+ def __eq__(self, other):
244
+ """Check if two Clifford tables are equal"""
245
+ return super().__eq__(other) and (self.tableau == other.tableau).all()
246
+
247
+ def copy(self):
248
+ return type(self)(self, validate=False, copy=True)
249
+
250
+ # ---------------------------------------------------------------------
251
+ # Attributes
252
+ # ---------------------------------------------------------------------
253
+
254
+ # pylint: disable=bad-docstring-quotes
255
+
256
+ @property
257
+ def symplectic_matrix(self):
258
+ """Return boolean symplectic matrix."""
259
+ return self.tableau[:, :-1]
260
+
261
+ @symplectic_matrix.setter
262
+ def symplectic_matrix(self, value):
263
+ self.tableau[:, :-1] = value
264
+
265
+ @property
266
+ def phase(self):
267
+ """Return phase with boolean representation."""
268
+ return self.tableau[:, -1]
269
+
270
+ @phase.setter
271
+ def phase(self, value):
272
+ self.tableau[:, -1] = value
273
+
274
+ @property
275
+ def x(self):
276
+ """The x array for the symplectic representation."""
277
+ return self.tableau[:, 0 : self.num_qubits]
278
+
279
+ @x.setter
280
+ def x(self, value):
281
+ self.tableau[:, 0 : self.num_qubits] = value
282
+
283
+ @property
284
+ def z(self):
285
+ """The z array for the symplectic representation."""
286
+ return self.tableau[:, self.num_qubits : 2 * self.num_qubits]
287
+
288
+ @z.setter
289
+ def z(self, value):
290
+ self.tableau[:, self.num_qubits : 2 * self.num_qubits] = value
291
+
292
+ @property
293
+ def destab(self):
294
+ """The destabilizer array for the symplectic representation."""
295
+ return self.tableau[: self.num_qubits, :]
296
+
297
+ @destab.setter
298
+ def destab(self, value):
299
+ self.tableau[: self.num_qubits, :] = value
300
+
301
+ @property
302
+ def destab_x(self):
303
+ """The destabilizer x array for the symplectic representation."""
304
+ return self.tableau[: self.num_qubits, : self.num_qubits]
305
+
306
+ @destab_x.setter
307
+ def destab_x(self, value):
308
+ self.tableau[: self.num_qubits, : self.num_qubits] = value
309
+
310
+ @property
311
+ def destab_z(self):
312
+ """The destabilizer z array for the symplectic representation."""
313
+ return self.tableau[: self.num_qubits, self.num_qubits : 2 * self.num_qubits]
314
+
315
+ @destab_z.setter
316
+ def destab_z(self, value):
317
+ self.tableau[: self.num_qubits, self.num_qubits : 2 * self.num_qubits] = value
318
+
319
+ @property
320
+ def destab_phase(self):
321
+ """Return phase of destabilizer with boolean representation."""
322
+ return self.tableau[: self.num_qubits, -1]
323
+
324
+ @destab_phase.setter
325
+ def destab_phase(self, value):
326
+ self.tableau[: self.num_qubits, -1] = value
327
+
328
+ @property
329
+ def stab(self):
330
+ """The stabilizer array for the symplectic representation."""
331
+ return self.tableau[self.num_qubits :, :]
332
+
333
+ @stab.setter
334
+ def stab(self, value):
335
+ self.tableau[self.num_qubits :, :] = value
336
+
337
+ @property
338
+ def stab_x(self):
339
+ """The stabilizer x array for the symplectic representation."""
340
+ return self.tableau[self.num_qubits :, : self.num_qubits]
341
+
342
+ @stab_x.setter
343
+ def stab_x(self, value):
344
+ self.tableau[self.num_qubits :, : self.num_qubits] = value
345
+
346
+ @property
347
+ def stab_z(self):
348
+ """The stabilizer array for the symplectic representation."""
349
+ return self.tableau[self.num_qubits :, self.num_qubits : 2 * self.num_qubits]
350
+
351
+ @stab_z.setter
352
+ def stab_z(self, value):
353
+ self.tableau[self.num_qubits :, self.num_qubits : 2 * self.num_qubits] = value
354
+
355
+ @property
356
+ def stab_phase(self):
357
+ """Return phase of stabilizer with boolean representation."""
358
+ return self.tableau[self.num_qubits :, -1]
359
+
360
+ @stab_phase.setter
361
+ def stab_phase(self, value):
362
+ self.tableau[self.num_qubits :, -1] = value
363
+
364
+ # ---------------------------------------------------------------------
365
+ # Utility Operator methods
366
+ # ---------------------------------------------------------------------
367
+
368
+ def is_unitary(self):
369
+ """Return True if the Clifford table is valid."""
370
+ # A valid Clifford is always unitary, so this function is really
371
+ # checking that the underlying Stabilizer table array is a valid
372
+ # Clifford array.
373
+ return Clifford._is_symplectic(self.symplectic_matrix)
374
+
375
+ # ---------------------------------------------------------------------
376
+ # BaseOperator Abstract Methods
377
+ # ---------------------------------------------------------------------
378
+
379
+ def conjugate(self):
380
+ return Clifford._conjugate_transpose(self, "C")
381
+
382
+ def adjoint(self):
383
+ return Clifford._conjugate_transpose(self, "A")
384
+
385
+ def transpose(self):
386
+ return Clifford._conjugate_transpose(self, "T")
387
+
388
+ def tensor(self, other: Clifford) -> Clifford:
389
+ if not isinstance(other, Clifford):
390
+ other = Clifford(other)
391
+ return self._tensor(self, other)
392
+
393
+ def expand(self, other: Clifford) -> Clifford:
394
+ if not isinstance(other, Clifford):
395
+ other = Clifford(other)
396
+ return self._tensor(other, self)
397
+
398
+ @classmethod
399
+ def _tensor(cls, a, b):
400
+ n = a.num_qubits + b.num_qubits
401
+ tableau = np.zeros((2 * n, 2 * n + 1), dtype=bool)
402
+ clifford = cls(tableau, validate=False)
403
+ clifford.destab_x[: b.num_qubits, : b.num_qubits] = b.destab_x
404
+ clifford.destab_x[b.num_qubits :, b.num_qubits :] = a.destab_x
405
+ clifford.destab_z[: b.num_qubits, : b.num_qubits] = b.destab_z
406
+ clifford.destab_z[b.num_qubits :, b.num_qubits :] = a.destab_z
407
+ clifford.stab_x[: b.num_qubits, : b.num_qubits] = b.stab_x
408
+ clifford.stab_x[b.num_qubits :, b.num_qubits :] = a.stab_x
409
+ clifford.stab_z[: b.num_qubits, : b.num_qubits] = b.stab_z
410
+ clifford.stab_z[b.num_qubits :, b.num_qubits :] = a.stab_z
411
+ clifford.phase[: b.num_qubits] = b.destab_phase
412
+ clifford.phase[b.num_qubits : n] = a.destab_phase
413
+ clifford.phase[n : n + b.num_qubits] = b.stab_phase
414
+ clifford.phase[n + b.num_qubits :] = a.stab_phase
415
+ return clifford
416
+
417
+ def compose(
418
+ self,
419
+ other: Clifford | QuantumCircuit | Instruction,
420
+ qargs: list | None = None,
421
+ front: bool = False,
422
+ ) -> Clifford:
423
+ if qargs is None:
424
+ qargs = getattr(other, "qargs", None)
425
+ # If other is a QuantumCircuit we can more efficiently compose
426
+ # using the _append_circuit method to update each gate recursively
427
+ # to the current Clifford, rather than converting to a Clifford first
428
+ # and then doing the composition of tables.
429
+ if not front:
430
+ if isinstance(other, QuantumCircuit):
431
+ return _append_circuit(self.copy(), other, qargs=qargs)
432
+ if isinstance(other, Instruction):
433
+ return _append_operation(self.copy(), other, qargs=qargs)
434
+
435
+ if not isinstance(other, Clifford):
436
+ # Not copying is safe since we're going to drop our only reference to `other` at the end
437
+ # of the function.
438
+ other = Clifford(other, copy=False)
439
+
440
+ # Validate compose dimensions
441
+ self._op_shape.compose(other._op_shape, qargs, front)
442
+
443
+ # Pad other with identities if composing on subsystem
444
+ other = self._pad_with_identity(other, qargs)
445
+
446
+ left, right = (self, other) if front else (other, self)
447
+
448
+ if self.num_qubits == 1:
449
+ return self._compose_1q(left, right)
450
+ return self._compose_general(left, right)
451
+
452
+ @classmethod
453
+ def _compose_general(cls, first, second):
454
+ # Correcting for phase due to Pauli multiplication. Start with factors of -i from XZ = -iY
455
+ # on individual qubits, and then handle multiplication between each qubitwise pair.
456
+ ifacts = np.sum(second.x & second.z, axis=1, dtype=int)
457
+
458
+ x1, z1 = first.x.astype(np.uint8), first.z.astype(np.uint8)
459
+ lookup = cls._compose_lookup()
460
+
461
+ # The loop is over 2*n_qubits entries, and the entire loop is cubic in the number of qubits.
462
+ for k, row2 in enumerate(second.symplectic_matrix):
463
+ x1_select = x1[row2]
464
+ z1_select = z1[row2]
465
+ x1_accum = np.logical_xor.accumulate(x1_select, axis=0).astype(np.uint8)
466
+ z1_accum = np.logical_xor.accumulate(z1_select, axis=0).astype(np.uint8)
467
+ indexer = (x1_select[1:], z1_select[1:], x1_accum[:-1], z1_accum[:-1])
468
+ ifacts[k] += np.sum(lookup[indexer])
469
+ p = np.mod(ifacts, 4) // 2
470
+
471
+ phase = (
472
+ (np.matmul(second.symplectic_matrix, first.phase, dtype=int) + second.phase + p) % 2
473
+ ).astype(bool)
474
+ data = cls._stack_table_phase(
475
+ (np.matmul(second.symplectic_matrix, first.symplectic_matrix, dtype=int) % 2).astype(
476
+ bool
477
+ ),
478
+ phase,
479
+ )
480
+ return Clifford(data, validate=False, copy=False)
481
+
482
+ @classmethod
483
+ def _compose_1q(cls, first, second):
484
+ # 1-qubit composition can be done with a simple lookup table; there are 24 elements in the
485
+ # 1q Clifford group, so 576 possible combinations, which is small enough to look up.
486
+ if cls._COMPOSE_1Q_LOOKUP is None:
487
+ # The valid tables for 1q Cliffords.
488
+ tables_1q = np.array(
489
+ [
490
+ [[False, True], [True, False]],
491
+ [[False, True], [True, True]],
492
+ [[True, False], [False, True]],
493
+ [[True, False], [True, True]],
494
+ [[True, True], [False, True]],
495
+ [[True, True], [True, False]],
496
+ ]
497
+ )
498
+ phases_1q = np.array([[False, False], [False, True], [True, False], [True, True]])
499
+ # Build the lookup table.
500
+ cliffords = [
501
+ cls(cls._stack_table_phase(table, phase), validate=False, copy=False)
502
+ for table, phase in itertools.product(tables_1q, phases_1q)
503
+ ]
504
+ cls._COMPOSE_1Q_LOOKUP = {
505
+ (cls._hash(left), cls._hash(right)): cls._compose_general(left, right)
506
+ for left, right in itertools.product(cliffords, repeat=2)
507
+ }
508
+ return cls._COMPOSE_1Q_LOOKUP[cls._hash(first), cls._hash(second)].copy()
509
+
510
+ @classmethod
511
+ def _compose_lookup(
512
+ cls,
513
+ ):
514
+ if cls._COMPOSE_PHASE_LOOKUP is None:
515
+ # A lookup table for calculating phases. The indices are
516
+ # current_x, current_z, running_x_count, running_z_count
517
+ # where all counts taken modulo 2.
518
+ lookup = np.zeros((2, 2, 2, 2), dtype=int)
519
+ lookup[0, 1, 1, 0] = lookup[1, 0, 1, 1] = lookup[1, 1, 0, 1] = -1
520
+ lookup[0, 1, 1, 1] = lookup[1, 0, 0, 1] = lookup[1, 1, 1, 0] = 1
521
+ lookup.setflags(write=False)
522
+ cls._COMPOSE_PHASE_LOOKUP = lookup
523
+ return cls._COMPOSE_PHASE_LOOKUP
524
+
525
+ # ---------------------------------------------------------------------
526
+ # Representation conversions
527
+ # ---------------------------------------------------------------------
528
+
529
+ def to_dict(self):
530
+ """Return dictionary representation of Clifford object."""
531
+ return {
532
+ "stabilizer": self.to_labels(mode="S"),
533
+ "destabilizer": self.to_labels(mode="D"),
534
+ }
535
+
536
+ @classmethod
537
+ def from_dict(cls, obj):
538
+ """Load a Clifford from a dictionary"""
539
+ labels = obj.get("destabilizer") + obj.get("stabilizer")
540
+ n_paulis = len(labels)
541
+ symp = cls._from_label(labels[0])
542
+ tableau = np.zeros((n_paulis, len(symp)), dtype=bool)
543
+ tableau[0] = symp
544
+ for i in range(1, n_paulis):
545
+ tableau[i] = cls._from_label(labels[i])
546
+ return cls(tableau)
547
+
548
+ def to_matrix(self):
549
+ """Convert operator to Numpy matrix."""
550
+ return self.to_operator().data
551
+
552
+ @classmethod
553
+ def from_matrix(cls, matrix: np.ndarray) -> Clifford:
554
+ """Create a Clifford from a unitary matrix.
555
+
556
+ Note that this function takes exponentially long time w.r.t. the number of qubits.
557
+
558
+ Args:
559
+ matrix (np.array): A unitary matrix representing a Clifford to be converted.
560
+
561
+ Returns:
562
+ Clifford: the Clifford object for the unitary matrix.
563
+
564
+ Raises:
565
+ QiskitError: if the input is not a Clifford matrix.
566
+ """
567
+ tableau = cls._unitary_matrix_to_tableau(matrix)
568
+ if tableau is None:
569
+ raise QiskitError("Non-Clifford matrix is not convertible")
570
+ return cls(tableau)
571
+
572
+ @classmethod
573
+ def from_linear_function(cls, linear_function):
574
+ """Create a Clifford from a Linear Function.
575
+
576
+ If the linear function is represented by a nxn binary invertible matrix A,
577
+ then the corresponding Clifford has symplectic matrix [[A^t, 0], [0, A^{-1}]].
578
+
579
+ Args:
580
+ linear_function (LinearFunction): A linear function to be converted.
581
+
582
+ Returns:
583
+ Clifford: the Clifford object for this linear function.
584
+ """
585
+ from qiskit.synthesis.linear import calc_inverse_matrix # pylint: disable=cyclic-import
586
+
587
+ mat = linear_function.linear
588
+ mat_t = np.transpose(mat)
589
+ mat_i = calc_inverse_matrix(mat)
590
+
591
+ dim = len(mat)
592
+ zero = np.zeros((dim, dim), dtype=int)
593
+ symplectic_mat = np.block([[mat_t, zero], [zero, mat_i]])
594
+ phase = np.zeros(2 * dim, dtype=int)
595
+ tableau = cls._stack_table_phase(symplectic_mat, phase)
596
+ return tableau
597
+
598
+ @classmethod
599
+ def from_permutation(cls, permutation_gate):
600
+ """Create a Clifford from a PermutationGate.
601
+
602
+ Args:
603
+ permutation_gate (PermutationGate): A permutation to be converted.
604
+
605
+ Returns:
606
+ Clifford: the Clifford object for this permutation.
607
+ """
608
+
609
+ pat = permutation_gate.pattern
610
+ dim = len(pat)
611
+ symplectic_mat = np.zeros((2 * dim, 2 * dim), dtype=int)
612
+ for i, j in enumerate(pat):
613
+ symplectic_mat[j, i] = True
614
+ symplectic_mat[j + dim, i + dim] = True
615
+ phase = np.zeros(2 * dim, dtype=bool)
616
+ tableau = cls._stack_table_phase(symplectic_mat, phase)
617
+ return tableau
618
+
619
+ def to_operator(self) -> Operator:
620
+ """Convert to an Operator object."""
621
+ return Operator(self.to_instruction())
622
+
623
+ @classmethod
624
+ def from_operator(cls, operator: Operator) -> Clifford:
625
+ """Create a Clifford from a operator.
626
+
627
+ Note that this function takes exponentially long time w.r.t. the number of qubits.
628
+
629
+ Args:
630
+ operator (Operator): An operator representing a Clifford to be converted.
631
+
632
+ Returns:
633
+ Clifford: the Clifford object for the operator.
634
+
635
+ Raises:
636
+ QiskitError: if the input is not a Clifford operator.
637
+ """
638
+ tableau = cls._unitary_matrix_to_tableau(operator.to_matrix())
639
+ if tableau is None:
640
+ raise QiskitError("Non-Clifford operator is not convertible")
641
+ return cls(tableau)
642
+
643
+ def to_circuit(self):
644
+ """Return a QuantumCircuit implementing the Clifford.
645
+
646
+ For N <= 3 qubits this is based on optimal CX cost decomposition
647
+ from reference [1]. For N > 3 qubits this is done using the general
648
+ non-optimal compilation routine from reference [2].
649
+
650
+ Return:
651
+ QuantumCircuit: a circuit implementation of the Clifford.
652
+
653
+ References:
654
+ 1. S. Bravyi, D. Maslov, *Hadamard-free circuits expose the
655
+ structure of the Clifford group*,
656
+ `arXiv:2003.09412 [quant-ph] <https://arxiv.org/abs/2003.09412>`_
657
+
658
+ 2. S. Aaronson, D. Gottesman, *Improved Simulation of Stabilizer Circuits*,
659
+ Phys. Rev. A 70, 052328 (2004).
660
+ `arXiv:quant-ph/0406196 <https://arxiv.org/abs/quant-ph/0406196>`_
661
+ """
662
+ from qiskit.synthesis.clifford import synth_clifford_full # pylint: disable=cyclic-import
663
+
664
+ return synth_clifford_full(self)
665
+
666
+ def to_instruction(self):
667
+ """Return a Gate instruction implementing the Clifford."""
668
+ return self.to_circuit().to_gate()
669
+
670
+ @staticmethod
671
+ def from_circuit(circuit: QuantumCircuit | Instruction) -> Clifford:
672
+ """Initialize from a QuantumCircuit or Instruction.
673
+
674
+ Args:
675
+ circuit (QuantumCircuit or ~qiskit.circuit.Instruction):
676
+ instruction to initialize.
677
+
678
+ Returns:
679
+ Clifford: the Clifford object for the instruction.
680
+
681
+ Raises:
682
+ QiskitError: if the input instruction is non-Clifford or contains
683
+ classical register instruction.
684
+ """
685
+ if not isinstance(circuit, (QuantumCircuit, Instruction)):
686
+ raise QiskitError("Input must be a QuantumCircuit or Instruction")
687
+
688
+ # Initialize an identity Clifford
689
+ clifford = Clifford(np.eye(2 * circuit.num_qubits), validate=False)
690
+ if isinstance(circuit, QuantumCircuit):
691
+ clifford = _append_circuit(clifford, circuit)
692
+ else:
693
+ clifford = _append_operation(clifford, circuit)
694
+ return clifford
695
+
696
+ @staticmethod
697
+ def from_label(label: str) -> Clifford:
698
+ """Return a tensor product of single-qubit Clifford gates.
699
+
700
+ Args:
701
+ label (string): single-qubit operator string.
702
+
703
+ Returns:
704
+ Clifford: The N-qubit Clifford operator.
705
+
706
+ Raises:
707
+ QiskitError: if the label contains invalid characters.
708
+
709
+ Additional Information:
710
+ The labels correspond to the single-qubit Cliffords are
711
+
712
+ * - Label
713
+ - Stabilizer
714
+ - Destabilizer
715
+ * - ``"I"``
716
+ - +Z
717
+ - +X
718
+ * - ``"X"``
719
+ - -Z
720
+ - +X
721
+ * - ``"Y"``
722
+ - -Z
723
+ - -X
724
+ * - ``"Z"``
725
+ - +Z
726
+ - -X
727
+ * - ``"H"``
728
+ - +X
729
+ - +Z
730
+ * - ``"S"``
731
+ - +Z
732
+ - +Y
733
+ """
734
+ # Check label is valid
735
+ label_gates = {
736
+ "I": IGate(),
737
+ "X": XGate(),
738
+ "Y": YGate(),
739
+ "Z": ZGate(),
740
+ "H": HGate(),
741
+ "S": SGate(),
742
+ }
743
+ if re.match(r"^[IXYZHS\-+]+$", label) is None:
744
+ raise QiskitError("Label contains invalid characters.")
745
+ # Initialize an identity matrix and apply each gate
746
+ num_qubits = len(label)
747
+ op = Clifford(np.eye(2 * num_qubits, dtype=bool))
748
+ for qubit, char in enumerate(reversed(label)):
749
+ op = _append_operation(op, label_gates[char], qargs=[qubit])
750
+ return op
751
+
752
+ def to_labels(self, array: bool = False, mode: Literal["S", "D", "B"] = "B"):
753
+ r"""Convert a Clifford to a list Pauli (de)stabilizer string labels.
754
+
755
+ For large Clifford converting using the ``array=True``
756
+ kwarg will be more efficient since it allocates memory for
757
+ the full Numpy array of labels in advance.
758
+
759
+ .. list-table:: Stabilizer Representations
760
+ :header-rows: 1
761
+
762
+ * - Label
763
+ - Phase
764
+ - Symplectic
765
+ - Matrix
766
+ - Pauli
767
+ * - ``"+I"``
768
+ - 0
769
+ - :math:`[0, 0]`
770
+ - :math:`\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}`
771
+ - :math:`I`
772
+ * - ``"-I"``
773
+ - 1
774
+ - :math:`[0, 0]`
775
+ - :math:`\begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix}`
776
+ - :math:`-I`
777
+ * - ``"X"``
778
+ - 0
779
+ - :math:`[1, 0]`
780
+ - :math:`\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}`
781
+ - :math:`X`
782
+ * - ``"-X"``
783
+ - 1
784
+ - :math:`[1, 0]`
785
+ - :math:`\begin{bmatrix} 0 & -1 \\ -1 & 0 \end{bmatrix}`
786
+ - :math:`-X`
787
+ * - ``"Y"``
788
+ - 0
789
+ - :math:`[1, 1]`
790
+ - :math:`\begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix}`
791
+ - :math:`iY`
792
+ * - ``"-Y"``
793
+ - 1
794
+ - :math:`[1, 1]`
795
+ - :math:`\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}`
796
+ - :math:`-iY`
797
+ * - ``"Z"``
798
+ - 0
799
+ - :math:`[0, 1]`
800
+ - :math:`\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}`
801
+ - :math:`Z`
802
+ * - ``"-Z"``
803
+ - 1
804
+ - :math:`[0, 1]`
805
+ - :math:`\begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix}`
806
+ - :math:`-Z`
807
+
808
+ Args:
809
+ array (bool): return a Numpy array if True, otherwise
810
+ return a list (Default: False).
811
+ mode (Literal["S", "D", "B"]): return both stabilizer and destabilizer if "B",
812
+ return only stabilizer if "S" and return only destabilizer if "D".
813
+
814
+ Returns:
815
+ list or array: The rows of the StabilizerTable in label form.
816
+ Raises:
817
+ QiskitError: if stabilizer and destabilizer are both False.
818
+ """
819
+ if mode not in ("S", "B", "D"):
820
+ raise QiskitError("mode must be B, S, or D.")
821
+ size = 2 * self.num_qubits if mode == "B" else self.num_qubits
822
+ offset = self.num_qubits if mode == "S" else 0
823
+ ret = np.zeros(size, dtype=f"<U{1 + self.num_qubits}")
824
+ for i in range(size):
825
+ z = self.tableau[i + offset, self.num_qubits : 2 * self.num_qubits]
826
+ x = self.tableau[i + offset, 0 : self.num_qubits]
827
+ phase = int(self.tableau[i + offset, -1]) * 2
828
+ label = BasePauli._to_label(z, x, phase, group_phase=True)
829
+ if label[0] != "-":
830
+ label = "+" + label
831
+ ret[i] = label
832
+ if array:
833
+ return ret
834
+ return ret.tolist()
835
+
836
+ # ---------------------------------------------------------------------
837
+ # Internal helper functions
838
+ # ---------------------------------------------------------------------
839
+
840
+ def _hash(self):
841
+ """Produce a hashable value that is unique for each different Clifford. This should only be
842
+ used internally when the classes being hashed are under our control, because classes of this
843
+ type are mutable."""
844
+ return np.packbits(self.tableau).tobytes()
845
+
846
+ @staticmethod
847
+ def _is_symplectic(mat):
848
+ """Return True if input is symplectic matrix."""
849
+ # Condition is
850
+ # table.T * [[0, 1], [1, 0]] * table = [[0, 1], [1, 0]]
851
+ # where we are block matrix multiplying using symplectic product
852
+
853
+ dim = len(mat) // 2
854
+ if mat.shape != (2 * dim, 2 * dim):
855
+ return False
856
+
857
+ one = np.eye(dim, dtype=int)
858
+ zero = np.zeros((dim, dim), dtype=int)
859
+ seye = np.block([[zero, one], [one, zero]])
860
+ arr = mat.astype(int)
861
+ return np.array_equal(np.mod(arr.T.dot(seye).dot(arr), 2), seye)
862
+
863
+ @staticmethod
864
+ def _conjugate_transpose(clifford, method):
865
+ """Return the adjoint, conjugate, or transpose of the Clifford.
866
+
867
+ Args:
868
+ clifford (Clifford): a clifford object.
869
+ method (str): what function to apply 'A', 'C', or 'T'.
870
+
871
+ Returns:
872
+ Clifford: the modified clifford.
873
+ """
874
+ ret = clifford.copy()
875
+ if method in ["A", "T"]:
876
+ # Apply inverse
877
+ # Update table
878
+ tmp = ret.destab_x.copy()
879
+ ret.destab_x = ret.stab_z.T
880
+ ret.destab_z = ret.destab_z.T
881
+ ret.stab_x = ret.stab_x.T
882
+ ret.stab_z = tmp.T
883
+ # Update phase
884
+ ret.phase ^= clifford.dot(ret).phase
885
+ if method in ["C", "T"]:
886
+ # Apply conjugate
887
+ ret.phase ^= np.mod(_count_y(ret.x, ret.z), 2).astype(bool)
888
+ return ret
889
+
890
+ def _pad_with_identity(self, clifford, qargs):
891
+ """Pad Clifford with identities on other subsystems."""
892
+ if qargs is None:
893
+ return clifford
894
+
895
+ padded = Clifford(np.eye(2 * self.num_qubits, dtype=bool), validate=False, copy=False)
896
+ inds = list(qargs) + [self.num_qubits + i for i in qargs]
897
+
898
+ # Pad Pauli array
899
+ for i, pos in enumerate(qargs):
900
+ padded.tableau[inds, pos] = clifford.tableau[:, i]
901
+ padded.tableau[inds, self.num_qubits + pos] = clifford.tableau[
902
+ :, clifford.num_qubits + i
903
+ ]
904
+
905
+ # Pad phase
906
+ padded.phase[inds] = clifford.phase
907
+
908
+ return padded
909
+
910
+ @staticmethod
911
+ def _stack_table_phase(table, phase):
912
+ return np.hstack((table, phase.reshape(len(phase), 1)))
913
+
914
+ @staticmethod
915
+ def _from_label(label):
916
+ phase = False
917
+ if label[0] in ("-", "+"):
918
+ phase = label[0] == "-"
919
+ label = label[1:]
920
+ num_qubits = len(label)
921
+ symp = np.zeros(2 * num_qubits + 1, dtype=bool)
922
+ xs = symp[0:num_qubits]
923
+ zs = symp[num_qubits : 2 * num_qubits]
924
+ for i, char in enumerate(label):
925
+ if char not in ["I", "X", "Y", "Z"]:
926
+ raise QiskitError(
927
+ f"Pauli string contains invalid character: {char} not in ['I', 'X', 'Y', 'Z']."
928
+ )
929
+ if char in ("X", "Y"):
930
+ xs[num_qubits - 1 - i] = True
931
+ if char in ("Z", "Y"):
932
+ zs[num_qubits - 1 - i] = True
933
+ symp[-1] = phase
934
+ return symp
935
+
936
+ @staticmethod
937
+ def _pauli_matrix_to_row(mat, num_qubits):
938
+ """Generate a binary vector (a row of tableau representation) from a Pauli matrix.
939
+ Return None if the non-Pauli matrix is supplied."""
940
+ # pylint: disable=too-many-return-statements
941
+ decimals = 6
942
+
943
+ def find_one_index(x):
944
+ indices = np.where(np.round(np.abs(x), decimals=decimals) == 1)
945
+ return indices[0][0] if len(indices[0]) == 1 else None
946
+
947
+ def bitvector(n, num_bits):
948
+ return np.array([int(digit) for digit in format(n, f"0{num_bits}b")], dtype=bool)[::-1]
949
+
950
+ # compute x-bits
951
+ xint = find_one_index(mat[0, :])
952
+ if xint is None:
953
+ return None
954
+ xbits = bitvector(xint, num_qubits)
955
+
956
+ # extract non-zero elements from matrix (each must be 1, -1, 1j or -1j for Pauli matrix)
957
+ entries = np.empty(len(mat), dtype=complex)
958
+ for i, row in enumerate(mat):
959
+ index = find_one_index(row)
960
+ if index is None:
961
+ return None
962
+ expected = xint ^ i
963
+ if index != expected:
964
+ return None
965
+ entries[i] = np.round(mat[i, index], decimals=decimals)
966
+ if entries[i] not in {1, -1, 1j, -1j}:
967
+ return None
968
+
969
+ # compute z-bits
970
+ zbits = np.empty(num_qubits, dtype=bool)
971
+ for k in range(num_qubits):
972
+ sign = np.round(entries[2**k] / entries[0])
973
+ if sign == 1:
974
+ zbits[k] = False
975
+ elif sign == -1:
976
+ zbits[k] = True
977
+ else:
978
+ return None
979
+
980
+ # compute phase
981
+ phase = None
982
+ num_y = sum(xbits & zbits)
983
+ positive_phase = (-1j) ** num_y
984
+ if entries[0] == positive_phase:
985
+ phase = False
986
+ elif entries[0] == -1 * positive_phase:
987
+ phase = True
988
+ if phase is None:
989
+ return None
990
+
991
+ # validate all non-zero elements
992
+ coef = ((-1) ** phase) * positive_phase
993
+ ivec, zvec = np.ones(2), np.array([1, -1])
994
+ expected = coef * functools.reduce(np.kron, [zvec if z else ivec for z in zbits[::-1]])
995
+ if not np.allclose(entries, expected):
996
+ return None
997
+
998
+ return np.hstack([xbits, zbits, phase])
999
+
1000
+ @staticmethod
1001
+ def _unitary_matrix_to_tableau(matrix):
1002
+ # pylint: disable=invalid-name
1003
+ num_qubits = int(math.log2(len(matrix)))
1004
+
1005
+ stab = np.empty((num_qubits, 2 * num_qubits + 1), dtype=bool)
1006
+ for i in range(num_qubits):
1007
+ label = "I" * (num_qubits - i - 1) + "X" + "I" * i
1008
+ Xi = Operator.from_label(label).to_matrix()
1009
+ target = matrix @ Xi @ np.conj(matrix).T
1010
+ row = Clifford._pauli_matrix_to_row(target, num_qubits)
1011
+ if row is None:
1012
+ return None
1013
+ stab[i] = row
1014
+
1015
+ destab = np.empty((num_qubits, 2 * num_qubits + 1), dtype=bool)
1016
+ for i in range(num_qubits):
1017
+ label = "I" * (num_qubits - i - 1) + "Z" + "I" * i
1018
+ Zi = Operator.from_label(label).to_matrix()
1019
+ target = matrix @ Zi @ np.conj(matrix).T
1020
+ row = Clifford._pauli_matrix_to_row(target, num_qubits)
1021
+ if row is None:
1022
+ return None
1023
+ destab[i] = row
1024
+
1025
+ tableau = np.vstack([stab, destab])
1026
+ return tableau
1027
+
1028
+
1029
+ # Update docstrings for API docs
1030
+ generate_apidocs(Clifford)