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