qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.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 (699) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +159 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1335 -0
  6. qiskit/circuit/_add_control.py +338 -0
  7. qiskit/circuit/_classical_resource_map.py +154 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/annotation.py +404 -0
  12. qiskit/circuit/barrier.py +46 -0
  13. qiskit/circuit/classical/__init__.py +41 -0
  14. qiskit/circuit/classical/expr/__init__.py +266 -0
  15. qiskit/circuit/classical/expr/constructors.py +764 -0
  16. qiskit/circuit/classical/expr/expr.py +156 -0
  17. qiskit/circuit/classical/expr/visitors.py +381 -0
  18. qiskit/circuit/classical/types/__init__.py +113 -0
  19. qiskit/circuit/classical/types/ordering.py +229 -0
  20. qiskit/circuit/classical/types/types.py +30 -0
  21. qiskit/circuit/commutation_checker.py +133 -0
  22. qiskit/circuit/commutation_library.py +20 -0
  23. qiskit/circuit/controlflow/__init__.py +59 -0
  24. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  25. qiskit/circuit/controlflow/box.py +188 -0
  26. qiskit/circuit/controlflow/break_loop.py +56 -0
  27. qiskit/circuit/controlflow/builder.py +791 -0
  28. qiskit/circuit/controlflow/continue_loop.py +56 -0
  29. qiskit/circuit/controlflow/control_flow.py +94 -0
  30. qiskit/circuit/controlflow/for_loop.py +218 -0
  31. qiskit/circuit/controlflow/if_else.py +498 -0
  32. qiskit/circuit/controlflow/switch_case.py +411 -0
  33. qiskit/circuit/controlflow/while_loop.py +166 -0
  34. qiskit/circuit/controlledgate.py +274 -0
  35. qiskit/circuit/delay.py +159 -0
  36. qiskit/circuit/duration.py +80 -0
  37. qiskit/circuit/equivalence.py +94 -0
  38. qiskit/circuit/equivalence_library.py +18 -0
  39. qiskit/circuit/exceptions.py +19 -0
  40. qiskit/circuit/gate.py +261 -0
  41. qiskit/circuit/instruction.py +564 -0
  42. qiskit/circuit/instructionset.py +132 -0
  43. qiskit/circuit/library/__init__.py +984 -0
  44. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  45. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  46. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  47. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  48. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  49. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  50. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  51. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  52. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  53. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  54. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  55. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  56. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  57. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  58. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  59. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
  60. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
  61. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
  62. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  63. qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
  64. qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
  65. qiskit/circuit/library/basis_change/__init__.py +15 -0
  66. qiskit/circuit/library/basis_change/qft.py +316 -0
  67. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  68. qiskit/circuit/library/blueprintcircuit.py +322 -0
  69. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  70. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  71. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  72. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  73. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  74. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  75. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  76. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  77. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  78. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  79. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  80. qiskit/circuit/library/fourier_checking.py +160 -0
  81. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  82. qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
  83. qiskit/circuit/library/generalized_gates/gms.py +179 -0
  84. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  85. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  86. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  87. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  88. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  89. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  90. qiskit/circuit/library/generalized_gates/permutation.py +202 -0
  91. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  92. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  93. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  94. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  96. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  97. qiskit/circuit/library/generalized_gates/unitary.py +236 -0
  98. qiskit/circuit/library/graph_state.py +172 -0
  99. qiskit/circuit/library/grover_operator.py +583 -0
  100. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  101. qiskit/circuit/library/hidden_linear_function.py +163 -0
  102. qiskit/circuit/library/iqp.py +180 -0
  103. qiskit/circuit/library/n_local/__init__.py +45 -0
  104. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  105. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  106. qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
  107. qiskit/circuit/library/n_local/n_local.py +1478 -0
  108. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  109. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  110. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  111. qiskit/circuit/library/n_local/two_local.py +289 -0
  112. qiskit/circuit/library/overlap.py +183 -0
  113. qiskit/circuit/library/pauli_evolution.py +202 -0
  114. qiskit/circuit/library/phase_estimation.py +177 -0
  115. qiskit/circuit/library/phase_oracle.py +239 -0
  116. qiskit/circuit/library/quantum_volume.py +179 -0
  117. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  118. qiskit/circuit/library/standard_gates/dcx.py +76 -0
  119. qiskit/circuit/library/standard_gates/ecr.py +126 -0
  120. qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
  121. qiskit/circuit/library/standard_gates/global_phase.py +83 -0
  122. qiskit/circuit/library/standard_gates/h.py +230 -0
  123. qiskit/circuit/library/standard_gates/i.py +76 -0
  124. qiskit/circuit/library/standard_gates/iswap.py +115 -0
  125. qiskit/circuit/library/standard_gates/p.py +415 -0
  126. qiskit/circuit/library/standard_gates/r.py +108 -0
  127. qiskit/circuit/library/standard_gates/rx.py +269 -0
  128. qiskit/circuit/library/standard_gates/rxx.py +165 -0
  129. qiskit/circuit/library/standard_gates/ry.py +268 -0
  130. qiskit/circuit/library/standard_gates/ryy.py +165 -0
  131. qiskit/circuit/library/standard_gates/rz.py +290 -0
  132. qiskit/circuit/library/standard_gates/rzx.py +211 -0
  133. qiskit/circuit/library/standard_gates/rzz.py +181 -0
  134. qiskit/circuit/library/standard_gates/s.py +424 -0
  135. qiskit/circuit/library/standard_gates/swap.py +268 -0
  136. qiskit/circuit/library/standard_gates/sx.py +303 -0
  137. qiskit/circuit/library/standard_gates/t.py +169 -0
  138. qiskit/circuit/library/standard_gates/u.py +379 -0
  139. qiskit/circuit/library/standard_gates/u1.py +466 -0
  140. qiskit/circuit/library/standard_gates/u2.py +145 -0
  141. qiskit/circuit/library/standard_gates/u3.py +412 -0
  142. qiskit/circuit/library/standard_gates/x.py +1335 -0
  143. qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
  144. qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
  145. qiskit/circuit/library/standard_gates/y.py +253 -0
  146. qiskit/circuit/library/standard_gates/z.py +331 -0
  147. qiskit/circuit/library/templates/__init__.py +92 -0
  148. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  153. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  157. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  158. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  163. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  166. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  167. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  170. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  175. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  179. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  215. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  216. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  217. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  218. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  221. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  222. qiskit/circuit/measure.py +53 -0
  223. qiskit/circuit/operation.py +68 -0
  224. qiskit/circuit/parameter.py +188 -0
  225. qiskit/circuit/parameterexpression.py +737 -0
  226. qiskit/circuit/parametertable.py +119 -0
  227. qiskit/circuit/parametervector.py +140 -0
  228. qiskit/circuit/quantumcircuit.py +7610 -0
  229. qiskit/circuit/quantumcircuitdata.py +137 -0
  230. qiskit/circuit/random/__init__.py +50 -0
  231. qiskit/circuit/random/utils.py +755 -0
  232. qiskit/circuit/reset.py +37 -0
  233. qiskit/circuit/singleton.py +600 -0
  234. qiskit/circuit/store.py +89 -0
  235. qiskit/circuit/tools/__init__.py +16 -0
  236. qiskit/circuit/tools/pi_check.py +185 -0
  237. qiskit/circuit/twirling.py +145 -0
  238. qiskit/compiler/__init__.py +27 -0
  239. qiskit/compiler/transpiler.py +375 -0
  240. qiskit/converters/__init__.py +74 -0
  241. qiskit/converters/circuit_to_dag.py +80 -0
  242. qiskit/converters/circuit_to_dagdependency.py +49 -0
  243. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  244. qiskit/converters/circuit_to_gate.py +107 -0
  245. qiskit/converters/circuit_to_instruction.py +142 -0
  246. qiskit/converters/dag_to_circuit.py +79 -0
  247. qiskit/converters/dag_to_dagdependency.py +54 -0
  248. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  249. qiskit/converters/dagdependency_to_circuit.py +40 -0
  250. qiskit/converters/dagdependency_to_dag.py +48 -0
  251. qiskit/dagcircuit/__init__.py +44 -0
  252. qiskit/dagcircuit/collect_blocks.py +403 -0
  253. qiskit/dagcircuit/dagcircuit.py +24 -0
  254. qiskit/dagcircuit/dagdependency.py +612 -0
  255. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  256. qiskit/dagcircuit/dagdepnode.py +160 -0
  257. qiskit/dagcircuit/dagnode.py +193 -0
  258. qiskit/dagcircuit/exceptions.py +42 -0
  259. qiskit/exceptions.py +153 -0
  260. qiskit/passmanager/__init__.py +258 -0
  261. qiskit/passmanager/base_tasks.py +230 -0
  262. qiskit/passmanager/compilation_status.py +74 -0
  263. qiskit/passmanager/exceptions.py +19 -0
  264. qiskit/passmanager/flow_controllers.py +116 -0
  265. qiskit/passmanager/passmanager.py +353 -0
  266. qiskit/primitives/__init__.py +490 -0
  267. qiskit/primitives/backend_estimator_v2.py +530 -0
  268. qiskit/primitives/backend_sampler_v2.py +339 -0
  269. qiskit/primitives/base/__init__.py +20 -0
  270. qiskit/primitives/base/base_estimator.py +247 -0
  271. qiskit/primitives/base/base_primitive_job.py +78 -0
  272. qiskit/primitives/base/base_primitive_v1.py +45 -0
  273. qiskit/primitives/base/base_result_v1.py +65 -0
  274. qiskit/primitives/base/base_sampler.py +196 -0
  275. qiskit/primitives/base/estimator_result_v1.py +46 -0
  276. qiskit/primitives/base/sampler_result_v1.py +45 -0
  277. qiskit/primitives/base/validation_v1.py +250 -0
  278. qiskit/primitives/containers/__init__.py +26 -0
  279. qiskit/primitives/containers/bindings_array.py +391 -0
  280. qiskit/primitives/containers/bit_array.py +764 -0
  281. qiskit/primitives/containers/data_bin.py +172 -0
  282. qiskit/primitives/containers/estimator_pub.py +222 -0
  283. qiskit/primitives/containers/object_array.py +94 -0
  284. qiskit/primitives/containers/observables_array.py +380 -0
  285. qiskit/primitives/containers/primitive_result.py +53 -0
  286. qiskit/primitives/containers/pub_result.py +51 -0
  287. qiskit/primitives/containers/sampler_pub.py +193 -0
  288. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  289. qiskit/primitives/containers/shape.py +129 -0
  290. qiskit/primitives/primitive_job.py +100 -0
  291. qiskit/primitives/statevector_estimator.py +175 -0
  292. qiskit/primitives/statevector_sampler.py +290 -0
  293. qiskit/primitives/utils.py +72 -0
  294. qiskit/providers/__init__.py +677 -0
  295. qiskit/providers/backend.py +364 -0
  296. qiskit/providers/basic_provider/__init__.py +47 -0
  297. qiskit/providers/basic_provider/basic_provider.py +121 -0
  298. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  299. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  300. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  301. qiskit/providers/basic_provider/exceptions.py +30 -0
  302. qiskit/providers/exceptions.py +33 -0
  303. qiskit/providers/fake_provider/__init__.py +69 -0
  304. qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
  305. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  306. qiskit/providers/job.py +147 -0
  307. qiskit/providers/jobstatus.py +30 -0
  308. qiskit/providers/options.py +273 -0
  309. qiskit/providers/providerutils.py +110 -0
  310. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  311. qiskit/qasm/libs/qelib1.inc +266 -0
  312. qiskit/qasm/libs/stdgates.inc +82 -0
  313. qiskit/qasm2/__init__.py +669 -0
  314. qiskit/qasm2/exceptions.py +27 -0
  315. qiskit/qasm2/export.py +364 -0
  316. qiskit/qasm2/parse.py +438 -0
  317. qiskit/qasm3/__init__.py +466 -0
  318. qiskit/qasm3/ast.py +796 -0
  319. qiskit/qasm3/exceptions.py +27 -0
  320. qiskit/qasm3/experimental.py +70 -0
  321. qiskit/qasm3/exporter.py +1363 -0
  322. qiskit/qasm3/printer.py +620 -0
  323. qiskit/qpy/__init__.py +2141 -0
  324. qiskit/qpy/binary_io/__init__.py +35 -0
  325. qiskit/qpy/binary_io/circuits.py +1687 -0
  326. qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
  327. qiskit/qpy/binary_io/schedules.py +288 -0
  328. qiskit/qpy/binary_io/value.py +1183 -0
  329. qiskit/qpy/common.py +361 -0
  330. qiskit/qpy/exceptions.py +53 -0
  331. qiskit/qpy/formats.py +458 -0
  332. qiskit/qpy/interface.py +384 -0
  333. qiskit/qpy/type_keys.py +415 -0
  334. qiskit/quantum_info/__init__.py +172 -0
  335. qiskit/quantum_info/analysis/__init__.py +17 -0
  336. qiskit/quantum_info/analysis/average.py +47 -0
  337. qiskit/quantum_info/analysis/distance.py +104 -0
  338. qiskit/quantum_info/analysis/make_observable.py +44 -0
  339. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  340. qiskit/quantum_info/operators/__init__.py +29 -0
  341. qiskit/quantum_info/operators/base_operator.py +145 -0
  342. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  343. qiskit/quantum_info/operators/channel/chi.py +191 -0
  344. qiskit/quantum_info/operators/channel/choi.py +218 -0
  345. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  346. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  347. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  348. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  349. qiskit/quantum_info/operators/channel/superop.py +373 -0
  350. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  351. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  352. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  354. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  355. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  356. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  357. qiskit/quantum_info/operators/linear_op.py +25 -0
  358. qiskit/quantum_info/operators/measures.py +418 -0
  359. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  360. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  361. qiskit/quantum_info/operators/mixins/group.py +171 -0
  362. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  363. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  364. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  365. qiskit/quantum_info/operators/op_shape.py +525 -0
  366. qiskit/quantum_info/operators/operator.py +869 -0
  367. qiskit/quantum_info/operators/operator_utils.py +76 -0
  368. qiskit/quantum_info/operators/predicates.py +183 -0
  369. qiskit/quantum_info/operators/random.py +154 -0
  370. qiskit/quantum_info/operators/scalar_op.py +254 -0
  371. qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
  372. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  373. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  374. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
  375. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  377. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  378. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  379. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  380. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  381. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  383. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  384. qiskit/quantum_info/quaternion.py +156 -0
  385. qiskit/quantum_info/random.py +26 -0
  386. qiskit/quantum_info/states/__init__.py +28 -0
  387. qiskit/quantum_info/states/densitymatrix.py +857 -0
  388. qiskit/quantum_info/states/measures.py +288 -0
  389. qiskit/quantum_info/states/quantum_state.py +503 -0
  390. qiskit/quantum_info/states/random.py +157 -0
  391. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  392. qiskit/quantum_info/states/statevector.py +977 -0
  393. qiskit/quantum_info/states/utils.py +247 -0
  394. qiskit/result/__init__.py +61 -0
  395. qiskit/result/counts.py +189 -0
  396. qiskit/result/distributions/__init__.py +17 -0
  397. qiskit/result/distributions/probability.py +100 -0
  398. qiskit/result/distributions/quasi.py +154 -0
  399. qiskit/result/exceptions.py +40 -0
  400. qiskit/result/models.py +241 -0
  401. qiskit/result/postprocess.py +239 -0
  402. qiskit/result/result.py +385 -0
  403. qiskit/result/sampled_expval.py +76 -0
  404. qiskit/result/utils.py +294 -0
  405. qiskit/synthesis/__init__.py +250 -0
  406. qiskit/synthesis/arithmetic/__init__.py +18 -0
  407. qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
  408. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  409. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
  410. qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
  411. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  412. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  413. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  414. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  415. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  416. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  417. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  418. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  419. qiskit/synthesis/boolean/__init__.py +13 -0
  420. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  421. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  422. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  423. qiskit/synthesis/clifford/__init__.py +19 -0
  424. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  425. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  426. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  427. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  428. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  429. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  431. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  432. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  433. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +316 -0
  442. qiskit/synthesis/evolution/qdrift.py +133 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +29 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +359 -0
  495. qiskit/transpiler/__init__.py +1352 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +263 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +278 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +197 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
  556. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  557. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  558. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  559. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  560. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  561. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  562. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  563. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  564. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  565. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  566. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  567. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  569. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
  570. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  571. qiskit/transpiler/passes/routing/__init__.py +21 -0
  572. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  573. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  574. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  575. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  576. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  581. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  582. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  583. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  584. qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
  585. qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
  586. qiskit/transpiler/passes/routing/utils.py +35 -0
  587. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  588. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  589. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  590. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  591. qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
  592. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  593. qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
  594. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  595. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  599. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  600. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  601. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  602. qiskit/transpiler/passes/synthesis/__init__.py +21 -0
  603. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  604. qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
  605. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  606. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  607. qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
  608. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  609. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  610. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
  611. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  612. qiskit/transpiler/passes/utils/__init__.py +32 -0
  613. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  614. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  615. qiskit/transpiler/passes/utils/check_map.py +78 -0
  616. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  617. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  618. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  619. qiskit/transpiler/passes/utils/error.py +69 -0
  620. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  621. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  622. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  623. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  624. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  625. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  626. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  627. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  628. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  629. qiskit/transpiler/passmanager.py +503 -0
  630. qiskit/transpiler/passmanager_config.py +154 -0
  631. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  632. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
  633. qiskit/transpiler/preset_passmanagers/common.py +773 -0
  634. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
  635. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  636. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  637. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  638. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  639. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  640. qiskit/transpiler/target.py +905 -0
  641. qiskit/transpiler/timing_constraints.py +59 -0
  642. qiskit/user_config.py +266 -0
  643. qiskit/utils/__init__.py +90 -0
  644. qiskit/utils/classtools.py +146 -0
  645. qiskit/utils/deprecation.py +382 -0
  646. qiskit/utils/lazy_tester.py +363 -0
  647. qiskit/utils/optionals.py +355 -0
  648. qiskit/utils/parallel.py +318 -0
  649. qiskit/utils/units.py +146 -0
  650. qiskit/version.py +84 -0
  651. qiskit/visualization/__init__.py +290 -0
  652. qiskit/visualization/array.py +207 -0
  653. qiskit/visualization/bloch.py +778 -0
  654. qiskit/visualization/circuit/__init__.py +15 -0
  655. qiskit/visualization/circuit/_utils.py +677 -0
  656. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  657. qiskit/visualization/circuit/latex.py +668 -0
  658. qiskit/visualization/circuit/matplotlib.py +2041 -0
  659. qiskit/visualization/circuit/qcstyle.py +130 -0
  660. qiskit/visualization/circuit/styles/__init__.py +13 -0
  661. qiskit/visualization/circuit/styles/bw.json +202 -0
  662. qiskit/visualization/circuit/styles/clifford.json +202 -0
  663. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  664. qiskit/visualization/circuit/styles/iqp.json +214 -0
  665. qiskit/visualization/circuit/styles/textbook.json +202 -0
  666. qiskit/visualization/circuit/text.py +1849 -0
  667. qiskit/visualization/circuit_visualization.py +19 -0
  668. qiskit/visualization/counts_visualization.py +487 -0
  669. qiskit/visualization/dag/__init__.py +13 -0
  670. qiskit/visualization/dag/dagstyle.py +103 -0
  671. qiskit/visualization/dag/styles/__init__.py +13 -0
  672. qiskit/visualization/dag/styles/color.json +10 -0
  673. qiskit/visualization/dag/styles/plain.json +5 -0
  674. qiskit/visualization/dag_visualization.py +389 -0
  675. qiskit/visualization/exceptions.py +21 -0
  676. qiskit/visualization/gate_map.py +1424 -0
  677. qiskit/visualization/library.py +40 -0
  678. qiskit/visualization/pass_manager_visualization.py +312 -0
  679. qiskit/visualization/state_visualization.py +1546 -0
  680. qiskit/visualization/style.py +223 -0
  681. qiskit/visualization/timeline/__init__.py +21 -0
  682. qiskit/visualization/timeline/core.py +495 -0
  683. qiskit/visualization/timeline/drawings.py +260 -0
  684. qiskit/visualization/timeline/generators.py +506 -0
  685. qiskit/visualization/timeline/interface.py +444 -0
  686. qiskit/visualization/timeline/layouts.py +115 -0
  687. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  688. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  689. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  690. qiskit/visualization/timeline/stylesheet.py +301 -0
  691. qiskit/visualization/timeline/types.py +148 -0
  692. qiskit/visualization/transition_visualization.py +369 -0
  693. qiskit/visualization/utils.py +49 -0
  694. qiskit-2.1.0rc1.dist-info/METADATA +221 -0
  695. qiskit-2.1.0rc1.dist-info/RECORD +699 -0
  696. qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
  697. qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
  698. qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
  699. qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,668 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2021.
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
+ """latex visualization backend."""
14
+
15
+ import io
16
+ import itertools
17
+ import math
18
+ import re
19
+ from warnings import warn
20
+
21
+ import numpy as np
22
+ from qiskit.circuit import Clbit, Qubit, ClassicalRegister
23
+ from qiskit.circuit.classical import expr
24
+ from qiskit.circuit.controlledgate import ControlledGate
25
+ from qiskit.circuit.library.standard_gates import SwapGate, XGate, ZGate, RZZGate, U1Gate, PhaseGate
26
+ from qiskit.circuit.measure import Measure
27
+ from qiskit.circuit.tools.pi_check import pi_check
28
+
29
+
30
+ from qiskit.visualization.style import load_style
31
+ from qiskit.visualization.circuit.qcstyle import MPLDefaultStyle, MPLStyleDict
32
+ from ._utils import (
33
+ get_gate_ctrl_text,
34
+ get_param_str,
35
+ get_wire_map,
36
+ get_bit_register,
37
+ get_bit_reg_index,
38
+ get_wire_label,
39
+ generate_latex_label,
40
+ get_condition_label_val,
41
+ )
42
+
43
+
44
+ class QCircuitImage:
45
+ """This class contains methods to create \\LaTeX circuit images.
46
+
47
+ The class targets the \\LaTeX package Q-circuit
48
+ (https://arxiv.org/pdf/quant-ph/0406003).
49
+
50
+ Thanks to Eric Sabo for the initial implementation for Qiskit.
51
+ """
52
+
53
+ def __init__( # pylint: disable=bad-docstring-quotes
54
+ self,
55
+ qubits,
56
+ clbits,
57
+ nodes,
58
+ scale,
59
+ style=None,
60
+ reverse_bits=False,
61
+ plot_barriers=True,
62
+ initial_state=False,
63
+ cregbundle=None,
64
+ with_layout=False,
65
+ circuit=None,
66
+ ):
67
+ """QCircuitImage initializer.
68
+
69
+ Args:
70
+ qubits (list[Qubit]): list of qubits
71
+ clbits (list[Clbit]): list of clbits
72
+ nodes (list[list[DAGNode]]): list of circuit instructions, grouped by layer
73
+ scale (float): image scaling
74
+ style (dict or str): dictionary of style or file name of style file
75
+ reverse_bits (bool): when True, reverse the bit ordering of the registers
76
+ plot_barriers (bool): Enable/disable drawing barriers in the output
77
+ circuit. Defaults to True.
78
+ initial_state (bool): Optional. Adds |0> in the beginning of the line. Default: `False`.
79
+ cregbundle (bool): Optional. If set True bundle classical registers.
80
+ circuit (QuantumCircuit): the circuit that's being displayed
81
+ Raises:
82
+ ImportError: If pylatexenc is not installed
83
+ """
84
+
85
+ self._circuit = circuit
86
+ self._qubits = qubits
87
+ self._clbits = clbits
88
+
89
+ # list of lists corresponding to layers of the circuit
90
+ self._nodes = nodes
91
+
92
+ # image scaling
93
+ self._scale = 1.0 if scale is None else scale
94
+
95
+ # Map of cregs to sizes
96
+ self._cregs = {}
97
+
98
+ # Array to hold the \\LaTeX commands to generate a circuit image.
99
+ self._latex = []
100
+
101
+ # Variable to hold image depth (width)
102
+ self._img_depth = 0
103
+
104
+ # Variable to hold image width (height)
105
+ self._img_width = 0
106
+
107
+ # Variable to hold total circuit depth
108
+ self._sum_column_widths = 0
109
+
110
+ # Variable to hold total circuit width
111
+ self._sum_wire_heights = 0
112
+
113
+ # em points of separation between circuit columns
114
+ self._column_separation = 1
115
+
116
+ # em points of separation between circuit wire
117
+ self._wire_separation = 0
118
+
119
+ # presence of "box" or "target" determines wire spacing
120
+ self._has_box = False
121
+ self._has_target = False
122
+
123
+ self._plot_barriers = plot_barriers
124
+ self._reverse_bits = reverse_bits
125
+ if with_layout:
126
+ if self._circuit._layout:
127
+ self._layout = self._circuit._layout.initial_layout
128
+ else:
129
+ self._layout = None
130
+ else:
131
+ self._layout = None
132
+
133
+ self._initial_state = initial_state
134
+ self._global_phase = circuit.global_phase
135
+
136
+ # If there is any custom instruction that uses classical bits
137
+ # then cregbundle is forced to be False.
138
+ for node in itertools.chain.from_iterable(self._nodes):
139
+ if node.cargs and node.op.name != "measure":
140
+ if cregbundle:
141
+ warn(
142
+ "Cregbundle set to False since an instruction needs to refer"
143
+ " to individual classical wire",
144
+ RuntimeWarning,
145
+ 2,
146
+ )
147
+ self._cregbundle = False
148
+ break
149
+ else:
150
+ self._cregbundle = True if cregbundle is None else cregbundle
151
+
152
+ self._wire_map = get_wire_map(circuit, qubits + clbits, self._cregbundle)
153
+ self._img_width = len(self._wire_map)
154
+
155
+ self._style, _ = load_style(
156
+ style,
157
+ style_dict=MPLStyleDict,
158
+ default_style=MPLDefaultStyle(),
159
+ user_config_opt="circuit_mpl_style",
160
+ user_config_path_opt="circuit_mpl_style_path",
161
+ )
162
+
163
+ def latex(self):
164
+ """Return LaTeX string representation of circuit."""
165
+
166
+ self._initialize_latex_array()
167
+ self._build_latex_array()
168
+ header_1 = r"\documentclass[border=2px]{standalone}" + "\n"
169
+
170
+ header_2 = r"""
171
+ \usepackage[braket, qm]{qcircuit}
172
+ \usepackage{graphicx}
173
+
174
+ \begin{document}
175
+ """
176
+ header_scale = f"\\scalebox{{{self._scale}}}" + "{"
177
+
178
+ qcircuit_line = r"""
179
+ \Qcircuit @C=%.1fem @R=%.1fem @!R { \\
180
+ """
181
+ output = io.StringIO()
182
+ output.write(header_1)
183
+ output.write(header_2)
184
+ output.write(header_scale)
185
+ if self._global_phase:
186
+ output.write(
187
+ r"""{$\mathrm{%s} \mathrm{%s}$}"""
188
+ % ("global\\,phase:\\,", pi_check(self._global_phase, output="latex"))
189
+ )
190
+ output.write(qcircuit_line % (self._column_separation, self._wire_separation))
191
+ for i in range(self._img_width):
192
+ output.write("\t \t")
193
+ for j in range(self._img_depth + 1):
194
+ output.write(self._latex[i][j])
195
+ if j != self._img_depth:
196
+ output.write(" & ")
197
+ else:
198
+ output.write(r"\\" + "\n")
199
+ output.write(r"\\ " + "}}\n")
200
+ output.write("\\end{document}")
201
+ contents = output.getvalue()
202
+ output.close()
203
+ return contents
204
+
205
+ def _initialize_latex_array(self):
206
+ """Initialize qubit and clbit labels and set wire separation"""
207
+ self._img_depth, self._sum_column_widths = self._get_image_depth()
208
+ self._sum_wire_heights = self._img_width
209
+ # choose the most compact wire spacing, while not squashing them
210
+ if self._has_box:
211
+ self._wire_separation = 0.2
212
+ elif self._has_target:
213
+ self._wire_separation = 0.8
214
+ else:
215
+ self._wire_separation = 1.0
216
+ self._latex = [
217
+ ["\\qw" if isinstance(wire, Qubit) else "\\cw" for _ in range(self._img_depth + 1)]
218
+ for wire in self._wire_map
219
+ ]
220
+ self._latex.append([" "] * (self._img_depth + 1))
221
+
222
+ # display the bit/register labels
223
+ for wire, index in self._wire_map.items():
224
+ if isinstance(wire, ClassicalRegister):
225
+ register = wire
226
+ wire_label = get_wire_label(
227
+ "latex", register, index, layout=self._layout, cregbundle=self._cregbundle
228
+ )
229
+ else:
230
+ register, bit_index, reg_index = get_bit_reg_index(self._circuit, wire)
231
+ wire_label = get_wire_label(
232
+ "latex",
233
+ register,
234
+ bit_index if register is None else reg_index,
235
+ layout=self._layout,
236
+ cregbundle=self._cregbundle,
237
+ )
238
+
239
+ wire_label += " : "
240
+ if self._initial_state:
241
+ wire_label += "\\ket{{0}}" if isinstance(wire, Qubit) else "0"
242
+ wire_label += " }"
243
+
244
+ if not isinstance(wire, (Qubit)) and self._cregbundle and register is not None:
245
+ pos = self._wire_map[register]
246
+ self._latex[pos][1] = "\\lstick{/_{_{" + str(register.size) + "}}} \\cw"
247
+ wire_label = f"\\mathrm{{{wire_label}}}"
248
+ else:
249
+ pos = index
250
+ self._latex[pos][0] = "\\nghost{" + wire_label + " & " + "\\lstick{" + wire_label
251
+
252
+ def _get_image_depth(self):
253
+ """Get depth information for the circuit."""
254
+
255
+ # wires in the beginning and end
256
+ columns = 2
257
+ if self._cregbundle and (
258
+ self._nodes
259
+ and self._nodes[0]
260
+ and (
261
+ self._nodes[0][0].op.name == "measure"
262
+ or getattr(self._nodes[0][0].op, "condition", None)
263
+ )
264
+ ):
265
+ columns += 1
266
+
267
+ # Determine wire spacing before image depth
268
+ max_column_widths = []
269
+ for layer in self._nodes:
270
+ column_width = 1
271
+ current_max = 0
272
+ for node in layer:
273
+ op = node.op
274
+ # useful information for determining wire spacing
275
+ boxed_gates = [
276
+ "u1",
277
+ "u2",
278
+ "u3",
279
+ "u",
280
+ "p",
281
+ "x",
282
+ "y",
283
+ "z",
284
+ "h",
285
+ "s",
286
+ "sdg",
287
+ "t",
288
+ "tdg",
289
+ "sx",
290
+ "sxdg",
291
+ "rx",
292
+ "ry",
293
+ "rz",
294
+ "ch",
295
+ "cy",
296
+ "crz",
297
+ "cu2",
298
+ "cu3",
299
+ "cu",
300
+ "id",
301
+ ]
302
+ target_gates = ["cx", "ccx", "cu1", "cp", "rzz"]
303
+ if op.name in boxed_gates:
304
+ self._has_box = True
305
+ elif op.name in target_gates:
306
+ self._has_target = True
307
+ elif isinstance(op, ControlledGate):
308
+ self._has_box = True
309
+
310
+ arg_str_len = 0
311
+ # the wide gates
312
+ for arg in op.params:
313
+ if not any(isinstance(param, np.ndarray) for param in op.params):
314
+ arg_str = re.sub(r"[-+]?\d*\.\d{2,}|\d{2,}", self._truncate_float, str(arg))
315
+ arg_str_len += len(arg_str)
316
+
317
+ # the width of the column is the max of all the gates in the column
318
+ current_max = max(arg_str_len, current_max)
319
+
320
+ # all gates take up 1 column except from those with side labels (ie cu1, cp, rzz)
321
+ # which take 4 columns
322
+ base_type = None if not hasattr(op, "base_gate") else op.base_gate
323
+ if isinstance(op, RZZGate) or isinstance(base_type, (U1Gate, PhaseGate, RZZGate)):
324
+ column_width = 4
325
+ max_column_widths.append(current_max)
326
+ columns += column_width
327
+
328
+ # every 3 characters is roughly one extra 'unit' of width in the cell
329
+ # the gate name is 1 extra 'unit'
330
+ # the qubit/cbit labels plus initial states is 2 more
331
+ # the wires poking out at the ends is 2 more
332
+ sum_column_widths = sum(1 + v / 3 for v in max_column_widths)
333
+
334
+ max_wire_name = 3
335
+ for wire in self._wire_map:
336
+ if isinstance(wire, (Qubit, Clbit)):
337
+ register = get_bit_register(self._circuit, wire)
338
+ name = register.name if register is not None else ""
339
+ else:
340
+ name = wire.name
341
+ max_wire_name = max(max_wire_name, len(name))
342
+
343
+ sum_column_widths += 5 + max_wire_name / 3
344
+
345
+ # could be a fraction so ceil
346
+ return columns, math.ceil(sum_column_widths)
347
+
348
+ def _get_beamer_page(self):
349
+ """Get height, width & scale attributes for the beamer page."""
350
+
351
+ # PIL python package limits image size to around a quarter gigabyte
352
+ # this means the beamer image should be limited to < 50000
353
+ # if you want to avoid a "warning" too, set it to < 25000
354
+ pil_limit = 40000
355
+
356
+ # the beamer latex template limits each dimension to < 19 feet
357
+ # (i.e. 575cm)
358
+ beamer_limit = 550
359
+
360
+ # columns are roughly twice as big as wires
361
+ aspect_ratio = self._sum_wire_heights / self._sum_column_widths
362
+
363
+ # choose a page margin so circuit is not cropped
364
+ margin_factor = 1.5
365
+ height = min(self._sum_wire_heights * margin_factor, beamer_limit)
366
+ width = min(self._sum_column_widths * margin_factor, beamer_limit)
367
+
368
+ # if too large, make it fit
369
+ if height * width > pil_limit:
370
+ height = min(np.sqrt(pil_limit * aspect_ratio), beamer_limit)
371
+ width = min(np.sqrt(pil_limit / aspect_ratio), beamer_limit)
372
+
373
+ # if too small, give it a minimum size
374
+ height = max(height, 10)
375
+ width = max(width, 10)
376
+
377
+ return (height, width, self._scale)
378
+
379
+ def _build_latex_array(self):
380
+ """Returns an array of strings containing \\LaTeX for this circuit."""
381
+
382
+ column = 1
383
+ # Leave a column to display number of classical registers if needed
384
+ if self._cregbundle and (
385
+ self._nodes
386
+ and self._nodes[0]
387
+ and (
388
+ self._nodes[0][0].op.name == "measure"
389
+ or getattr(self._nodes[0][0].op, "condition", None)
390
+ )
391
+ ):
392
+ column += 1
393
+
394
+ for layer in self._nodes:
395
+ num_cols_layer = 1
396
+
397
+ for node in layer:
398
+ op = node.op
399
+ num_cols_op = 1
400
+ wire_list = [self._wire_map[qarg] for qarg in node.qargs if qarg in self._qubits]
401
+ if getattr(op, "condition", None):
402
+ if isinstance(op.condition, expr.Expr):
403
+ warn("ignoring expression condition, which is not supported yet")
404
+ else:
405
+ self._add_condition(op, wire_list, column)
406
+
407
+ if isinstance(op, Measure):
408
+ self._build_measure(node, column)
409
+
410
+ elif getattr(op, "_directive", False): # barrier, snapshot, etc.
411
+ self._build_barrier(node, column)
412
+
413
+ else:
414
+ gate_text, _, _ = get_gate_ctrl_text(op, "latex", style=self._style)
415
+ gate_text += get_param_str(op, "latex", ndigits=4)
416
+ gate_text = generate_latex_label(gate_text)
417
+ if node.cargs:
418
+ cwire_list = [
419
+ self._wire_map[carg] for carg in node.cargs if carg in self._clbits
420
+ ]
421
+ else:
422
+ cwire_list = []
423
+
424
+ if len(wire_list) == 1 and not node.cargs:
425
+ self._latex[wire_list[0]][column] = f"\\gate{{{gate_text}}}"
426
+
427
+ elif isinstance(op, ControlledGate):
428
+ num_cols_op = self._build_ctrl_gate(op, gate_text, wire_list, column)
429
+ else:
430
+ num_cols_op = self._build_multi_gate(
431
+ op, gate_text, wire_list, cwire_list, column
432
+ )
433
+
434
+ num_cols_layer = max(num_cols_layer, num_cols_op)
435
+
436
+ column += num_cols_layer
437
+
438
+ def _build_multi_gate(self, op, gate_text, wire_list, cwire_list, col):
439
+ """Add a multiple wire gate to the _latex list"""
440
+ cwire_start = len(self._qubits)
441
+ num_cols_op = 1
442
+ if isinstance(op, (SwapGate, RZZGate)):
443
+ num_cols_op = self._build_symmetric_gate(op, gate_text, wire_list, col)
444
+ else:
445
+ wire_min = min(wire_list)
446
+ wire_max = max(wire_list)
447
+ if cwire_list and not self._cregbundle:
448
+ wire_max = max(cwire_list)
449
+ wire_ind = wire_list.index(wire_min)
450
+ self._latex[wire_min][col] = (
451
+ f"\\multigate{{{wire_max - wire_min}}}{{{gate_text}}}_"
452
+ + "<" * (len(str(wire_ind)) + 2)
453
+ + f"{{{wire_ind}}}"
454
+ )
455
+ for wire in range(wire_min + 1, wire_max + 1):
456
+ if wire < cwire_start:
457
+ ghost_box = f"\\ghost{{{gate_text}}}"
458
+ if wire in wire_list:
459
+ wire_ind = wire_list.index(wire)
460
+ else:
461
+ ghost_box = f"\\cghost{{{gate_text}}}"
462
+ if wire in cwire_list:
463
+ wire_ind = cwire_list.index(wire)
464
+ if wire in wire_list + cwire_list:
465
+ self._latex[wire][col] = (
466
+ ghost_box + "_" + "<" * (len(str(wire_ind)) + 2) + f"{{{wire_ind}}}"
467
+ )
468
+ else:
469
+ self._latex[wire][col] = ghost_box
470
+ return num_cols_op
471
+
472
+ def _build_ctrl_gate(self, op, gate_text, wire_list, col):
473
+ """Add a gate with multiple controls to the _latex list"""
474
+ num_cols_op = 1
475
+ num_ctrl_qubits = op.num_ctrl_qubits
476
+ wireqargs = wire_list[num_ctrl_qubits:]
477
+ ctrlqargs = wire_list[:num_ctrl_qubits]
478
+ wire_min = min(wireqargs)
479
+ wire_max = max(wireqargs)
480
+ ctrl_state = f"{op.ctrl_state:b}".rjust(num_ctrl_qubits, "0")[::-1]
481
+
482
+ # First do single qubit target gates
483
+ if len(wireqargs) == 1:
484
+ self._add_controls(wire_list, ctrlqargs, ctrl_state, col)
485
+
486
+ # Check for cx, cz, cu1 and cp first, then do standard gate
487
+ if isinstance(op.base_gate, XGate):
488
+ self._latex[wireqargs[0]][col] = "\\targ"
489
+ elif isinstance(op.base_gate, ZGate):
490
+ self._latex[wireqargs[0]][col] = "\\control\\qw"
491
+ elif isinstance(op.base_gate, (U1Gate, PhaseGate)):
492
+ num_cols_op = self._build_symmetric_gate(op, gate_text, wire_list, col)
493
+ else:
494
+ self._latex[wireqargs[0]][col] = f"\\gate{{{gate_text}}}"
495
+ else:
496
+ # Treat special cases of swap and rzz gates
497
+ if isinstance(op.base_gate, (SwapGate, RZZGate)):
498
+ self._add_controls(wire_list, ctrlqargs, ctrl_state, col)
499
+ num_cols_op = self._build_symmetric_gate(op, gate_text, wire_list, col)
500
+ else:
501
+ # If any controls appear in the span of the multiqubit
502
+ # gate just treat the whole thing as a big gate
503
+ for ctrl in ctrlqargs:
504
+ if ctrl in range(wire_min, wire_max):
505
+ wireqargs = wire_list
506
+ break
507
+ else:
508
+ self._add_controls(wire_list, ctrlqargs, ctrl_state, col)
509
+
510
+ self._build_multi_gate(op, gate_text, wireqargs, [], col)
511
+ return num_cols_op
512
+
513
+ def _build_symmetric_gate(self, op, gate_text, wire_list, col):
514
+ """Add symmetric gates for cu1, cp, swap, and rzz"""
515
+ wire_max = max(wire_list)
516
+ # The last and next to last in the wire list are the gate wires without added controls
517
+ wire_next_last = wire_list[-2]
518
+ wire_last = wire_list[-1]
519
+ base_op = None if not hasattr(op, "base_gate") else op.base_gate
520
+
521
+ if isinstance(op, SwapGate) or (base_op and isinstance(base_op, SwapGate)):
522
+ self._latex[wire_next_last][col] = "\\qswap"
523
+ self._latex[wire_last][col] = "\\qswap \\qwx[" + str(wire_next_last - wire_last) + "]"
524
+ return 1 # num_cols
525
+
526
+ if isinstance(op, RZZGate) or (base_op and isinstance(base_op, RZZGate)):
527
+ ctrl_bit = "1"
528
+ else:
529
+ ctrl_bit = f"{op.ctrl_state:b}".rjust(1, "0")[::-1]
530
+
531
+ control = "\\ctrlo" if ctrl_bit == "0" else "\\ctrl"
532
+ self._latex[wire_next_last][col] = f"{control}" + (
533
+ "{" + str(wire_last - wire_next_last) + "}"
534
+ )
535
+ self._latex[wire_last][col] = "\\control \\qw"
536
+ # Put side text to the right between bottom wire in wire_list and the one above it
537
+ self._latex[wire_max - 1][col + 1] = f"\\dstick{{\\hspace{{2.0em}}{gate_text}}} \\qw"
538
+ return 4 # num_cols for side text gates
539
+
540
+ def _build_measure(self, node, col):
541
+ """Build a meter and the lines to the creg"""
542
+ wire1 = self._wire_map[node.qargs[0]]
543
+ self._latex[wire1][col] = "\\meter"
544
+
545
+ idx_str = ""
546
+ cond_offset = 1.5 if getattr(node.op, "condition", None) else 0.0
547
+ if self._cregbundle:
548
+ register = get_bit_register(self._circuit, node.cargs[0])
549
+ if register is not None:
550
+ wire2 = self._wire_map[register]
551
+ idx_str = str(self._circuit.find_bit(node.cargs[0]).registers[0][1])
552
+ else:
553
+ wire2 = self._wire_map[node.cargs[0]]
554
+ self._latex[wire2][col] = (
555
+ f"\\dstick{{_{{_{{\\hspace{{{cond_offset}em}}{idx_str}}}}}}} "
556
+ f"\\cw \\ar @{{<=}} [-{str(wire2 - wire1)},0]"
557
+ )
558
+ else:
559
+ wire2 = self._wire_map[node.cargs[0]]
560
+ self._latex[wire2][col] = "\\cw \\ar @{<=} [-" + str(wire2 - wire1) + ",0]"
561
+
562
+ def _build_barrier(self, node, col):
563
+ """Build a partial or full barrier if plot_barriers set"""
564
+ if self._plot_barriers:
565
+ indexes = [self._wire_map[qarg] for qarg in node.qargs if qarg in self._qubits]
566
+ indexes.sort()
567
+ first = last = indexes[0]
568
+ for index in indexes[1:]:
569
+ if index - 1 == last:
570
+ last = index
571
+ else:
572
+ pos = self._wire_map[self._qubits[first]]
573
+ self._latex[pos][col - 1] += " \\barrier[0em]{" + str(last - first) + "}"
574
+ self._latex[pos][col] = "\\qw"
575
+ first = last = index
576
+ pos = self._wire_map[self._qubits[first]]
577
+ self._latex[pos][col - 1] += " \\barrier[0em]{" + str(last - first) + "}"
578
+ if node.op.label is not None:
579
+ pos = indexes[0]
580
+ label = node.op.label.replace(" ", "\\,")
581
+ self._latex[pos][col] = f"\\cds{{0}}{{^{{\\mathrm{{{label}}}}}}}"
582
+
583
+ def _add_controls(self, wire_list, ctrlqargs, ctrl_state, col):
584
+ """Add one or more controls to a gate"""
585
+ for index, ctrl_item in enumerate(zip(ctrlqargs, ctrl_state)):
586
+ pos = ctrl_item[0]
587
+ nxt = wire_list[index]
588
+ if wire_list[index] > wire_list[-1]:
589
+ nxt -= 1
590
+ while nxt not in wire_list:
591
+ nxt -= 1
592
+ else:
593
+ nxt += 1
594
+ while nxt not in wire_list:
595
+ nxt += 1
596
+
597
+ # ctrl_item[1] is ctrl_state for this bit
598
+ control = "\\ctrlo" if ctrl_item[1] == "0" else "\\ctrl"
599
+ self._latex[pos][col] = f"{control}" + "{" + str(nxt - wire_list[index]) + "}"
600
+
601
+ def _add_condition(self, op, wire_list, col):
602
+ """Add a condition to the _latex list"""
603
+ # cwire - the wire number for the first wire for the condition register
604
+ # or if cregbundle, wire number of the condition register itself
605
+ # gap - the number of wires from cwire to the bottom gate qubit
606
+ label, val_bits = get_condition_label_val(op.condition, self._circuit, self._cregbundle)
607
+ cond_is_bit = isinstance(op.condition[0], Clbit)
608
+ cond_reg = op.condition[0]
609
+ if cond_is_bit:
610
+ register = get_bit_register(self._circuit, op.condition[0])
611
+ if register is not None:
612
+ cond_reg = register
613
+ meas_offset = -0.3 if isinstance(op, Measure) else 0.0
614
+
615
+ # If condition is a bit or cregbundle true, print the condition value
616
+ # at the bottom and put bullet on creg line
617
+ if cond_is_bit or self._cregbundle:
618
+ cwire = (
619
+ self._wire_map[cond_reg] if self._cregbundle else self._wire_map[op.condition[0]]
620
+ )
621
+ gap = cwire - max(wire_list)
622
+ control = "\\control" if op.condition[1] else "\\controlo"
623
+ self._latex[cwire][
624
+ col
625
+ ] = f"{control} \\cw^({meas_offset}){{^{{\\mathtt{{{label}}}}}}} \\cwx[-{str(gap)}]"
626
+
627
+ # If condition is a register and cregbundle is false
628
+ else:
629
+ # First sort the val_bits in the order of the register bits in the circuit
630
+ cond_wires = []
631
+ cond_bits = []
632
+ for wire, index in self._wire_map.items():
633
+ reg, _, reg_index = get_bit_reg_index(self._circuit, wire)
634
+ if reg == cond_reg:
635
+ cond_bits.append(reg_index)
636
+ cond_wires.append(index)
637
+
638
+ gap = cond_wires[0] - max(wire_list)
639
+ prev_wire = cond_wires[0]
640
+ val_bits_sorted = [bit for _, bit in sorted(zip(cond_bits, val_bits))]
641
+
642
+ # Iterate over the wire values for the bits in the register
643
+ for i, wire in enumerate(cond_wires[:-1]):
644
+ if i > 0:
645
+ gap = wire - prev_wire
646
+ control = "\\control" if val_bits_sorted[i] == "1" else "\\controlo"
647
+ self._latex[wire][col] = f"{control} \\cw \\cwx[-" + str(gap) + "]"
648
+ prev_wire = wire
649
+
650
+ # Add (hex condition value) below the last cwire
651
+ if len(cond_wires) == 1: # Only one bit in register
652
+ gap = cond_wires[0] - max(wire_list)
653
+ else:
654
+ gap = cond_wires[-1] - prev_wire
655
+ control = "\\control" if val_bits_sorted[len(cond_wires) - 1] == "1" else "\\controlo"
656
+ self._latex[cond_wires[-1]][col] = (
657
+ f"{control}" + " \\cw^(%s){^{\\mathtt{%s}}} \\cwx[-%s]"
658
+ ) % (
659
+ meas_offset,
660
+ label,
661
+ str(gap),
662
+ )
663
+
664
+ def _truncate_float(self, matchobj, ndigits=4):
665
+ """Truncate long floats."""
666
+ if matchobj.group(0):
667
+ return f"%.{ndigits}g" % float(matchobj.group(0))
668
+ return ""