qiskit 1.4.2__cp39-abi3-win_amd64.whl → 2.0.0rc2__cp39-abi3-win_amd64.whl

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