qiskit 1.1.1__cp38-abi3-win32.whl → 1.2.0__cp38-abi3-win32.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 (347) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +27 -24
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/_numpy_compat.py +1 -1
  5. qiskit/assembler/assemble_circuits.py +107 -64
  6. qiskit/assembler/assemble_schedules.py +5 -12
  7. qiskit/assembler/disassemble.py +10 -1
  8. qiskit/circuit/__init__.py +6 -3
  9. qiskit/circuit/_classical_resource_map.py +5 -5
  10. qiskit/circuit/_utils.py +0 -13
  11. qiskit/circuit/add_control.py +1 -1
  12. qiskit/circuit/annotated_operation.py +23 -1
  13. qiskit/circuit/classical/expr/expr.py +4 -4
  14. qiskit/circuit/classical/expr/visitors.py +1 -1
  15. qiskit/circuit/classical/types/__init__.py +1 -1
  16. qiskit/circuit/classical/types/types.py +2 -2
  17. qiskit/circuit/classicalfunction/__init__.py +8 -0
  18. qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
  19. qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
  20. qiskit/circuit/classicalfunction/utils.py +1 -1
  21. qiskit/circuit/classicalregister.py +1 -1
  22. qiskit/circuit/commutation_checker.py +83 -35
  23. qiskit/circuit/controlflow/_builder_utils.py +1 -1
  24. qiskit/circuit/controlflow/builder.py +10 -6
  25. qiskit/circuit/controlflow/if_else.py +2 -2
  26. qiskit/circuit/controlflow/switch_case.py +1 -1
  27. qiskit/circuit/delay.py +1 -1
  28. qiskit/circuit/duration.py +2 -2
  29. qiskit/circuit/equivalence.py +5 -7
  30. qiskit/circuit/gate.py +11 -8
  31. qiskit/circuit/instruction.py +31 -13
  32. qiskit/circuit/instructionset.py +2 -5
  33. qiskit/circuit/library/__init__.py +2 -1
  34. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
  35. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  36. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
  37. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
  38. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
  39. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
  40. qiskit/circuit/library/basis_change/__init__.py +1 -1
  41. qiskit/circuit/library/basis_change/qft.py +40 -6
  42. qiskit/circuit/library/blueprintcircuit.py +3 -5
  43. qiskit/circuit/library/data_preparation/__init__.py +9 -2
  44. qiskit/circuit/library/data_preparation/initializer.py +8 -0
  45. qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
  46. qiskit/circuit/library/generalized_gates/isometry.py +8 -8
  47. qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
  48. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
  49. qiskit/circuit/library/generalized_gates/permutation.py +8 -9
  50. qiskit/circuit/library/generalized_gates/uc.py +3 -3
  51. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
  52. qiskit/circuit/library/generalized_gates/unitary.py +13 -11
  53. qiskit/circuit/library/graph_state.py +1 -1
  54. qiskit/circuit/library/hamiltonian_gate.py +1 -2
  55. qiskit/circuit/library/hidden_linear_function.py +1 -1
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
  57. qiskit/circuit/library/n_local/n_local.py +4 -5
  58. qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
  59. qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
  60. qiskit/circuit/library/n_local/two_local.py +1 -1
  61. qiskit/circuit/library/overlap.py +11 -5
  62. qiskit/circuit/library/pauli_evolution.py +7 -3
  63. qiskit/circuit/library/standard_gates/dcx.py +3 -0
  64. qiskit/circuit/library/standard_gates/ecr.py +3 -0
  65. qiskit/circuit/library/standard_gates/global_phase.py +3 -0
  66. qiskit/circuit/library/standard_gates/h.py +13 -5
  67. qiskit/circuit/library/standard_gates/i.py +3 -0
  68. qiskit/circuit/library/standard_gates/iswap.py +3 -0
  69. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
  70. qiskit/circuit/library/standard_gates/p.py +14 -9
  71. qiskit/circuit/library/standard_gates/r.py +3 -0
  72. qiskit/circuit/library/standard_gates/rx.py +21 -6
  73. qiskit/circuit/library/standard_gates/rxx.py +40 -1
  74. qiskit/circuit/library/standard_gates/ry.py +21 -6
  75. qiskit/circuit/library/standard_gates/ryy.py +40 -1
  76. qiskit/circuit/library/standard_gates/rz.py +22 -6
  77. qiskit/circuit/library/standard_gates/rzx.py +40 -1
  78. qiskit/circuit/library/standard_gates/rzz.py +41 -2
  79. qiskit/circuit/library/standard_gates/s.py +77 -0
  80. qiskit/circuit/library/standard_gates/swap.py +12 -5
  81. qiskit/circuit/library/standard_gates/sx.py +14 -5
  82. qiskit/circuit/library/standard_gates/t.py +5 -0
  83. qiskit/circuit/library/standard_gates/u.py +22 -7
  84. qiskit/circuit/library/standard_gates/u1.py +8 -3
  85. qiskit/circuit/library/standard_gates/u2.py +3 -0
  86. qiskit/circuit/library/standard_gates/u3.py +22 -7
  87. qiskit/circuit/library/standard_gates/x.py +158 -92
  88. qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
  89. qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
  90. qiskit/circuit/library/standard_gates/y.py +6 -1
  91. qiskit/circuit/library/standard_gates/z.py +8 -1
  92. qiskit/circuit/operation.py +1 -1
  93. qiskit/circuit/parameter.py +9 -10
  94. qiskit/circuit/parameterexpression.py +16 -13
  95. qiskit/circuit/parametertable.py +1 -190
  96. qiskit/circuit/parametervector.py +1 -1
  97. qiskit/circuit/quantumcircuit.py +395 -385
  98. qiskit/circuit/quantumcircuitdata.py +3 -5
  99. qiskit/circuit/quantumregister.py +1 -1
  100. qiskit/circuit/random/__init__.py +1 -1
  101. qiskit/circuit/random/utils.py +175 -26
  102. qiskit/circuit/register.py +5 -7
  103. qiskit/circuit/singleton.py +3 -3
  104. qiskit/circuit/tools/pi_check.py +4 -4
  105. qiskit/compiler/assembler.py +95 -24
  106. qiskit/compiler/scheduler.py +2 -2
  107. qiskit/compiler/transpiler.py +42 -128
  108. qiskit/converters/circuit_to_dag.py +4 -6
  109. qiskit/converters/circuit_to_gate.py +4 -8
  110. qiskit/converters/circuit_to_instruction.py +5 -17
  111. qiskit/converters/dag_to_circuit.py +2 -6
  112. qiskit/dagcircuit/collect_blocks.py +2 -2
  113. qiskit/dagcircuit/dagcircuit.py +197 -187
  114. qiskit/dagcircuit/dagdependency.py +4 -4
  115. qiskit/dagcircuit/dagdependency_v2.py +4 -4
  116. qiskit/dagcircuit/dagdepnode.py +1 -1
  117. qiskit/dagcircuit/dagnode.py +66 -157
  118. qiskit/passmanager/flow_controllers.py +1 -1
  119. qiskit/passmanager/passmanager.py +3 -3
  120. qiskit/primitives/__init__.py +1 -5
  121. qiskit/primitives/backend_estimator.py +25 -15
  122. qiskit/primitives/backend_estimator_v2.py +31 -7
  123. qiskit/primitives/backend_sampler.py +21 -12
  124. qiskit/primitives/backend_sampler_v2.py +12 -3
  125. qiskit/primitives/base/base_estimator.py +31 -4
  126. qiskit/primitives/base/base_primitive.py +2 -2
  127. qiskit/primitives/base/base_result.py +2 -2
  128. qiskit/primitives/base/base_sampler.py +26 -2
  129. qiskit/primitives/base/estimator_result.py +2 -2
  130. qiskit/primitives/base/sampler_result.py +2 -2
  131. qiskit/primitives/containers/__init__.py +0 -1
  132. qiskit/primitives/containers/bindings_array.py +2 -2
  133. qiskit/primitives/containers/bit_array.py +113 -12
  134. qiskit/primitives/containers/shape.py +3 -3
  135. qiskit/primitives/estimator.py +9 -2
  136. qiskit/primitives/primitive_job.py +1 -1
  137. qiskit/primitives/sampler.py +10 -3
  138. qiskit/primitives/statevector_estimator.py +5 -3
  139. qiskit/primitives/statevector_sampler.py +11 -5
  140. qiskit/primitives/utils.py +16 -0
  141. qiskit/providers/backend.py +15 -6
  142. qiskit/providers/backend_compat.py +7 -4
  143. qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
  144. qiskit/providers/basic_provider/basic_simulator.py +33 -25
  145. qiskit/providers/fake_provider/fake_backend.py +10 -3
  146. qiskit/providers/fake_provider/fake_openpulse_2q.py +157 -149
  147. qiskit/providers/fake_provider/fake_openpulse_3q.py +228 -220
  148. qiskit/providers/fake_provider/fake_pulse_backend.py +2 -1
  149. qiskit/providers/fake_provider/fake_qasm_backend.py +7 -2
  150. qiskit/providers/fake_provider/generic_backend_v2.py +519 -68
  151. qiskit/providers/models/__init__.py +48 -11
  152. qiskit/providers/models/backendconfiguration.py +50 -4
  153. qiskit/providers/models/backendproperties.py +13 -2
  154. qiskit/providers/models/pulsedefaults.py +10 -11
  155. qiskit/providers/options.py +13 -13
  156. qiskit/providers/providerutils.py +3 -1
  157. qiskit/pulse/configuration.py +8 -12
  158. qiskit/pulse/instruction_schedule_map.py +3 -5
  159. qiskit/pulse/instructions/acquire.py +7 -8
  160. qiskit/pulse/instructions/instruction.py +2 -3
  161. qiskit/pulse/library/samplers/decorators.py +5 -9
  162. qiskit/pulse/library/symbolic_pulses.py +4 -7
  163. qiskit/pulse/library/waveform.py +2 -5
  164. qiskit/pulse/macros.py +11 -6
  165. qiskit/pulse/parser.py +8 -10
  166. qiskit/pulse/schedule.py +12 -20
  167. qiskit/pulse/transforms/alignments.py +1 -3
  168. qiskit/pulse/utils.py +1 -2
  169. qiskit/qasm/libs/stdgates.inc +35 -28
  170. qiskit/qasm2/__init__.py +7 -7
  171. qiskit/qasm2/export.py +5 -9
  172. qiskit/qasm2/parse.py +1 -1
  173. qiskit/qasm3/ast.py +9 -25
  174. qiskit/qasm3/exporter.py +582 -479
  175. qiskit/qasm3/printer.py +7 -16
  176. qiskit/qobj/common.py +10 -0
  177. qiskit/qobj/converters/lo_config.py +9 -0
  178. qiskit/qobj/converters/pulse_instruction.py +13 -6
  179. qiskit/qobj/pulse_qobj.py +69 -15
  180. qiskit/qobj/qasm_qobj.py +72 -20
  181. qiskit/qobj/utils.py +9 -0
  182. qiskit/qpy/__init__.py +1 -1
  183. qiskit/qpy/binary_io/circuits.py +8 -5
  184. qiskit/qpy/binary_io/schedules.py +1 -1
  185. qiskit/qpy/binary_io/value.py +3 -3
  186. qiskit/qpy/interface.py +3 -2
  187. qiskit/qpy/type_keys.py +2 -2
  188. qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
  189. qiskit/quantum_info/operators/channel/superop.py +2 -2
  190. qiskit/quantum_info/operators/channel/transformations.py +1 -1
  191. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
  192. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
  193. qiskit/quantum_info/operators/dihedral/random.py +6 -3
  194. qiskit/quantum_info/operators/measures.py +2 -2
  195. qiskit/quantum_info/operators/op_shape.py +12 -20
  196. qiskit/quantum_info/operators/operator.py +14 -21
  197. qiskit/quantum_info/operators/predicates.py +1 -0
  198. qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
  199. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  200. qiskit/quantum_info/operators/symplectic/pauli.py +14 -12
  201. qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
  202. qiskit/quantum_info/operators/symplectic/random.py +1 -1
  203. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +15 -17
  204. qiskit/quantum_info/quaternion.py +1 -1
  205. qiskit/quantum_info/states/densitymatrix.py +5 -8
  206. qiskit/quantum_info/states/stabilizerstate.py +128 -37
  207. qiskit/quantum_info/states/statevector.py +4 -8
  208. qiskit/result/counts.py +2 -2
  209. qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
  210. qiskit/result/mitigation/local_readout_mitigator.py +2 -2
  211. qiskit/result/mitigation/utils.py +1 -3
  212. qiskit/result/models.py +17 -16
  213. qiskit/result/result.py +15 -20
  214. qiskit/scheduler/lowering.py +2 -2
  215. qiskit/synthesis/__init__.py +2 -1
  216. qiskit/synthesis/clifford/__init__.py +1 -1
  217. qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
  218. qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
  219. qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
  220. qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
  221. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
  222. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
  223. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -2
  224. qiskit/synthesis/discrete_basis/solovay_kitaev.py +24 -14
  225. qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
  226. qiskit/synthesis/evolution/lie_trotter.py +46 -19
  227. qiskit/synthesis/evolution/product_formula.py +111 -55
  228. qiskit/synthesis/evolution/qdrift.py +40 -10
  229. qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
  230. qiskit/synthesis/linear/__init__.py +1 -0
  231. qiskit/synthesis/linear/cnot_synth.py +22 -96
  232. qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
  233. qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
  234. qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
  235. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
  236. qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
  237. qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
  238. qiskit/synthesis/permutation/permutation_full.py +5 -29
  239. qiskit/synthesis/permutation/permutation_lnn.py +2 -24
  240. qiskit/synthesis/permutation/permutation_utils.py +2 -59
  241. qiskit/synthesis/qft/__init__.py +1 -0
  242. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  243. qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
  244. qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
  245. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
  246. qiskit/synthesis/two_qubit/local_invariance.py +8 -38
  247. qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
  248. qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
  249. qiskit/synthesis/unitary/qsd.py +5 -3
  250. qiskit/transpiler/__init__.py +6 -5
  251. qiskit/transpiler/basepasses.py +1 -1
  252. qiskit/transpiler/coupling.py +3 -3
  253. qiskit/transpiler/instruction_durations.py +1 -2
  254. qiskit/transpiler/layout.py +6 -6
  255. qiskit/transpiler/passes/__init__.py +2 -0
  256. qiskit/transpiler/passes/basis/basis_translator.py +84 -64
  257. qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
  258. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  259. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
  260. qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
  261. qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
  262. qiskit/transpiler/passes/layout/apply_layout.py +13 -3
  263. qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
  264. qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
  265. qiskit/transpiler/passes/layout/set_layout.py +2 -2
  266. qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
  267. qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
  268. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  269. qiskit/transpiler/passes/optimization/collect_cliffords.py +6 -15
  270. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  271. qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
  272. qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
  273. qiskit/transpiler/passes/optimization/consolidate_blocks.py +17 -8
  274. qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
  275. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
  276. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  277. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
  278. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
  279. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
  280. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
  281. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
  282. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +5 -1
  283. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  284. qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
  285. qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
  286. qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
  287. qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
  288. qiskit/transpiler/passes/scheduling/alap.py +1 -2
  289. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
  290. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  291. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -2
  292. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
  293. qiskit/transpiler/passes/scheduling/asap.py +1 -2
  294. qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
  295. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
  296. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  297. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -14
  298. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
  299. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
  300. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
  301. qiskit/transpiler/passes/synthesis/plugin.py +2 -2
  302. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +83 -40
  303. qiskit/transpiler/passes/utils/__init__.py +0 -1
  304. qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
  305. qiskit/transpiler/passes/utils/check_map.py +3 -6
  306. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
  307. qiskit/transpiler/passes/utils/error.py +2 -2
  308. qiskit/transpiler/passes/utils/fixed_point.py +3 -3
  309. qiskit/transpiler/passes/utils/gate_direction.py +1 -1
  310. qiskit/transpiler/passes/utils/gates_basis.py +1 -2
  311. qiskit/transpiler/passmanager.py +7 -6
  312. qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
  313. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +73 -18
  314. qiskit/transpiler/preset_passmanagers/common.py +3 -6
  315. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
  316. qiskit/transpiler/preset_passmanagers/level0.py +1 -1
  317. qiskit/transpiler/target.py +27 -8
  318. qiskit/user_config.py +29 -6
  319. qiskit/utils/classtools.py +3 -3
  320. qiskit/utils/deprecation.py +3 -2
  321. qiskit/utils/lazy_tester.py +2 -2
  322. qiskit/utils/optionals.py +8 -8
  323. qiskit/visualization/bloch.py +62 -24
  324. qiskit/visualization/circuit/_utils.py +34 -10
  325. qiskit/visualization/circuit/circuit_visualization.py +23 -16
  326. qiskit/visualization/circuit/latex.py +29 -27
  327. qiskit/visualization/circuit/matplotlib.py +4 -2
  328. qiskit/visualization/circuit/qcstyle.py +2 -2
  329. qiskit/visualization/circuit/text.py +9 -15
  330. qiskit/visualization/dag_visualization.py +12 -5
  331. qiskit/visualization/pass_manager_visualization.py +9 -9
  332. qiskit/visualization/pulse_v2/core.py +1 -1
  333. qiskit/visualization/pulse_v2/events.py +1 -1
  334. qiskit/visualization/pulse_v2/generators/frame.py +3 -4
  335. qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
  336. qiskit/visualization/pulse_v2/layouts.py +1 -5
  337. qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
  338. qiskit/visualization/state_visualization.py +5 -6
  339. qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
  340. qiskit/visualization/transition_visualization.py +7 -2
  341. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/METADATA +28 -28
  342. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/RECORD +346 -344
  343. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/WHEEL +1 -1
  344. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/entry_points.txt +3 -0
  345. qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
  346. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/LICENSE.txt +0 -0
  347. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
