qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl

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