qiskit 1.4.0__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.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 (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +248 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +7 -140
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +34 -5
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +2 -6
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +4 -0
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +168 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +5 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +1 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +67 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +27 -12
  291. qiskit/visualization/timeline/interface.py +23 -18
  292. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
  295. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -14,14 +14,15 @@
14
14
  """Piecewise-linearly-controlled rotation."""
15
15
 
16
16
  from __future__ import annotations
17
+ from collections.abc import Sequence
17
18
  import numpy as np
18
19
 
19
- from qiskit.circuit import QuantumRegister, AncillaRegister, QuantumCircuit
20
+ from qiskit.circuit import QuantumRegister, AncillaRegister, QuantumCircuit, Gate
20
21
  from qiskit.circuit.exceptions import CircuitError
21
22
 
22
23
  from .functional_pauli_rotations import FunctionalPauliRotations
23
- from .linear_pauli_rotations import LinearPauliRotations
24
- from .integer_comparator import IntegerComparator
24
+ from .linear_pauli_rotations import LinearPauliRotations, LinearPauliRotationsGate
25
+ from .integer_comparator import IntegerComparator, IntegerComparatorGate
25
26
 
26
27
 
27
28
  class PiecewiseLinearPauliRotations(FunctionalPauliRotations):
@@ -272,6 +273,115 @@ class PiecewiseLinearPauliRotations(FunctionalPauliRotations):
272
273
  circuit.append(lin_r.to_gate().control(), qr_compare[:] + qr_state[:] + qr_target)
273
274
 
274
275
  # uncompute comparator
275
- circuit.append(comp.to_gate().inverse(), qr[:] + qr_helper[: comp.num_ancillas])
276
+ circuit.append(comp.to_gate(), qr[:] + qr_helper[: comp.num_ancillas])
276
277
 
277
278
  self.append(circuit.to_gate(), self.qubits)
279
+
280
+
281
+ class PiecewiseLinearPauliRotationsGate(Gate):
282
+ r"""Piecewise-linearly-controlled Pauli rotations.
283
+
284
+ For a piecewise linear (not necessarily continuous) function :math:`f(x)`, which is defined
285
+ through breakpoints, slopes and offsets as follows.
286
+ Suppose the breakpoints :math:`(x_0, ..., x_J)` are a subset of :math:`[0, 2^n-1]`, where
287
+ :math:`n` is the number of state qubits. Further on, denote the corresponding slopes and
288
+ offsets by :math:`a_j` and :math:`b_j` respectively.
289
+ Then f(x) is defined as:
290
+
291
+ .. math::
292
+
293
+ f(x) = \begin{cases}
294
+ 0, x < x_0 \\
295
+ a_j (x - x_j) + b_j, x_j \leq x < x_{j+1}
296
+ \end{cases}
297
+
298
+ where we implicitly assume :math:`x_{J+1} = 2^n`.
299
+ """
300
+
301
+ def __init__(
302
+ self,
303
+ num_state_qubits: int | None = None,
304
+ breakpoints: list[int] | None = None,
305
+ slopes: Sequence[float] | None = None,
306
+ offsets: Sequence[float] | None = None,
307
+ basis: str = "Y",
308
+ label: str | None = None,
309
+ ) -> None:
310
+ """Construct piecewise-linearly-controlled Pauli rotations.
311
+
312
+ Args:
313
+ num_state_qubits: The number of qubits representing the state.
314
+ breakpoints: The breakpoints to define the piecewise-linear function.
315
+ Defaults to ``[0]``.
316
+ slopes: The slopes for different segments of the piecewise-linear function.
317
+ Defaults to ``[1]``.
318
+ offsets: The offsets for different segments of the piecewise-linear function.
319
+ Defaults to ``[0]``.
320
+ basis: The type of Pauli rotation (``'X'``, ``'Y'``, ``'Z'``).
321
+ label: The label of the gate.
322
+ """
323
+ self.breakpoints = breakpoints if breakpoints is not None else [0]
324
+ self.slopes = slopes if slopes is not None else [1]
325
+ self.offsets = offsets if offsets is not None else [0]
326
+ self.basis = basis
327
+
328
+ num_compare_bits = 1 if len(self.breakpoints) > 1 else 0
329
+ super().__init__("PwLinPauliRot", num_state_qubits + 1 + num_compare_bits, [], label=label)
330
+
331
+ def _define(self):
332
+ circuit = QuantumCircuit(self.num_qubits, name=self.name)
333
+
334
+ if len(self.breakpoints) == 1:
335
+ qr_state = circuit.qubits[: self.num_qubits - 1]
336
+ qr_target = [circuit.qubits[-1]]
337
+ qr_compare = []
338
+ else:
339
+ qr_state = circuit.qubits[: self.num_qubits - 2]
340
+ qr_target = [circuit.qubits[-2]]
341
+ qr_compare = [circuit.qubits[-1]]
342
+
343
+ num_state_qubits = len(qr_state)
344
+
345
+ mapped_slopes = np.zeros_like(self.slopes)
346
+ for i, slope in enumerate(self.slopes):
347
+ mapped_slopes[i] = slope - sum(mapped_slopes[:i])
348
+
349
+ mapped_offsets = np.zeros_like(self.offsets)
350
+ for i, (offset, slope, point) in enumerate(
351
+ zip(self.offsets, self.slopes, self.breakpoints)
352
+ ):
353
+ mapped_offsets[i] = offset - slope * point - sum(mapped_offsets[:i])
354
+
355
+ # apply comparators and controlled linear rotations
356
+ contains_zero_breakpoint = np.isclose(self.breakpoints[0], 0)
357
+ for i, point in enumerate(self.breakpoints):
358
+ if i == 0 and contains_zero_breakpoint:
359
+ # apply rotation
360
+ lin_r = LinearPauliRotationsGate(
361
+ num_state_qubits=num_state_qubits,
362
+ slope=mapped_slopes[i],
363
+ offset=mapped_offsets[i],
364
+ basis=self.basis,
365
+ )
366
+ circuit.append(lin_r, qr_state[:] + qr_target)
367
+
368
+ else:
369
+ # apply Comparator
370
+ comp = IntegerComparatorGate(num_state_qubits=num_state_qubits, value=point)
371
+ qr = qr_state[:] + qr_compare[:] # add ancilla as compare qubit
372
+
373
+ circuit.append(comp, qr[:])
374
+
375
+ # apply controlled rotation
376
+ lin_r = LinearPauliRotationsGate(
377
+ num_state_qubits=num_state_qubits,
378
+ slope=mapped_slopes[i],
379
+ offset=mapped_offsets[i],
380
+ basis=self.basis,
381
+ )
382
+ circuit.append(lin_r.control(), qr_compare[:] + qr_state[:] + qr_target)
383
+
384
+ # uncompute comparator (which is its self-inverse)
385
+ circuit.append(comp, qr[:])
386
+
387
+ self.definition = circuit
@@ -16,12 +16,12 @@ from __future__ import annotations
16
16
  from typing import List, Optional
17
17
  import numpy as np
18
18
 
19
- from qiskit.circuit import QuantumRegister, AncillaRegister, QuantumCircuit
19
+ from qiskit.circuit import QuantumRegister, AncillaRegister, QuantumCircuit, Gate
20
20
  from qiskit.circuit.exceptions import CircuitError
21
21
 
22
22
  from .functional_pauli_rotations import FunctionalPauliRotations
23
- from .polynomial_pauli_rotations import PolynomialPauliRotations
24
- from .integer_comparator import IntegerComparator
23
+ from .polynomial_pauli_rotations import PolynomialPauliRotations, PolynomialPauliRotationsGate
24
+ from .integer_comparator import IntegerComparator, IntegerComparatorGate
25
25
 
26
26
 
27
27
  class PiecewisePolynomialPauliRotations(FunctionalPauliRotations):
@@ -101,8 +101,8 @@ class PiecewisePolynomialPauliRotations(FunctionalPauliRotations):
101
101
  breakpoints: The breakpoints to define the piecewise-linear function.
102
102
  Defaults to ``[0]``.
103
103
  coeffs: The coefficients of the polynomials for different segments of the
104
- piecewise-linear function. ``coeffs[j][i]`` is the coefficient of the i-th power of x
105
- for the j-th polynomial.
104
+ piecewise-linear function. ``coeffs[j][i]`` is the coefficient of the i-th power of x
105
+ for the j-th polynomial.
106
106
  Defaults to linear: ``[[1]]``.
107
107
  basis: The type of Pauli rotation (``'X'``, ``'Y'``, ``'Z'``).
108
108
  name: The name of the circuit.
@@ -187,16 +187,7 @@ class PiecewisePolynomialPauliRotations(FunctionalPauliRotations):
187
187
  Returns:
188
188
  The mapped coefficients.
189
189
  """
190
- mapped_coeffs = []
191
-
192
- # First polynomial
193
- mapped_coeffs.append(self._hom_coeffs[0])
194
- for i in range(1, len(self._hom_coeffs)):
195
- mapped_coeffs.append([])
196
- for j in range(0, self._degree + 1):
197
- mapped_coeffs[i].append(self._hom_coeffs[i][j] - self._hom_coeffs[i - 1][j])
198
-
199
- return mapped_coeffs
190
+ return _map_coeffs(self._hom_coeffs)
200
191
 
201
192
  @property
202
193
  def contains_zero_breakpoint(self) -> bool | np.bool_:
@@ -315,3 +306,188 @@ class PiecewisePolynomialPauliRotations(FunctionalPauliRotations):
315
306
  )
316
307
 
317
308
  self.append(circuit.to_gate(), self.qubits)
309
+
310
+
311
+ class PiecewisePolynomialPauliRotationsGate(Gate):
312
+ r"""Piecewise-polynomially-controlled Pauli rotations.
313
+
314
+ This class implements a piecewise polynomial (not necessarily continuous) function,
315
+ :math:`f(x)`, on qubit amplitudes, which is defined through breakpoints and coefficients as
316
+ follows.
317
+ Suppose the breakpoints :math:`(x_0, ..., x_J)` are a subset of :math:`[0, 2^n-1]`, where
318
+ :math:`n` is the number of state qubits. Further on, denote the corresponding coefficients by
319
+ :math:`[a_{j,1},...,a_{j,d}]`, where :math:`d` is the highest degree among all polynomials.
320
+
321
+ Then :math:`f(x)` is defined as:
322
+
323
+ .. math::
324
+
325
+ f(x) = \begin{cases}
326
+ 0, x < x_0 \\
327
+ \sum_{i=0}^{i=d}a_{j,i}/2 x^i, x_j \leq x < x_{j+1}
328
+ \end{cases}
329
+
330
+ where if given the same number of breakpoints as polynomials, we implicitly assume
331
+ :math:`x_{J+1} = 2^n`.
332
+
333
+ .. note::
334
+
335
+ Note the :math:`1/2` factor in the coefficients of :math:`f(x)`, this is consistent with
336
+ Qiskit's Pauli rotations.
337
+
338
+ Examples:
339
+ >>> from qiskit import QuantumCircuit
340
+ >>> from qiskit.circuit.library.arithmetic.piecewise_polynomial_pauli_rotations import\
341
+ ... PiecewisePolynomialPauliRotations
342
+ >>> qubits, breakpoints, coeffs = (2, [0, 2], [[0, -1.2],[-1, 1, 3]])
343
+ >>> poly_r = PiecewisePolynomialPauliRotations(num_state_qubits=qubits,
344
+ ...breakpoints=breakpoints, coeffs=coeffs)
345
+ >>>
346
+ >>> qc = QuantumCircuit(poly_r.num_qubits)
347
+ >>> qc.h(list(range(qubits)));
348
+ >>> qc.append(poly_r.to_instruction(), list(range(qc.num_qubits)));
349
+ >>> qc.draw()
350
+ ┌───┐┌──────────┐
351
+ q_0: ┤ H ├┤0 ├
352
+ ├───┤│ │
353
+ q_1: ┤ H ├┤1 ├
354
+ └───┘│ │
355
+ q_2: ─────┤2 ├
356
+ │ pw_poly │
357
+ q_3: ─────┤3 ├
358
+ │ │
359
+ q_4: ─────┤4 ├
360
+ │ │
361
+ q_5: ─────┤5 ├
362
+ └──────────┘
363
+
364
+ References:
365
+ [1]: Haener, T., Roetteler, M., & Svore, K. M. (2018).
366
+ Optimizing Quantum Circuits for Arithmetic.
367
+ `arXiv:1805.12445 <http://arxiv.org/abs/1805.12445>`_
368
+
369
+ [2]: Carrera Vazquez, A., Hiptmair, R., & Woerner, S. (2022).
370
+ Enhancing the Quantum Linear Systems Algorithm using Richardson Extrapolation.
371
+ `ACM Transactions on Quantum Computing 3, 1, Article 2 <https://doi.org/10.1145/3490631>`_
372
+ """
373
+
374
+ def __init__(
375
+ self,
376
+ num_state_qubits: int,
377
+ breakpoints: list[int] | None = None,
378
+ coeffs: list[list[float]] | None = None,
379
+ basis: str = "Y",
380
+ label: str | None = None,
381
+ ) -> None:
382
+ """
383
+ Args:
384
+ num_state_qubits: The number of qubits representing the state.
385
+ breakpoints: The breakpoints to define the piecewise-linear function.
386
+ Defaults to ``[0]``.
387
+ coeffs: The coefficients of the polynomials for different segments of the
388
+ piecewise-linear function. ``coeffs[j][i]`` is the coefficient of the i-th power of x
389
+ for the j-th polynomial.
390
+ Defaults to linear: ``[[1]]``.
391
+ basis: The type of Pauli rotation (``'X'``, ``'Y'``, ``'Z'``).
392
+ label: An optional label for the gate.
393
+ """
394
+
395
+ if coeffs is None:
396
+ degree = 0
397
+ coeffs = [[1]]
398
+ else:
399
+ # store a list of coefficients as homogeneous polynomials adding 0's where necessary
400
+ degree = len(max(coeffs, key=len)) - 1
401
+ coeffs = [poly + [0] * (degree + 1 - len(poly)) for poly in coeffs]
402
+
403
+ # ensure the breakpoint contains 2 ** num_state_qubits
404
+ breakpoints = breakpoints.copy()
405
+ if breakpoints is None:
406
+ breakpoints = [0, 2**num_state_qubits]
407
+ elif breakpoints[-1] < 2**num_state_qubits:
408
+ breakpoints.append(2**num_state_qubits)
409
+
410
+ self.coeffs = coeffs
411
+ self.breakpoints = breakpoints
412
+ self.basis = basis
413
+
414
+ self.num_compare = int(len(self.breakpoints) > 2)
415
+ super().__init__(
416
+ "PiecewisePolyPauli", num_state_qubits + self.num_compare + 1, [], label=label
417
+ )
418
+
419
+ def evaluate(self, x: float) -> float:
420
+ """Classically evaluate the piecewise polynomial rotation.
421
+
422
+ Args:
423
+ x: Value to be evaluated at.
424
+
425
+ Returns:
426
+ Value of piecewise polynomial function at x.
427
+ """
428
+ mapped_coeffs = _map_coeffs(self.coeffs)
429
+
430
+ y = 0
431
+ for i, breakpt in enumerate(self.breakpoints):
432
+ y = y + (x >= breakpt) * (np.poly1d(mapped_coeffs[i][::-1])(x))
433
+
434
+ return y
435
+
436
+ def _define(self):
437
+ num_state_qubits = self.num_qubits - self.num_compare - 1
438
+ circuit = QuantumCircuit(self.num_qubits, name=self.name)
439
+ qr_state = circuit.qubits[:num_state_qubits]
440
+
441
+ if len(self.breakpoints) > 2:
442
+ qr_target = [circuit.qubits[-2]]
443
+ qr_compare = [circuit.qubits[-1]]
444
+ else:
445
+ qr_target = [circuit.qubits[-1]]
446
+ qr_compare = []
447
+
448
+ # apply comparators and controlled linear rotations
449
+ contains_zero_breakpoint = np.isclose(self.breakpoints[0], 0)
450
+ mapped_coeffs = _map_coeffs(self.coeffs)
451
+
452
+ for i, point in enumerate(self.breakpoints[:-1]):
453
+ if i == 0 and contains_zero_breakpoint:
454
+ # apply rotation
455
+ poly_r = PolynomialPauliRotationsGate(
456
+ num_state_qubits=num_state_qubits,
457
+ coeffs=mapped_coeffs[i],
458
+ basis=self.basis,
459
+ )
460
+ circuit.append(poly_r, qr_state[:] + qr_target)
461
+
462
+ else:
463
+ # apply Comparator
464
+ comp = IntegerComparatorGate(num_state_qubits=num_state_qubits, value=point)
465
+ qr_state_full = qr_state[:] + qr_compare # add compare qubit
466
+
467
+ circuit.append(comp, qr_state_full[:])
468
+
469
+ # apply controlled rotation
470
+ poly_r = PolynomialPauliRotationsGate(
471
+ num_state_qubits=num_state_qubits,
472
+ coeffs=mapped_coeffs[i],
473
+ basis=self.basis,
474
+ )
475
+ circuit.append(poly_r.control(), qr_compare + qr_state[:] + qr_target)
476
+
477
+ # uncompute comparator
478
+ circuit.append(comp, qr_state_full[:])
479
+
480
+ self.definition = circuit
481
+
482
+
483
+ def _map_coeffs(coeffs):
484
+ mapped_coeffs = []
485
+ mapped_coeffs.append(coeffs[0])
486
+
487
+ degree = len(coeffs[0]) - 1 # all coeffs should have the same length by now
488
+ for i in range(1, len(coeffs)):
489
+ mapped_coeffs.append([])
490
+ for j in range(0, degree + 1):
491
+ mapped_coeffs[i].append(coeffs[i][j] - coeffs[i - 1][j])
492
+
493
+ return mapped_coeffs
@@ -17,7 +17,7 @@ from __future__ import annotations
17
17
 
18
18
  from itertools import product
19
19
 
20
- from qiskit.circuit import QuantumRegister, QuantumCircuit
20
+ from qiskit.circuit import QuantumRegister, QuantumCircuit, Gate
21
21
  from qiskit.circuit.exceptions import CircuitError
22
22
 
23
23
  from .functional_pauli_rotations import FunctionalPauliRotations
@@ -253,52 +253,68 @@ class PolynomialPauliRotations(FunctionalPauliRotations):
253
253
 
254
254
  return valid
255
255
 
256
- def _get_rotation_coefficients(self) -> dict[tuple[int, ...], float]:
257
- """Compute the coefficient of each monomial.
256
+ def _build(self):
257
+ """If not already built, build the circuit."""
258
+ if self._is_built:
259
+ return
258
260
 
259
- Returns:
260
- A dictionary with pairs ``{control_state: rotation angle}`` where ``control_state``
261
- is a tuple of ``0`` or ``1`` bits.
262
- """
263
- # determine the control states
264
- all_combinations = list(product([0, 1], repeat=self.num_state_qubits))
265
- valid_combinations = []
266
- for combination in all_combinations:
267
- if 0 < sum(combination) <= self.degree:
268
- valid_combinations += [combination]
261
+ super()._build()
269
262
 
270
- rotation_coeffs = {control_state: 0.0 for control_state in valid_combinations}
263
+ gate = PolynomialPauliRotationsGate(self.num_state_qubits, self.coeffs, self.basis)
264
+ self.append(gate, self.qubits)
271
265
 
272
- # compute the coefficients for the control states
273
- for i, coeff in enumerate(self.coeffs[1:]):
274
- i += 1 # since we skip the first element we need to increase i by one
275
266
 
276
- # iterate over the multinomial coefficients
277
- for comb, num_combs in _multinomial_coefficients(self.num_state_qubits, i).items():
278
- control_state: tuple[int, ...] = ()
279
- power = 1
280
- for j, qubit in enumerate(comb):
281
- if qubit > 0: # means we control on qubit i
282
- control_state += (1,)
283
- power *= 2 ** (j * qubit)
284
- else:
285
- control_state += (0,)
267
+ class PolynomialPauliRotationsGate(Gate):
268
+ r"""A gate implementing polynomial Pauli rotations.
286
269
 
287
- # Add angle
288
- rotation_coeffs[control_state] += coeff * num_combs * power
270
+ For a polynomial :math:`p(x)`, a basis state :math:`|i\rangle` and a target qubit
271
+ :math:`|0\rangle` this operator acts as:
289
272
 
290
- return rotation_coeffs
273
+ .. math::
291
274
 
292
- def _build(self):
293
- """If not already built, build the circuit."""
294
- if self._is_built:
295
- return
275
+ |i\rangle |0\rangle \mapsto \cos\left(\frac{p(i)}{2}\right) |i\rangle |0\rangle
276
+ + \sin\left(\frac{p(i)}{2}\right) |i\rangle |1\rangle
296
277
 
297
- super()._build()
278
+ Let n be the number of qubits representing the state, d the degree of p(x) and q_i the qubits,
279
+ where q_0 is the least significant qubit. Then for
298
280
 
299
- circuit = QuantumCircuit(*self.qregs, name=self.name)
300
- qr_state = circuit.qubits[: self.num_state_qubits]
301
- qr_target = circuit.qubits[self.num_state_qubits]
281
+ .. math::
282
+
283
+ x = \sum_{i=0}^{n-1} 2^i q_i,
284
+
285
+ we can write
286
+
287
+ .. math::
288
+
289
+ p(x) = \sum_{j=0}^{j=d} c_j x^j
290
+
291
+ where :math:`c` are the input coefficients, ``coeffs``.
292
+ """
293
+
294
+ def __init__(
295
+ self,
296
+ num_state_qubits: int,
297
+ coeffs: list[float] | None = None,
298
+ basis: str = "Y",
299
+ label: str | None = None,
300
+ ) -> None:
301
+ """Prepare an approximation to a state with amplitudes specified by a polynomial.
302
+
303
+ Args:
304
+ num_state_qubits: The number of qubits representing the state.
305
+ coeffs: The coefficients of the polynomial. ``coeffs[i]`` is the coefficient of the
306
+ i-th power of x. Defaults to linear: [0, 1].
307
+ basis: The type of Pauli rotation ('X', 'Y', 'Z').
308
+ label: A label for the gate.
309
+ """
310
+ self.coeffs = coeffs or [0, 1]
311
+ self.basis = basis.lower()
312
+ super().__init__("PolyPauli", num_state_qubits + 1, [], label=label)
313
+
314
+ def _define(self):
315
+ circuit = QuantumCircuit(self.num_qubits)
316
+ qr_state = circuit.qubits[: self.num_qubits - 1]
317
+ qr_target = circuit.qubits[-1]
302
318
 
303
319
  rotation_coeffs = self._get_rotation_coefficients()
304
320
 
@@ -332,4 +348,42 @@ class PolynomialPauliRotations(FunctionalPauliRotations):
332
348
  else:
333
349
  circuit.crz(rotation_coeffs[c], qr_control[0], qr_target)
334
350
 
335
- self.append(circuit.to_gate(), self.qubits)
351
+ self.definition = circuit
352
+
353
+ def _get_rotation_coefficients(self) -> dict[tuple[int, ...], float]:
354
+ """Compute the coefficient of each monomial.
355
+
356
+ Returns:
357
+ A dictionary with pairs ``{control_state: rotation angle}`` where ``control_state``
358
+ is a tuple of ``0`` or ``1`` bits.
359
+ """
360
+ # determine the control states
361
+ num_state_qubits = self.num_qubits - 1
362
+ degree = len(self.coeffs) - 1
363
+ all_combinations = list(product([0, 1], repeat=num_state_qubits))
364
+ valid_combinations = []
365
+ for combination in all_combinations:
366
+ if 0 < sum(combination) <= degree:
367
+ valid_combinations += [combination]
368
+
369
+ rotation_coeffs = {control_state: 0.0 for control_state in valid_combinations}
370
+
371
+ # compute the coefficients for the control states
372
+ for i, coeff in enumerate(self.coeffs[1:]):
373
+ i += 1 # since we skip the first element we need to increase i by one
374
+
375
+ # iterate over the multinomial coefficients
376
+ for comb, num_combs in _multinomial_coefficients(num_state_qubits, i).items():
377
+ control_state: tuple[int, ...] = ()
378
+ power = 1
379
+ for j, qubit in enumerate(comb):
380
+ if qubit > 0: # means we control on qubit i
381
+ control_state += (1,)
382
+ power *= 2 ** (j * qubit)
383
+ else:
384
+ control_state += (0,)
385
+
386
+ # Add angle
387
+ rotation_coeffs[control_state] += coeff * num_combs * power
388
+
389
+ return rotation_coeffs