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