qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0__cp39-abi3-win_amd64.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 (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  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 +236 -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 +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  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/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +11 -0
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +1 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -13,14 +13,22 @@
13
13
  """The arithmetic circuit library."""
14
14
 
15
15
  from .functional_pauli_rotations import FunctionalPauliRotations
16
- from .integer_comparator import IntegerComparator
17
- from .linear_pauli_rotations import LinearPauliRotations
18
- from .piecewise_linear_pauli_rotations import PiecewiseLinearPauliRotations
19
- from .piecewise_polynomial_pauli_rotations import PiecewisePolynomialPauliRotations
20
- from .polynomial_pauli_rotations import PolynomialPauliRotations
21
- from .weighted_adder import WeightedAdder
22
- from .quadratic_form import QuadraticForm
23
- from .linear_amplitude_function import LinearAmplitudeFunction
16
+ from .integer_comparator import IntegerComparator, IntegerComparatorGate
17
+ from .linear_pauli_rotations import LinearPauliRotations, LinearPauliRotationsGate
18
+ from .piecewise_linear_pauli_rotations import (
19
+ PiecewiseLinearPauliRotations,
20
+ PiecewiseLinearPauliRotationsGate,
21
+ )
22
+ from .piecewise_polynomial_pauli_rotations import (
23
+ PiecewisePolynomialPauliRotations,
24
+ PiecewisePolynomialPauliRotationsGate,
25
+ )
26
+ from .polynomial_pauli_rotations import PolynomialPauliRotations, PolynomialPauliRotationsGate
27
+ from .weighted_adder import WeightedAdder, WeightedSumGate
28
+ from .quadratic_form import QuadraticForm, QuadraticFormGate
29
+ from .linear_amplitude_function import LinearAmplitudeFunction, LinearAmplitudeFunctionGate
30
+ from .piecewise_chebyshev import PiecewiseChebyshev, PiecewiseChebyshevGate
31
+ from .exact_reciprocal import ExactReciprocal, ExactReciprocalGate
24
32
  from .adders import (
25
33
  VBERippleCarryAdder,
26
34
  CDKMRippleCarryAdder,
@@ -29,6 +37,4 @@ from .adders import (
29
37
  HalfAdderGate,
30
38
  FullAdderGate,
31
39
  )
32
- from .piecewise_chebyshev import PiecewiseChebyshev
33
40
  from .multipliers import HRSCumulativeMultiplier, RGQFTMultiplier, MultiplierGate
34
- from .exact_reciprocal import ExactReciprocal
@@ -84,7 +84,7 @@ class CDKMRippleCarryAdder(Adder):
84
84
  :class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
85
85
  is functionally equivalent to ``kind="fixed"``.
86
86
 
87
- :class:`.HalfAdderGate`: A generic inplace adder. This
87
+ :class:`.AdderGate`: A generic inplace adder. This
88
88
  is functionally equivalent to ``kind="half"``.
89
89
 
90
90
  :class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
@@ -15,7 +15,7 @@
15
15
  import numpy as np
16
16
 
17
17
  from qiskit.circuit.quantumcircuit import QuantumCircuit
18
- from qiskit.circuit.quantumregister import QuantumRegister
18
+ from qiskit.circuit import QuantumRegister
19
19
  from qiskit.circuit.library.basis_change import QFT
20
20
 
21
21
  from .adder import Adder
@@ -54,7 +54,7 @@ class DraperQFTAdder(Adder):
54
54
  :class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
55
55
  is functionally equivalent to ``kind="fixed"``.
56
56
 
57
- :class:`.HalfAdderGate`: A generic inplace adder. This
57
+ :class:`.AdderGate`: A generic inplace adder. This
58
58
  is functionally equivalent to ``kind="half"``.
59
59
 
60
60
  **References:**
@@ -60,7 +60,7 @@ class VBERippleCarryAdder(Adder):
60
60
  :class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
61
61
  is functionally equivalent to ``kind="fixed"``.
62
62
 
63
- :class:`.HalfAdderGate`: A generic inplace adder. This
63
+ :class:`.AdderGate`: A generic inplace adder. This
64
64
  is functionally equivalent to ``kind="half"``.
65
65
 
66
66
  :class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
@@ -13,7 +13,7 @@
13
13
 
14
14
  from math import isclose
15
15
  import numpy as np
16
- from qiskit.circuit import QuantumCircuit, QuantumRegister
16
+ from qiskit.circuit import QuantumCircuit, QuantumRegister, Gate
17
17
  from qiskit.circuit.library.generalized_gates import UCRYGate
18
18
 
19
19
 
@@ -46,43 +46,86 @@ class ExactReciprocal(QuantumCircuit):
46
46
  """
47
47
  qr_state = QuantumRegister(num_state_qubits, "state")
48
48
  qr_flag = QuantumRegister(1, "flag")
49
- circuit = QuantumCircuit(qr_state, qr_flag, name=name)
49
+ super().__init__(qr_state, qr_flag, name=name)
50
+
51
+ reciprocal = ExactReciprocalGate(num_state_qubits, scaling, neg_vals, label=name)
52
+ self.append(reciprocal, self.qubits)
53
+
54
+
55
+ class ExactReciprocalGate(Gate):
56
+ r"""Implements an exact reciprocal function.
57
+
58
+ For a state :math:`|x\rangle` and a scaling factor :math:`s`, this gate implements the operation
59
+
60
+ .. math::
61
+
62
+ |x\rangle |0\rangle \mapsto
63
+ \cos\left(\arcsin\left(s\frac{2^n}{x}\right)\right)|x\rangle|0\rangle +
64
+ \left(s\frac{2^n}{x}\right)|x\rangle|1\rangle.
65
+
66
+ States representing :math:`x = 0` or :math:`s 2^n / x \geq 1` are left unchanged, since
67
+ this function would not be defined.
68
+ """
69
+
70
+ def __init__(
71
+ self, num_state_qubits: int, scaling: float, neg_vals: bool = False, label: str = "1/x"
72
+ ) -> None:
73
+ r"""
74
+ Args:
75
+ num_state_qubits: The number of qubits representing the value to invert.
76
+ scaling: Scaling factor :math:`s` of the reciprocal function, i.e. to compute
77
+ :math:`s / x`.
78
+ neg_vals: Whether :math:`x` might represent negative values. In this case the first
79
+ qubit is the sign, with :math:`|1\rangle` for negative and :math:`|0\rangle` for
80
+ positive. For the negative case it is assumed that the remaining string represents
81
+ :math:`1 - x`. This is because :math:`e^{-2 \pi i x} = e^{2 \pi i (1 - x)}` for
82
+ :math:`x \in [0,1)`.
83
+ label: The label of the object.
84
+
85
+ .. note::
86
+
87
+ It is assumed that the binary string :math:`x` represents a number < 1.
88
+ """
89
+ super().__init__("ExactReciprocal", num_state_qubits + 1, [], label=label)
90
+
91
+ self.scaling = scaling
92
+ self.neg_vals = neg_vals
93
+
94
+ def _define(self):
95
+ num_state_qubits = self.num_qubits - 1
96
+ qr_state = QuantumRegister(num_state_qubits, "state")
97
+ qr_flag = QuantumRegister(1, "flag")
98
+ circuit = QuantumCircuit(qr_state, qr_flag)
50
99
 
51
100
  angles = [0.0]
52
- nl = 2 ** (num_state_qubits - 1) if neg_vals else 2**num_state_qubits
101
+ nl = 2 ** (num_state_qubits - 1) if self.neg_vals else 2**num_state_qubits
53
102
 
54
103
  # Angles to rotate by scaling / x, where x = i / nl
55
104
  for i in range(1, nl):
56
- if isclose(scaling * nl / i, 1, abs_tol=1e-5):
105
+ if isclose(self.scaling * nl / i, 1, abs_tol=1e-5):
57
106
  angles.append(np.pi)
58
- elif scaling * nl / i < 1:
59
- angles.append(2 * np.arcsin(scaling * nl / i))
107
+ elif self.scaling * nl / i < 1:
108
+ angles.append(2 * np.arcsin(self.scaling * nl / i))
60
109
  else:
61
110
  angles.append(0.0)
62
111
 
63
- circuit.compose(
64
- UCRYGate(angles), [qr_flag[0]] + qr_state[: len(qr_state) - neg_vals], inplace=True
65
- )
112
+ circuit.append(UCRYGate(angles), [qr_flag[0]] + qr_state[: len(qr_state) - self.neg_vals])
66
113
 
67
- if neg_vals:
68
- circuit.compose(
114
+ if self.neg_vals:
115
+ circuit.append(
69
116
  UCRYGate([-theta for theta in angles]).control(),
70
117
  [qr_state[-1]] + [qr_flag[0]] + qr_state[:-1],
71
- inplace=True,
72
118
  )
73
119
  angles_neg = [0.0]
74
120
  for i in range(1, nl):
75
- if isclose(scaling * (-1) / (1 - i / nl), -1, abs_tol=1e-5):
121
+ if isclose(self.scaling * (-1) / (1 - i / nl), -1, abs_tol=1e-5):
76
122
  angles_neg.append(-np.pi)
77
- elif np.abs(scaling * (-1) / (1 - i / nl)) < 1:
78
- angles_neg.append(2 * np.arcsin(scaling * (-1) / (1 - i / nl)))
123
+ elif np.abs(self.scaling * (-1) / (1 - i / nl)) < 1:
124
+ angles_neg.append(2 * np.arcsin(self.scaling * (-1) / (1 - i / nl)))
79
125
  else:
80
126
  angles_neg.append(0.0)
81
- circuit.compose(
82
- UCRYGate(angles_neg).control(),
83
- [qr_state[-1]] + [qr_flag[0]] + qr_state[:-1],
84
- inplace=True,
127
+ circuit.append(
128
+ UCRYGate(angles_neg).control(), [qr_state[-1]] + [qr_flag[0]] + qr_state[:-1]
85
129
  )
86
130
 
87
- super().__init__(*circuit.qregs, name=name)
88
- self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
131
+ self.definition = circuit
@@ -14,11 +14,13 @@
14
14
  """Integer Comparator."""
15
15
 
16
16
  from __future__ import annotations
17
- import math
18
17
 
19
- from qiskit.circuit import QuantumCircuit, QuantumRegister, AncillaRegister
18
+ from qiskit.circuit import QuantumRegister, AncillaRegister, Gate
20
19
  from qiskit.circuit.exceptions import CircuitError
21
- from ..boolean_logic import OR
20
+ from qiskit.synthesis.arithmetic.comparators import (
21
+ synth_integer_comparator_2s,
22
+ synth_integer_comparator_greedy,
23
+ )
22
24
  from ..blueprintcircuit import BlueprintCircuit
23
25
 
24
26
 
@@ -134,19 +136,6 @@ class IntegerComparator(BlueprintCircuit):
134
136
  qr_ancilla = AncillaRegister(num_ancillas)
135
137
  self.add_register(qr_ancilla)
136
138
 
137
- def _get_twos_complement(self) -> list[int]:
138
- """Returns the 2's complement of ``self.value`` as array.
139
-
140
- Returns:
141
- The 2's complement of ``self.value``.
142
- """
143
- twos_complement = pow(2, self.num_state_qubits) - math.ceil(self.value)
144
- twos_complement = f"{twos_complement:b}".rjust(self.num_state_qubits, "0")
145
- twos_complement = [
146
- 1 if twos_complement[i] == "1" else 0 for i in reversed(range(len(twos_complement)))
147
- ]
148
- return twos_complement
149
-
150
139
  def _check_configuration(self, raise_on_failure: bool = True) -> bool:
151
140
  """Check if the current configuration is valid."""
152
141
  valid = True
@@ -176,68 +165,36 @@ class IntegerComparator(BlueprintCircuit):
176
165
 
177
166
  super()._build()
178
167
 
179
- qr_state = self.qubits[: self.num_state_qubits]
180
- q_compare = self.qubits[self.num_state_qubits]
181
- qr_ancilla = self.qubits[self.num_state_qubits + 1 :]
182
-
183
- circuit = QuantumCircuit(*self.qregs, name=self.name)
184
-
185
- if self.value <= 0: # condition always satisfied for non-positive values
186
- if self._geq: # otherwise the condition is never satisfied
187
- circuit.x(q_compare)
188
- # condition never satisfied for values larger than or equal to 2^n
189
- elif self.value < pow(2, self.num_state_qubits):
190
-
191
- if self.num_state_qubits > 1:
192
- twos = self._get_twos_complement()
193
- for i in range(self.num_state_qubits):
194
- if i == 0:
195
- if twos[i] == 1:
196
- circuit.cx(qr_state[i], qr_ancilla[i])
197
- elif i < self.num_state_qubits - 1:
198
- if twos[i] == 1:
199
- circuit.compose(
200
- OR(2), [qr_state[i], qr_ancilla[i - 1], qr_ancilla[i]], inplace=True
201
- )
202
- else:
203
- circuit.ccx(qr_state[i], qr_ancilla[i - 1], qr_ancilla[i])
204
- else:
205
- if twos[i] == 1:
206
- # OR needs the result argument as qubit not register, thus
207
- # access the index [0]
208
- circuit.compose(
209
- OR(2), [qr_state[i], qr_ancilla[i - 1], q_compare], inplace=True
210
- )
211
- else:
212
- circuit.ccx(qr_state[i], qr_ancilla[i - 1], q_compare)
213
-
214
- # flip result bit if geq flag is false
215
- if not self._geq:
216
- circuit.x(q_compare)
217
-
218
- # uncompute ancillas state
219
- for i in reversed(range(self.num_state_qubits - 1)):
220
- if i == 0:
221
- if twos[i] == 1:
222
- circuit.cx(qr_state[i], qr_ancilla[i])
223
- else:
224
- if twos[i] == 1:
225
- circuit.compose(
226
- OR(2), [qr_state[i], qr_ancilla[i - 1], qr_ancilla[i]], inplace=True
227
- )
228
- else:
229
- circuit.ccx(qr_state[i], qr_ancilla[i - 1], qr_ancilla[i])
230
- else:
231
-
232
- # num_state_qubits == 1 and value == 1:
233
- circuit.cx(qr_state[0], q_compare)
234
-
235
- # flip result bit if geq flag is false
236
- if not self._geq:
237
- circuit.x(q_compare)
238
-
239
- else:
240
- if not self._geq: # otherwise the condition is never satisfied
241
- circuit.x(q_compare)
242
-
168
+ circuit = synth_integer_comparator_2s(self.num_state_qubits, self.value, self.geq)
243
169
  self.append(circuit.to_gate(), self.qubits)
170
+
171
+
172
+ class IntegerComparatorGate(Gate):
173
+ r"""Perform a :math:`\geq` (or :math:`<`) on a qubit register against a classical integer.
174
+
175
+ This operator compares basis states :math:`|i\rangle_n` against a classically given integer
176
+ :math:`L` of fixed value and flips a target qubit if :math:`i \geq L`
177
+ (or :math:`<` depending on the parameter ``geq``):
178
+
179
+ .. math::
180
+
181
+ |i\rangle_n |0\rangle \mapsto |i\rangle_n |i \geq L\rangle
182
+
183
+ """
184
+
185
+ def __init__(
186
+ self, num_state_qubits: int, value: int, geq: bool = True, label: str | None = None
187
+ ):
188
+ r"""
189
+ Args:
190
+ num_state_qubits: The number of qubits in the registers.
191
+ value: The value :math:`L` to compre to.
192
+ geq: If ``True`` compute :math:`i \geq L`, otherwise compute :math:`i < L`.
193
+ label: An optional label for the gate.
194
+ """
195
+ super().__init__("IntComp", num_state_qubits + 1, [], label=label)
196
+ self.value = value
197
+ self.geq = geq
198
+
199
+ def _define(self):
200
+ self.definition = synth_integer_comparator_greedy(self.num_qubits - 1, self.value, self.geq)
@@ -14,9 +14,12 @@
14
14
 
15
15
  from __future__ import annotations
16
16
  import numpy as np
17
- from qiskit.circuit import QuantumCircuit
17
+ from qiskit.circuit import QuantumCircuit, Gate
18
18
 
19
- from .piecewise_linear_pauli_rotations import PiecewiseLinearPauliRotations
19
+ from .piecewise_linear_pauli_rotations import (
20
+ PiecewiseLinearPauliRotations,
21
+ PiecewiseLinearPauliRotationsGate,
22
+ )
20
23
 
21
24
 
22
25
  class LinearAmplitudeFunction(QuantumCircuit):
@@ -173,6 +176,170 @@ class LinearAmplitudeFunction(QuantumCircuit):
173
176
  return value
174
177
 
175
178
 
179
+ class LinearAmplitudeFunctionGate(Gate):
180
+ r"""A circuit implementing a (piecewise) linear function on qubit amplitudes.
181
+
182
+ An amplitude function :math:`F` of a function :math:`f` is a mapping
183
+
184
+ .. math::
185
+
186
+ F|x\rangle|0\rangle = \sqrt{1 - \hat{f}(x)} |x\rangle|0\rangle + \sqrt{\hat{f}(x)}
187
+ |x\rangle|1\rangle.
188
+
189
+ for a function :math:`\hat{f}: \{ 0, ..., 2^n - 1 \} \rightarrow [0, 1]`, where
190
+ :math:`|x\rangle` is a :math:`n` qubit state.
191
+
192
+ This circuit implements :math:`F` for piecewise linear functions :math:`\hat{f}`.
193
+ In this case, the mapping :math:`F` can be approximately implemented using a Taylor expansion
194
+ and linearly controlled Pauli-Y rotations, see [1, 2] for more detail. This approximation
195
+ uses a ``rescaling_factor`` to determine the accuracy of the Taylor expansion.
196
+
197
+ In general, the function of interest :math:`f` is defined from some interval :math:`[a,b]`,
198
+ the ``domain`` to :math:`[c,d]`, the ``image``, instead of :math:`\{ 1, ..., N \}` to
199
+ :math:`[0, 1]`. Using an affine transformation we can rescale :math:`f` to :math:`\hat{f}`:
200
+
201
+ .. math::
202
+
203
+ \hat{f}(x) = \frac{f(\phi(x)) - c}{d - c}
204
+
205
+ with
206
+
207
+ .. math::
208
+
209
+ \phi(x) = a + \frac{b - a}{2^n - 1} x.
210
+
211
+ If :math:`f` is a piecewise linear function on :math:`m` intervals
212
+ :math:`[p_{i-1}, p_i], i \in \{1, ..., m\}` with slopes :math:`\alpha_i` and
213
+ offsets :math:`\beta_i` it can be written as
214
+
215
+ .. math::
216
+
217
+ f(x) = \sum_{i=1}^m 1_{[p_{i-1}, p_i]}(x) (\alpha_i x + \beta_i)
218
+
219
+ where :math:`1_{[a, b]}` is an indication function that is 1 if the argument is in the interval
220
+ :math:`[a, b]` and otherwise 0. The breakpoints :math:`p_i` can be specified by the
221
+ ``breakpoints`` argument.
222
+
223
+ References:
224
+
225
+ [1]: Woerner, S., & Egger, D. J. (2018).
226
+ Quantum Risk Analysis.
227
+ `arXiv:1806.06893 <http://arxiv.org/abs/1806.06893>`_
228
+
229
+ [2]: Gacon, J., Zoufal, C., & Woerner, S. (2020).
230
+ Quantum-Enhanced Simulation-Based Optimization.
231
+ `arXiv:2005.10780 <http://arxiv.org/abs/2005.10780>`_
232
+ """
233
+
234
+ def __init__(
235
+ self,
236
+ num_state_qubits: int,
237
+ slope: float | list[float],
238
+ offset: float | list[float],
239
+ domain: tuple[float, float],
240
+ image: tuple[float, float],
241
+ rescaling_factor: float = 1,
242
+ breakpoints: list[float] | None = None,
243
+ label: str = "F",
244
+ ) -> None:
245
+ r"""
246
+ Args:
247
+ num_state_qubits: The number of qubits used to encode the variable :math:`x`.
248
+ slope: The slope of the linear function. Can be a list of slopes if it is a piecewise
249
+ linear function.
250
+ offset: The offset of the linear function. Can be a list of offsets if it is a piecewise
251
+ linear function.
252
+ domain: The domain of the function as tuple :math:`(x_\min{}, x_\max{})`.
253
+ image: The image of the function as tuple :math:`(f_\min{}, f_\max{})`.
254
+ rescaling_factor: The rescaling factor to adjust the accuracy in the Taylor
255
+ approximation.
256
+ breakpoints: The breakpoints if the function is piecewise linear. If None, the function
257
+ is not piecewise.
258
+ label: A label for the gate.
259
+ """
260
+ if not hasattr(slope, "__len__"):
261
+ slope = [slope]
262
+ if not hasattr(offset, "__len__"):
263
+ offset = [offset]
264
+
265
+ # ensure that the breakpoints include the first point of the domain
266
+ if breakpoints is None:
267
+ breakpoints = [domain[0]]
268
+ else:
269
+ if not np.isclose(breakpoints[0], domain[0]):
270
+ breakpoints = [domain[0]] + breakpoints
271
+
272
+ _check_sizes_match(slope, offset, breakpoints)
273
+ _check_sorted_and_in_range(breakpoints, domain)
274
+
275
+ self.slope = slope
276
+ self.offset = offset
277
+ self.domain = domain
278
+ self.image = image
279
+ self.rescaling_factor = rescaling_factor
280
+ self.breakpoints = breakpoints
281
+
282
+ num_compare = int(len(breakpoints) > 1)
283
+ super().__init__("LinFunction", num_state_qubits + num_compare + 1, [], label=label)
284
+
285
+ def _define(self):
286
+ num_compare = int(len(self.breakpoints) > 1)
287
+ num_state_qubits = self.num_qubits - num_compare - 1
288
+
289
+ # do rescaling
290
+ a, b = self.domain
291
+ c, d = self.image
292
+
293
+ mapped_breakpoints = []
294
+ mapped_slope = []
295
+ mapped_offset = []
296
+ for i, point in enumerate(self.breakpoints):
297
+ mapped_breakpoint = (point - a) / (b - a) * (2**num_state_qubits - 1)
298
+ mapped_breakpoints += [mapped_breakpoint]
299
+
300
+ # factor (upper - lower) / (2^n - 1) is for the scaling of x to [l,u]
301
+ # note that the +l for mapping to [l,u] is already included in
302
+ # the offsets given as parameters
303
+ mapped_slope += [self.slope[i] * (b - a) / (2**num_state_qubits - 1)]
304
+ mapped_offset += [self.offset[i]]
305
+
306
+ # approximate linear behavior by scaling and contracting around pi/4
307
+ slope_angles = np.zeros(len(self.breakpoints))
308
+ offset_angles = np.pi / 4 * (1 - self.rescaling_factor) * np.ones_like(slope_angles)
309
+ for i, (slope_i, offset_i) in enumerate(zip(mapped_slope, mapped_offset)):
310
+ slope_angles[i] = np.pi * self.rescaling_factor * slope_i / 2 / (d - c)
311
+ offset_angles[i] += np.pi * self.rescaling_factor * (offset_i - c) / 2 / (d - c)
312
+
313
+ # use PWLPauliRotations to implement the function
314
+ pwl_pauli_rotation = PiecewiseLinearPauliRotationsGate(
315
+ num_state_qubits, mapped_breakpoints, 2 * slope_angles, 2 * offset_angles
316
+ )
317
+
318
+ self.definition = QuantumCircuit(pwl_pauli_rotation.num_qubits)
319
+ self.definition.append(pwl_pauli_rotation, self.definition.qubits)
320
+
321
+ def post_processing(self, scaled_value: float) -> float:
322
+ r"""Map the function value of the approximated :math:`\hat{f}` to :math:`f`.
323
+
324
+ Args:
325
+ scaled_value: A function value from the Taylor expansion of :math:`\hat{f}(x)`.
326
+
327
+ Returns:
328
+ The ``scaled_value`` mapped back to the domain of :math:`f`, by first inverting
329
+ the transformation used for the Taylor approximation and then mapping back from
330
+ :math:`[0, 1]` to the original domain.
331
+ """
332
+ # revert the mapping applied in the Taylor approximation
333
+ value = scaled_value - 1 / 2 + np.pi / 4 * self.rescaling_factor
334
+ value *= 2 / np.pi / self.rescaling_factor
335
+
336
+ # map the value from [0, 1] back to the original domain
337
+ value *= self.image[1] - self.image[0]
338
+ value += self.image[0]
339
+
340
+ return value
341
+
342
+
176
343
  def _check_sorted_and_in_range(breakpoints, domain):
177
344
  if breakpoints is None:
178
345
  return
@@ -13,9 +13,10 @@
13
13
 
14
14
  """Linearly-controlled X, Y or Z rotation."""
15
15
 
16
+ from __future__ import annotations
16
17
  from typing import Optional
17
18
 
18
- from qiskit.circuit import QuantumRegister, QuantumCircuit
19
+ from qiskit.circuit import QuantumRegister, QuantumCircuit, Gate
19
20
  from qiskit.circuit.exceptions import CircuitError
20
21
 
21
22
  from .functional_pauli_rotations import FunctionalPauliRotations
@@ -164,12 +165,65 @@ class LinearPauliRotations(FunctionalPauliRotations):
164
165
  return
165
166
 
166
167
  super()._build()
168
+ gate = LinearPauliRotationsGate(self.num_state_qubits, self.slope, self.offset, self.basis)
169
+ self.append(gate, self.qubits)
167
170
 
168
- circuit = QuantumCircuit(*self.qregs, name=self.name)
171
+
172
+ class LinearPauliRotationsGate(Gate):
173
+ r"""Linearly-controlled X, Y or Z rotation.
174
+
175
+ For a register of state qubits :math:`|x\rangle`, a target qubit :math:`|0\rangle` and the
176
+ basis ``'Y'`` this circuit acts as:
177
+
178
+ .. parsed-literal::
179
+
180
+ q_0: ─────────────────────────■───────── ... ──────────────────────
181
+
182
+ .
183
+
184
+ q_(n-1): ─────────────────────────┼───────── ... ───────────■──────────
185
+ ┌────────────┐ ┌───────┴───────┐ ┌─────────┴─────────┐
186
+ q_n: ─┤ RY(offset) ├──┤ RY(2^0 slope) ├ ... ┤ RY(2^(n-1) slope) ├
187
+ └────────────┘ └───────────────┘ └───────────────────┘
188
+
189
+ This can for example be used to approximate linear functions, with :math:`a =` ``slope``:math:`/2`
190
+ and :math:`b =` ``offset``:math:`/2` and the basis ``'Y'``:
191
+
192
+ .. math::
193
+
194
+ |x\rangle |0\rangle \mapsto \cos(ax + b)|x\rangle|0\rangle + \sin(ax + b)|x\rangle |1\rangle
195
+
196
+ Since for small arguments :math:`\sin(x) \approx x` this operator can be used to approximate
197
+ linear functions.
198
+ """
199
+
200
+ def __init__(
201
+ self,
202
+ num_state_qubits: int,
203
+ slope: float = 1,
204
+ offset: float = 0,
205
+ basis: str = "Y",
206
+ label: str | None = None,
207
+ ) -> None:
208
+ r"""
209
+ Args:
210
+ num_state_qubits: The number of qubits representing the state :math:`|x\rangle`.
211
+ slope: The slope of the controlled rotation.
212
+ offset: The offset of the controlled rotation.
213
+ basis: The type of Pauli rotation ('X', 'Y', 'Z').
214
+ label: The label of the gate.
215
+ """
216
+ super().__init__("LinPauliRot", num_state_qubits + 1, [], label=label)
217
+ self.slope = slope
218
+ self.offset = offset
219
+ self.basis = basis.lower()
220
+
221
+ def _define(self):
222
+ circuit = QuantumCircuit(self.num_qubits, name=self.name)
169
223
 
170
224
  # build the circuit
171
- qr_state = self.qubits[: self.num_state_qubits]
172
- qr_target = self.qubits[self.num_state_qubits]
225
+ qr_state = circuit.qubits[: self.num_qubits - 1]
226
+ qr_target = circuit.qubits[-1]
173
227
 
174
228
  if self.basis == "x":
175
229
  circuit.rx(self.offset, qr_target)
@@ -186,4 +240,4 @@ class LinearPauliRotations(FunctionalPauliRotations):
186
240
  else: # 'Z'
187
241
  circuit.crz(self.slope * pow(2, i), q_i, qr_target)
188
242
 
189
- self.append(circuit.to_gate(), self.qubits)
243
+ self.definition = circuit