qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0__cp39-abi3-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +11 -0
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +1 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -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)