@@ -19,8 +19,10 @@ from qiskit.circuit.controlledgate import ControlledGate
19
19
  from qiskit.circuit.singleton import SingletonGate, SingletonControlledGate, stdlib_singleton_key
20
20
  from qiskit.circuit.quantumregister import QuantumRegister
21
21
  from qiskit.circuit._utils import _ctrl_state_to_int, with_gate_array, with_controlled_gate_array
22
+ from qiskit._accelerate.circuit import StandardGate
22
23
 
23
24
  _X_ARRAY = [[0, 1], [1, 0]]
25
+ _SX_ARRAY = [[0.5 + 0.5j, 0.5 - 0.5j], [0.5 - 0.5j, 0.5 + 0.5j]]
24
26
 
25
27
 
26
28
  @with_gate_array(_X_ARRAY)
@@ -70,6 +72,8 @@ class XGate(SingletonGate):
70
72
  |1\rangle \rightarrow |0\rangle
71
73
  """
72
74
 
75
+ _standard_gate = StandardGate.XGate
76
+
73
77
  def __init__(self, label: Optional[str] = None, *, duration=None, unit="dt"):
74
78
  """Create new X gate."""
75
79
  super().__init__("x", 1, [], label=label, duration=duration, unit=unit)
@@ -108,7 +112,7 @@ class XGate(SingletonGate):
108
112
  label: An optional label for the gate [Default: ``None``]
109
113
  ctrl_state: control state expressed as integer,
110
114
  string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
111
- annotated: indicates whether the controlled gate can be implemented
115
+ annotated: indicates whether the controlled gate should be implemented
112
116
  as an annotated gate.
113
117
 
114
118
  Returns:
@@ -212,6 +216,8 @@ class CXGate(SingletonControlledGate):
212
216
  `|a, b\rangle \rightarrow |a, a \oplus b\rangle`
213
217
  """
