qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0rc1__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 (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.pyd +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 +2 -141
  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 +154 -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 +4 -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 +18 -12
  291. qiskit/visualization/timeline/interface.py +19 -18
  292. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +1 -1
  295. {qiskit-1.4.1.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.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -28,13 +28,13 @@ import numpy as np
28
28
  from qiskit.circuit.gate import Gate
29
29
  from qiskit.circuit.library.standard_gates.h import HGate
30
30
  from qiskit.quantum_info.operators.predicates import is_unitary_matrix
31
- from qiskit.circuit.quantumregister import QuantumRegister
31
+ from qiskit.circuit import QuantumRegister
32
32
  from qiskit.circuit.quantumcircuit import QuantumCircuit
33
33
  from qiskit.circuit.exceptions import CircuitError
34
34
  from qiskit.exceptions import QiskitError
35
35
  from qiskit._accelerate import uc_gate
36
36
 
37
- from .diagonal import Diagonal
37
+ from .diagonal import DiagonalGate
38
38
 
39
39
  _EPS = 1e-10 # global variable used to chop very small numbers to zero
40
40
 
@@ -60,14 +60,21 @@ class UCGate(Gate):
60
60
 
61
61
  The decomposition is based on Ref. [1].
62
62
 
63
+ Unnecessary controls and repeated operators can be removed as described in Ref [2].
64
+
63
65
  **References:**
64
66
 
65
67
  [1] Bergholm et al., Quantum circuits with uniformly controlled one-qubit gates (2005).
66
68
  `Phys. Rev. A 71, 052330 <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.71.052330>`__.
67
69
 
70
+ [2] de Carvalho et al., Quantum multiplexer simplification for state preparation (2024).
71
+ `arXiv:2409.05618 <https://arxiv.org/abs/2409.05618>`__.
72
+
68
73
  """
69
74
 
70
- def __init__(self, gate_list: list[np.ndarray], up_to_diagonal: bool = False):
75
+ def __init__(
76
+ self, gate_list: list[np.ndarray], up_to_diagonal: bool = False, mux_simp: bool = True
77
+ ):
71
78
  r"""
72
79
  Args:
73
80
  gate_list: List of two qubit unitaries :math:`[U_0, ..., U_{2^{k-1}}]`, where each
@@ -76,6 +83,9 @@ class UCGate(Gate):
76
83
  or if it is decomposed completely (default: False).
77
84
  If the ``UCGate`` :math:`U` is decomposed up to a diagonal :math:`D`, this means
78
85
  that the circuit implements a unitary :math:`U'` such that :math:`D U' = U`.
86
+ mux_simp: Determines whether the search for repetitions is conducted (default: True).
87
+ The intention is to perform a possible simplification in the number of controls
88
+ and operators.
79
89
 
80
90
  Raises:
81
91
  QiskitError: in case of bad input to the constructor
@@ -101,10 +111,67 @@ class UCGate(Gate):
101
111
  if not is_unitary_matrix(gate, _EPS):
102
112
  raise QiskitError("A controlled gate is not unitary.")
103
113
 
114
+ new_controls = set()
115
+ if mux_simp:
116
+ new_controls, gate_list = self._simplify(gate_list, num_contr)
117
+ self.simp_contr = (mux_simp, new_controls)
118
+
104
119
  # Create new gate.
105
120
  super().__init__("multiplexer", int(num_contr) + 1, gate_list)
106
121
  self.up_to_diagonal = up_to_diagonal
107
122
 
123
+ def _simplify(self, gate_list, num_contr):
124
+ """https://arxiv.org/abs/2409.05618"""
125
+
126
+ c = set()
127
+ nc = set()
128
+ mux_copy = gate_list.copy()
129
+
130
+ for i in range(int(num_contr)):
131
+ c.add(i + 1)
132
+
133
+ if len(gate_list) > 1:
134
+ nc, mux_copy = self._repetition_search(gate_list, num_contr, mux_copy)
135
+
136
+ new_controls = {x for x in c if x not in nc}
137
+ new_mux = [gate for gate in mux_copy if gate is not None]
138
+ return new_controls, new_mux
139
+
140
+ def _repetition_search(self, mux, level, mux_copy):
141
+ nc = set()
142
+ d = 1
143
+ while d <= len(mux) / 2:
144
+ disentanglement = False
145
+ if np.allclose(mux[d], mux[0]):
146
+ mux_org = mux_copy.copy()
147
+ repetitions = len(mux) / (2 * d)
148
+ p = 0
149
+ while repetitions > 0:
150
+ repetitions -= 1
151
+ valid, mux_copy = self._repetition_verify(p, d, mux, mux_copy)
152
+ p = p + 2 * d
153
+ if not valid:
154
+ mux_copy = mux_org
155
+ break
156
+ if repetitions == 0:
157
+ disentanglement = True
158
+
159
+ if disentanglement:
160
+ removed_contr = level - math.log2(d)
161
+ nc.add(removed_contr)
162
+ d = 2 * d
163
+ return nc, mux_copy
164
+
165
+ def _repetition_verify(self, base, d, mux, mux_copy):
166
+ i = 0
167
+ next_base = base + d
168
+ while i < d:
169
+ if not np.allclose(mux[base], mux[next_base]):
170
+ return False, mux_copy
171
+ mux_copy[next_base] = None
172
+ base, next_base, i = base + 1, next_base + 1, i + 1
173
+ return True, mux_copy
174
+
108
175
  def inverse(self, annotated: bool = False) -> Gate:
109
176
  """Return the inverse.
110
177
 
@@ -135,6 +202,19 @@ class UCGate(Gate):
135
202
  # q[k-1],...,q[0],q_target, decreasingly ordered with respect to the
136
203
  # significance of the qubit in the computational basis
137
204
  _, diag = self._dec_ucg()
205
+ if self.simp_contr[1]:
206
+ q_controls = [self.num_qubits - i for i in self.simp_contr[1]]
207
+ q_controls.reverse()
208
+ for i in range(self.num_qubits):
209
+ if i not in [0] + q_controls:
210
+ d = 2**i
211
+ new_diag = []
212
+ n = len(diag)
213
+ for j in range(n):
214
+ new_diag.append(diag[j])
215
+ if (j + 1) % d == 0:
216
+ new_diag.extend(diag[j + 1 - d : j + 1])
217
+ diag = np.array(new_diag)
138
218
  return diag
139
219
 
140
220
  def _define(self):
@@ -149,12 +229,19 @@ class UCGate(Gate):
149
229
  """
150
230
  diag = np.ones(2**self.num_qubits).tolist()
151
231
  q = QuantumRegister(self.num_qubits, "q")
152
- q_controls = q[1:]
153
232
  q_target = q[0]
233
+ mux_simplify = self.simp_contr[0]
234
+
235
+ if mux_simplify:
236
+ q_controls = [q[self.num_qubits - i] for i in self.simp_contr[1]]
237
+ q_controls.reverse()
238
+ else:
239
+ q_controls = q[1:]
240
+
154
241
  circuit = QuantumCircuit(q, name="uc")
155
242
  # If there is no control, we use the ZYZ decomposition
156
243
  if not q_controls:
157
- circuit.unitary(self.params[0], [q])
244
+ circuit.unitary(self.params[0], q[0])
158
245
  return circuit, diag
159
246
  # If there is at least one control, first,
160
247
  # we find the single qubit gates of the decomposition.
@@ -189,8 +276,9 @@ class UCGate(Gate):
189
276
  # Important: the diagonal gate is given in the computational basis of the qubits
190
277
  # q[k-1],...,q[0],q_target (ordered with decreasing significance),
191
278
  # where q[i] are the control qubits and t denotes the target qubit.
192
- diagonal = Diagonal(diag)
193
- circuit.append(diagonal, q)
279
+ diagonal = DiagonalGate(diag)
280
+
281
+ circuit.append(diagonal, [q_target] + q_controls)
194
282
  return circuit, diag
195
283
 
196
284
  def _dec_ucg_help(self):
@@ -199,6 +287,8 @@ class UCGate(Gate):
199
287
  https://arxiv.org/pdf/quant-ph/0410066.pdf.
200
288
  """
201
289
  single_qubit_gates = [gate.astype(complex) for gate in self.params]
290
+ if self.simp_contr[0]:
291
+ return uc_gate.dec_ucg_help(single_qubit_gates, len(self.simp_contr[1]) + 1)
202
292
  return uc_gate.dec_ucg_help(single_qubit_gates, self.num_qubits)
203
293
 
204
294
  @staticmethod
@@ -23,7 +23,7 @@ import numpy as np
23
23
 
24
24
  from qiskit.circuit.gate import Gate
25
25
  from qiskit.circuit.quantumcircuit import QuantumCircuit
26
- from qiskit.circuit.quantumregister import QuantumRegister
26
+ from qiskit.circuit import QuantumRegister
27
27
  from qiskit.exceptions import QiskitError
28
28
 
29
29
  _EPS = 1e-10 # global variable used to chop very small numbers to zero
@@ -23,7 +23,7 @@ from qiskit.circuit.gate import Gate
23
23
  from qiskit.circuit.controlledgate import ControlledGate
24
24
  from qiskit.circuit.annotated_operation import AnnotatedOperation, ControlModifier
25
25
  from qiskit.circuit.quantumcircuit import QuantumCircuit
26
- from qiskit.circuit.quantumregister import QuantumRegister
26
+ from qiskit.circuit import QuantumRegister
27
27
  from qiskit.circuit.exceptions import CircuitError
28
28
  from qiskit.circuit._utils import _compute_control_matrix
29
29
  from qiskit.circuit.library.standard_gates.u import UGate
@@ -45,7 +45,9 @@ class UnitaryGate(Gate):
45
45
  quantum circuit. The matrix can also be directly applied to the quantum
46
46
  circuit, see :meth:`.QuantumCircuit.unitary`.
47
47
 
48
- .. code-block:: python
48
+ .. plot::
49
+ :include-source:
50
+ :nofigs:
49
51
 
50
52
  from qiskit import QuantumCircuit
51
53
  from qiskit.circuit.library import UnitaryGate
@@ -24,7 +24,7 @@ import numpy as np
24
24
  from qiskit import _numpy_compat
25
25
  from qiskit.circuit.gate import Gate
26
26
  from qiskit.circuit.quantumcircuit import QuantumCircuit
27
- from qiskit.circuit.quantumregister import QuantumRegister
27
+ from qiskit.circuit import QuantumRegister
28
28
  from qiskit.circuit.parameterexpression import ParameterExpression
29
29
  from qiskit.circuit.exceptions import CircuitError
30
30
  from qiskit.quantum_info.operators.predicates import matrix_equal
@@ -23,7 +23,7 @@ import numpy as np
23
23
  from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
24
24
  from qiskit.circuit.parameter import Parameter
25
25
  from qiskit.circuit.parametervector import ParameterVector
26
- from qiskit.circuit.quantumregister import QuantumRegister
26
+ from qiskit.circuit import QuantumRegister
27
27
  from qiskit.circuit.quantumcircuit import QuantumCircuit
28
28
  from qiskit.quantum_info import Operator, Pauli, SparsePauliOp
29
29
  from qiskit.quantum_info.operators.base_operator import BaseOperator
@@ -23,7 +23,7 @@ import numpy
23
23
  from qiskit.circuit.gate import Gate
24
24
  from qiskit.circuit.quantumcircuit import QuantumCircuit, ParameterValueType
25
25
  from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
26
- from qiskit.circuit.quantumregister import QuantumRegister
26
+ from qiskit.circuit import QuantumRegister
27
27
  from qiskit.circuit import (
28
28
  Instruction,
29
29
  Parameter,
@@ -19,7 +19,7 @@ import numpy as np
19
19
 
20
20
  from qiskit.circuit.parametervector import ParameterVector
21
21
  from qiskit.circuit.quantumcircuit import QuantumCircuit
22
- from qiskit.circuit.quantumregister import QuantumRegister
22
+ from qiskit.circuit import QuantumRegister
23
23
  from qiskit.quantum_info import SparsePauliOp
24
24
  from qiskit.quantum_info.operators.base_operator import BaseOperator
25
25
 
@@ -132,10 +132,10 @@ def unitary_overlap(
132
132
  :include-source:
133
133
 
134
134
  import numpy as np
135
- from qiskit.circuit.library import EfficientSU2, unitary_overlap
135
+ from qiskit.circuit.library import efficient_su2, unitary_overlap
136
136
 
137
137
  # get two circuit to prepare states of which we compute the overlap
138
- circuit = EfficientSU2(2, reps=1)
138
+ circuit = efficient_su2(2, reps=1)
139
139
  unitary1 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
140
140
  unitary2 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
141
141
 
@@ -20,7 +20,7 @@ import numpy as np
20
20
  from qiskit.circuit.gate import Gate
21
21
  from qiskit.circuit.quantumcircuit import ParameterValueType
22
22
  from qiskit.circuit.parameterexpression import ParameterExpression
23
- from qiskit.quantum_info import Pauli, SparsePauliOp
23
+ from qiskit.quantum_info import Pauli, SparsePauliOp, SparseObservable
24
24
 
25
25
  if TYPE_CHECKING:
26
26
  from qiskit.synthesis.evolution import EvolutionSynthesis
@@ -49,7 +49,9 @@ class PauliEvolutionGate(Gate):
49
49
 
50
50
  **Examples:**
51
51
 
52
- .. code-block:: python
52
+ .. plot::
53
+ :include-source:
54
+ :nofigs:
53
55
 
54
56
  from qiskit.circuit import QuantumCircuit
55
57
  from qiskit.circuit.library import PauliEvolutionGate
@@ -68,7 +70,9 @@ class PauliEvolutionGate(Gate):
68
70
  circuit.append(evo, range(2))
69
71
  print(circuit.draw())
70
72
 
71
- The above will print (note that the ``-0.1`` coefficient is not printed!)::
73
+ The above will print (note that the ``-0.1`` coefficient is not printed!):
74
+
75
+ .. code-block:: text
72
76
 
73
77
  ┌──────────────────────────┐
74
78
  q_0: ┤0 ├
@@ -86,15 +90,19 @@ class PauliEvolutionGate(Gate):
86
90
 
87
91
  def __init__(
88
92
  self,
89
- operator: Pauli | SparsePauliOp | list[Pauli | SparsePauliOp],
93
+ operator: (
94
+ Pauli
95
+ | SparsePauliOp
96
+ | SparseObservable
97
+ | list[Pauli | SparsePauliOp | SparseObservable]
98
+ ),
90
99
  time: ParameterValueType = 1.0,
91
100
  label: str | None = None,
92
101
  synthesis: EvolutionSynthesis | None = None,
93
102
  ) -> None:
94
103
  """
95
104
  Args:
96
- operator (Pauli | SparsePauliOp | list):
97
- The operator to evolve. Can also be provided as list of non-commuting
105
+ operator: The operator to evolve. Can also be provided as list of non-commuting
98
106
  operators where the elements are sums of commuting operators.
99
107
  For example: ``[XY + YX, ZZ + ZI + IZ, YY]``.
100
108
  time: The evolution time.
@@ -106,9 +114,9 @@ class PauliEvolutionGate(Gate):
106
114
  product formula with a single repetition.
107
115
  """
108
116
  if isinstance(operator, list):
109
- operator = [_to_sparse_pauli_op(op) for op in operator]
117
+ operator = [_to_sparse_op(op) for op in operator]
110
118
  else:
111
- operator = _to_sparse_pauli_op(operator)
119
+ operator = _to_sparse_op(operator)
112
120
 
113
121
  if label is None:
114
122
  label = _get_default_label(operator)
@@ -155,32 +163,39 @@ class PauliEvolutionGate(Gate):
155
163
  return super().validate_parameter(parameter)
156
164
 
157
165
 
158
- def _to_sparse_pauli_op(operator):
166
+ def _to_sparse_op(
167
+ operator: Pauli | SparsePauliOp | SparseObservable,
168
+ ) -> SparsePauliOp | SparseObservable:
159
169
  """Cast the operator to a SparsePauliOp."""
160
170
 
161
171
  if isinstance(operator, Pauli):
162
- sparse_pauli = SparsePauliOp(operator)
163
- elif isinstance(operator, SparsePauliOp):
164
- sparse_pauli = operator
172
+ sparse = SparsePauliOp(operator)
173
+ elif isinstance(operator, (SparseObservable, SparsePauliOp)):
174
+ sparse = operator
165
175
  else:
166
176
  raise ValueError(f"Unsupported operator type for evolution: {type(operator)}.")
167
177
 
168
- if any(np.iscomplex(sparse_pauli.coeffs)):
178
+ if any(np.iscomplex(sparse.coeffs)):
169
179
  raise ValueError("Operator contains complex coefficients, which are not supported.")
170
- if any(isinstance(coeff, ParameterExpression) for coeff in sparse_pauli.coeffs):
180
+ if any(isinstance(coeff, ParameterExpression) for coeff in sparse.coeffs):
171
181
  raise ValueError("Operator contains ParameterExpression, which are not supported.")
172
182
 
173
- return sparse_pauli
183
+ return sparse
184
+
185
+
186
+ def _operator_label(operator):
187
+ if isinstance(operator, SparseObservable):
188
+ if len(operator) == 1:
189
+ return operator[0].bit_labels()[::-1]
190
+ return "(" + " + ".join(term.bit_labels()[::-1] for term in operator) + ")"
191
+
192
+ # else: is a SparsePauliOp
193
+ if len(operator.paulis) == 1:
194
+ return operator.paulis.to_labels()[0]
195
+ return "(" + " + ".join(operator.paulis.to_labels()) + ")"
174
196
 
175
197
 
176
198
  def _get_default_label(operator):
177
199
  if isinstance(operator, list):
178
- label = f"exp(-it ({[' + '.join(op.paulis.to_labels()) for op in operator]}))"
179
- else:
180
- if len(operator.paulis) == 1:
181
- label = f"exp(-it {operator.paulis.to_labels()[0]})"
182
- # for just a single Pauli don't add brackets around the sum
183
- else:
184
- label = f"exp(-it ({' + '.join(operator.paulis.to_labels())}))"
185
-
186
- return label
200
+ return f"exp(-it ({[_operator_label(op) for op in operator]}))"
201
+ return f"exp(-it {_operator_label(operator)})"
@@ -12,33 +12,34 @@
12
12
 
13
13
  """Phase Oracle object."""
14
14
 
15
- # Needed to avoid type hints from erroring when `classicalfunction` might not be available.
16
15
  from __future__ import annotations
17
16
 
18
- from typing import Union, Callable, Optional, TYPE_CHECKING
17
+ from qiskit.circuit import QuantumCircuit, Gate
19
18
 
20
- from qiskit.circuit import QuantumCircuit
21
- from qiskit.utils import optionals as _optionals
19
+ from qiskit.synthesis.boolean.boolean_expression import BooleanExpression
22
20
 
23
- if TYPE_CHECKING:
24
- from qiskit.circuit.classicalfunction.boolean_expression import BooleanExpression
25
- from qiskit.circuit.classicalfunction.classical_element import ClassicalElement
26
21
 
27
-
28
- @_optionals.HAS_TWEEDLEDUM.require_in_instance
29
22
  class PhaseOracle(QuantumCircuit):
30
23
  r"""Phase Oracle.
31
24
 
32
25
  The Phase Oracle object constructs circuits for any arbitrary
33
26
  input logical expressions. A logical expression is composed of logical operators
34
- `&` (`AND`), `|` (`OR`), `~` (`NOT`), and `^` (`XOR`).
27
+ `&` (logical `AND`), `|` (logical `OR`),
28
+ `~` (logical `NOT`), and `^` (logical `XOR`).
35
29
  as well as symbols for literals (variables).
36
30
  For example, `'a & b'`, and `(v0 | ~v1) & (~v2 & v3)`
37
31
  are both valid string representation of boolean logical expressions.
38
32
 
33
+ A phase oracle for a boolean function `f(x)` performs the following
34
+ quantum operation:
35
+
36
+ .. math::
37
+
38
+ |x\rangle \mapsto (-1)^{f(x)}|x\rangle
39
+
39
40
  For convenience, this oracle, in addition to parsing arbitrary logical expressions,
40
41
  also supports input strings in the `DIMACS CNF format
41
- <http://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
42
+ <https://web.archive.org/web/20190325181937/https://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
42
43
  which is the standard format for specifying SATisfiability (SAT) problem instances in
43
44
  `Conjunctive Normal Form (CNF) <https://en.wikipedia.org/wiki/Conjunctive_normal_form>`__,
44
45
  which is a conjunction of one or more clauses, where a clause is a disjunction of one
@@ -50,51 +51,21 @@ class PhaseOracle(QuantumCircuit):
50
51
 
51
52
  def __init__(
52
53
  self,
53
- expression: Union[str, ClassicalElement],
54
- synthesizer: Optional[Callable[[BooleanExpression], QuantumCircuit]] = None,
55
- var_order: list = None,
54
+ expression: str,
55
+ var_order: list[str] | None = None,
56
56
  ) -> None:
57
- """Creates a PhaseOracle object
58
-
57
+ """
59
58
  Args:
60
59
  expression: A Python-like boolean expression.
61
- synthesizer: Optional. A function to convert a BooleanExpression into a QuantumCircuit
62
- If None is provided, Tweedledum's `pkrm_synth` with `phase_esop` will be used.
63
- var_order(list): A list with the order in which variables will be created.
60
+ var_order: A list with the order in which variables will be created.
64
61
  (default: by appearance)
65
62
  """
66
- # ignore deprecation warning for BooleanExpression; implementation is changing in 2.0
67
- import warnings
68
-
69
- with warnings.catch_warnings():
70
- warnings.simplefilter("ignore", DeprecationWarning)
71
- from qiskit.circuit.classicalfunction.boolean_expression import BooleanExpression
72
- from qiskit.circuit.classicalfunction.classical_element import ClassicalElement
73
-
74
- if not isinstance(expression, ClassicalElement):
75
- expression = BooleanExpression(expression, var_order=var_order)
76
-
77
- self.boolean_expression = expression
78
-
79
- if synthesizer is None:
80
-
81
- def synthesizer(boolean_expression):
82
- from tweedledum.synthesis import pkrm_synth # pylint: disable=import-error
83
- from qiskit.circuit.classicalfunction.utils import tweedledum2qiskit
63
+ self.boolean_expression = BooleanExpression(expression, var_order=var_order)
64
+ oracle = self.boolean_expression.synth(circuit_type="phase")
84
65
 
85
- truth_table = boolean_expression._tweedledum_bool_expression.truth_table(
86
- output_bit=0
87
- )
88
- tweedledum_circuit = pkrm_synth(
89
- truth_table, {"pkrm_synth": {"phase_esop": True}}
90
- )
91
- return tweedledum2qiskit(tweedledum_circuit)
66
+ super().__init__(oracle.num_qubits, name="Phase Oracle")
92
67
 
93
- oracle = expression.synth(synthesizer=synthesizer)
94
-
95
- super().__init__(oracle.num_qubits, name="Phase Oracle")
96
-
97
- self.compose(oracle, inplace=True, copy=False)
68
+ self.compose(oracle, inplace=True, copy=False)
98
69
 
99
70
  def evaluate_bitstring(self, bitstring: str) -> bool:
100
71
  """Evaluate the oracle on a bitstring.
@@ -114,7 +85,7 @@ class PhaseOracle(QuantumCircuit):
114
85
  r"""Create a PhaseOracle from the string in the DIMACS format.
115
86
 
116
87
  It is possible to build a PhaseOracle from a file in `DIMACS CNF format
117
- <http://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
88
+ <https://web.archive.org/web/20190325181937/https://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
118
89
  which is the standard format for specifying SATisfiability (SAT) problem instances in
119
90
  `Conjunctive Normal Form (CNF) <https://en.wikipedia.org/wiki/Conjunctive_normal_form>`__,
120
91
  which is a conjunction of one or more clauses, where a clause is a disjunction of one
@@ -154,7 +125,115 @@ class PhaseOracle(QuantumCircuit):
154
125
  Returns:
155
126
  PhaseOracle: A quantum circuit with a phase oracle.
156
127
  """
157
- from qiskit.circuit.classicalfunction.boolean_expression import BooleanExpression
128
+ expr = BooleanExpression.from_dimacs_file(filename)
129
+ return cls(expr)
130
+
131
+
132
+ class PhaseOracleGate(Gate):
133
+ r"""Implements a phase oracle.
134
+
135
+ The Phase Oracle Gate object constructs circuits for any arbitrary
136
+ input logical expressions. A logical expression is composed of logical operators
137
+ `&` (logical `AND`), `|` (logical `OR`),
138
+ `~` (logical `NOT`), and `^` (logical `XOR`).
139
+ as well as symbols for literals (variables).
140
+ For example, `'a & b'`, and `(v0 | ~v1) & (~v2 & v3)`
141
+ are both valid string representation of boolean logical expressions.
142
+
143
+ A phase oracle for a boolean function `f(x)` performs the following
144
+ quantum operation:
145
+
146
+ .. math::
147
+
148
+ |x\rangle \mapsto (-1)^{f(x)}|x\rangle
149
+
150
+ For convenience, this oracle, in addition to parsing arbitrary logical expressions,
151
+ also supports input strings in the `DIMACS CNF format
152
+ <https://web.archive.org/web/20190325181937/https://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
153
+ which is the standard format for specifying SATisfiability (SAT) problem instances in
154
+ `Conjunctive Normal Form (CNF) <https://en.wikipedia.org/wiki/Conjunctive_normal_form>`__,
155
+ which is a conjunction of one or more clauses, where a clause is a disjunction of one
156
+ or more literals. See :meth:`qiskit.circuit.library.phase_oracle.PhaseOracleGate.from_dimacs_file`.
157
+
158
+ From 16 variables on, possible performance issues should be expected when using the
159
+ default synthesizer.
160
+ """
161
+
162
+ def __init__(
163
+ self,
164
+ expression: str,
165
+ var_order: list[str] | None = None,
166
+ label: str | None = None,
167
+ ) -> None:
168
+ """
169
+ Args:
170
+ expression: A Python-like boolean expression.
171
+ var_order: A list with the order in which variables will be created.
172
+ (default: by appearance)
173
+ label: A label for the gate to display in visualizations. Per default, the label is
174
+ set to display the textual represntation of the boolean expression (truncated if needed)
175
+ """
176
+ self.boolean_expression = BooleanExpression(expression, var_order=var_order)
158
177
 
178
+ if label is None:
179
+ short_expr_for_name = (expression[:15] + "...") if len(expression) > 15 else expression
180
+ label = short_expr_for_name
181
+
182
+ super().__init__(
183
+ name="Phase Oracle",
184
+ num_qubits=self.boolean_expression.num_bits,
185
+ params=[],
186
+ label=label,
187
+ )
188
+
189
+ def _define(self):
190
+ """Defined by the synthesized phase oracle"""
191
+ self.definition = self.boolean_expression.synth(circuit_type="phase")
192
+
193
+ @classmethod
194
+ def from_dimacs_file(cls, filename: str) -> PhaseOracleGate:
195
+ r"""Create a PhaseOracle from the string in the DIMACS format.
196
+
197
+ It is possible to build a PhaseOracle from a file in `DIMACS CNF format
198
+ <https://web.archive.org/web/20190325181937/https://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
199
+ which is the standard format for specifying SATisfiability (SAT) problem instances in
200
+ `Conjunctive Normal Form (CNF) <https://en.wikipedia.org/wiki/Conjunctive_normal_form>`__,
201
+ which is a conjunction of one or more clauses, where a clause is a disjunction of one
202
+ or more literals.
203
+
204
+ The following is an example of a CNF expressed in the DIMACS format:
205
+
206
+ .. code:: text
207
+
208
+ c DIMACS CNF file with 3 satisfying assignments: 1 -2 3, -1 -2 -3, 1 2 -3.
209
+ p cnf 3 5
210
+ -1 -2 -3 0
211
+ 1 -2 3 0
212
+ 1 2 -3 0
213
+ 1 -2 -3 0
214
+ -1 2 3 0
215
+
216
+ The first line, following the `c` character, is a comment. The second line specifies that
217
+ the CNF is over three boolean variables --- let us call them :math:`x_1, x_2, x_3`, and
218
+ contains five clauses. The five clauses, listed afterwards, are implicitly joined by the
219
+ logical `AND` operator, :math:`\land`, while the variables in each clause, represented by
220
+ their indices, are implicitly disjoined by the logical `OR` operator, :math:`\lor`. The
221
+ :math:`-` symbol preceding a boolean variable index corresponds to the logical `NOT`
222
+ operator, :math:`\lnot`. Character `0` (zero) marks the end of each clause. Essentially,
223
+ the code above corresponds to the following CNF:
224
+
225
+ :math:`(\lnot x_1 \lor \lnot x_2 \lor \lnot x_3)
226
+ \land (x_1 \lor \lnot x_2 \lor x_3)
227
+ \land (x_1 \lor x_2 \lor \lnot x_3)
228
+ \land (x_1 \lor \lnot x_2 \lor \lnot x_3)
229
+ \land (\lnot x_1 \lor x_2 \lor x_3)`.
230
+
231
+
232
+ Args:
233
+ filename: A file in DIMACS format.
234
+
235
+ Returns:
236
+ PhaseOracleGate: A quantum circuit with a phase oracle.
237
+ """
159
238
  expr = BooleanExpression.from_dimacs_file(filename)
160
239
  return cls(expr)
@@ -43,7 +43,6 @@ from .x import MCXGate, MCXGrayCode, MCXRecursive, MCXVChain
43
43
  from .y import YGate, CYGate
44
44
  from .z import ZGate, CZGate, CCZGate
45
45
  from .global_phase import GlobalPhaseGate
46
- from .multi_control_rotation_gates import mcrx, mcry, mcrz
47
46
 
48
47
 
49
48
  def get_standard_gate_name_mapping():
@@ -13,7 +13,6 @@
13
13
  """Double-CNOT gate."""
14
14
 
15
15
  from qiskit.circuit.singleton import SingletonGate, stdlib_singleton_key
16
- from qiskit.circuit.quantumregister import QuantumRegister
17
16
  from qiskit.circuit._utils import with_gate_array
18
17
  from qiskit._accelerate.circuit import StandardGate
19
18
 
@@ -52,9 +51,9 @@ class DCXGate(SingletonGate):
52
51
 
53
52
  _standard_gate = StandardGate.DCXGate
54
53
 
55
- def __init__(self, label=None, *, duration=None, unit="dt"):
54
+ def __init__(self, label=None):
56
55
  """Create new DCX gate."""
57
- super().__init__("dcx", 2, [], label=label, duration=duration, unit=unit)
56
+ super().__init__("dcx", 2, [], label=label)
58
57
 
59
58
  _singleton_lookup_key = stdlib_singleton_key()
60
59
 
@@ -63,7 +62,7 @@ class DCXGate(SingletonGate):
63
62
  gate dcx a, b { cx a, b; cx b, a; }
64
63
  """
65
64
  # pylint: disable=cyclic-import
66
- from qiskit.circuit.quantumcircuit import QuantumCircuit
65
+ from qiskit.circuit import QuantumCircuit, QuantumRegister
67
66
  from .x import CXGate
68
67
 
69
68
  q = QuantumRegister(2, "q")