qiskit 1.4.0__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +248 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +7 -140
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +34 -5
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +2 -6
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +4 -0
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +168 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +5 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +1 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +67 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +27 -12
  291. qiskit/visualization/timeline/interface.py +23 -18
  292. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
  295. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,112 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Integer comparator based on 2s complement."""
14
+
15
+ import math
16
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
17
+ from qiskit.circuit.library.boolean_logic.quantum_or import OrGate
18
+
19
+
20
+ def synth_integer_comparator_2s(
21
+ num_state_qubits: int, value: int, geq: bool = True
22
+ ) -> QuantumCircuit:
23
+ r"""Implement an integer comparison based on 2s complement.
24
+
25
+ This is based on Appendix B of [1].
26
+
27
+ Args:
28
+ num_state_qubits: The number of qubits encoding the value to compare to.
29
+ value: The value to compare to.
30
+ geq: If ``True`` flip the target bit if the qubit state is :math:`\geq` than the value,
31
+ otherwise implement :math:`<`.
32
+
33
+ Returns:
34
+ A circuit implementing the integer comparator.
35
+
36
+ References:
37
+
38
+ [1] J. Gacon et al. "Quantum-enhanced simulation-based optimization"
39
+ `arXiv:2005.10780 <https://arxiv.org/abs/2005.10780>`__.
40
+ """
41
+ circuit = QuantumCircuit(2 * num_state_qubits)
42
+ qr_state = circuit.qubits[:num_state_qubits]
43
+ q_compare = circuit.qubits[num_state_qubits]
44
+ qr_ancilla = circuit.qubits[num_state_qubits + 1 :]
45
+
46
+ if value <= 0: # condition always satisfied for non-positive values
47
+ if geq: # otherwise the condition is never satisfied
48
+ circuit.x(q_compare)
49
+ # condition never satisfied for values larger than or equal to 2^n
50
+ elif value < pow(2, num_state_qubits):
51
+
52
+ if num_state_qubits > 1:
53
+ twos = _get_twos_complement(num_state_qubits, value)
54
+ for i in range(num_state_qubits):
55
+ if i == 0:
56
+ if twos[i] == 1:
57
+ circuit.cx(qr_state[i], qr_ancilla[i])
58
+ elif i < num_state_qubits - 1:
59
+ if twos[i] == 1:
60
+ circuit.append(OrGate(2), [qr_state[i], qr_ancilla[i - 1], qr_ancilla[i]])
61
+ else:
62
+ circuit.ccx(qr_state[i], qr_ancilla[i - 1], qr_ancilla[i])
63
+ else:
64
+ if twos[i] == 1:
65
+ # OR needs the result argument as qubit not register, thus
66
+ # access the index [0]
67
+ circuit.append(OrGate(2), [qr_state[i], qr_ancilla[i - 1], q_compare])
68
+ else:
69
+ circuit.ccx(qr_state[i], qr_ancilla[i - 1], q_compare)
70
+
71
+ # flip result bit if geq flag is false
72
+ if not geq:
73
+ circuit.x(q_compare)
74
+
75
+ # uncompute ancillas state
76
+ for i in reversed(range(num_state_qubits - 1)):
77
+ if i == 0:
78
+ if twos[i] == 1:
79
+ circuit.cx(qr_state[i], qr_ancilla[i])
80
+ else:
81
+ if twos[i] == 1:
82
+ circuit.append(OrGate(2), [qr_state[i], qr_ancilla[i - 1], qr_ancilla[i]])
83
+ else:
84
+ circuit.ccx(qr_state[i], qr_ancilla[i - 1], qr_ancilla[i])
85
+ else:
86
+
87
+ # num_state_qubits == 1 and value == 1:
88
+ circuit.cx(qr_state[0], q_compare)
89
+
90
+ # flip result bit if geq flag is false
91
+ if not geq:
92
+ circuit.x(q_compare)
93
+
94
+ else:
95
+ if not geq: # otherwise the condition is never satisfied
96
+ circuit.x(q_compare)
97
+
98
+ return circuit
99
+
100
+
101
+ def _get_twos_complement(num_bits: int, value: int) -> list[int]:
102
+ """Returns the 2's complement of ``self.value`` as array.
103
+
104
+ Returns:
105
+ The 2's complement of ``self.value``.
106
+ """
107
+ twos_complement = pow(2, num_bits) - math.ceil(value)
108
+ twos_complement = f"{twos_complement:b}".rjust(num_bits, "0")
109
+ twos_complement = [
110
+ 1 if twos_complement[i] == "1" else 0 for i in reversed(range(len(twos_complement)))
111
+ ]
112
+ return twos_complement
@@ -0,0 +1,66 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Integer comparator based on an exponential number of multi-controlled gates."""
14
+
15
+ import numpy as np
16
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
17
+
18
+
19
+ def synth_integer_comparator_greedy(
20
+ num_state_qubits: int, value: int, geq: bool = True
21
+ ) -> QuantumCircuit:
22
+ r"""Implement an integer comparison based on value-by-value comparison.
23
+
24
+ For ``value`` smaller than ``2 ** (num_state_qubits - 1)`` this circuit implements
25
+ ``value`` multi-controlled gates with control states 0, 1, ..., ``value - 1``, such that
26
+ the target qubit is flipped if the qubit state represents any of the allowed values.
27
+ For ``value`` larger than that, ``geq`` is flipped. This implementation can
28
+ require an exponential number of gates. If auxiliary qubits are available, the implementation
29
+ provided by :func:`.synth_integer_comparator_2s` is more efficient.
30
+
31
+ Args:
32
+ num_state_qubits: The number of qubits encoding the value to compare to.
33
+ value: The value to compare to.
34
+ geq: If ``True`` flip the target bit if the qubit state is :math:`\geq` than the value,
35
+ otherwise implement :math:`<`.
36
+
37
+ Returns:
38
+ A circuit implementing the integer comparator.
39
+
40
+ """
41
+ circuit = QuantumCircuit(num_state_qubits + 1)
42
+
43
+ if value <= 0: # condition always satisfied for non-positive values
44
+ if geq: # otherwise the condition is never satisfied
45
+ circuit.x(num_state_qubits)
46
+
47
+ return circuit
48
+
49
+ # make sure to always choose the comparison where we have to place less than
50
+ # (2 ** n)/2 MCX gates
51
+ value = int(np.ceil(value))
52
+ if (value < 2 ** (num_state_qubits - 1) and geq) or (
53
+ value > 2 ** (num_state_qubits - 1) and not geq
54
+ ):
55
+ geq = not geq
56
+ circuit.x(num_state_qubits)
57
+
58
+ if geq:
59
+ accepted_values = range(value, 2**num_state_qubits)
60
+ else:
61
+ accepted_values = range(0, value)
62
+
63
+ for accepted_value in accepted_values:
64
+ circuit.mcx(list(range(num_state_qubits)), num_state_qubits, ctrl_state=accepted_value)
65
+
66
+ return circuit
@@ -15,7 +15,7 @@
15
15
  from __future__ import annotations
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
 
