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,216 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2019, 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
+ Circuit simulation for the CNOTDihedral class
14
+ """
15
+
16
+ from __future__ import annotations
17
+ import numpy as np
18
+
19
+ from qiskit.exceptions import QiskitError
20
+ from qiskit.circuit import QuantumCircuit
21
+ from qiskit.circuit.barrier import Barrier
22
+ from qiskit.circuit.delay import Delay
23
+
24
+
25
+ def _append_circuit(elem, circuit, qargs=None):
26
+ """Update a CNOTDihedral element inplace by applying a CNOTDihedral circuit.
27
+
28
+ Args:
29
+ elem (CNOTDihedral): the CNOTDihedral element to update.
30
+ circuit (QuantumCircuit or Instruction): the gate or composite gate to apply.
31
+ qargs (list or None): The qubits to apply gates to.
32
+ Returns:
33
+ CNOTDihedral: the updated CNOTDihedral.
34
+ Raises:
35
+ QiskitError: if input gates cannot be decomposed into CNOTDihedral gates.
36
+ """
37
+
38
+ if qargs is None:
39
+ qargs = list(range(elem.num_qubits))
40
+
41
+ if isinstance(circuit, (Barrier, Delay)):
42
+ return elem
43
+
44
+ if isinstance(circuit, QuantumCircuit):
45
+ gate = circuit.to_instruction()
46
+ else:
47
+ gate = circuit
48
+
49
+ # Handle cx, cz, ccz and id since they are basic gates, and cannot be decomposed,
50
+ if gate.name == "cx":
51
+ if len(qargs) != 2:
52
+ raise QiskitError("Invalid qubits for 2-qubit gate cx.")
53
+ elem._append_cx(qargs[0], qargs[1])
54
+ return elem
55
+
56
+ elif gate.name == "cz":
57
+ if len(qargs) != 2:
58
+ raise QiskitError("Invalid qubits for 2-qubit gate cz.")
59
+ elem._append_phase(7, qargs[1])
60
+ elem._append_phase(7, qargs[0])
61
+ elem._append_cx(qargs[1], qargs[0])
62
+ elem._append_phase(2, qargs[0])
63
+ elem._append_cx(qargs[1], qargs[0])
64
+ elem._append_phase(7, qargs[1])
65
+ elem._append_phase(7, qargs[0])
66
+ return elem
67
+
68
+ if gate.name == "ccz":
69
+ if len(qargs) != 3:
70
+ raise QiskitError("Invalid qubits for 2-qubit gate cx.")
71
+ elem._append_cx(qargs[1], qargs[2])
72
+ elem._append_phase(7, qargs[2])
73
+ elem._append_cx(qargs[0], qargs[2])
74
+ elem._append_phase(1, qargs[2])
75
+ elem._append_cx(qargs[1], qargs[2])
76
+ elem._append_phase(1, qargs[1])
77
+ elem._append_phase(7, qargs[2])
78
+ elem._append_cx(qargs[0], qargs[2])
79
+ elem._append_cx(qargs[0], qargs[1])
80
+ elem._append_phase(1, qargs[2])
81
+ elem._append_phase(1, qargs[0])
82
+ elem._append_phase(7, qargs[1])
83
+ elem._append_cx(qargs[0], qargs[1])
84
+ return elem
85
+
86
+ if gate.name == "id":
87
+ if len(qargs) != 1:
88
+ raise QiskitError("Invalid qubits for 1-qubit gate id.")
89
+ return elem
90
+
91
+ if gate.definition is None:
92
+ raise QiskitError(f"Cannot apply Instruction: {gate.name}")
93
+ if not isinstance(gate.definition, QuantumCircuit):
94
+ raise QiskitError(
95
+ f"{gate.name} instruction definition is {type(gate.definition)}; expected QuantumCircuit"
96
+ )
97
+
98
+ flat_instr = gate.definition
99
+ bit_indices = {
100
+ bit: index
101
+ for bits in [flat_instr.qubits, flat_instr.clbits]
102
+ for index, bit in enumerate(bits)
103
+ }
104
+
105
+ for instruction in gate.definition:
106
+ if isinstance(instruction.operation, (Barrier, Delay)):
107
+ continue
108
+ # Get the integer position of the flat register
109
+ new_qubits = [qargs[bit_indices[tup]] for tup in instruction.qubits]
110
+
111
+ if instruction.operation.name == "x" or gate.name == "x":
112
+ if len(new_qubits) != 1:
113
+ raise QiskitError("Invalid qubits for 1-qubit gate x.")
114
+ elem._append_x(new_qubits[0])
115
+
116
+ elif instruction.operation.name == "z" or gate.name == "z":
117
+ if len(new_qubits) != 1:
118
+ raise QiskitError("Invalid qubits for 1-qubit gate z.")
119
+ elem._append_phase(4, new_qubits[0])
120
+
121
+ elif instruction.operation.name == "y" or gate.name == "y":
122
+ if len(new_qubits) != 1:
123
+ raise QiskitError("Invalid qubits for 1-qubit gate y.")
124
+ elem._append_x(new_qubits[0])
125
+ elem._append_phase(4, new_qubits[0])
126
+
127
+ elif instruction.operation.name == "p" or gate.name == "p":
128
+ if len(new_qubits) != 1 or len(instruction.operation.params) != 1:
129
+ raise QiskitError("Invalid qubits or params for 1-qubit gate p.")
130
+ elem._append_phase(int(4 * instruction.operation.params[0] / np.pi), new_qubits[0])
131
+
132
+ elif instruction.operation.name == "t" or gate.name == "t":
133
+ if len(new_qubits) != 1:
134
+ raise QiskitError("Invalid qubits for 1-qubit gate t.")
135
+ elem._append_phase(1, new_qubits[0])
136
+
137
+ elif instruction.operation.name == "tdg" or gate.name == "tdg":
138
+ if len(new_qubits) != 1:
139
+ raise QiskitError("Invalid qubits for 1-qubit gate tdg.")
140
+ elem._append_phase(7, new_qubits[0])
141
+
142
+ elif instruction.operation.name == "s" or gate.name == "s":
143
+ if len(new_qubits) != 1:
144
+ raise QiskitError("Invalid qubits for 1-qubit gate s.")
145
+ elem._append_phase(2, new_qubits[0])
146
+
147
+ elif instruction.operation.name == "sdg" or gate.name == "sdg":
148
+ if len(new_qubits) != 1:
149
+ raise QiskitError("Invalid qubits for 1-qubit gate sdg.")
150
+ elem._append_phase(6, new_qubits[0])
151
+
152
+ elif instruction.operation.name == "cx":
153
+ if len(new_qubits) != 2:
154
+ raise QiskitError("Invalid qubits for 2-qubit gate cx.")
155
+ elem._append_cx(new_qubits[0], new_qubits[1])
156
+
157
+ elif instruction.operation.name == "cz":
158
+ if len(new_qubits) != 2:
159
+ raise QiskitError("Invalid qubits for 2-qubit gate cz.")
160
+ elem._append_phase(7, new_qubits[1])
161
+ elem._append_phase(7, new_qubits[0])
162
+ elem._append_cx(new_qubits[1], new_qubits[0])
163
+ elem._append_phase(2, new_qubits[0])
164
+ elem._append_cx(new_qubits[1], new_qubits[0])
165
+ elem._append_phase(7, new_qubits[1])
166
+ elem._append_phase(7, new_qubits[0])
167
+
168
+ elif instruction.operation.name == "cs" or gate.name == "cs":
169
+ if len(new_qubits) != 2:
170
+ raise QiskitError("Invalid qubits for 2-qubit gate cs.")
171
+ elem._append_phase(1, new_qubits[1])
172
+ elem._append_phase(1, new_qubits[0])
173
+ elem._append_cx(new_qubits[1], new_qubits[0])
174
+ elem._append_phase(7, new_qubits[0])
175
+ elem._append_cx(new_qubits[1], new_qubits[0])
176
+
177
+ elif instruction.operation.name == "csdg" or gate.name == "csdg":
178
+ if len(new_qubits) != 2:
179
+ raise QiskitError("Invalid qubits for 2-qubit gate csdg.")
180
+ elem._append_phase(7, new_qubits[1])
181
+ elem._append_phase(7, new_qubits[0])
182
+ elem._append_cx(new_qubits[1], new_qubits[0])
183
+ elem._append_phase(1, new_qubits[0])
184
+ elem._append_cx(new_qubits[1], new_qubits[0])
185
+
186
+ elif instruction.operation.name == "swap" or gate.name == "swap":
187
+ if len(new_qubits) != 2:
188
+ raise QiskitError("Invalid qubits for 2-qubit gate swap.")
189
+ elem._append_cx(new_qubits[0], new_qubits[1])
190
+ elem._append_cx(new_qubits[1], new_qubits[0])
191
+ elem._append_cx(new_qubits[0], new_qubits[1])
192
+
193
+ elif instruction.operation.name == "ccz":
194
+ if len(new_qubits) != 3:
195
+ raise QiskitError("Invalid qubits for 3-qubit gate ccz.")
196
+ elem._append_cx(new_qubits[1], new_qubits[2])
197
+ elem._append_phase(7, new_qubits[2])
198
+ elem._append_cx(new_qubits[0], new_qubits[2])
199
+ elem._append_phase(1, new_qubits[2])
200
+ elem._append_cx(new_qubits[1], new_qubits[2])
201
+ elem._append_phase(1, new_qubits[1])
202
+ elem._append_phase(7, new_qubits[2])
203
+ elem._append_cx(new_qubits[0], new_qubits[2])
204
+ elem._append_cx(new_qubits[0], new_qubits[1])
205
+ elem._append_phase(1, new_qubits[2])
206
+ elem._append_phase(1, new_qubits[0])
207
+ elem._append_phase(7, new_qubits[1])
208
+ elem._append_cx(new_qubits[0], new_qubits[1])
209
+
210
+ elif instruction.operation.name == "id":
211
+ pass
212
+
213
+ else:
214
+ raise QiskitError(f"Not a CNOT-Dihedral gate: {instruction.operation.name}")
215
+
216
+ return elem
@@ -0,0 +1,313 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2019, 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
+ SpecialPolynomial class.
14
+ """
15
+
16
+ from __future__ import annotations
17
+ import itertools
18
+ from itertools import combinations
19
+ import copy
20
+ from functools import reduce
21
+ from operator import mul
22
+ import numpy as np
23
+
24
+ from qiskit.exceptions import QiskitError
25
+
26
+
27
+ class SpecialPolynomial:
28
+ """Multivariate polynomial with special form.
29
+
30
+ Maximum degree 3, n Z_2 variables, coefficients in Z_8.
31
+ """
32
+
33
+ def __init__(self, n_vars):
34
+ """Construct the zero polynomial on n_vars variables."""
35
+ # 1 constant term
36
+ # n linear terms x_1, ..., x_n
37
+ # {n choose 2} quadratic terms x_1x_2, x_1x_3, ..., x_{n-1}x_n
38
+ # {n choose 3} cubic terms x_1x_2x_3, ..., x_{n-2}x_{n-1}x_n
39
+ # and coefficients in Z_8
40
+ if n_vars < 1:
41
+ raise QiskitError("n_vars for SpecialPolynomial is too small.")
42
+ self.n_vars = n_vars
43
+ self.nc2 = int(n_vars * (n_vars - 1) / 2)
44
+ self.nc3 = int(n_vars * (n_vars - 1) * (n_vars - 2) / 6)
45
+ self.weight_0 = 0
46
+ self.weight_1 = np.zeros(n_vars, dtype=np.int8)
47
+ self.weight_2 = np.zeros(self.nc2, dtype=np.int8)
48
+ self.weight_3 = np.zeros(self.nc3, dtype=np.int8)
49
+
50
+ def mul_monomial(self, indices):
51
+ """Multiply by a monomial given by indices.
52
+
53
+ Returns the product.
54
+ """
55
+ length = len(indices)
56
+ if length >= 4:
57
+ raise QiskitError("There is no term with on more than 3 indices.")
58
+ indices_arr = np.array(indices)
59
+ if (indices_arr < 0).any() and (indices_arr > self.n_vars).any():
60
+ raise QiskitError("Indices are out of bounds.")
61
+ if length > 1 and (np.diff(indices_arr) <= 0).any():
62
+ raise QiskitError("Indices are non-increasing!")
63
+ result = SpecialPolynomial(self.n_vars)
64
+ if length == 0:
65
+ result = copy.deepcopy(self)
66
+ else:
67
+ terms0 = [[]]
68
+ terms1 = list(combinations(range(self.n_vars), r=1))
69
+ terms2 = list(combinations(range(self.n_vars), r=2))
70
+ terms3 = list(combinations(range(self.n_vars), r=3))
71
+ for term in terms0 + terms1 + terms2 + terms3:
72
+ value = self.get_term(term)
73
+ new_term = list(set(term).union(set(indices)))
74
+ result.set_term(new_term, (result.get_term(new_term) + value) % 8)
75
+ return result
76
+
77
+ def __mul__(self, other):
78
+ """Multiply two polynomials."""
79
+ if not isinstance(other, SpecialPolynomial):
80
+ other = int(other)
81
+ result = SpecialPolynomial(self.n_vars)
82
+ if isinstance(other, int):
83
+ result.weight_0 = (self.weight_0 * other) % 8
84
+ result.weight_1 = (self.weight_1 * other) % 8
85
+ result.weight_2 = (self.weight_2 * other) % 8
86
+ result.weight_3 = (self.weight_3 * other) % 8
87
+ else:
88
+ if self.n_vars != other.n_vars:
89
+ raise QiskitError("Multiplication on different n_vars.")
90
+ terms0 = [[]]
91
+ terms1 = list(combinations(range(self.n_vars), r=1))
92
+ terms2 = list(combinations(range(self.n_vars), r=2))
93
+ terms3 = list(combinations(range(self.n_vars), r=3))
94
+ for term in terms0 + terms1 + terms2 + terms3:
95
+ value = other.get_term(term)
96
+ if value != 0:
97
+ temp = copy.deepcopy(self)
98
+ temp = temp.mul_monomial(term)
99
+ temp = temp * value
100
+ result = result + temp
101
+ return result
102
+
103
+ def __rmul__(self, other):
104
+ """Right multiplication.
105
+
106
+ This operation is commutative.
107
+ """
108
+ return self.__mul__(other)
109
+
110
+ def __add__(self, other):
111
+ """Add two polynomials."""
112
+ if not isinstance(other, SpecialPolynomial):
113
+ raise QiskitError("Element to add is not a SpecialPolynomial.")
114
+ if self.n_vars != other.n_vars:
115
+ raise QiskitError("Addition on different n_vars.")
116
+ result = SpecialPolynomial(self.n_vars)
117
+ result.weight_0 = (self.weight_0 + other.weight_0) % 8
118
+ result.weight_1 = (self.weight_1 + other.weight_1) % 8
119
+ result.weight_2 = (self.weight_2 + other.weight_2) % 8
120
+ result.weight_3 = (self.weight_3 + other.weight_3) % 8
121
+ return result
122
+
123
+ def evaluate(self, xval):
124
+ """Evaluate the multinomial at xval.
125
+
126
+ if xval is a length n z2 vector, return element of Z8.
127
+ if xval is a length n vector of multinomials, return
128
+ a multinomial. The multinomials must all be on n vars.
129
+ """
130
+ if len(xval) != self.n_vars:
131
+ raise QiskitError("Evaluate on wrong number of variables.")
132
+ check_int = [isinstance(x, int) for x in xval]
133
+ check_poly = [isinstance(x, SpecialPolynomial) for x in xval]
134
+ if False in check_int and False in check_poly:
135
+ raise QiskitError("Evaluate on a wrong type.")
136
+ is_int = False not in check_int
137
+ if not is_int:
138
+ if False in [i.n_vars == self.n_vars for i in xval]:
139
+ raise QiskitError("Evaluate on incompatible polynomials.")
140
+ else:
141
+ xval = xval % 2
142
+ # Examine each term of this polynomial
143
+ terms0 = [[]]
144
+ terms1 = list(combinations(range(self.n_vars), r=1))
145
+ terms2 = list(combinations(range(self.n_vars), r=2))
146
+ terms3 = list(combinations(range(self.n_vars), r=3))
147
+ # Set the initial result and start for each term
148
+ if is_int:
149
+ result = 0
150
+ start = 1
151
+ else:
152
+ result = SpecialPolynomial(self.n_vars)
153
+ start = SpecialPolynomial(self.n_vars)
154
+ start.weight_0 = 1
155
+ # Compute the new terms and accumulate
156
+ for term in terms0 + terms1 + terms2 + terms3:
157
+ value = self.get_term(term)
158
+ if value != 0:
159
+ newterm = reduce(mul, [xval[j] for j in term], start)
160
+ result = result + value * newterm
161
+ if isinstance(result, int):
162
+ result = result % 8
163
+ return result
164
+
165
+ def set_pj(self, indices):
166
+ """Set to special form polynomial on subset of variables.
167
+
168
+ p_J(x) := sum_{a subseteq J,|a| neq 0} (-2)^{|a|-1}x^a
169
+ """
170
+ indices_arr = np.array(indices)
171
+ if (indices_arr < 0).any() or (indices_arr >= self.n_vars).any():
172
+ raise QiskitError("Indices are out of bounds.")
173
+ indices = sorted(indices)
174
+ subsets_2 = itertools.combinations(indices, 2)
175
+ subsets_3 = itertools.combinations(indices, 3)
176
+ self.weight_0 = 0
177
+ self.weight_1 = np.zeros(self.n_vars)
178
+ self.weight_2 = np.zeros(self.nc2)
179
+ self.weight_3 = np.zeros(self.nc3)
180
+ for j in indices:
181
+ self.set_term([j], 1)
182
+ for j in subsets_2:
183
+ self.set_term(list(j), 6)
184
+ for j in subsets_3:
185
+ self.set_term(list(j), 4)
186
+
187
+ def get_term(self, indices):
188
+ """Get the value of a term given the list of variables.
189
+
190
+ Example: indices = [] returns the constant
191
+ indices = [0] returns the coefficient of x_0
192
+ indices = [0,3] returns the coefficient of x_0x_3
193
+ indices = [0,1,3] returns the coefficient of x_0x_1x_3
194
+
195
+ If len(indices) > 3 the method fails.
196
+ If the indices are out of bounds the method fails.
197
+ If the indices are not increasing the method fails.
198
+ """
199
+ length = len(indices)
200
+ if length >= 4:
201
+ return 0
202
+ indices_arr = np.array(indices)
203
+ if (indices_arr < 0).any() or (indices_arr >= self.n_vars).any():
204
+ raise QiskitError("Indices are out of bounds.")
205
+ if length > 1 and (np.diff(indices_arr) <= 0).any():
206
+ raise QiskitError("Indices are non-increasing.")
207
+
208
+ if length == 0:
209
+ return self.weight_0
210
+ if length == 1:
211
+ return self.weight_1[indices[0]]
212
+ if length == 2:
213
+ # sum(self.n_vars-j, {j, 1, indices[0]})
214
+ offset_1 = int(indices[0] * self.n_vars - ((indices[0] + 1) * indices[0]) / 2)
215
+ offset_2 = int(indices[1] - indices[0] - 1)
216
+ return self.weight_2[offset_1 + offset_2]
217
+
218
+ # handle length = 3
219
+ tmp_1 = self.n_vars - indices[0]
220
+ offset_1 = int((tmp_1 - 3) * (tmp_1 - 2) * (tmp_1 - 1) / 6)
221
+ tmp_2 = self.n_vars - indices[1]
222
+ offset_2 = int((tmp_2 - 2) * (tmp_2 - 1) / 2)
223
+ offset_3 = self.n_vars - indices[2]
224
+ offset = int(
225
+ self.n_vars * (self.n_vars - 1) * (self.n_vars - 2) / 6 - offset_1 - offset_2 - offset_3
226
+ )
227
+
228
+ return self.weight_3[offset]
229
+
230
+ def set_term(self, indices, value):
231
+ """Set the value of a term given the list of variables.
232
+
233
+ Example: indices = [] returns the constant
234
+ indices = [0] returns the coefficient of x_0
235
+ indices = [0,3] returns the coefficient of x_0x_3
236
+ indices = [0,1,3] returns the coefficient of x_0x_1x_3
237
+
238
+ If len(indices) > 3 the method fails.
239
+ If the indices are out of bounds the method fails.
240
+ If the indices are not increasing the method fails.
241
+ The value is reduced modulo 8.
242
+ """
243
+ length = len(indices)
244
+ if length >= 4:
245
+ return
246
+ indices_arr = np.array(indices)
247
+ if (indices_arr < 0).any() or (indices_arr >= self.n_vars).any():
248
+ raise QiskitError("Indices are out of bounds.")
249
+ if length > 1 and (np.diff(indices_arr) <= 0).any():
250
+ raise QiskitError("Indices are non-increasing.")
251
+
252
+ value = value % 8
253
+ if length == 0:
254
+ self.weight_0 = value
255
+ elif length == 1:
256
+ self.weight_1[indices[0]] = value
257
+ elif length == 2:
258
+ # sum(self.n_vars-j, {j, 1, indices[0]})
259
+ offset_1 = int(indices[0] * self.n_vars - ((indices[0] + 1) * indices[0]) / 2)
260
+ offset_2 = int(indices[1] - indices[0] - 1)
261
+ self.weight_2[offset_1 + offset_2] = value
262
+ else: # length = 3
263
+ tmp_1 = self.n_vars - indices[0]
264
+ offset_1 = int((tmp_1 - 3) * (tmp_1 - 2) * (tmp_1 - 1) / 6)
265
+ tmp_2 = self.n_vars - indices[1]
266
+ offset_2 = int((tmp_2 - 2) * (tmp_2 - 1) / 2)
267
+ offset_3 = self.n_vars - indices[2]
268
+ offset = int(
269
+ self.n_vars * (self.n_vars - 1) * (self.n_vars - 2) / 6
270
+ - offset_1
271
+ - offset_2
272
+ - offset_3
273
+ )
274
+ self.weight_3[offset] = value
275
+
276
+ @property
277
+ def key(self):
278
+ """Return a string representation."""
279
+ tup = (self.weight_0, tuple(self.weight_1), tuple(self.weight_2), tuple(self.weight_3))
280
+ return tup
281
+
282
+ def __eq__(self, x):
283
+ """Test equality."""
284
+ return isinstance(x, SpecialPolynomial) and self.key == x.key
285
+
286
+ def __str__(self):
287
+ """Return formatted string representation."""
288
+ out = str(self.weight_0)
289
+ for i in range(self.n_vars):
290
+ value = self.get_term([i])
291
+ if value != 0:
292
+ out += " + "
293
+ if value != 1:
294
+ out += str(value) + "*"
295
+ out += "x_" + str(i)
296
+ for i in range(self.n_vars - 1):
297
+ for j in range(i + 1, self.n_vars):
298
+ value = self.get_term([i, j])
299
+ if value != 0:
300
+ out += " + "
301
+ if value != 1:
302
+ out += str(value) + "*"
303
+ out += "x_" + str(i) + "*x_" + str(j)
304
+ for i in range(self.n_vars - 2):
305
+ for j in range(i + 1, self.n_vars - 1):
306
+ for k in range(j + 1, self.n_vars):
307
+ value = self.get_term([i, j, k])
308
+ if value != 0:
309
+ out += " + "
310
+ if value != 1:
311
+ out += str(value) + "*"
312
+ out += "x_" + str(i) + "*x_" + str(j) + "*x_" + str(k)
313
+ return out
@@ -0,0 +1,64 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2019, 2024.
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
+ Random CNOTDihedral operator functions
14
+ """
15
+
16
+ from __future__ import annotations
17
+ import numpy as np
18
+ from numpy.random import default_rng
19
+ from .dihedral import CNOTDihedral
20
+
21
+
22
+ def random_cnotdihedral(num_qubits, seed=None):
23
+ """Return a random CNOTDihedral element.
24
+
25
+ Args:
26
+ num_qubits (int): the number of qubits for the CNOTDihedral object.
27
+ seed (int or RandomState): Optional. Set a fixed seed or
28
+ generator for RNG.
29
+ Returns:
30
+ CNOTDihedral: a random CNOTDihedral element.
31
+ """
32
+
33
+ if seed is None:
34
+ rng = np.random.default_rng()
35
+ elif isinstance(seed, np.random.Generator):
36
+ rng = seed
37
+ else:
38
+ rng = default_rng(seed)
39
+
40
+ elem = CNOTDihedral(num_qubits=num_qubits)
41
+
42
+ # Random phase polynomial weights
43
+ weight_1 = rng.integers(8, size=num_qubits)
44
+ elem.poly.weight_1 = weight_1
45
+ weight_2 = 2 * rng.integers(4, size=int(num_qubits * (num_qubits - 1) / 2))
46
+ elem.poly.weight_2 = weight_2
47
+ weight_3 = 4 * rng.integers(2, size=int(num_qubits * (num_qubits - 1) * (num_qubits - 2) / 6))
48
+ elem.poly.weight_3 = weight_3
49
+
50
+ # Random affine function
51
+ # Random invertible binary matrix
52
+ from qiskit.synthesis.linear import ( # pylint: disable=cyclic-import
53
+ random_invertible_binary_matrix,
54
+ )
55
+
56
+ seed = rng.integers(100000, size=1, dtype=np.uint64)[0]
57
+ linear = random_invertible_binary_matrix(num_qubits, seed=seed).astype(int, copy=False)
58
+ elem.linear = linear
59
+
60
+ # Random shift
61
+ shift = rng.integers(2, size=num_qubits)
62
+ elem.shift = shift
63
+
64
+ return elem
@@ -0,0 +1,25 @@
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
+ """
14
+ Abstract LinearOperator class.
15
+ """
16
+
17
+ from __future__ import annotations
18
+ from abc import ABC
19
+
20
+ from .base_operator import BaseOperator
21
+ from .mixins import LinearMixin, AdjointMixin, TolerancesMixin
22
+
23
+
24
+ class LinearOp(BaseOperator, AdjointMixin, LinearMixin, TolerancesMixin, ABC):
25
+ """Abstract linear operator base class."""