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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +248 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +7 -140
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +34 -5
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +2 -6
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +4 -0
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +168 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +5 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +1 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +67 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +27 -12
  291. qiskit/visualization/timeline/interface.py +23 -18
  292. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
  295. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -1,77 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2017, 2019.
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
- """Models for RunConfig and its related components."""
14
-
15
- from types import SimpleNamespace
16
-
17
-
18
- class RunConfig(SimpleNamespace):
19
- """Class for Run Configuration.
20
-
21
- Attributes:
22
- shots (int): the number of shots
23
- seed_simulator (int): the seed to use in the simulator
24
- memory (bool): whether to request memory from backend (per-shot
25
- readouts)
26
- parameter_binds (list[dict]): List of parameter bindings
27
- """
28
-
29
- def __init__(
30
- self,
31
- shots=None,
32
- seed_simulator=None,
33
- memory=None,
34
- parameter_binds=None,
35
- **kwargs,
36
- ):
37
- """Initialize a RunConfig object
38
-
39
- Args:
40
- shots (int): the number of shots
41
- seed_simulator (int): the seed to use in the simulator
42
- memory (bool): whether to request memory from backend
43
- (per-shot readouts)
44
- parameter_binds (list[dict]): List of parameter bindings
45
- **kwargs: optional fields
46
- """
47
- if shots is not None:
48
- self.shots = shots
49
- if seed_simulator is not None:
50
- self.seed_simulator = seed_simulator
51
- if memory is not None:
52
- self.memory = memory
53
- if parameter_binds is not None:
54
- self.parameter_binds = parameter_binds
55
- self.__dict__.update(kwargs)
56
-
57
- @classmethod
58
- def from_dict(cls, data):
59
- """Create a new RunConfig object from a dictionary.
60
-
61
- Args:
62
- data (dict): A dictionary representing the RunConfig to create.
63
- It will be in the same format as output by
64
- :meth:`to_dict`.
65
-
66
- Returns:
67
- RunConfig: The RunConfig from the input dictionary.
68
- """
69
- return cls(**data)
70
-
71
- def to_dict(self):
72
- """Return a dictionary format representation of the RunConfig
73
-
74
- Returns:
75
- dict: The dictionary form of the RunConfig.
76
- """
77
- return self.__dict__
qiskit/circuit/bit.py DELETED
@@ -1,106 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2019.
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
- """
14
- Quantum bit and Classical bit objects.
15
- """
16
- import copy
17
- import warnings
18
-
19
- from qiskit.circuit.exceptions import CircuitError
20
-
21
-
22
- class Bit:
23
- """Implement a generic bit.
24
-
25
- .. note::
26
- This class should not be instantiated directly. This is just a superclass
27
- for :class:`~.Clbit` and :class:`~.circuit.Qubit`.
28
- """
29
-
30
- __slots__ = {"_register", "_index", "_hash", "_repr"}
31
-
32
- def __init__(self, register=None, index=None):
33
- """Create a new generic bit."""
34
- if (register, index) == (None, None):
35
- self._register = None
36
- self._index = None
37
- # To sidestep the overridden Bit.__hash__ and use the default hash
38
- # algorithm (only new-style Bits), call default object hash method.
39
- self._hash = object.__hash__(self)
40
- else:
41
- try:
42
- index = int(index)
43
- except Exception as ex:
44
- raise CircuitError(
45
- f"index needs to be castable to an int: type {type(index)} was provided"
46
- ) from ex
47
-
48
- if index < 0:
49
- index += register.size
50
-
51
- if index >= register.size:
52
- raise CircuitError(
53
- f"index must be under the size of the register: {index} was provided"
54
- )
55
-
56
- self._register = register
57
- self._index = index
58
- self._hash = hash((self._register, self._index))
59
- self._repr = f"{self.__class__.__name__}({self._register}, {self._index})"
60
-
61
- def __init_subclass__(cls):
62
- # In Qiskit 2.0, `Bit` and `Register` will move to Rust space, and the allowable types of
63
- # them will be fixed, similar to if the classes had been marked as `final`.
64
- if cls.__module__.split(".", 2)[0] != __name__.split(".", 2)[0]:
65
- warnings.warn(
66
- "subclassing 'Bit' is not supported, and may not be possible in Qiskit 2.0",
67
- category=DeprecationWarning,
68
- stacklevel=2,
69
- )
70
- return cls
71
-
72
- def __repr__(self):
73
- """Return the official string representing the bit."""
74
- if (self._register, self._index) == (None, None):
75
- # Similar to __hash__, use default repr method for new-style Bits.
76
- return object.__repr__(self)
77
- return self._repr
78
-
79
- def __hash__(self):
80
- return self._hash
81
-
82
- def __eq__(self, other):
83
- if (self._register, self._index) == (None, None):
84
- return other is self
85
-
86
- try:
87
- return self._repr == other._repr
88
- except AttributeError:
89
- return False
90
-
91
- def __copy__(self):
92
- # Bits are immutable.
93
- return self
94
-
95
- def __deepcopy__(self, memo=None):
96
- if (self._register, self._index) == (None, None):
97
- return self
98
-
99
- # Old-style bits need special handling for now, since some code seems
100
- # to rely on their registers getting deep-copied.
101
- bit = type(self).__new__(type(self))
102
- bit._register = copy.deepcopy(self._register, memo)
103
- bit._index = self._index
104
- bit._hash = self._hash
105
- bit._repr = self._repr
106
- return bit
@@ -1,152 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2020.
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
- """
14
- ====================================================================
15
- ClassicalFunction compiler (:mod:`qiskit.circuit.classicalfunction`)
16
- ====================================================================
17
-
18
- .. currentmodule:: qiskit.circuit.classicalfunction
19
-
20
- Overview
21
- ========
22
-
23
- .. warning::
24
-
25
- This module is deprecated as of Qiskit 1.4.0. It will be removed in the Qiskit 2.0 release.
26
-
27
- The classical function compiler provides the necessary tools to map a classical
28
- potentially irreversible functions into quantum circuits. Below is a simple example of
29
- how to synthesize a simple boolean function defined using Python into a
30
- QuantumCircuit:
31
-
32
- .. code-block::
33
-
34
- from qiskit.circuit.classicalfunction import classical_function
35
- from qiskit.circuit.classicalfunction.types import Int1
36
-
37
- @classical_function
38
- def grover_oracle(a: Int1, b: Int1, c: Int1, d: Int1) -> Int1:
39
- return (not a and b and not c and d)
40
-
41
- quantum_circuit = grover_oracle.synth(registerless=False)
42
- quantum_circuit.draw('text')
43
-
44
- a: ──o──
45
-
46
- b: ──■──
47
-
48
- c: ──o──
49
-
50
- d: ──■──
51
- ┌─┴─┐
52
- return: ┤ X ├
53
- └───┘
54
-
55
- Following Qiskit's little-endian bit ordering convention, the left-most bit (``a``) is the most
56
- significant bit and the right-most bit (``d``) is the least significant bit.
57
-
58
- .. warning::
59
-
60
- The functionality of `qiskit.circuit.classicalfunction` requires `tweedledum`,
61
- which isn't available on all platforms (up to Python version 3.11).
62
- See `tweedledum installation guide
63
- <https://github.com/boschmitt/tweedledum/tree/master?tab=readme-ov-file#installation>`_
64
- for more details.
65
-
66
- Supplementary Information
67
- =========================
68
-
69
- Tweedledum
70
- ----------
71
-
72
- Tweedledum is a C++-17 header-only library that implements a large set of
73
- reversible (and quantum) synthesis, optimization, and mapping algorithms.
74
- The classical function compiler relies on it and its dependencies to both represent logic
75
- networks and synthesize them into quantum circuits.
76
-
77
- ClassicalFunction data types
78
- ----------------------------
79
-
80
- At the moment, the only type supported by the classical_function compilers is
81
- ``qiskit.circuit.classicalfunction.types.Int1``. The classical function function
82
- to parse *must* include type hints (just ``Int1`` for now). The resulting gate
83
- will be a gate in the size of the sum of all the parameters and the return.
84
-
85
- The type ``Int1`` means the classical function will only operate at bit level.
86
-
87
-
88
- ClassicalFunction compiler API
89
- ==============================
90
-
91
- classical_function
92
- ------------------
93
-
94
- Decorator for a classical function that returns a `ClassicalFunction` object.
95
-
96
- .. autofunction:: classical_function
97
-
98
- ClassicalFunction
99
- -----------------
100
-
101
- .. autosummary::
102
- :toctree: ../stubs/
103
-
104
- ClassicalFunction
105
- BooleanExpression
106
-
107
- Exceptions
108
- ----------
109
-
110
- .. autosummary::
111
- :toctree: ../stubs/
112
-
113
- ClassicalFunctionCompilerTypeError
114
- ClassicalFunctionParseError
115
- ClassicalFunctionCompilerTypeError
116
-
117
- """
118
- from qiskit.utils.deprecation import deprecate_func
119
- from .classicalfunction import ClassicalFunction
120
- from .exceptions import (
121
- ClassicalFunctionParseError,
122
- ClassicalFunctionCompilerError,
123
- ClassicalFunctionCompilerTypeError,
124
- )
125
- from .boolean_expression import BooleanExpression
126
-
127
-
128
- @deprecate_func(
129
- since="1.4",
130
- removal_timeline="in Qiskit 2.0",
131
- additional_msg="Use `PhaseOracle` instead, which can be turned into a "
132
- "bit-flip oracle by applying Hadamard gates on the target "
133
- "qubit before and after the instruction, and conditioning."
134
- "the instruction on the target qubit.",
135
- )
136
- def classical_function(func):
137
- """
138
- Parses and type checks the callable ``func`` to compile it into an ``ClassicalFunction``
139
- that can be synthesized into a ``QuantumCircuit``.
140
-
141
- Args:
142
- func (callable): A callable (with type hints) to compile into an ``ClassicalFunction``.
143
-
144
- Returns:
145
- ClassicalFunction: An object that can synthesis into a QuantumCircuit (via ``synth()``
146
- method).
147
- """
148
- import inspect
149
- from textwrap import dedent
150
-
151
- source = dedent(inspect.getsource(func))
152
- return ClassicalFunction(source, name=func.__name__)
@@ -1,138 +0,0 @@
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 quantum oracle constructed from a logical expression or a string in the DIMACS format."""
14
-
15
- from os.path import basename, isfile
16
- from typing import Callable, Optional
17
-
18
- from qiskit.utils.deprecation import deprecate_func
19
- from qiskit.circuit import QuantumCircuit
20
- from qiskit.utils.optionals import HAS_TWEEDLEDUM
21
- from .classical_element import ClassicalElement
22
-
23
-
24
- class BooleanExpression(ClassicalElement):
25
- """The Boolean Expression gate."""
26
-
27
- @HAS_TWEEDLEDUM.require_in_instance
28
- @deprecate_func(
29
- since="1.4",
30
- removal_timeline="in Qiskit 2.0",
31
- additional_msg="Use `PhaseOracle` instead, which can be turned into a "
32
- "bit-flip oracle by applying Hadamard gates on the target "
33
- "qubit before and after the instruction, and conditioning."
34
- "the instruction on the target qubit.",
35
- )
36
- def __init__(self, expression: str, name: str = None, var_order: list = None) -> None:
37
- """
38
- Args:
39
- expression (str): The logical expression string.
40
- name (str): Optional. Instruction gate name. Otherwise part of the expression is
41
- going to be used.
42
- var_order(list): A list with the order in which variables will be created.
43
- (default: by appearance)
44
- """
45
-
46
- from tweedledum import BoolFunction # pylint: disable=import-error
47
-
48
- self._tweedledum_bool_expression = BoolFunction.from_expression(
49
- expression, var_order=var_order
50
- )
51
-
52
- short_expr_for_name = (expression[:10] + "...") if len(expression) > 13 else expression
53
- num_qubits = (
54
- self._tweedledum_bool_expression.num_outputs()
55
- + self._tweedledum_bool_expression.num_inputs()
56
- )
57
- super().__init__(name or short_expr_for_name, num_qubits=num_qubits, params=[])
58
-
59
- def simulate(self, bitstring: str) -> bool:
60
- """Evaluate the expression on a bitstring.
61
-
62
- This evaluation is done classically.
63
-
64
- Args:
65
- bitstring: The bitstring for which to evaluate.
66
-
67
- Returns:
68
- bool: result of the evaluation.
69
- """
70
- from tweedledum import BitVec # pylint: disable=import-error
71
-
72
- bits = []
73
- for bit in bitstring:
74
- bits.append(BitVec(1, bit))
75
- return bool(self._tweedledum_bool_expression.simulate(*bits))
76
-
77
- def synth(
78
- self,
79
- registerless: bool = True,
80
- synthesizer: Optional[Callable[["BooleanExpression"], QuantumCircuit]] = None,
81
- ):
82
- """Synthesis the logic network into a :class:`~qiskit.circuit.QuantumCircuit`.
83
-
84
- Args:
85
- registerless: Default ``True``. If ``False`` uses the parameter names
86
- to create registers with those names. Otherwise, creates a circuit with a flat
87
- quantum register.
88
- synthesizer: A callable that takes self and returns a Tweedledum
89
- circuit.
90
- Returns:
91
- QuantumCircuit: A circuit implementing the logic network.
92
- """
93
- if registerless:
94
- qregs = None
95
- else:
96
- qregs = None # TODO: Probably from self._tweedledum_bool_expression._signature
97
-
98
- if synthesizer is None:
99
- from .utils import tweedledum2qiskit # Avoid an import cycle
100
- from tweedledum.synthesis import pkrm_synth # pylint: disable=import-error
101
-
102
- truth_table = self._tweedledum_bool_expression.truth_table(output_bit=0)
103
- return tweedledum2qiskit(pkrm_synth(truth_table), name=self.name, qregs=qregs)
104
- return synthesizer(self)
105
-
106
- def _define(self):
107
- """The definition of the boolean expression is its synthesis"""
108
- self.definition = self.synth()
109
-
110
- @classmethod
111
- def from_dimacs_file(cls, filename: str):
112
- """Create a BooleanExpression from the string in the DIMACS format.
113
- Args:
114
- filename: A file in DIMACS format.
115
-
116
- Returns:
117
- BooleanExpression: A gate for the input string
118
-
119
- Raises:
120
- FileNotFoundError: If filename is not found.
121
- """
122
- HAS_TWEEDLEDUM.require_now("BooleanExpression")
123
-
124
- from tweedledum import BoolFunction # pylint: disable=import-error
125
-
126
- expr_obj = cls.__new__(cls)
127
- if not isfile(filename):
128
- raise FileNotFoundError(f"The file {filename} does not exists.")
129
- expr_obj._tweedledum_bool_expression = BoolFunction.from_dimacs_file(filename)
130
-
131
- num_qubits = (
132
- expr_obj._tweedledum_bool_expression.num_inputs()
133
- + expr_obj._tweedledum_bool_expression.num_outputs()
134
- )
135
- super(BooleanExpression, expr_obj).__init__(
136
- name=basename(filename), num_qubits=num_qubits, params=[]
137
- )
138
- return expr_obj
@@ -1,54 +0,0 @@
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 quantum oracle constructed from a logical expression or a string in the DIMACS format."""
14
-
15
- from abc import ABCMeta, abstractmethod
16
-
17
- from qiskit.circuit import Gate
18
-
19
-
20
- class ClassicalElement(Gate, metaclass=ABCMeta):
21
- """The classical element gate."""
22
-
23
- @abstractmethod
24
- def simulate(self, bitstring: str) -> bool:
25
- """Evaluate the expression on a bitstring.
26
-
27
- This evaluation is done classically.
28
-
29
- Args:
30
- bitstring: The bitstring for which to evaluate.
31
-
32
- Returns:
33
- bool: result of the evaluation.
34
- """
35
- pass
36
-
37
- @abstractmethod
38
- def synth(self, registerless=True, synthesizer=None):
39
- """Synthesis the logic network into a :class:`~qiskit.circuit.QuantumCircuit`.
40
-
41
- Args:
42
- registerless (bool): Default ``True``. If ``False`` uses the parameter names
43
- to create registers with those names. Otherwise, creates a circuit with a flat
44
- quantum register.
45
- synthesizer (callable): A callable that takes a Logic Network and returns a Tweedledum
46
- circuit.
47
- Returns:
48
- QuantumCircuit: A circuit implementing the logic network.
49
- """
50
- pass
51
-
52
- def _define(self):
53
- """The definition of the boolean expression is its synthesis"""
54
- self.definition = self.synth()
@@ -1,155 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2020.
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
- """Node visitor as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor
14
- This module is used internally by ``qiskit.transpiler.classicalfunction.ClassicalFunction``.
15
- """
16
-
17
- import ast
18
- import _ast
19
-
20
- from qiskit.utils.optionals import HAS_TWEEDLEDUM
21
- from .exceptions import ClassicalFunctionParseError, ClassicalFunctionCompilerTypeError
22
-
23
-
24
- @HAS_TWEEDLEDUM.require_in_instance
25
- class ClassicalFunctionVisitor(ast.NodeVisitor):
26
- """Node visitor as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor"""
27
-
28
- # pylint: disable=invalid-name
29
- bitops = {
30
- _ast.BitAnd: "create_and",
31
- _ast.BitOr: "create_or",
32
- _ast.BitXor: "create_xor",
33
- _ast.And: "create_and",
34
- _ast.Or: "create_or",
35
- _ast.Not: "create_not",
36
- }
37
-
38
- def __init__(self):
39
- self.scopes = []
40
- self.args = []
41
- self._network = None
42
- self.name = None
43
- super().__init__()
44
-
45
- def visit_Module(self, node):
46
- """The full snippet should contain a single function"""
47
- if len(node.body) != 1 and not isinstance(node.body[0], ast.FunctionDef):
48
- raise ClassicalFunctionParseError("just functions, sorry!")
49
- self.name = node.body[0].name
50
- self.visit(node.body[0])
51
-
52
- def visit_FunctionDef(self, node):
53
- """The function definition should have type hints"""
54
- if node.returns is None:
55
- raise ClassicalFunctionParseError("return type is needed")
56
- scope = {"return": (node.returns.id, None), node.returns.id: ("type", None)}
57
-
58
- # Extend scope with the decorator's names
59
- scope.update({decorator.id: ("decorator", None) for decorator in node.decorator_list})
60
-
61
- from tweedledum.classical import LogicNetwork # pylint: disable=import-error
62
-
63
- self.scopes.append(scope)
64
- self._network = LogicNetwork()
65
- self.extend_scope(node.args)
66
- return super().generic_visit(node)
67
-
68
- def visit_Return(self, node):
69
- """The return type should match the return type hint."""
70
- _type, signal = self.visit(node.value)
71
- if _type != self.scopes[-1]["return"][0]:
72
- raise ClassicalFunctionParseError("return type error")
73
- self._network.create_po(signal)
74
-
75
- def visit_Assign(self, node):
76
- """When assign, the scope needs to be updated with the right type"""
77
- type_value, signal_value = self.visit(node.value)
78
- for target in node.targets:
79
- self.scopes[-1][target.id] = (type_value, signal_value)
80
- return (type_value, signal_value)
81
-
82
- def bit_binop(self, op, values):
83
- """Uses ClassicalFunctionVisitor.bitops to extend self._network"""
84
- bitop = ClassicalFunctionVisitor.bitops.get(type(op))
85
- if not bitop:
86
- raise ClassicalFunctionParseError(f"Unknown binop.op {op}")
87
- binop = getattr(self._network, bitop)
88
-
89
- left_type, left_signal = values[0]
90
- if left_type != "Int1":
91
- raise ClassicalFunctionParseError("binop type error")
92
-
93
- for right_type, right_signal in values[1:]:
94
- if right_type != "Int1":
95
- raise ClassicalFunctionParseError("binop type error")
96
- left_signal = binop(left_signal, right_signal)
97
-
98
- return "Int1", left_signal
99
-
100
- def visit_BoolOp(self, node):
101
- """Handles ``and`` and ``or``.
102
- node.left=Int1 and node.right=Int1 return Int1"""
103
- return self.bit_binop(node.op, [self.visit(value) for value in node.values])
104
-
105
- def visit_BinOp(self, node):
106
- """Handles ``&``, ``^``, and ``|``.
107
- node.left=Int1 and node.right=Int1 return Int1"""
108
- return self.bit_binop(node.op, [self.visit(node.left), self.visit(node.right)])
109
-
110
- def visit_UnaryOp(self, node):
111
- """Handles ``~``. Cannot operate on Int1s."""
112
- operand_type, operand_signal = self.visit(node.operand)
113
- if operand_type != "Int1":
114
- raise ClassicalFunctionCompilerTypeError(
115
- f"UntaryOp.op {node.op} only support operation on Int1s for now"
116
- )
117
- bitop = ClassicalFunctionVisitor.bitops.get(type(node.op))
118
- if not bitop:
119
- raise ClassicalFunctionCompilerTypeError(
120
- f"UntaryOp.op {node.op} does not operate with Int1 type "
121
- )
122
- return "Int1", getattr(self._network, bitop)(operand_signal)
123
-
124
- def visit_Name(self, node):
125
- """Reduce variable names."""
126
- if node.id not in self.scopes[-1]:
127
- raise ClassicalFunctionParseError(f"out of scope: {node.id}")
128
- return self.scopes[-1][node.id]
129
-
130
- def generic_visit(self, node):
131
- """Catch all for the unhandled nodes."""
132
- if isinstance(
133
- node,
134
- (
135
- _ast.arguments,
136
- _ast.arg,
137
- _ast.Load,
138
- _ast.BitAnd,
139
- _ast.BitOr,
140
- _ast.BitXor,
141
- _ast.BoolOp,
142
- _ast.Or,
143
- ),
144
- ):
145
- return super().generic_visit(node)
146
- raise ClassicalFunctionParseError(f"Unknown node: {type(node)}")
147
-
148
- def extend_scope(self, args_node: _ast.arguments) -> None:
149
- """Add the arguments to the scope"""
150
- for arg in args_node.args:
151
- if arg.annotation is None:
152
- raise ClassicalFunctionParseError("argument type is needed")
153
- self.args.append(arg.arg)
154
- self.scopes[-1][arg.annotation.id] = ("type", None)
155
- self.scopes[-1][arg.arg] = (arg.annotation.id, self._network.create_pi())