qiskit 2.0.3__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 (690) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +141 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1343 -0
  6. qiskit/circuit/_add_control.py +312 -0
  7. qiskit/circuit/_classical_resource_map.py +150 -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/barrier.py +46 -0
  12. qiskit/circuit/classical/__init__.py +41 -0
  13. qiskit/circuit/classical/expr/__init__.py +266 -0
  14. qiskit/circuit/classical/expr/constructors.py +764 -0
  15. qiskit/circuit/classical/expr/expr.py +498 -0
  16. qiskit/circuit/classical/expr/visitors.py +375 -0
  17. qiskit/circuit/classical/types/__init__.py +113 -0
  18. qiskit/circuit/classical/types/ordering.py +229 -0
  19. qiskit/circuit/classical/types/types.py +153 -0
  20. qiskit/circuit/commutation_checker.py +133 -0
  21. qiskit/circuit/commutation_library.py +20 -0
  22. qiskit/circuit/controlflow/__init__.py +59 -0
  23. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  24. qiskit/circuit/controlflow/box.py +163 -0
  25. qiskit/circuit/controlflow/break_loop.py +56 -0
  26. qiskit/circuit/controlflow/builder.py +791 -0
  27. qiskit/circuit/controlflow/continue_loop.py +56 -0
  28. qiskit/circuit/controlflow/control_flow.py +94 -0
  29. qiskit/circuit/controlflow/for_loop.py +218 -0
  30. qiskit/circuit/controlflow/if_else.py +498 -0
  31. qiskit/circuit/controlflow/switch_case.py +411 -0
  32. qiskit/circuit/controlflow/while_loop.py +166 -0
  33. qiskit/circuit/controlledgate.py +274 -0
  34. qiskit/circuit/delay.py +157 -0
  35. qiskit/circuit/duration.py +80 -0
  36. qiskit/circuit/equivalence.py +94 -0
  37. qiskit/circuit/equivalence_library.py +18 -0
  38. qiskit/circuit/exceptions.py +19 -0
  39. qiskit/circuit/gate.py +261 -0
  40. qiskit/circuit/instruction.py +564 -0
  41. qiskit/circuit/instructionset.py +132 -0
  42. qiskit/circuit/library/__init__.py +984 -0
  43. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  44. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  45. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  46. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  47. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  48. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  49. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  50. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  51. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  52. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  53. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  54. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  55. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  56. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  57. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  58. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
  59. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
  60. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
  61. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  62. qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
  63. qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
  64. qiskit/circuit/library/basis_change/__init__.py +15 -0
  65. qiskit/circuit/library/basis_change/qft.py +316 -0
  66. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  67. qiskit/circuit/library/blueprintcircuit.py +316 -0
  68. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  69. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  70. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  71. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  72. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  73. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  74. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  75. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  76. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  77. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  78. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  79. qiskit/circuit/library/fourier_checking.py +160 -0
  80. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  81. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  82. qiskit/circuit/library/generalized_gates/gms.py +175 -0
  83. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  84. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  85. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  86. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  87. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  88. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  89. qiskit/circuit/library/generalized_gates/permutation.py +198 -0
  90. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  91. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  92. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  93. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  94. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  96. qiskit/circuit/library/generalized_gates/unitary.py +217 -0
  97. qiskit/circuit/library/graph_state.py +172 -0
  98. qiskit/circuit/library/grover_operator.py +583 -0
  99. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  100. qiskit/circuit/library/hidden_linear_function.py +163 -0
  101. qiskit/circuit/library/iqp.py +180 -0
  102. qiskit/circuit/library/n_local/__init__.py +45 -0
  103. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  104. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  105. qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
  106. qiskit/circuit/library/n_local/n_local.py +1477 -0
  107. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  108. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  109. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  110. qiskit/circuit/library/n_local/two_local.py +289 -0
  111. qiskit/circuit/library/overlap.py +183 -0
  112. qiskit/circuit/library/pauli_evolution.py +201 -0
  113. qiskit/circuit/library/phase_estimation.py +177 -0
  114. qiskit/circuit/library/phase_oracle.py +239 -0
  115. qiskit/circuit/library/quantum_volume.py +180 -0
  116. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  117. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  118. qiskit/circuit/library/standard_gates/ecr.py +129 -0
  119. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  120. qiskit/circuit/library/standard_gates/global_phase.py +84 -0
  121. qiskit/circuit/library/standard_gates/h.py +253 -0
  122. qiskit/circuit/library/standard_gates/i.py +76 -0
  123. qiskit/circuit/library/standard_gates/iswap.py +133 -0
  124. qiskit/circuit/library/standard_gates/p.py +422 -0
  125. qiskit/circuit/library/standard_gates/r.py +114 -0
  126. qiskit/circuit/library/standard_gates/rx.py +293 -0
  127. qiskit/circuit/library/standard_gates/rxx.py +180 -0
  128. qiskit/circuit/library/standard_gates/ry.py +286 -0
  129. qiskit/circuit/library/standard_gates/ryy.py +180 -0
  130. qiskit/circuit/library/standard_gates/rz.py +307 -0
  131. qiskit/circuit/library/standard_gates/rzx.py +226 -0
  132. qiskit/circuit/library/standard_gates/rzz.py +193 -0
  133. qiskit/circuit/library/standard_gates/s.py +419 -0
  134. qiskit/circuit/library/standard_gates/swap.py +281 -0
  135. qiskit/circuit/library/standard_gates/sx.py +310 -0
  136. qiskit/circuit/library/standard_gates/t.py +178 -0
  137. qiskit/circuit/library/standard_gates/u.py +395 -0
  138. qiskit/circuit/library/standard_gates/u1.py +490 -0
  139. qiskit/circuit/library/standard_gates/u2.py +145 -0
  140. qiskit/circuit/library/standard_gates/u3.py +428 -0
  141. qiskit/circuit/library/standard_gates/x.py +1481 -0
  142. qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
  143. qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
  144. qiskit/circuit/library/standard_gates/y.py +257 -0
  145. qiskit/circuit/library/standard_gates/z.py +338 -0
  146. qiskit/circuit/library/templates/__init__.py +92 -0
  147. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  148. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  153. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  157. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  158. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  163. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  166. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  167. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  170. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  175. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  179. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  214. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  215. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  216. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  217. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  218. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  221. qiskit/circuit/measure.py +53 -0
  222. qiskit/circuit/operation.py +68 -0
  223. qiskit/circuit/parameter.py +179 -0
  224. qiskit/circuit/parameterexpression.py +703 -0
  225. qiskit/circuit/parametertable.py +119 -0
  226. qiskit/circuit/parametervector.py +140 -0
  227. qiskit/circuit/quantumcircuit.py +7540 -0
  228. qiskit/circuit/quantumcircuitdata.py +136 -0
  229. qiskit/circuit/random/__init__.py +15 -0
  230. qiskit/circuit/random/utils.py +366 -0
  231. qiskit/circuit/reset.py +37 -0
  232. qiskit/circuit/singleton.py +600 -0
  233. qiskit/circuit/store.py +89 -0
  234. qiskit/circuit/tools/__init__.py +16 -0
  235. qiskit/circuit/tools/pi_check.py +193 -0
  236. qiskit/circuit/twirling.py +145 -0
  237. qiskit/compiler/__init__.py +27 -0
  238. qiskit/compiler/transpiler.py +375 -0
  239. qiskit/converters/__init__.py +74 -0
  240. qiskit/converters/circuit_to_dag.py +80 -0
  241. qiskit/converters/circuit_to_dagdependency.py +49 -0
  242. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  243. qiskit/converters/circuit_to_gate.py +107 -0
  244. qiskit/converters/circuit_to_instruction.py +142 -0
  245. qiskit/converters/dag_to_circuit.py +79 -0
  246. qiskit/converters/dag_to_dagdependency.py +54 -0
  247. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  248. qiskit/converters/dagdependency_to_circuit.py +40 -0
  249. qiskit/converters/dagdependency_to_dag.py +48 -0
  250. qiskit/dagcircuit/__init__.py +55 -0
  251. qiskit/dagcircuit/collect_blocks.py +407 -0
  252. qiskit/dagcircuit/dagcircuit.py +24 -0
  253. qiskit/dagcircuit/dagdependency.py +612 -0
  254. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  255. qiskit/dagcircuit/dagdepnode.py +160 -0
  256. qiskit/dagcircuit/dagnode.py +188 -0
  257. qiskit/dagcircuit/exceptions.py +42 -0
  258. qiskit/exceptions.py +153 -0
  259. qiskit/passmanager/__init__.py +258 -0
  260. qiskit/passmanager/base_tasks.py +230 -0
  261. qiskit/passmanager/compilation_status.py +74 -0
  262. qiskit/passmanager/exceptions.py +19 -0
  263. qiskit/passmanager/flow_controllers.py +116 -0
  264. qiskit/passmanager/passmanager.py +353 -0
  265. qiskit/primitives/__init__.py +490 -0
  266. qiskit/primitives/backend_estimator_v2.py +530 -0
  267. qiskit/primitives/backend_sampler_v2.py +339 -0
  268. qiskit/primitives/base/__init__.py +20 -0
  269. qiskit/primitives/base/base_estimator.py +247 -0
  270. qiskit/primitives/base/base_primitive_job.py +78 -0
  271. qiskit/primitives/base/base_primitive_v1.py +45 -0
  272. qiskit/primitives/base/base_result_v1.py +65 -0
  273. qiskit/primitives/base/base_sampler.py +196 -0
  274. qiskit/primitives/base/estimator_result_v1.py +46 -0
  275. qiskit/primitives/base/sampler_result_v1.py +45 -0
  276. qiskit/primitives/base/validation_v1.py +250 -0
  277. qiskit/primitives/containers/__init__.py +26 -0
  278. qiskit/primitives/containers/bindings_array.py +391 -0
  279. qiskit/primitives/containers/bit_array.py +764 -0
  280. qiskit/primitives/containers/data_bin.py +175 -0
  281. qiskit/primitives/containers/estimator_pub.py +222 -0
  282. qiskit/primitives/containers/object_array.py +94 -0
  283. qiskit/primitives/containers/observables_array.py +296 -0
  284. qiskit/primitives/containers/primitive_result.py +53 -0
  285. qiskit/primitives/containers/pub_result.py +51 -0
  286. qiskit/primitives/containers/sampler_pub.py +193 -0
  287. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  288. qiskit/primitives/containers/shape.py +129 -0
  289. qiskit/primitives/primitive_job.py +81 -0
  290. qiskit/primitives/statevector_estimator.py +175 -0
  291. qiskit/primitives/statevector_sampler.py +290 -0
  292. qiskit/primitives/utils.py +72 -0
  293. qiskit/providers/__init__.py +677 -0
  294. qiskit/providers/backend.py +364 -0
  295. qiskit/providers/basic_provider/__init__.py +47 -0
  296. qiskit/providers/basic_provider/basic_provider.py +121 -0
  297. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  298. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  299. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  300. qiskit/providers/basic_provider/exceptions.py +30 -0
  301. qiskit/providers/exceptions.py +33 -0
  302. qiskit/providers/fake_provider/__init__.py +69 -0
  303. qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
  304. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  305. qiskit/providers/job.py +147 -0
  306. qiskit/providers/jobstatus.py +30 -0
  307. qiskit/providers/options.py +273 -0
  308. qiskit/providers/providerutils.py +110 -0
  309. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  310. qiskit/qasm/libs/qelib1.inc +266 -0
  311. qiskit/qasm/libs/stdgates.inc +82 -0
  312. qiskit/qasm2/__init__.py +669 -0
  313. qiskit/qasm2/exceptions.py +27 -0
  314. qiskit/qasm2/export.py +364 -0
  315. qiskit/qasm2/parse.py +438 -0
  316. qiskit/qasm3/__init__.py +372 -0
  317. qiskit/qasm3/ast.py +782 -0
  318. qiskit/qasm3/exceptions.py +27 -0
  319. qiskit/qasm3/experimental.py +70 -0
  320. qiskit/qasm3/exporter.py +1340 -0
  321. qiskit/qasm3/printer.py +608 -0
  322. qiskit/qpy/__init__.py +1965 -0
  323. qiskit/qpy/binary_io/__init__.py +35 -0
  324. qiskit/qpy/binary_io/circuits.py +1455 -0
  325. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  326. qiskit/qpy/binary_io/schedules.py +308 -0
  327. qiskit/qpy/binary_io/value.py +1165 -0
  328. qiskit/qpy/common.py +353 -0
  329. qiskit/qpy/exceptions.py +53 -0
  330. qiskit/qpy/formats.py +442 -0
  331. qiskit/qpy/interface.py +344 -0
  332. qiskit/qpy/type_keys.py +409 -0
  333. qiskit/quantum_info/__init__.py +162 -0
  334. qiskit/quantum_info/analysis/__init__.py +17 -0
  335. qiskit/quantum_info/analysis/average.py +47 -0
  336. qiskit/quantum_info/analysis/distance.py +104 -0
  337. qiskit/quantum_info/analysis/make_observable.py +44 -0
  338. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  339. qiskit/quantum_info/operators/__init__.py +28 -0
  340. qiskit/quantum_info/operators/base_operator.py +145 -0
  341. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  342. qiskit/quantum_info/operators/channel/chi.py +191 -0
  343. qiskit/quantum_info/operators/channel/choi.py +218 -0
  344. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  345. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  346. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  347. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  348. qiskit/quantum_info/operators/channel/superop.py +373 -0
  349. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  350. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  351. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  352. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  354. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  355. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  356. qiskit/quantum_info/operators/linear_op.py +25 -0
  357. qiskit/quantum_info/operators/measures.py +418 -0
  358. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  359. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  360. qiskit/quantum_info/operators/mixins/group.py +171 -0
  361. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  362. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  363. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  364. qiskit/quantum_info/operators/op_shape.py +525 -0
  365. qiskit/quantum_info/operators/operator.py +869 -0
  366. qiskit/quantum_info/operators/operator_utils.py +76 -0
  367. qiskit/quantum_info/operators/predicates.py +183 -0
  368. qiskit/quantum_info/operators/random.py +154 -0
  369. qiskit/quantum_info/operators/scalar_op.py +254 -0
  370. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  371. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  372. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  373. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  374. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  375. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  377. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  378. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  379. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  380. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  381. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  383. qiskit/quantum_info/quaternion.py +156 -0
  384. qiskit/quantum_info/random.py +26 -0
  385. qiskit/quantum_info/states/__init__.py +28 -0
  386. qiskit/quantum_info/states/densitymatrix.py +857 -0
  387. qiskit/quantum_info/states/measures.py +288 -0
  388. qiskit/quantum_info/states/quantum_state.py +503 -0
  389. qiskit/quantum_info/states/random.py +157 -0
  390. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  391. qiskit/quantum_info/states/statevector.py +977 -0
  392. qiskit/quantum_info/states/utils.py +247 -0
  393. qiskit/result/__init__.py +61 -0
  394. qiskit/result/counts.py +189 -0
  395. qiskit/result/distributions/__init__.py +17 -0
  396. qiskit/result/distributions/probability.py +100 -0
  397. qiskit/result/distributions/quasi.py +154 -0
  398. qiskit/result/exceptions.py +40 -0
  399. qiskit/result/models.py +241 -0
  400. qiskit/result/postprocess.py +239 -0
  401. qiskit/result/result.py +385 -0
  402. qiskit/result/sampled_expval.py +74 -0
  403. qiskit/result/utils.py +294 -0
  404. qiskit/synthesis/__init__.py +240 -0
  405. qiskit/synthesis/arithmetic/__init__.py +18 -0
  406. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  407. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  408. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  409. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  410. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  411. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  412. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  413. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  414. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  415. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  416. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  417. qiskit/synthesis/boolean/__init__.py +13 -0
  418. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  419. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  420. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  421. qiskit/synthesis/clifford/__init__.py +19 -0
  422. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  423. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  424. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  425. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  426. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  427. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  428. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  429. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  431. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  432. qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
  433. qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -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 +120 -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 +313 -0
  442. qiskit/synthesis/evolution/qdrift.py +130 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +224 -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 +25 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -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 +79 -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 +288 -0
  495. qiskit/transpiler/__init__.py +1345 -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 +281 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +276 -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 +177 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -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 +506 -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 +256 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +235 -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 +250 -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_cliffords.py +89 -0
  556. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  557. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  558. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  559. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  560. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  561. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  562. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  563. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  564. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  565. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  566. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  567. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
  569. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  570. qiskit/transpiler/passes/routing/__init__.py +21 -0
  571. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  572. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  573. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  574. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  575. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  576. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  581. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  582. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  583. qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
  584. qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
  585. qiskit/transpiler/passes/routing/utils.py +35 -0
  586. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  587. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  588. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  589. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  590. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  591. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  592. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  593. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  594. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  595. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  599. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  600. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  601. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  602. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  603. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  604. qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
  605. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  606. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  607. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
  608. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  609. qiskit/transpiler/passes/utils/__init__.py +32 -0
  610. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  611. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  612. qiskit/transpiler/passes/utils/check_map.py +78 -0
  613. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  614. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  615. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  616. qiskit/transpiler/passes/utils/error.py +69 -0
  617. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  618. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  619. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  620. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  621. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  622. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  623. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  624. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  625. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  626. qiskit/transpiler/passmanager.py +503 -0
  627. qiskit/transpiler/passmanager_config.py +151 -0
  628. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  629. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
  630. qiskit/transpiler/preset_passmanagers/common.py +672 -0
  631. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
  632. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  633. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  634. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  635. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  636. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  637. qiskit/transpiler/target.py +905 -0
  638. qiskit/transpiler/timing_constraints.py +59 -0
  639. qiskit/user_config.py +266 -0
  640. qiskit/utils/__init__.py +90 -0
  641. qiskit/utils/classtools.py +146 -0
  642. qiskit/utils/deprecation.py +382 -0
  643. qiskit/utils/lazy_tester.py +363 -0
  644. qiskit/utils/optionals.py +354 -0
  645. qiskit/utils/parallel.py +318 -0
  646. qiskit/utils/units.py +146 -0
  647. qiskit/version.py +84 -0
  648. qiskit/visualization/__init__.py +290 -0
  649. qiskit/visualization/array.py +207 -0
  650. qiskit/visualization/bloch.py +778 -0
  651. qiskit/visualization/circuit/__init__.py +15 -0
  652. qiskit/visualization/circuit/_utils.py +675 -0
  653. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  654. qiskit/visualization/circuit/latex.py +661 -0
  655. qiskit/visualization/circuit/matplotlib.py +2019 -0
  656. qiskit/visualization/circuit/qcstyle.py +278 -0
  657. qiskit/visualization/circuit/styles/__init__.py +13 -0
  658. qiskit/visualization/circuit/styles/bw.json +202 -0
  659. qiskit/visualization/circuit/styles/clifford.json +202 -0
  660. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  661. qiskit/visualization/circuit/styles/iqp.json +214 -0
  662. qiskit/visualization/circuit/styles/textbook.json +202 -0
  663. qiskit/visualization/circuit/text.py +1849 -0
  664. qiskit/visualization/circuit_visualization.py +19 -0
  665. qiskit/visualization/counts_visualization.py +487 -0
  666. qiskit/visualization/dag_visualization.py +318 -0
  667. qiskit/visualization/exceptions.py +21 -0
  668. qiskit/visualization/gate_map.py +1424 -0
  669. qiskit/visualization/library.py +40 -0
  670. qiskit/visualization/pass_manager_visualization.py +312 -0
  671. qiskit/visualization/state_visualization.py +1546 -0
  672. qiskit/visualization/timeline/__init__.py +21 -0
  673. qiskit/visualization/timeline/core.py +495 -0
  674. qiskit/visualization/timeline/drawings.py +260 -0
  675. qiskit/visualization/timeline/generators.py +506 -0
  676. qiskit/visualization/timeline/interface.py +444 -0
  677. qiskit/visualization/timeline/layouts.py +115 -0
  678. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  679. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  680. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  681. qiskit/visualization/timeline/stylesheet.py +301 -0
  682. qiskit/visualization/timeline/types.py +148 -0
  683. qiskit/visualization/transition_visualization.py +369 -0
  684. qiskit/visualization/utils.py +49 -0
  685. qiskit-2.0.3.dist-info/METADATA +220 -0
  686. qiskit-2.0.3.dist-info/RECORD +690 -0
  687. qiskit-2.0.3.dist-info/WHEEL +6 -0
  688. qiskit-2.0.3.dist-info/entry_points.txt +82 -0
  689. qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
  690. qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,246 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
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
+ """The Random Pauli circuit class."""
14
+
15
+ from __future__ import annotations
16
+ import numpy as np
17
+
18
+ from qiskit.circuit import QuantumCircuit
19
+ from qiskit.circuit.library.standard_gates import RXGate, RYGate, RZGate, CZGate
20
+ from qiskit.utils.deprecation import deprecate_func
21
+ from qiskit._accelerate.circuit_library import Block, py_n_local
22
+ from .two_local import TwoLocal
23
+
24
+
25
+ def pauli_two_design(
26
+ num_qubits: int,
27
+ reps: int = 3,
28
+ seed: int | None = None,
29
+ insert_barriers: bool = False,
30
+ parameter_prefix: str = "θ",
31
+ name: str = "PauliTwoDesign",
32
+ ) -> QuantumCircuit:
33
+ r"""Construct a Pauli 2-design ansatz.
34
+
35
+ This class implements a particular form of a 2-design circuit [1], which is frequently studied
36
+ in quantum machine learning literature, such as, e.g., the investigation of Barren plateaus in
37
+ variational algorithms [2].
38
+
39
+ The circuit consists of alternating rotation and entanglement layers with
40
+ an initial layer of :math:`\sqrt{H} = RY(\pi/4)` gates.
41
+ The rotation layers contain single qubit Pauli rotations, where the axis is chosen uniformly
42
+ at random to be X, Y or Z. The entanglement layers is compromised of pairwise CZ gates
43
+ with a total depth of 2.
44
+
45
+ For instance, the circuit could look like this:
46
+
47
+ .. parsed-literal::
48
+
49
+ ┌─────────┐┌──────────┐ ░ ┌──────────┐ ░ ┌──────────┐
50
+ q_0: ┤ RY(π/4) ├┤ RZ(θ[0]) ├─■─────░─┤ RY(θ[4]) ├─■─────░──┤ RZ(θ[8]) ├
51
+ ├─────────┤├──────────┤ │ ░ ├──────────┤ │ ░ ├──────────┤
52
+ q_1: ┤ RY(π/4) ├┤ RZ(θ[1]) ├─■──■──░─┤ RY(θ[5]) ├─■──■──░──┤ RX(θ[9]) ├
53
+ ├─────────┤├──────────┤ │ ░ ├──────────┤ │ ░ ┌┴──────────┤
54
+ q_2: ┤ RY(π/4) ├┤ RX(θ[2]) ├─■──■──░─┤ RY(θ[6]) ├─■──■──░─┤ RX(θ[10]) ├
55
+ ├─────────┤├──────────┤ │ ░ ├──────────┤ │ ░ ├───────────┤
56
+ q_3: ┤ RY(π/4) ├┤ RZ(θ[3]) ├─■─────░─┤ RX(θ[7]) ├─■─────░─┤ RY(θ[11]) ├
57
+ └─────────┘└──────────┘ ░ └──────────┘ ░ └───────────┘
58
+
59
+ Examples:
60
+
61
+ .. plot::
62
+ :alt: Circuit diagram output by the previous code.
63
+ :include-source:
64
+
65
+ from qiskit.circuit.library import pauli_two_design
66
+ circuit = pauli_two_design(4, reps=2, seed=5, insert_barriers=True)
67
+ circuit.draw("mpl")
68
+
69
+ Args:
70
+ num_qubits: The number of qubits of the Pauli Two-Design circuit.
71
+ reps: Specifies how often a block consisting of a rotation layer and entanglement
72
+ layer is repeated.
73
+ seed: The seed for randomly choosing the axes of the Pauli rotations.
74
+ parameter_prefix: The prefix used for the rotation parameters.
75
+ insert_barriers: If ``True``, barriers are inserted in between each layer. If ``False``,
76
+ no barriers are inserted. Defaults to ``False``.
77
+ name: The circuit name.
78
+
79
+ Returns:
80
+ A Pauli 2-design circuit.
81
+
82
+ References:
83
+
84
+ [1]: Nakata et al., Unitary 2-designs from random X- and Z-diagonal unitaries.
85
+ `arXiv:1502.07514 <https://arxiv.org/pdf/1502.07514.pdf>`_
86
+
87
+ [2]: McClean et al., Barren plateaus in quantum neural network training landscapes.
88
+ `arXiv:1803.11173 <https://arxiv.org/pdf/1803.11173.pdf>`_
89
+ """
90
+ rng = np.random.default_rng(seed)
91
+ random_block = Block.from_callable(1, 1, lambda params: _random_pauli_builder(params, rng))
92
+ entanglement_block = [Block.from_standard_gate(CZGate._standard_gate)] if num_qubits > 1 else []
93
+
94
+ data = py_n_local(
95
+ num_qubits=num_qubits,
96
+ reps=reps,
97
+ rotation_blocks=[random_block],
98
+ entanglement_blocks=entanglement_block,
99
+ entanglement=["pairwise"],
100
+ insert_barriers=insert_barriers,
101
+ skip_final_rotation_layer=False,
102
+ skip_unentangled_qubits=False,
103
+ parameter_prefix=parameter_prefix,
104
+ )
105
+
106
+ two_design = QuantumCircuit._from_circuit_data(data)
107
+
108
+ circuit = QuantumCircuit(num_qubits, name=name)
109
+ circuit.ry(np.pi / 4, circuit.qubits)
110
+ circuit.compose(two_design, inplace=True, copy=False)
111
+
112
+ return circuit
113
+
114
+
115
+ def _random_pauli_builder(params, rng):
116
+ gate_cls = rng.choice([RXGate, RYGate, RZGate])
117
+ gate = gate_cls(params[0])
118
+ return gate, gate.params
119
+
120
+
121
+ class PauliTwoDesign(TwoLocal):
122
+ r"""The Pauli Two-Design ansatz.
123
+
124
+ This class implements a particular form of a 2-design circuit [1], which is frequently studied
125
+ in quantum machine learning literature, such as e.g. the investigating of Barren plateaus in
126
+ variational algorithms [2].
127
+
128
+ The circuit consists of alternating rotation and entanglement layers with
129
+ an initial layer of :math:`\sqrt{H} = RY(\pi/4)` gates.
130
+ The rotation layers contain single qubit Pauli rotations, where the axis is chosen uniformly
131
+ at random to be X, Y or Z. The entanglement layers is compromised of pairwise CZ gates
132
+ with a total depth of 2.
133
+
134
+ For instance, the circuit could look like this (but note that choosing a different seed
135
+ yields different Pauli rotations).
136
+
137
+ .. code-block:: text
138
+
139
+ ┌─────────┐┌──────────┐ ░ ┌──────────┐ ░ ┌──────────┐
140
+ q_0: ┤ RY(π/4) ├┤ RZ(θ[0]) ├─■─────░─┤ RY(θ[4]) ├─■─────░──┤ RZ(θ[8]) ├
141
+ ├─────────┤├──────────┤ │ ░ ├──────────┤ │ ░ ├──────────┤
142
+ q_1: ┤ RY(π/4) ├┤ RZ(θ[1]) ├─■──■──░─┤ RY(θ[5]) ├─■──■──░──┤ RX(θ[9]) ├
143
+ ├─────────┤├──────────┤ │ ░ ├──────────┤ │ ░ ┌┴──────────┤
144
+ q_2: ┤ RY(π/4) ├┤ RX(θ[2]) ├─■──■──░─┤ RY(θ[6]) ├─■──■──░─┤ RX(θ[10]) ├
145
+ ├─────────┤├──────────┤ │ ░ ├──────────┤ │ ░ ├───────────┤
146
+ q_3: ┤ RY(π/4) ├┤ RZ(θ[3]) ├─■─────░─┤ RX(θ[7]) ├─■─────░─┤ RY(θ[11]) ├
147
+ └─────────┘└──────────┘ ░ └──────────┘ ░ └───────────┘
148
+
149
+ Examples:
150
+
151
+ .. plot::
152
+ :alt: Circuit diagram output by the previous code.
153
+ :include-source:
154
+
155
+ from qiskit.circuit.library import PauliTwoDesign
156
+ circuit = PauliTwoDesign(4, reps=2, seed=5, insert_barriers=True)
157
+ circuit.draw('mpl')
158
+
159
+ .. seealso::
160
+
161
+ The :func:`.pauli_two_design` function constructs the functionally same circuit, but faster.
162
+
163
+ References:
164
+
165
+ [1]: Nakata et al., Unitary 2-designs from random X- and Z-diagonal unitaries.
166
+ `arXiv:1502.07514 <https://arxiv.org/pdf/1502.07514.pdf>`_
167
+
168
+ [2]: McClean et al., Barren plateaus in quantum neural network training landscapes.
169
+ `arXiv:1803.11173 <https://arxiv.org/pdf/1803.11173.pdf>`_
170
+ """
171
+
172
+ @deprecate_func(
173
+ since="1.3",
174
+ additional_msg="Use the function qiskit.circuit.library.pauli_two_design instead.",
175
+ pending=True,
176
+ )
177
+ def __init__(
178
+ self,
179
+ num_qubits: int | None = None,
180
+ reps: int = 3,
181
+ seed: int | None = None,
182
+ insert_barriers: bool = False,
183
+ name: str = "PauliTwoDesign",
184
+ ):
185
+ """
186
+ Args:
187
+ num_qubits: The number of qubits of the Pauli Two-Design circuit.
188
+ reps: Specifies how often a block consisting of a rotation layer and entanglement
189
+ layer is repeated.
190
+ seed: The seed for randomly choosing the axes of the Pauli rotations.
191
+ insert_barriers: If ``True``, barriers are inserted in between each layer. If ``False``,
192
+ no barriers are inserted. Defaults to ``False``.
193
+
194
+ """
195
+ # store a random number generator
196
+ self._seed = seed
197
+ self._rng = np.random.default_rng(seed)
198
+
199
+ # store a dict to keep track of the random gates
200
+ self._gates: dict[int, list[str]] = {}
201
+
202
+ super().__init__(
203
+ num_qubits,
204
+ reps=reps,
205
+ entanglement_blocks="cz",
206
+ entanglement="pairwise",
207
+ insert_barriers=insert_barriers,
208
+ name=name,
209
+ )
210
+
211
+ # set the initial layer
212
+ self._prepended_blocks = [RYGate(np.pi / 4)]
213
+ self._prepended_entanglement = ["linear"]
214
+
215
+ def _invalidate(self):
216
+ """Invalidate the circuit and reset the random number."""
217
+ self._rng = np.random.default_rng(self._seed) # reset number generator
218
+ super()._invalidate()
219
+
220
+ def _build_rotation_layer(self, circuit, param_iter, i):
221
+ """Build a rotation layer."""
222
+ layer = QuantumCircuit(*self.qregs)
223
+ qubits = range(self.num_qubits)
224
+
225
+ # if no gates for this layer were generated, generate them
226
+ if i not in self._gates:
227
+ self._gates[i] = list(self._rng.choice(["rx", "ry", "rz"], self.num_qubits))
228
+ # if not enough gates exist, add more
229
+ elif len(self._gates[i]) < self.num_qubits:
230
+ num_missing = self.num_qubits - len(self._gates[i])
231
+ self._gates[i] += list(self._rng.choice(["rx", "ry", "rz"], num_missing))
232
+
233
+ for j in qubits:
234
+ getattr(layer, self._gates[i][j])(next(param_iter), j)
235
+
236
+ # add the layer to the circuit
237
+ circuit.compose(layer, inplace=True)
238
+
239
+ @property
240
+ def num_parameters_settable(self) -> int:
241
+ """Return the number of settable parameters.
242
+
243
+ Returns:
244
+ The number of possibly distinct parameters.
245
+ """
246
+ return (self.reps + 1) * self.num_qubits
@@ -0,0 +1,367 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2018, 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
+ """A generalized QAOA quantum circuit with a support of custom initial states and mixers."""
14
+
15
+ # pylint: disable=cyclic-import
16
+ from __future__ import annotations
17
+
18
+ import numpy as np
19
+
20
+ from qiskit.circuit.parametervector import ParameterVector
21
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
22
+ from qiskit.circuit import QuantumRegister
23
+ from qiskit.quantum_info import SparsePauliOp
24
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
25
+
26
+ from .evolved_operator_ansatz import (
27
+ EvolvedOperatorAnsatz,
28
+ _is_pauli_identity,
29
+ evolved_operator_ansatz,
30
+ )
31
+
32
+
33
+ def qaoa_ansatz(
34
+ cost_operator: BaseOperator,
35
+ reps: int = 1,
36
+ initial_state: QuantumCircuit | None = None,
37
+ mixer_operator: BaseOperator | None = None,
38
+ insert_barriers: bool = False,
39
+ name: str = "QAOA",
40
+ flatten: bool = True,
41
+ ) -> QuantumCircuit:
42
+ r"""A generalized QAOA quantum circuit with a support of custom initial states and mixers.
43
+
44
+ Examples:
45
+
46
+ To define the QAOA ansatz we require a cost Hamiltonian, encoding the classical
47
+ optimization problem:
48
+
49
+ .. plot::
50
+ :alt: Circuit diagram output by the previous code.
51
+ :include-source:
52
+
53
+ from qiskit.quantum_info import SparsePauliOp
54
+ from qiskit.circuit.library import qaoa_ansatz
55
+
56
+ cost_operator = SparsePauliOp(["ZZII", "IIZZ", "ZIIZ"])
57
+ ansatz = qaoa_ansatz(cost_operator, reps=3, insert_barriers=True)
58
+ ansatz.draw("mpl")
59
+
60
+ Args:
61
+ cost_operator: The operator representing the cost of the optimization problem, denoted as
62
+ :math:`U(C, \gamma)` in [1].
63
+ reps: The integer determining the depth of the circuit, called :math:`p` in [1].
64
+ initial_state: An optional initial state to use, which defaults to a layer of
65
+ Hadamard gates preparing the :math:`|+\rangle^{\otimes n}` state.
66
+ If a custom mixer is chosen, this circuit should be set to prepare its ground state,
67
+ to appropriately fulfill the annealing conditions.
68
+ mixer_operator: An optional custom mixer, which defaults to global Pauli-:math:`X`
69
+ rotations. This is denoted as :math:`U(B, \beta)` in [1]. If this is set,
70
+ the ``initial_state`` might also require modification.
71
+ insert_barriers: Whether to insert barriers in-between the cost and mixer operators.
72
+ name: The name of the circuit.
73
+ flatten: If ``True``, a flat circuit is returned instead of nesting it inside multiple
74
+ layers of gate objects. Setting this to ``False`` is significantly less performant,
75
+ especially for parameter binding, but can be desirable for a cleaner visualization.
76
+
77
+ References:
78
+
79
+ [1]: Farhi et al., A Quantum Approximate Optimization Algorithm.
80
+ `arXiv:1411.4028 <https://arxiv.org/pdf/1411.4028>`_
81
+ """
82
+ num_qubits = cost_operator.num_qubits
83
+
84
+ if initial_state is None:
85
+ initial_state = QuantumCircuit(num_qubits)
86
+ initial_state.h(range(num_qubits))
87
+
88
+ if mixer_operator is None:
89
+ mixer_operator = SparsePauliOp.from_sparse_list(
90
+ [("X", [i], 1) for i in range(num_qubits)], num_qubits
91
+ )
92
+
93
+ parameter_prefix = ["γ", "β"]
94
+
95
+ return initial_state.compose(
96
+ evolved_operator_ansatz(
97
+ [cost_operator, mixer_operator],
98
+ reps=reps,
99
+ insert_barriers=insert_barriers,
100
+ parameter_prefix=parameter_prefix,
101
+ name=name,
102
+ flatten=flatten,
103
+ ),
104
+ copy=False,
105
+ )
106
+
107
+
108
+ class QAOAAnsatz(EvolvedOperatorAnsatz):
109
+ """A generalized QAOA quantum circuit with a support of custom initial states and mixers.
110
+
111
+ References:
112
+
113
+ [1]: Farhi et al., A Quantum Approximate Optimization Algorithm.
114
+ `arXiv:1411.4028 <https://arxiv.org/pdf/1411.4028>`_
115
+ """
116
+
117
+ def __init__(
118
+ self,
119
+ cost_operator=None,
120
+ reps: int = 1,
121
+ initial_state: QuantumCircuit | None = None,
122
+ mixer_operator=None,
123
+ name: str = "QAOA",
124
+ flatten: bool | None = None,
125
+ ):
126
+ r"""
127
+ Args:
128
+ cost_operator (BaseOperator or OperatorBase, optional): The operator
129
+ representing the cost of the optimization problem, denoted as :math:`U(C, \gamma)`
130
+ in the original paper. Must be set either in the constructor or via property setter.
131
+ reps (int): The integer parameter p, which determines the depth of the circuit,
132
+ as specified in the original paper, default is 1.
133
+ initial_state (QuantumCircuit, optional): An optional initial state to use.
134
+ If `None` is passed then a set of Hadamard gates is applied as an initial state
135
+ to all qubits.
136
+ mixer_operator (BaseOperator or OperatorBase or QuantumCircuit, optional): An optional
137
+ custom mixer to use instead of the global X-rotations, denoted as :math:`U(B, \beta)`
138
+ in the original paper. Can be an operator or an optionally parameterized quantum
139
+ circuit.
140
+ name (str): A name of the circuit, default 'qaoa'
141
+ flatten: Set this to ``True`` to output a flat circuit instead of nesting it inside multiple
142
+ layers of gate objects. By default currently the contents of
143
+ the output circuit will be wrapped in nested objects for
144
+ cleaner visualization. However, if you're using this circuit
145
+ for anything besides visualization its **strongly** recommended
146
+ to set this flag to ``True`` to avoid a large performance
147
+ overhead for parameter binding.
148
+ """
149
+ super().__init__(reps=reps, name=name, flatten=flatten)
150
+
151
+ self._cost_operator = None
152
+ self._reps = reps
153
+ self._initial_state: QuantumCircuit | None = initial_state
154
+ self._mixer = mixer_operator
155
+
156
+ # set this circuit as a not-built circuit
157
+ self._bounds: list[tuple[float | None, float | None]] | None = None
158
+
159
+ # store cost operator and set the registers if the operator is not None
160
+ self.cost_operator = cost_operator
161
+
162
+ def _check_configuration(self, raise_on_failure: bool = True) -> bool:
163
+ """Check if the current configuration is valid."""
164
+ valid = True
165
+
166
+ if not super()._check_configuration(raise_on_failure):
167
+ return False
168
+
169
+ if self.cost_operator is None:
170
+ valid = False
171
+ if raise_on_failure:
172
+ raise ValueError(
173
+ "The operator representing the cost of the optimization problem is not set"
174
+ )
175
+
176
+ if self.initial_state is not None and self.initial_state.num_qubits != self.num_qubits:
177
+ valid = False
178
+ if raise_on_failure:
179
+ raise ValueError(
180
+ f"The number of qubits of the initial state {self.initial_state.num_qubits}"
181
+ " does not match "
182
+ f"the number of qubits of the cost operator {self.num_qubits}"
183
+ )
184
+
185
+ if self.mixer_operator is not None and self.mixer_operator.num_qubits != self.num_qubits:
186
+ valid = False
187
+ if raise_on_failure:
188
+ raise ValueError(
189
+ f"The number of qubits of the mixer {self.mixer_operator.num_qubits}"
190
+ f" does not match "
191
+ f"the number of qubits of the cost operator {self.num_qubits}"
192
+ )
193
+
194
+ return valid
195
+
196
+ @property
197
+ def parameter_bounds(self) -> list[tuple[float | None, float | None]] | None:
198
+ """The parameter bounds for the unbound parameters in the circuit.
199
+
200
+ Returns:
201
+ A list of pairs indicating the bounds, as (lower, upper). None indicates an unbounded
202
+ parameter in the corresponding direction. If None is returned, problem is fully
203
+ unbounded.
204
+ """
205
+ if self._bounds is not None:
206
+ return self._bounds
207
+
208
+ # if the mixer is a circuit, we set no bounds
209
+ if isinstance(self.mixer_operator, QuantumCircuit):
210
+ return None
211
+
212
+ # default bounds: None for gamma (cost operator), [0, 2pi] for gamma (mixer operator)
213
+ beta_bounds = (0, 2 * np.pi)
214
+ gamma_bounds = (None, None)
215
+ bounds: list[tuple[float | None, float | None]] = []
216
+
217
+ if not _is_pauli_identity(self.mixer_operator):
218
+ bounds += self.reps * [beta_bounds]
219
+
220
+ if not _is_pauli_identity(self.cost_operator):
221
+ bounds += self.reps * [gamma_bounds]
222
+
223
+ return bounds
224
+
225
+ @parameter_bounds.setter
226
+ def parameter_bounds(self, bounds: list[tuple[float | None, float | None]] | None) -> None:
227
+ """Set the parameter bounds.
228
+
229
+ Args:
230
+ bounds: The new parameter bounds.
231
+ """
232
+ self._bounds = bounds
233
+
234
+ @property
235
+ def operators(self) -> list:
236
+ """The operators that are evolved in this circuit.
237
+
238
+ Returns:
239
+ List[Union[BaseOperator, OperatorBase, QuantumCircuit]]: The operators to be evolved
240
+ (and circuits) in this ansatz.
241
+ """
242
+ return [self.cost_operator, self.mixer_operator]
243
+
244
+ @property
245
+ def cost_operator(self):
246
+ """Returns an operator representing the cost of the optimization problem.
247
+
248
+ Returns:
249
+ BaseOperator or OperatorBase: cost operator.
250
+ """
251
+ return self._cost_operator
252
+
253
+ @cost_operator.setter
254
+ def cost_operator(self, cost_operator) -> None:
255
+ """Sets cost operator.
256
+
257
+ Args:
258
+ cost_operator (BaseOperator or OperatorBase, optional): cost operator to set.
259
+ """
260
+ self._cost_operator = cost_operator
261
+ self.qregs = [QuantumRegister(self.num_qubits, name="q")]
262
+ self._invalidate()
263
+
264
+ @property
265
+ def reps(self) -> int:
266
+ """Returns the `reps` parameter, which determines the depth of the circuit."""
267
+ return self._reps
268
+
269
+ @reps.setter
270
+ def reps(self, reps: int) -> None:
271
+ """Sets the `reps` parameter."""
272
+ self._reps = reps
273
+ self._invalidate()
274
+
275
+ @property
276
+ def initial_state(self) -> QuantumCircuit | None:
277
+ """Returns an optional initial state as a circuit"""
278
+ if self._initial_state is not None:
279
+ return self._initial_state
280
+
281
+ # if no initial state is passed and we know the number of qubits, then initialize it.
282
+ if self.num_qubits > 0:
283
+ initial_state = QuantumCircuit(self.num_qubits)
284
+ initial_state.h(range(self.num_qubits))
285
+ return initial_state
286
+
287
+ # otherwise we cannot provide a default
288
+ return None
289
+
290
+ @initial_state.setter
291
+ def initial_state(self, initial_state: QuantumCircuit | None) -> None:
292
+ """Sets initial state."""
293
+ self._initial_state = initial_state
294
+ self._invalidate()
295
+
296
+ # we can't directly specify OperatorBase as a return type, it causes a circular import
297
+ # and pylint objects if return type is not documented
298
+ @property
299
+ def mixer_operator(self):
300
+ """Returns an optional mixer operator expressed as an operator or a quantum circuit.
301
+
302
+ Returns:
303
+ BaseOperator or OperatorBase or QuantumCircuit, optional: mixer operator or circuit.
304
+ """
305
+ if self._mixer is not None:
306
+ return self._mixer
307
+
308
+ # if no mixer is passed and we know the number of qubits, then initialize it.
309
+ if self.cost_operator is not None:
310
+ # local imports to avoid circular imports
311
+ num_qubits = self.cost_operator.num_qubits
312
+
313
+ # Mixer is just a sum of single qubit X's on each qubit. Evolving by this operator
314
+ # will simply produce rx's on each qubit.
315
+ mixer_terms = [
316
+ ("I" * left + "X" + "I" * (num_qubits - left - 1), 1) for left in range(num_qubits)
317
+ ]
318
+ mixer = SparsePauliOp.from_list(mixer_terms)
319
+ return mixer
320
+
321
+ # otherwise we cannot provide a default
322
+ return None
323
+
324
+ @mixer_operator.setter
325
+ def mixer_operator(self, mixer_operator) -> None:
326
+ """Sets mixer operator.
327
+
328
+ Args:
329
+ mixer_operator (BaseOperator or OperatorBase or QuantumCircuit, optional): mixer
330
+ operator or circuit to set.
331
+ """
332
+ self._mixer = mixer_operator
333
+ self._invalidate()
334
+
335
+ @property
336
+ def num_qubits(self) -> int:
337
+ if self._cost_operator is None:
338
+ return 0
339
+ return self._cost_operator.num_qubits
340
+
341
+ def _build(self):
342
+ """If not already built, build the circuit."""
343
+ if self._is_built:
344
+ return
345
+
346
+ super()._build()
347
+
348
+ # keep old parameter order: first cost operator, then mixer operators
349
+ num_cost = 0 if _is_pauli_identity(self.cost_operator) else 1
350
+ if isinstance(self.mixer_operator, QuantumCircuit):
351
+ num_mixer = self.mixer_operator.num_parameters
352
+ else:
353
+ num_mixer = 0 if _is_pauli_identity(self.mixer_operator) else 1
354
+
355
+ betas = ParameterVector("β", self.reps * num_mixer)
356
+ gammas = ParameterVector("γ", self.reps * num_cost)
357
+
358
+ # Create a permutation to take us from (cost_1, mixer_1, cost_2, mixer_2, ...)
359
+ # to (cost_1, cost_2, ..., mixer_1, mixer_2, ...), or if the mixer is a circuit
360
+ # with more than 1 parameters, from (cost_1, mixer_1a, mixer_1b, cost_2, ...)
361
+ # to (cost_1, cost_2, ..., mixer_1a, mixer_1b, mixer_2a, mixer_2b, ...)
362
+ reordered = []
363
+ for rep in range(self.reps):
364
+ reordered.extend(gammas[rep * num_cost : (rep + 1) * num_cost])
365
+ reordered.extend(betas[rep * num_mixer : (rep + 1) * num_mixer])
366
+
367
+ self.assign_parameters(dict(zip(self.ordered_parameters, reordered)), inplace=True)