214
218
 
219
+ _standard_gate = StandardGate.CXGate
220
+
215
221
  def __init__(
216
222
  self,
217
223
  label: Optional[str] = None,
@@ -251,7 +257,7 @@ class CXGate(SingletonControlledGate):
251
257
  label: An optional label for the gate [Default: ``None``]
252
258
  ctrl_state: control state expressed as integer,
253
259
  string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
254
- annotated: indicates whether the controlled gate can be implemented
260
+ annotated: indicates whether the controlled gate should be implemented
255
261
  as an annotated gate.
256
262
 
257
263
  Returns:
@@ -362,6 +368,8 @@ class CCXGate(SingletonControlledGate):
362
368
 
363
369
  """
364
370
 
371
+ _standard_gate = StandardGate.CCXGate
372
+
365
373
  def __init__(
366
374
  self,
367
375
  label: Optional[str] = None,
@@ -445,7 +453,7 @@ class CCXGate(SingletonControlledGate):
445
453
  label: An optional label for the gate [Default: ``None``]
446
454
  ctrl_state: control state expressed as integer,
447
455
  string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
448
- annotated: indicates whether the controlled gate can be implemented
456
+ annotated: indicates whether the controlled gate should be implemented
449
457
  as an annotated gate.
450
458
 
451
459
  Returns:
@@ -515,6 +523,8 @@ class RCCXGate(SingletonGate):
515
523
  with the :meth:`~qiskit.circuit.QuantumCircuit.rccx` method.
516
524
  """
517
525
 
526
+ _standard_gate = StandardGate.RCCXGate
527
+
518
528
  def __init__(self, label: Optional[str] = None, *, duration=None, unit="dt"):
519
529
  """Create a new simplified CCX gate."""
520
530
  super().__init__("rccx", 3, [], label=label, duration=duration, unit=unit)
@@ -562,6 +572,7 @@ class RCCXGate(SingletonGate):
562
572
  return isinstance(other, RCCXGate)
563
573
 
564
574
 
575
+ @with_controlled_gate_array(_SX_ARRAY, num_ctrl_qubits=3, cached_states=(7,))
565
576
  class C3SXGate(SingletonControlledGate):
566
577
  """The 3-qubit controlled sqrt-X gate.
567
578
 
@@ -571,6 +582,8 @@ class C3SXGate(SingletonControlledGate):
571
582
  [1] Barenco et al., 1995. https://arxiv.org/pdf/quant-ph/9503016.pdf
572
583
  """
573
584
 
585
+ _standard_gate = StandardGate.C3SXGate
586
+
574
587
  def __init__(
575
588
  self,
576
589
  label: Optional[str] = None,
@@ -675,6 +688,8 @@ class C3XGate(SingletonControlledGate):
675
688
  This implementation uses :math:`\sqrt{T}` and 14 CNOT gates.
676
689
  """
677
690
 
691
+ _standard_gate = StandardGate.C3XGate
692
+
678
693
  def __init__(
679
694
  self,
680
695
  label: Optional[str] = None,
@@ -786,7 +801,7 @@ class C3XGate(SingletonControlledGate):
786
801
  label: An optional label for the gate [Default: ``None``]
787
802
  ctrl_state: control state expressed as integer,
788
803
  string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
789
- annotated: indicates whether the controlled gate can be implemented
804
+ annotated: indicates whether the controlled gate should be implemented
790
805
  as an annotated gate.
791
806
 
792
807
  Returns:
@@ -862,6 +877,8 @@ class RC3XGate(SingletonGate):
862
877
  with the :meth:`~qiskit.circuit.QuantumCircuit.rcccx` method.
863
878
  """
864
879
 
880
+ _standard_gate = StandardGate.RC3XGate
881
+
865
882
  def __init__(self, label: Optional[str] = None, *, duration=None, unit="dt"):
866
883
  """Create a new RC3X gate."""
867
884
  super().__init__("rcccx", 4, [], label=label, duration=duration, unit=unit)
@@ -935,8 +952,8 @@ class C4XGate(SingletonControlledGate):
935
952
  of the relative phase version of c3x, the rc3x [2].
936
953
 
937
954
  References:
938
- [1] Barenco et al., 1995. https://arxiv.org/pdf/quant-ph/9503016.pdf
939
- [2] Maslov, 2015. https://arxiv.org/abs/1508.03273
955
+ 1. Barenco et al., 1995. https://arxiv.org/pdf/quant-ph/9503016.pdf
956
+ 2. Maslov, 2015. https://arxiv.org/abs/1508.03273
940
957
  """
941
958
 
942
959
  def __init__(
@@ -965,7 +982,7 @@ class C4XGate(SingletonControlledGate):
965
982
 
966
983
  _singleton_lookup_key = stdlib_singleton_key(num_ctrl_qubits=4)
967
984
 
968
- # seems like open controls not hapening?
985
+ # seems like open controls not happening?
969
986
  def _define(self):
970
987
  """
971
988
  gate c3sqrtx a,b,c,d
@@ -1030,7 +1047,7 @@ class C4XGate(SingletonControlledGate):
1030
1047
  label: An optional label for the gate [Default: ``None``]
1031
1048
  ctrl_state: control state expressed as integer,
1032
1049
  string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
1033
- annotated: indicates whether the controlled gate can be implemented
1050
+ annotated: indicates whether the controlled gate should be implemented
1034
1051
  as an annotated gate.
1035
1052
 
1036
1053
  Returns:
@@ -1205,7 +1222,7 @@ class MCXGate(ControlledGate):
1205
1222
  label: An optional label for the gate [Default: ``None``]
1206
1223
  ctrl_state: control state expressed as integer,
1207
1224
  string (e.g. ``'110'``), or ``None``. If ``None``, use all 1s.
1208
- annotated: indicates whether the controlled gate can be implemented
1225
+ annotated: indicates whether the controlled gate should be implemented
1209
1226
  as an annotated gate.
1210
1227
 
1211
1228
  Returns:
@@ -1303,9 +1320,14 @@ class MCXGrayCode(MCXGate):
1303
1320
  class MCXRecursive(MCXGate):
1304
1321
  """Implement the multi-controlled X gate using recursion.
1305
1322
 
1306
- Using a single ancilla qubit, the multi-controlled X gate is recursively split onto
1307
- four sub-registers. This is done until we reach the 3- or 4-controlled X gate since
1308
- for these we have a concrete implementation that do not require ancillas.
1323
+ Using a single clean ancilla qubit, the multi-controlled X gate is split into
1324
+ four sub-registers, each one of them uses the V-chain method.
1325
+
1326
+ The method is based on Lemma 9 of [2], first shown in Lemma 7.3 of [1].
1327
+
1328
+ References:
1329
+ 1. Barenco et al., 1995. https://arxiv.org/pdf/quant-ph/9503016.pdf
1330
+ 2. Iten et al., 2015. https://arxiv.org/abs/1501.06911
1309
1331
  """
1310
1332
 
1311
1333
  def __init__(
@@ -1361,32 +1383,35 @@ class MCXRecursive(MCXGate):
1361
1383
  qc._append(C4XGate(), q[:], [])
1362
1384
  self.definition = qc
1363
1385
  else:
1364
- for instr, qargs, cargs in self._recurse(q[:-1], q_ancilla=q[-1]):
1365
- qc._append(instr, qargs, cargs)
1366
- self.definition = qc
1367
-
1368
- def _recurse(self, q, q_ancilla=None):
1369
- # recursion stop
1370
- if len(q) == 4:
1371
- return [(C3XGate(), q[:], [])]
1372
- if len(q) == 5:
1373
- return [(C4XGate(), q[:], [])]
1374
- if len(q) < 4:
1375
- raise AttributeError("Something went wrong in the recursion, have less than 4 qubits.")
1376
-
1377
- # recurse
1378
- num_ctrl_qubits = len(q) - 1
1379
- middle = ceil(num_ctrl_qubits / 2)
1380
- first_half = [*q[:middle], q_ancilla]
1381
- second_half = [*q[middle:num_ctrl_qubits], q_ancilla, q[num_ctrl_qubits]]
1382
-
1383
- rule = []
1384
- rule += self._recurse(first_half, q_ancilla=q[middle])
1385
- rule += self._recurse(second_half, q_ancilla=q[middle - 1])
1386
- rule += self._recurse(first_half, q_ancilla=q[middle])
1387
- rule += self._recurse(second_half, q_ancilla=q[middle - 1])
1386
+ num_ctrl_qubits = len(q) - 1
1387
+ q_ancilla = q[-1]
1388
+ q_target = q[-2]
1389
+ middle = ceil(num_ctrl_qubits / 2)
1390
+ first_half = [*q[:middle]]
1391
+ second_half = [*q[middle : num_ctrl_qubits - 1], q_ancilla]
1392
+
1393
+ qc._append(
1394
+ MCXVChain(num_ctrl_qubits=len(first_half), dirty_ancillas=True),
1395
+ qargs=[*first_half, q_ancilla, *q[middle : middle + len(first_half) - 2]],
1396
+ cargs=[],
1397
+ )
1398
+ qc._append(
1399
+ MCXVChain(num_ctrl_qubits=len(second_half), dirty_ancillas=True),
1400
+ qargs=[*second_half, q_target, *q[: len(second_half) - 2]],
1401
+ cargs=[],
1402
+ )
1403
+ qc._append(
1404
+ MCXVChain(num_ctrl_qubits=len(first_half), dirty_ancillas=True),
1405
+ qargs=[*first_half, q_ancilla, *q[middle : middle + len(first_half) - 2]],
1406
+ cargs=[],
1407
+ )
1408
+ qc._append(
1409
+ MCXVChain(num_ctrl_qubits=len(second_half), dirty_ancillas=True),
1410
+ qargs=[*second_half, q_target, *q[: len(second_half) - 2]],
1411
+ cargs=[],
1412
+ )
1388
1413
 
1389
- return rule
1414
+ self.definition = qc
1390
1415
 
1391
1416
 
1392
1417
  class MCXVChain(MCXGate):
@@ -1402,6 +1427,8 @@ class MCXVChain(MCXGate):
1402
1427
  duration=None,
1403
1428
  unit="dt",
1404
1429
  _base_label=None,
1430
+ relative_phase: bool = False, # pylint: disable=unused-argument
1431
+ action_only: bool = False, # pylint: disable=unused-argument
1405
1432
  ):
1406
1433
  """Create a new MCX instance.
1407
1434
 
@@ -1427,7 +1454,24 @@ class MCXVChain(MCXGate):
1427
1454
  duration=None,
1428
1455
  unit="dt",
1429
1456
  _base_label=None,
1457
+ relative_phase: bool = False,
1458
+ action_only: bool = False,
1430
1459
  ):
1460
+ """
1461
+ Args:
1462
+ dirty_ancillas: when set to ``True``, the method applies an optimized multicontrolled-X gate
1463
+ up to a relative phase using dirty ancillary qubits with the properties of lemmas 7 and 8
1464
+ from arXiv:1501.06911, with at most 8*k - 6 CNOT gates.
1465
+ For k within the range {1, ..., ceil(n/2)}. And for n representing the total number of
1466
+ qubits.
1467
+ relative_phase: when set to ``True``, the method applies the optimized multicontrolled-X gate
1468
+ up to a relative phase, in a way that, by lemma 7 of arXiv:1501.06911, the relative
1469
+ phases of the ``action part`` cancel out with the phases of the ``reset part``.
1470
+
1471
+ action_only: when set to ``True``, the method applies only the action part of lemma 8
1472
+ from arXiv:1501.06911.
1473
+
1474
+ """
1431
1475
  super().__init__(
1432
1476
  num_ctrl_qubits,
1433
1477
  label=label,
@@ -1438,6 +1482,9 @@ class MCXVChain(MCXGate):
1438
1482
  unit=unit,
1439
1483
  )
1440
1484
  self._dirty_ancillas = dirty_ancillas
1485
+ self._relative_phase = relative_phase
1486
+ self._action_only = action_only
1487
+ super().__init__(num_ctrl_qubits, label=label, ctrl_state=ctrl_state, _name="mcx_vchain")
1441
1488
 
1442
1489
  def inverse(self, annotated: bool = False):
1443
1490
  """Invert this gate. The MCX is its own inverse.
@@ -1455,6 +1502,8 @@ class MCXVChain(MCXGate):
1455
1502
  num_ctrl_qubits=self.num_ctrl_qubits,
1456
1503
  dirty_ancillas=self._dirty_ancillas,
1457
1504
  ctrl_state=self.ctrl_state,
1505
+ relative_phase=self._relative_phase,
1506
+ action_only=self._action_only,
1458
1507
  )
1459
1508
 
1460
1509
  @staticmethod
@@ -1466,8 +1515,6 @@ class MCXVChain(MCXGate):
1466
1515
  """Define the MCX gate using a V-chain of CX gates."""
1467
1516
  # pylint: disable=cyclic-import
1468
1517
  from qiskit.circuit.quantumcircuit import QuantumCircuit
1469
- from .u1 import U1Gate
1470
- from .u2 import U2Gate
1471
1518
 
1472
1519
  q = QuantumRegister(self.num_qubits, name="q")
1473
1520
  qc = QuantumCircuit(q, name=self.name)
@@ -1475,64 +1522,83 @@ class MCXVChain(MCXGate):
1475
1522
  q_target = q[self.num_ctrl_qubits]
1476
1523
  q_ancillas = q[self.num_ctrl_qubits + 1 :]
1477
1524
 
1478
- definition = []
1479
-
1480
1525
  if self._dirty_ancillas:
1481
- i = self.num_ctrl_qubits - 3
1482
- ancilla_pre_rule = [
1483
- (U2Gate(0, numpy.pi), [q_target], []),
1484
- (CXGate(), [q_target, q_ancillas[i]], []),
1485
- (U1Gate(-numpy.pi / 4), [q_ancillas[i]], []),
1486
- (CXGate(), [q_controls[-1], q_ancillas[i]], []),
1487
- (U1Gate(numpy.pi / 4), [q_ancillas[i]], []),
1488
- (CXGate(), [q_target, q_ancillas[i]], []),
1489
- (U1Gate(-numpy.pi / 4), [q_ancillas[i]], []),
1490
- (CXGate(), [q_controls[-1], q_ancillas[i]], []),
1491
- (U1Gate(numpy.pi / 4), [q_ancillas[i]], []),
1492
- ]
1493
- for inst in ancilla_pre_rule:
1494
- definition.append(inst)
1526
+ if self.num_ctrl_qubits < 3:
1527
+ qc.mcx(q_controls, q_target)
1528
+ elif not self._relative_phase and self.num_ctrl_qubits == 3:
1529
+ qc._append(C3XGate(), [*q_controls, q_target], [])
1530
+ else:
1531
+ num_ancillas = self.num_ctrl_qubits - 2
1532
+ targets = [q_target] + q_ancillas[:num_ancillas][::-1]
1533
+
1534
+ for j in range(2):
1535
+ for i in range(self.num_ctrl_qubits): # action part
1536
+ if i < self.num_ctrl_qubits - 2:
1537
+ if targets[i] != q_target or self._relative_phase:
1538
+ # gate cancelling
1539
+
1540
+ # cancel rightmost gates of action part
1541
+ # with leftmost gates of reset part
1542
+ if self._relative_phase and targets[i] == q_target and j == 1:
1543
+ qc.cx(q_ancillas[num_ancillas - i - 1], targets[i])
1544
+ qc.t(targets[i])
1545
+ qc.cx(q_controls[self.num_ctrl_qubits - i - 1], targets[i])
1546
+ qc.tdg(targets[i])
1547
+ qc.h(targets[i])
1548
+ else:
1549
+ qc.h(targets[i])
1550
+ qc.t(targets[i])
1551
+ qc.cx(q_controls[self.num_ctrl_qubits - i - 1], targets[i])
1552
+ qc.tdg(targets[i])
1553
+ qc.cx(q_ancillas[num_ancillas - i - 1], targets[i])
1554
+ else:
1555
+ controls = [
1556
+ q_controls[self.num_ctrl_qubits - i - 1],
1557
+ q_ancillas[num_ancillas - i - 1],
1558
+ ]
1559
+
1560
+ qc.ccx(controls[0], controls[1], targets[i])
1561
+ else:
1562
+ # implements an optimized toffoli operation
1563
+ # up to a diagonal gate, akin to lemma 6 of arXiv:1501.06911
1564
+ qc.h(targets[i])
1565
+ qc.t(targets[i])
1566
+ qc.cx(q_controls[self.num_ctrl_qubits - i - 2], targets[i])
1567
+ qc.tdg(targets[i])
1568
+ qc.cx(q_controls[self.num_ctrl_qubits - i - 1], targets[i])
1569
+ qc.t(targets[i])
1570
+ qc.cx(q_controls[self.num_ctrl_qubits - i - 2], targets[i])
1571
+ qc.tdg(targets[i])
1572
+ qc.h(targets[i])
1573
+
1574
+ break
1575
+
1576
+ for i in range(num_ancillas - 1): # reset part
1577
+ qc.cx(q_ancillas[i], q_ancillas[i + 1])
1578
+ qc.t(q_ancillas[i + 1])
1579
+ qc.cx(q_controls[2 + i], q_ancillas[i + 1])
1580
+ qc.tdg(q_ancillas[i + 1])
1581
+ qc.h(q_ancillas[i + 1])
1582
+
1583
+ if self._action_only:
1584
+ qc.ccx(q_controls[-1], q_ancillas[-1], q_target)
1585
+
1586
+ break
1587
+ else:
1588
+ qc.rccx(q_controls[0], q_controls[1], q_ancillas[0])
1589
+ i = 0
1590
+ for j in range(2, self.num_ctrl_qubits - 1):
1591
+ qc.rccx(q_controls[j], q_ancillas[i], q_ancillas[i + 1])
1495
1592
 
1496
- for j in reversed(range(2, self.num_ctrl_qubits - 1)):
1497
- definition.append(
1498
- (RCCXGate(), [q_controls[j], q_ancillas[i - 1], q_ancillas[i]], [])
1499
- )
1500
- i -= 1
1593
+ i += 1
1501
1594
 
1502
- definition.append((RCCXGate(), [q_controls[0], q_controls[1], q_ancillas[0]], []))
1503
- i = 0
1504
- for j in range(2, self.num_ctrl_qubits - 1):
1505
- definition.append((RCCXGate(), [q_controls[j], q_ancillas[i], q_ancillas[i + 1]], []))
1506
- i += 1
1595
+ qc.ccx(q_controls[-1], q_ancillas[i], q_target)
1507
1596
 
1508
- if self._dirty_ancillas:
1509
- ancilla_post_rule = [
1510
- (U1Gate(-numpy.pi / 4), [q_ancillas[i]], []),
1511
- (CXGate(), [q_controls[-1], q_ancillas[i]], []),
1512
- (U1Gate(numpy.pi / 4), [q_ancillas[i]], []),
1513
- (CXGate(), [q_target, q_ancillas[i]], []),
1514
- (U1Gate(-numpy.pi / 4), [q_ancillas[i]], []),
1515
- (CXGate(), [q_controls[-1], q_ancillas[i]], []),
1516
- (U1Gate(numpy.pi / 4), [q_ancillas[i]], []),
1517
- (CXGate(), [q_target, q_ancillas[i]], []),
1518
- (U2Gate(0, numpy.pi), [q_target], []),
1519
- ]
1520
- for inst in ancilla_post_rule:
1521
- definition.append(inst)
1522
- else:
1523
- definition.append((CCXGate(), [q_controls[-1], q_ancillas[i], q_target], []))
1597
+ for j in reversed(range(2, self.num_ctrl_qubits - 1)):
1598
+ qc.rccx(q_controls[j], q_ancillas[i - 1], q_ancillas[i])
1524
1599
 
1525
- for j in reversed(range(2, self.num_ctrl_qubits - 1)):
1526
- definition.append((RCCXGate(), [q_controls[j], q_ancillas[i - 1], q_ancillas[i]], []))
1527
- i -= 1
1528
- definition.append((RCCXGate(), [q_controls[0], q_controls[1], q_ancillas[i]], []))
1600
+ i -= 1
1529
1601
 
1530
- if self._dirty_ancillas:
1531
- for i, j in enumerate(list(range(2, self.num_ctrl_qubits - 1))):
1532
- definition.append(
1533
- (RCCXGate(), [q_controls[j], q_ancillas[i], q_ancillas[i + 1]], [])
1534
- )
1602
+ qc.rccx(q_controls[0], q_controls[1], q_ancillas[i])
1535
1603
 
1536
- for instr, qargs, cargs in definition:
1537
- qc._append(instr, qargs, cargs)
1538
1604
  self.definition = qc
@@ -11,6 +11,9 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """Two-qubit XX-YY gate."""
14
+
15
+ from __future__ import annotations
16
+
14
17
  import math
15
18
  from cmath import exp
16
19
  from math import pi
@@ -24,9 +27,10 @@ from qiskit.circuit.library.standard_gates.rz import RZGate
24
27
  from qiskit.circuit.library.standard_gates.s import SdgGate, SGate
25
28
  from qiskit.circuit.library.standard_gates.sx import SXdgGate, SXGate
26
29
  from qiskit.circuit.library.standard_gates.x import CXGate
27
- from qiskit.circuit.parameterexpression import ParameterValueType
30
+ from qiskit.circuit.parameterexpression import ParameterValueType, ParameterExpression
28
31
  from qiskit.circuit.quantumcircuit import QuantumCircuit
29
32
  from qiskit.circuit.quantumregister import QuantumRegister
33
+ from qiskit._accelerate.circuit import StandardGate
30
34
 
31
35
 
32
36
  class XXMinusYYGate(Gate):
@@ -91,6 +95,8 @@ class XXMinusYYGate(Gate):
91
95
  \end{pmatrix}
92
96
  """
93
97
 
98
+ _standard_gate = StandardGate.XXMinusYYGate
99
+
94
100
  def __init__(
95
101
  self,
96
102
  theta: ParameterValueType,
@@ -153,6 +159,39 @@ class XXMinusYYGate(Gate):
153
159
 
154
160
  self.definition = circuit
155
161
 
162
+ def control(
163
+ self,
164
+ num_ctrl_qubits: int = 1,
165
+ label: str | None = None,
166
+ ctrl_state: str | int | None = None,
167
+ annotated: bool | None = None,
168
+ ):
169
+ """Return a (multi-)controlled-(XX-YY) gate.
170
+
171
+ Args:
172
+ num_ctrl_qubits: number of control qubits.
173
+ label: An optional label for the gate [Default: ``None``]
174
+ ctrl_state: control state expressed as integer,
175
+ string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
176
+ annotated: indicates whether the controlled gate should be implemented
177
+ as an annotated gate. If ``None``, this is set to ``True`` if
178
+ the gate contains free parameters, in which case it cannot
179
+ yet be synthesized.
180
+
181
+ Returns:
182
+ ControlledGate: controlled version of this gate.
183
+ """
184
+ if annotated is None:
185
+ annotated = any(isinstance(p, ParameterExpression) for p in self.params)
186
+
187
+ gate = super().control(
188
+ num_ctrl_qubits=num_ctrl_qubits,
189
+ label=label,
190
+ ctrl_state=ctrl_state,
191
+ annotated=annotated,
192
+ )
193
+ return gate
194
+
156
195
  def inverse(self, annotated: bool = False):
157
196
  """Inverse gate.
158
197
 
@@ -11,6 +11,9 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """Two-qubit XX+YY gate."""
14
+
15
+ from __future__ import annotations
16
+
14
17
  import math
15
18
  from cmath import exp
16
19
  from math import pi
@@ -20,7 +23,8 @@ import numpy
20
23
 
21
24
  from qiskit.circuit.gate import Gate
22
25
  from qiskit.circuit.quantumregister import QuantumRegister
23
- from qiskit.circuit.parameterexpression import ParameterValueType
26
+ from qiskit.circuit.parameterexpression import ParameterValueType, ParameterExpression
27
+ from qiskit._accelerate.circuit import StandardGate
24
28
 
25
29
 
26
30
  class XXPlusYYGate(Gate):
@@ -71,20 +75,24 @@ class XXPlusYYGate(Gate):
71
75
  q_1: ┤0 ├
72
76
  └───────────────┘
73
77
 
74
- .. math::
78
+ .. math::
75
79
 
76
- \newcommand{\rotationangle}{\frac{\theta}{2}}
80
+ \newcommand{\rotationangle}{\frac{\theta}{2}}
77
81
 
78
- R_{XX+YY}(\theta, \beta)\ q_0, q_1 =
79
- RZ_1(-\beta) \cdot \exp\left(-i \frac{\theta}{2} \frac{XX+YY}{2}\right) \cdot RZ_1(\beta) =
80
- \begin{pmatrix}
81
- 1 & 0 & 0 & 0 \\
82
- 0 & \cos\left(\rotationangle\right) & -i\sin\left(\rotationangle\right)e^{i\beta} & 0 \\
83
- 0 & -i\sin\left(\rotationangle\right)e^{-i\beta} & \cos\left(\rotationangle\right) & 0 \\
84
- 0 & 0 & 0 & 1
85
- \end{pmatrix}
82
+ R_{XX+YY}(\theta, \beta)\ q_0, q_1 =
83
+ RZ_1(-\beta) \cdot \exp\left(-i \frac{\theta}{2} \frac{XX+YY}{2}\right) \cdot RZ_1(\beta) =
84
+ \begin{pmatrix}
85
+ 1 & 0 & 0 & 0 \\
86
+ 0 & \cos\left(\rotationangle\right) &
87
+ -i\sin\left(\rotationangle\right)e^{i\beta} & 0 \\
88
+ 0 & -i\sin\left(\rotationangle\right)e^{-i\beta} &
89
+ \cos\left(\rotationangle\right) & 0 \\
90
+ 0 & 0 & 0 & 1
91
+ \end{pmatrix}
86
92
  """
87
93
 
94
+ _standard_gate = StandardGate.XXPlusYYGate
95
+
88
96
  def __init__(
89
97
  self,
90
98
  theta: ParameterValueType,
@@ -155,6 +163,39 @@ class XXPlusYYGate(Gate):
155
163
 
156
164
  self.definition = qc
157
165
 
166
+ def control(
167
+ self,
168
+ num_ctrl_qubits: int = 1,
169
+ label: str | None = None,
170
+ ctrl_state: str | int | None = None,
171
+ annotated: bool | None = None,
172
+ ):
173
+ """Return a (multi-)controlled-(XX+YY) gate.
174
+
175
+ Args:
176
+ num_ctrl_qubits: number of control qubits.
177
+ label: An optional label for the gate [Default: ``None``]
178
+ ctrl_state: control state expressed as integer,
179
+ string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
180
+ annotated: indicates whether the controlled gate should be implemented
181
+ as an annotated gate. If ``None``, this is set to ``True`` if
182
+ the gate contains free parameters, in which case it cannot
183
+ yet be synthesized.
184
+
185
+ Returns:
186
+ ControlledGate: controlled version of this gate.
187
+ """
188
+ if annotated is None:
189
+ annotated = any(isinstance(p, ParameterExpression) for p in self.params)
190
+
191
+ gate = super().control(
192
+ num_ctrl_qubits=num_ctrl_qubits,
193
+ label=label,
194
+ ctrl_state=ctrl_state,
195
+ annotated=annotated,
196
+ )
197
+ return gate
198
+
158
199
  def inverse(self, annotated: bool = False):
159
200
  """Return inverse XX+YY gate (i.e. with the negative rotation angle and same phase angle).
160
201
 
@@ -19,6 +19,7 @@ from typing import Optional, Union
19
19
  from qiskit.circuit.singleton import SingletonGate, SingletonControlledGate, stdlib_singleton_key
20
20
  from qiskit.circuit.quantumregister import QuantumRegister
21
21
  from qiskit.circuit._utils import with_gate_array, with_controlled_gate_array
22
+ from qiskit._accelerate.circuit import StandardGate
22
23
 
23
24
  _Y_ARRAY = [[0, -1j], [1j, 0]]
24
25
 
@@ -70,6 +71,8 @@ class YGate(SingletonGate):
70
71
  |1\rangle \rightarrow -i|0\rangle
71
72
  """
72
73
 
74
+ _standard_gate = StandardGate.YGate
75
+
73
76
  def __init__(self, label: Optional[str] = None, *, duration=None, unit="dt"):
74
77
  """Create new Y gate."""
75
78
  super().__init__("y", 1, [], label=label, duration=duration, unit=unit)
@@ -105,7 +108,7 @@ class YGate(SingletonGate):
105
108
  label: An optional label for the gate [Default: ``None``]
106
109
  ctrl_state: control state expressed as integer,
107
110
  string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
108
- annotated: indicates whether the controlled gate can be implemented
111
+ annotated: indicates whether the controlled gate should be implemented
109
112
  as an annotated gate.
110
113
 
111
114
  Returns:
@@ -197,6 +200,8 @@ class CYGate(SingletonControlledGate):
197
200
 
198
201
  """
199
202
 
203
+ _standard_gate = StandardGate.CYGate
204
+
200
205
  def __init__(
201
206
  self,
202
207
  label: Optional[str] = None,
@@ -20,6 +20,7 @@ import numpy
20
20
  from qiskit.circuit._utils import with_gate_array, with_controlled_gate_array
21
21
  from qiskit.circuit.singleton import SingletonGate, SingletonControlledGate, stdlib_singleton_key
22
22
  from qiskit.circuit.quantumregister import QuantumRegister
23
+ from qiskit._accelerate.circuit import StandardGate
23
24
 
24
25
  from .p import PhaseGate
25
26
 
@@ -73,6 +74,8 @@ class ZGate(SingletonGate):
73
74
  |1\rangle \rightarrow -|1\rangle
74
75
  """
75
76
 
77
+ _standard_gate = StandardGate.ZGate
78
+
76
79
  def __init__(self, label: Optional[str] = None, *, duration=None, unit="dt"):
77
80
  """Create new Z gate."""
78
81
  super().__init__("z", 1, [], label=label, duration=duration, unit=unit)
@@ -109,7 +112,7 @@ class ZGate(SingletonGate):
109
112
  label: An optional label for the gate [Default: ``None``]
110
113
  ctrl_state: control state expressed as integer,
111
114
  string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
112
- annotated: indicates whether the controlled gate can be implemented
115
+ annotated: indicates whether the controlled gate should be implemented
113
116
  as an annotated gate.
114
117
 
115
118
  Returns:
@@ -181,6 +184,8 @@ class CZGate(SingletonControlledGate):
181
184
  the target qubit if the control qubit is in the :math:`|1\rangle` state.
182
185
  """
183
186
 
187
+ _standard_gate = StandardGate.CZGate
188
+
184
189
  def __init__(
185
190
  self,
186
191
  label: Optional[str] = None,
@@ -281,6 +286,8 @@ class CCZGate(SingletonControlledGate):
281
286
  the target qubit if the control qubits are in the :math:`|11\rangle` state.
282
287
  """
283
288
 
289
+ _standard_gate = StandardGate.CCZGate
290
+
284
291
  def __init__(
285
292
  self,
286
293
  label: Optional[str] = None,