qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__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 (459) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +7 -1
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/compiler/__init__.py +1 -7
  104. qiskit/compiler/transpiler.py +38 -196
  105. qiskit/converters/circuit_to_dag.py +6 -4
  106. qiskit/converters/circuit_to_dagdependency.py +0 -2
  107. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  108. qiskit/converters/circuit_to_gate.py +1 -1
  109. qiskit/converters/circuit_to_instruction.py +16 -29
  110. qiskit/converters/dag_to_circuit.py +7 -8
  111. qiskit/converters/dag_to_dagdependency.py +0 -1
  112. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  113. qiskit/converters/dagdependency_to_circuit.py +0 -6
  114. qiskit/converters/dagdependency_to_dag.py +0 -6
  115. qiskit/dagcircuit/collect_blocks.py +32 -20
  116. qiskit/dagcircuit/dagdependency.py +3 -37
  117. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  118. qiskit/dagcircuit/dagnode.py +14 -2
  119. qiskit/passmanager/__init__.py +24 -6
  120. qiskit/passmanager/passmanager.py +26 -24
  121. qiskit/primitives/__init__.py +44 -35
  122. qiskit/primitives/backend_estimator_v2.py +102 -23
  123. qiskit/primitives/backend_sampler_v2.py +5 -20
  124. qiskit/primitives/base/__init__.py +4 -4
  125. qiskit/primitives/base/base_estimator.py +77 -82
  126. qiskit/primitives/base/base_primitive_job.py +2 -2
  127. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  128. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  129. qiskit/primitives/base/base_sampler.py +52 -60
  130. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  131. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  132. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  133. qiskit/primitives/containers/bindings_array.py +3 -1
  134. qiskit/primitives/containers/bit_array.py +23 -0
  135. qiskit/primitives/containers/data_bin.py +3 -1
  136. qiskit/primitives/containers/observables_array.py +19 -2
  137. qiskit/primitives/statevector_sampler.py +6 -8
  138. qiskit/primitives/utils.py +14 -189
  139. qiskit/providers/__init__.py +4 -130
  140. qiskit/providers/backend.py +11 -314
  141. qiskit/providers/basic_provider/__init__.py +3 -1
  142. qiskit/providers/basic_provider/basic_provider.py +29 -9
  143. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  144. qiskit/providers/exceptions.py +0 -33
  145. qiskit/providers/fake_provider/__init__.py +0 -37
  146. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  147. qiskit/qasm2/__init__.py +21 -6
  148. qiskit/qasm2/export.py +2 -10
  149. qiskit/qasm2/parse.py +11 -25
  150. qiskit/qasm3/__init__.py +5 -1
  151. qiskit/qasm3/ast.py +44 -0
  152. qiskit/qasm3/exporter.py +65 -27
  153. qiskit/qasm3/printer.py +35 -4
  154. qiskit/qpy/__init__.py +162 -19
  155. qiskit/qpy/binary_io/__init__.py +0 -1
  156. qiskit/qpy/binary_io/circuits.py +98 -130
  157. qiskit/qpy/binary_io/schedules.py +69 -439
  158. qiskit/qpy/binary_io/value.py +154 -31
  159. qiskit/qpy/common.py +10 -7
  160. qiskit/qpy/formats.py +41 -0
  161. qiskit/qpy/interface.py +34 -81
  162. qiskit/qpy/type_keys.py +58 -221
  163. qiskit/quantum_info/analysis/distance.py +3 -1
  164. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  165. qiskit/quantum_info/operators/operator.py +6 -2
  166. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  167. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  168. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  169. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  170. qiskit/quantum_info/states/densitymatrix.py +16 -6
  171. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  172. qiskit/quantum_info/states/statevector.py +16 -6
  173. qiskit/result/__init__.py +5 -17
  174. qiskit/result/models.py +18 -11
  175. qiskit/result/result.py +38 -134
  176. qiskit/result/sampled_expval.py +1 -2
  177. qiskit/result/utils.py +3 -4
  178. qiskit/synthesis/__init__.py +21 -1
  179. qiskit/synthesis/arithmetic/__init__.py +3 -1
  180. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  182. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  183. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  184. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  185. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  186. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  188. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  189. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  190. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  191. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  192. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -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 +4 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  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 +3 -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 +2 -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 +32 -4
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  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 +134 -62
  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 +107 -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 +78 -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/counts_visualization.py +4 -0
  287. qiskit/visualization/dag_visualization.py +2 -1
  288. qiskit/visualization/gate_map.py +39 -154
  289. qiskit/visualization/library.py +4 -1
  290. qiskit/visualization/pass_manager_visualization.py +6 -2
  291. qiskit/visualization/state_visualization.py +19 -2
  292. qiskit/visualization/timeline/core.py +19 -13
  293. qiskit/visualization/timeline/interface.py +19 -18
  294. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  295. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  296. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
  297. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  298. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  299. qiskit/assembler/__init__.py +0 -42
  300. qiskit/assembler/assemble_circuits.py +0 -451
  301. qiskit/assembler/assemble_schedules.py +0 -367
  302. qiskit/assembler/disassemble.py +0 -310
  303. qiskit/assembler/run_config.py +0 -77
  304. qiskit/circuit/bit.py +0 -106
  305. qiskit/circuit/classicalfunction/__init__.py +0 -152
  306. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  307. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  308. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  309. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  310. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  311. qiskit/circuit/classicalfunction/types.py +0 -18
  312. qiskit/circuit/classicalfunction/utils.py +0 -91
  313. qiskit/circuit/classicalregister.py +0 -57
  314. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  315. qiskit/circuit/quantumregister.py +0 -75
  316. qiskit/circuit/register.py +0 -246
  317. qiskit/compiler/assembler.py +0 -689
  318. qiskit/compiler/scheduler.py +0 -109
  319. qiskit/compiler/sequencer.py +0 -71
  320. qiskit/primitives/backend_estimator.py +0 -486
  321. qiskit/primitives/backend_sampler.py +0 -222
  322. qiskit/primitives/estimator.py +0 -172
  323. qiskit/primitives/sampler.py +0 -162
  324. qiskit/providers/backend_compat.py +0 -507
  325. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  340. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/fake_1q.py +0 -91
  349. qiskit/providers/fake_provider/fake_backend.py +0 -165
  350. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  351. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  352. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  353. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  354. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  355. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  356. qiskit/providers/models/__init__.py +0 -89
  357. qiskit/providers/models/backendconfiguration.py +0 -1040
  358. qiskit/providers/models/backendproperties.py +0 -535
  359. qiskit/providers/models/backendstatus.py +0 -104
  360. qiskit/providers/models/jobstatus.py +0 -77
  361. qiskit/providers/models/pulsedefaults.py +0 -305
  362. qiskit/providers/provider.py +0 -95
  363. qiskit/pulse/__init__.py +0 -158
  364. qiskit/pulse/builder.py +0 -2262
  365. qiskit/pulse/calibration_entries.py +0 -381
  366. qiskit/pulse/channels.py +0 -227
  367. qiskit/pulse/configuration.py +0 -245
  368. qiskit/pulse/exceptions.py +0 -45
  369. qiskit/pulse/filters.py +0 -309
  370. qiskit/pulse/instruction_schedule_map.py +0 -424
  371. qiskit/pulse/instructions/__init__.py +0 -67
  372. qiskit/pulse/instructions/acquire.py +0 -150
  373. qiskit/pulse/instructions/delay.py +0 -71
  374. qiskit/pulse/instructions/directives.py +0 -154
  375. qiskit/pulse/instructions/frequency.py +0 -135
  376. qiskit/pulse/instructions/instruction.py +0 -270
  377. qiskit/pulse/instructions/phase.py +0 -152
  378. qiskit/pulse/instructions/play.py +0 -99
  379. qiskit/pulse/instructions/reference.py +0 -100
  380. qiskit/pulse/instructions/snapshot.py +0 -82
  381. qiskit/pulse/library/__init__.py +0 -97
  382. qiskit/pulse/library/continuous.py +0 -430
  383. qiskit/pulse/library/pulse.py +0 -148
  384. qiskit/pulse/library/samplers/__init__.py +0 -15
  385. qiskit/pulse/library/samplers/decorators.py +0 -295
  386. qiskit/pulse/library/samplers/strategies.py +0 -71
  387. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  388. qiskit/pulse/library/waveform.py +0 -136
  389. qiskit/pulse/macros.py +0 -262
  390. qiskit/pulse/parameter_manager.py +0 -445
  391. qiskit/pulse/parser.py +0 -314
  392. qiskit/pulse/reference_manager.py +0 -58
  393. qiskit/pulse/schedule.py +0 -1854
  394. qiskit/pulse/transforms/__init__.py +0 -106
  395. qiskit/pulse/transforms/alignments.py +0 -406
  396. qiskit/pulse/transforms/base_transforms.py +0 -71
  397. qiskit/pulse/transforms/canonicalization.py +0 -498
  398. qiskit/pulse/transforms/dag.py +0 -122
  399. qiskit/pulse/utils.py +0 -149
  400. qiskit/qobj/__init__.py +0 -75
  401. qiskit/qobj/common.py +0 -81
  402. qiskit/qobj/converters/__init__.py +0 -18
  403. qiskit/qobj/converters/lo_config.py +0 -177
  404. qiskit/qobj/converters/pulse_instruction.py +0 -897
  405. qiskit/qobj/pulse_qobj.py +0 -709
  406. qiskit/qobj/qasm_qobj.py +0 -708
  407. qiskit/qobj/utils.py +0 -46
  408. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  409. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  410. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  411. qiskit/result/mitigation/utils.py +0 -217
  412. qiskit/scheduler/__init__.py +0 -40
  413. qiskit/scheduler/config.py +0 -37
  414. qiskit/scheduler/lowering.py +0 -187
  415. qiskit/scheduler/methods/__init__.py +0 -15
  416. qiskit/scheduler/methods/basic.py +0 -140
  417. qiskit/scheduler/schedule_circuit.py +0 -69
  418. qiskit/scheduler/sequence.py +0 -104
  419. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  420. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  421. qiskit/transpiler/passes/calibration/builders.py +0 -20
  422. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  423. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  424. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  425. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  426. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  427. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  428. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  429. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  430. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  431. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  432. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  433. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  434. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  435. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  436. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  437. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  438. qiskit/utils/deprecate_pulse.py +0 -119
  439. qiskit/utils/multiprocessing.py +0 -56
  440. qiskit/visualization/pulse_v2/__init__.py +0 -21
  441. qiskit/visualization/pulse_v2/core.py +0 -901
  442. qiskit/visualization/pulse_v2/device_info.py +0 -173
  443. qiskit/visualization/pulse_v2/drawings.py +0 -253
  444. qiskit/visualization/pulse_v2/events.py +0 -254
  445. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  446. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  447. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  448. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  449. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  450. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  451. qiskit/visualization/pulse_v2/interface.py +0 -459
  452. qiskit/visualization/pulse_v2/layouts.py +0 -387
  453. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  454. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  455. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  456. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  457. qiskit/visualization/pulse_v2/types.py +0 -242
  458. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  459. {qiskit-1.4.2.dist-info → qiskit-2.0.0.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)