20
20
 
21
21
  def multiplier_cumulative_h18(
@@ -17,7 +17,7 @@ from __future__ import annotations
17
17
  import numpy as np
18
18
 
19
19
  from qiskit.circuit.quantumcircuit import QuantumCircuit
20
- from qiskit.circuit.quantumregister import QuantumRegister
20
+ from qiskit.circuit import QuantumRegister
21
21
  from qiskit.circuit.library.standard_gates import PhaseGate
22
22
  from qiskit.circuit.library.basis_change import QFTGate
23
23
 
@@ -0,0 +1,155 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2025.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Implement a integer-weighted sum over a set of qubits."""
14
+
15
+ from __future__ import annotations
16
+
17
+ import typing
18
+ import numpy as np
19
+ from qiskit.circuit.quantumcircuit import QuantumCircuit, QuantumRegister, AncillaRegister
20
+ from qiskit.synthesis.multi_controlled import synth_mcx_n_clean_m15
21
+
22
+ if typing.TYPE_CHECKING:
23
+ from qiskit.circuit.library import WeightedSumGate
24
+
25
+
26
+ def synth_weighted_sum_carry(weighted_sum: WeightedSumGate) -> QuantumCircuit:
27
+ """Synthesize a weighted sum gate, by the number of state qubits and the qubit weights.
28
+
29
+ This method is described in Appendix A of [1].
30
+
31
+ Reference:
32
+
33
+ [1] Stamatopoulos et al. Option Pricing using Quantum Computers (2020)
34
+ `Quantum 4, 291 <https://doi.org/10.22331/q-2020-07-06-291>`__
35
+ """
36
+
37
+ num_sum_qubits = weighted_sum.num_sum_qubits
38
+ num_state_qubits = weighted_sum.num_qubits - num_sum_qubits
39
+
40
+ num_carry_qubits = num_sum_qubits - 1
41
+ num_control_qubits = int(num_sum_qubits > 2)
42
+
43
+ qr_state = QuantumRegister(num_state_qubits, "state")
44
+ qr_sum = QuantumRegister(num_sum_qubits, "sum")
45
+ qr_carry = AncillaRegister(num_carry_qubits, "carry")
46
+ qr_control = AncillaRegister(num_control_qubits, "control")
47
+ circuit = QuantumCircuit(qr_state, qr_sum, qr_carry, qr_control)
48
+
49
+ # we use a MCX v-chain decomposition of C3X here, synthesize it once and re-use
50
+ c3x = synth_mcx_n_clean_m15(3)
51
+
52
+ # loop over state qubits and corresponding weights
53
+ weights = weighted_sum.params
54
+ for i, weight in enumerate(weights):
55
+ # only act if non-trivial weight
56
+ if np.isclose(weight, 0):
57
+ continue
58
+
59
+ # get state control qubit
60
+ q_state = qr_state[i]
61
+
62
+ # get bit representation of current weight
63
+ weight_binary = f"{int(weight):b}".rjust(num_sum_qubits, "0")[::-1]
64
+
65
+ # loop over bits of current weight and add them to sum and carry registers
66
+ for j, bit in enumerate(weight_binary):
67
+ if bit == "1":
68
+ if num_sum_qubits == 1:
69
+ circuit.cx(q_state, qr_sum[j])
70
+ elif j == 0:
71
+ # compute (q_sum[0] + 1) into (q_sum[0], q_carry[0])
72
+ # - controlled by q_state[i]
73
+ circuit.ccx(q_state, qr_sum[j], qr_carry[j])
74
+ circuit.cx(q_state, qr_sum[j])
75
+ elif j == num_sum_qubits - 1:
76
+ # compute (q_sum[j] + q_carry[j-1] + 1) into (q_sum[j])
77
+ # - controlled by q_state[i] / last qubit,
78
+ # no carry needed by construction
79
+ circuit.cx(q_state, qr_sum[j])
80
+ circuit.ccx(q_state, qr_carry[j - 1], qr_sum[j])
81
+ else:
82
+ # compute (q_sum[j] + q_carry[j-1] + 1) into (q_sum[j], q_carry[j])
83
+ # - controlled by q_state[i]
84
+ circuit.x(qr_sum[j])
85
+ circuit.x(qr_carry[j - 1])
86
+ circuit.compose(
87
+ c3x,
88
+ [q_state, qr_sum[j], qr_carry[j - 1], qr_carry[j]] + qr_control[:],
89
+ inplace=True,
90
+ )
91
+ circuit.cx(q_state, qr_carry[j])
92
+ circuit.x(qr_sum[j])
93
+ circuit.x(qr_carry[j - 1])
94
+ circuit.cx(q_state, qr_sum[j])
95
+ circuit.ccx(q_state, qr_carry[j - 1], qr_sum[j])
96
+ else:
97
+ if num_sum_qubits == 1:
98
+ pass # nothing to do, since nothing to add
99
+ elif j == 0:
100
+ pass # nothing to do, since nothing to add
101
+ elif j == num_sum_qubits - 1:
102
+ # compute (q_sum[j] + q_carry[j-1]) into (q_sum[j])
103
+ # - controlled by q_state[i] / last qubit,
104
+ # no carry needed by construction
105
+ circuit.ccx(q_state, qr_carry[j - 1], qr_sum[j])
106
+ else:
107
+ # compute (q_sum[j] + q_carry[j-1]) into (q_sum[j], q_carry[j])
108
+ # - controlled by q_state[i]
109
+ circuit.compose(
110
+ c3x,
111
+ [q_state, qr_sum[j], qr_carry[j - 1], qr_carry[j]] + qr_control[:],
112
+ inplace=True,
113
+ )
114
+ circuit.ccx(q_state, qr_carry[j - 1], qr_sum[j])
115
+
116
+ # uncompute carry qubits
117
+ for j in reversed(range(len(weight_binary))):
118
+ bit = weight_binary[j]
119
+ if bit == "1":
120
+ if num_sum_qubits == 1:
121
+ pass
122
+ elif j == 0:
123
+ circuit.x(qr_sum[j])
124
+ circuit.ccx(q_state, qr_sum[j], qr_carry[j])
125
+ circuit.x(qr_sum[j])
126
+ elif j == num_sum_qubits - 1:
127
+ pass
128
+ else:
129
+ circuit.x(qr_carry[j - 1])
130
+ circuit.compose(
131
+ c3x,
132
+ [q_state, qr_sum[j], qr_carry[j - 1], qr_carry[j]] + qr_control[:],
133
+ inplace=True,
134
+ )
135
+ circuit.cx(q_state, qr_carry[j])
136
+ circuit.x(qr_carry[j - 1])
137
+ else:
138
+ if num_sum_qubits == 1:
139
+ pass
140
+ elif j == 0:
141
+ pass
142
+ elif j == num_sum_qubits - 1:
143
+ pass
144
+ else:
145
+ # compute (q_sum[j] + q_carry[j-1]) into (q_sum[j], q_carry[j])
146
+ # - controlled by q_state[i]
147
+ circuit.x(qr_sum[j])
148
+ circuit.compose(
149
+ c3x,
150
+ [q_state, qr_sum[j], qr_carry[j - 1], qr_carry[j]] + qr_control[:],
151
+ inplace=True,
152
+ )
153
+ circuit.x(qr_sum[j])
154
+
155
+ return circuit
@@ -1,6 +1,6 @@
1
1
  # This code is part of Qiskit.
2
2
  #
3
- # (C) Copyright IBM 2017, 2021.
3
+ # (C) Copyright IBM 2025.
4
4
  #
5
5
  # This code is licensed under the Apache License, Version 2.0. You may
6
6
  # obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -10,4 +10,4 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
 
13
- """Readout error mitigation."""
13
+ """Module containing boolean expression synthesis."""
@@ -0,0 +1,231 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """A class for parsing and synthesizing boolean expressions"""
14
+
15
+ import ast
16
+ import itertools
17
+ import re
18
+ from os.path import isfile
19
+ from typing import Union, Callable
20
+ import numpy as np
21
+
22
+ from .boolean_expression_visitor import (
23
+ BooleanExpressionEvalVisitor,
24
+ BooleanExpressionArgsCollectorVisitor,
25
+ )
26
+
27
+
28
+ class TruthTable:
29
+ """A simple implementation of a truth table for a boolean function
30
+
31
+ The truth table is built from a callable which takes an assignment, which
32
+ is a tuple of boolean values of a fixed given length (the number of bits
33
+ of the truth table) and returns a boolean value.
34
+
35
+ For a number of bits at most `EXPLICIT_REP_THRESHOLD` the values of the table
36
+ are explicitly computed and stored. Otherwise, the values are computed on the fly
37
+ and stored in a dictionary."""
38
+
39
+ EXPLICIT_REP_THRESHOLD = (
40
+ 12 # above this number of bits, do not explicitly save the values in a list
41
+ )
42
+
43
+ def __init__(self, func: Callable, num_bits: int):
44
+ self.func = func
45
+ self.num_bits = num_bits
46
+ self.explicit_storage = self.num_bits <= self.EXPLICIT_REP_THRESHOLD
47
+ if self.explicit_storage:
48
+ self.values = np.array(
49
+ [self.func(assignment) for assignment in self.all_assignments()],
50
+ dtype=bool,
51
+ )
52
+ else:
53
+ self.implicit_values = {}
54
+
55
+ def all_assignments(self) -> list[tuple[bool]]:
56
+ """Return an ordered list of all assignments, ordered from right to left
57
+ i.e. 000, 100, 010, 110, 001, 101, 011, 111"""
58
+ return [
59
+ tuple(reversed(assignment))
60
+ for assignment in itertools.product([False, True], repeat=self.num_bits)
61
+ ]
62
+
63
+ def __getitem__(self, key: Union[str, tuple[bool]]) -> bool:
64
+ if isinstance(key, str):
65
+ key = (bit != "0" for bit in key)
66
+ if self.explicit_storage:
67
+ key = sum(2**n for n, bit in enumerate(key) if bit)
68
+ return self.values[key]
69
+ else:
70
+ return self.implicit_values.setdefault(key, self.func(key))
71
+
72
+ def __str__(self) -> str:
73
+ if self.explicit_storage:
74
+ return "".join(
75
+ "1" if self[assignemnt] else "0" for assignemnt in self.all_assignments()
76
+ )
77
+ else:
78
+ return f"Truth table on {self.num_bits} bits (implicit representation)"
79
+
80
+
81
+ class BooleanExpression:
82
+ """A Boolean Expression"""
83
+
84
+ def __init__(self, expression: str, var_order: list = None) -> None:
85
+ """
86
+ Args:
87
+ expression (str): The logical expression string.
88
+ name (str): Optional. Instruction gate name. Otherwise part of the expression is
89
+ going to be used.
90
+ var_order(list): A list with the order in which variables will be created.
91
+ (default: by appearance)
92
+ """
93
+ self.expression = expression
94
+ self.expression_ast = ast.parse(expression)
95
+ args_collector = BooleanExpressionArgsCollectorVisitor()
96
+ args_collector.visit(self.expression_ast)
97
+ self.args = args_collector.get_sorted_args()
98
+ self.num_bits = len(self.args)
99
+ if var_order is not None:
100
+ missing_args = set(self.args) - set(var_order)
101
+ if len(missing_args) > 0:
102
+ raise ValueError(f"var_order missing the variable(s) {', '.join(missing_args)}")
103
+ self.args.sort(key=var_order.index)
104
+ self.truth_table_ = None
105
+
106
+ def simulate(self, bitstring: Union[str, tuple]) -> bool:
107
+ """Evaluate the expression on a bitstring.
108
+
109
+ This evaluation is done classically.
110
+
111
+ Args:
112
+ bitstring: The bitstring for which to evaluate,
113
+ either as a string of 0 and 1 or a tuple of booleans.
114
+
115
+ Returns:
116
+ bool: result of the evaluation.
117
+ """
118
+ if self.num_bits != len(bitstring):
119
+ raise ValueError(
120
+ f"bitstring length differs from the number of variables "
121
+ f"({len(bitstring)} != {self.num_bits}"
122
+ )
123
+ if isinstance(bitstring, str):
124
+ bitstring = (bit != "0" for bit in bitstring)
125
+ eval_visitor = BooleanExpressionEvalVisitor()
126
+ eval_visitor.arg_values = dict(zip(self.args, bitstring))
127
+ return eval_visitor.visit(self.expression_ast)
128
+
129
+ @property
130
+ def truth_table(self) -> dict:
131
+ """Generates the full truth table for the expression
132
+ Returns:
133
+ dict: A dictionary mapping boolean assignments to the boolean result
134
+ """
135
+ if self.truth_table_ is None:
136
+ self.truth_table_ = TruthTable(self.simulate, self.num_bits)
137
+ return self.truth_table_
138
+
139
+ def synth(self, circuit_type: str = "bit"):
140
+ r"""Synthesize the logic network into a :class:`~qiskit.circuit.QuantumCircuit`.
141
+ There are two common types of circuits for a boolean function :math:`f(x)`:
142
+
143
+ 1. **Bit-flip oracles** which compute:
144
+
145
+ .. math::
146
+
147
+ |x\rangle|y\rangle |-> |x\rangle|f(x)\oplusy\rangle
148
+
149
+ 2. **Phase-flip** oracles which compute:
150
+
151
+ .. math::
152
+
153
+ |x\rangle |-> (-1)^{f(x)}|x\rangle
154
+
155
+ By default the bit-flip oracle is generated.
156
+
157
+ Args:
158
+ circuit_type: which type of oracle to create, 'bit' or 'phase' flip oracle.
159
+ Returns:
160
+ QuantumCircuit: A circuit implementing the logic network.
161
+ Raises:
162
+ ValueError: If ``circuit_type`` is not either 'bit' or 'phase'.
163
+ """
164
+ # pylint: disable=cyclic-import
165
+ from .boolean_expression_synth import (
166
+ synth_bit_oracle_from_esop,
167
+ synth_phase_oracle_from_esop,
168
+ EsopGenerator,
169
+ ) # import here to avoid cyclic import
170
+
171
+ # generating the esop currntly requires generating the full truth table
172
+ # there are many optimizations that can be done to improve this step
173
+ esop = EsopGenerator(self.truth_table).esop
174
+ if circuit_type == "bit":
175
+ return synth_bit_oracle_from_esop(esop, self.num_bits + 1)
176
+ if circuit_type == "phase":
177
+ return synth_phase_oracle_from_esop(esop, self.num_bits)
178
+ raise ValueError("'circuit_type' must be either 'bit' or 'phase'")
179
+
180
+ @staticmethod
181
+ def from_dimacs(dimacs: str):
182
+ """Create a BooleanExpression from a string in the DIMACS format.
183
+ Args:
184
+ dimacs : A string in DIMACS format.
185
+
186
+ Returns:
187
+ BooleanExpression: A gate for the input string
188
+
189
+ Raises:
190
+ ValueError: If the string is not formatted according to DIMACS rules
191
+ """
192
+ header_regex = re.compile(r"p\s+cnf\s+(\d+)\s+(\d+)")
193
+ clause_regex = re.compile(r"(-?\d+)")
194
+ lines = [
195
+ line for line in dimacs.split("\n") if not line.startswith("c") and line != ""
196
+ ] # DIMACS comment line start with c
197
+ header_match = header_regex.match(lines[0])
198
+ if not header_match:
199
+ raise ValueError("First line must start with 'p cnf'")
200
+ num_vars, _ = map(int, header_match.groups())
201
+ variables = [f"x{i+1}" for i in range(num_vars)]
202
+ clauses = []
203
+ for line in lines[1:]:
204
+ literals = clause_regex.findall(line)
205
+ if len(literals) == 0 or literals[-1] != "0":
206
+ continue
207
+ clauses.append([int(c) for c in literals[:-1]])
208
+ clause_strings = [
209
+ " | ".join([f'{"~" if lit < 0 else ""}{variables[abs(lit)-1]}' for lit in clause])
210
+ for clause in clauses
211
+ ]
212
+ expr = " & ".join([f"({c})" for c in clause_strings])
213
+ return BooleanExpression(expr, var_order=variables)
214
+
215
+ @staticmethod
216
+ def from_dimacs_file(filename: str):
217
+ """Create a BooleanExpression from a file in the DIMACS format.
218
+ Args:
219
+ filename: A file in DIMACS format.
220
+
221
+ Returns:
222
+ BooleanExpression: A gate for the input string
223
+
224
+ Raises:
225
+ FileNotFoundError: If filename is not found.
226
+ """
227
+ if not isfile(filename):
228
+ raise FileNotFoundError(f"The file {filename} does not exists.")
229
+ with open(filename, "r") as dimacs_file:
230
+ dimacs = dimacs_file.read()
231
+ return BooleanExpression.from_dimacs(dimacs)