qiskit 1.1.2__cp38-abi3-win32.whl → 1.2.0rc1__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.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +27 -24
- qiskit/_accelerate.pyd +0 -0
- qiskit/_numpy_compat.py +1 -1
- qiskit/assembler/assemble_circuits.py +107 -64
- qiskit/assembler/assemble_schedules.py +5 -12
- qiskit/assembler/disassemble.py +10 -1
- qiskit/circuit/__init__.py +1 -1
- qiskit/circuit/_classical_resource_map.py +5 -5
- qiskit/circuit/_utils.py +0 -13
- qiskit/circuit/add_control.py +1 -1
- qiskit/circuit/annotated_operation.py +23 -1
- qiskit/circuit/classical/expr/expr.py +4 -4
- qiskit/circuit/classical/expr/visitors.py +1 -1
- qiskit/circuit/classical/types/__init__.py +1 -1
- qiskit/circuit/classical/types/types.py +2 -2
- qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
- qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
- qiskit/circuit/classicalfunction/utils.py +1 -1
- qiskit/circuit/classicalregister.py +1 -1
- qiskit/circuit/commutation_checker.py +83 -35
- qiskit/circuit/controlflow/_builder_utils.py +1 -1
- qiskit/circuit/controlflow/builder.py +10 -6
- qiskit/circuit/controlflow/if_else.py +2 -2
- qiskit/circuit/controlflow/switch_case.py +1 -1
- qiskit/circuit/delay.py +1 -1
- qiskit/circuit/duration.py +2 -2
- qiskit/circuit/equivalence.py +5 -7
- qiskit/circuit/gate.py +11 -8
- qiskit/circuit/instruction.py +31 -13
- qiskit/circuit/instructionset.py +2 -5
- qiskit/circuit/library/__init__.py +2 -1
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
- qiskit/circuit/library/basis_change/__init__.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +40 -6
- qiskit/circuit/library/blueprintcircuit.py +3 -5
- qiskit/circuit/library/data_preparation/__init__.py +9 -2
- qiskit/circuit/library/data_preparation/initializer.py +8 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
- qiskit/circuit/library/generalized_gates/isometry.py +8 -8
- qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
- qiskit/circuit/library/generalized_gates/permutation.py +8 -9
- qiskit/circuit/library/generalized_gates/uc.py +3 -3
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
- qiskit/circuit/library/generalized_gates/unitary.py +13 -11
- qiskit/circuit/library/graph_state.py +1 -1
- qiskit/circuit/library/hamiltonian_gate.py +1 -2
- qiskit/circuit/library/hidden_linear_function.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
- qiskit/circuit/library/n_local/n_local.py +4 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
- qiskit/circuit/library/n_local/two_local.py +1 -1
- qiskit/circuit/library/overlap.py +11 -5
- qiskit/circuit/library/pauli_evolution.py +7 -3
- qiskit/circuit/library/standard_gates/dcx.py +3 -0
- qiskit/circuit/library/standard_gates/ecr.py +3 -0
- qiskit/circuit/library/standard_gates/global_phase.py +3 -0
- qiskit/circuit/library/standard_gates/h.py +13 -5
- qiskit/circuit/library/standard_gates/i.py +3 -0
- qiskit/circuit/library/standard_gates/iswap.py +3 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
- qiskit/circuit/library/standard_gates/p.py +14 -9
- qiskit/circuit/library/standard_gates/r.py +3 -0
- qiskit/circuit/library/standard_gates/rx.py +21 -6
- qiskit/circuit/library/standard_gates/rxx.py +40 -1
- qiskit/circuit/library/standard_gates/ry.py +21 -6
- qiskit/circuit/library/standard_gates/ryy.py +40 -1
- qiskit/circuit/library/standard_gates/rz.py +22 -6
- qiskit/circuit/library/standard_gates/rzx.py +40 -1
- qiskit/circuit/library/standard_gates/rzz.py +41 -2
- qiskit/circuit/library/standard_gates/s.py +77 -0
- qiskit/circuit/library/standard_gates/swap.py +12 -5
- qiskit/circuit/library/standard_gates/sx.py +14 -5
- qiskit/circuit/library/standard_gates/t.py +5 -0
- qiskit/circuit/library/standard_gates/u.py +22 -7
- qiskit/circuit/library/standard_gates/u1.py +8 -3
- qiskit/circuit/library/standard_gates/u2.py +3 -0
- qiskit/circuit/library/standard_gates/u3.py +22 -7
- qiskit/circuit/library/standard_gates/x.py +156 -92
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
- qiskit/circuit/library/standard_gates/y.py +6 -1
- qiskit/circuit/library/standard_gates/z.py +8 -1
- qiskit/circuit/operation.py +1 -1
- qiskit/circuit/parameter.py +9 -10
- qiskit/circuit/parameterexpression.py +16 -13
- qiskit/circuit/parametertable.py +1 -190
- qiskit/circuit/parametervector.py +1 -1
- qiskit/circuit/quantumcircuit.py +392 -384
- qiskit/circuit/quantumcircuitdata.py +3 -5
- qiskit/circuit/quantumregister.py +1 -1
- qiskit/circuit/random/__init__.py +1 -1
- qiskit/circuit/random/utils.py +175 -26
- qiskit/circuit/register.py +5 -7
- qiskit/circuit/singleton.py +3 -3
- qiskit/circuit/tools/pi_check.py +4 -4
- qiskit/compiler/assembler.py +95 -24
- qiskit/compiler/scheduler.py +2 -2
- qiskit/compiler/transpiler.py +41 -127
- qiskit/converters/circuit_to_dag.py +4 -6
- qiskit/converters/circuit_to_gate.py +4 -8
- qiskit/converters/circuit_to_instruction.py +5 -17
- qiskit/converters/dag_to_circuit.py +2 -6
- qiskit/dagcircuit/collect_blocks.py +2 -2
- qiskit/dagcircuit/dagcircuit.py +190 -187
- qiskit/dagcircuit/dagdependency.py +4 -4
- qiskit/dagcircuit/dagdependency_v2.py +4 -4
- qiskit/dagcircuit/dagdepnode.py +1 -1
- qiskit/dagcircuit/dagnode.py +66 -157
- qiskit/passmanager/flow_controllers.py +1 -1
- qiskit/passmanager/passmanager.py +3 -3
- qiskit/primitives/__init__.py +1 -5
- qiskit/primitives/backend_estimator.py +25 -15
- qiskit/primitives/backend_estimator_v2.py +31 -7
- qiskit/primitives/backend_sampler.py +21 -12
- qiskit/primitives/backend_sampler_v2.py +12 -3
- qiskit/primitives/base/base_estimator.py +31 -4
- qiskit/primitives/base/base_primitive.py +2 -2
- qiskit/primitives/base/base_result.py +2 -2
- qiskit/primitives/base/base_sampler.py +26 -2
- qiskit/primitives/base/estimator_result.py +2 -2
- qiskit/primitives/base/sampler_result.py +2 -2
- qiskit/primitives/containers/__init__.py +0 -1
- qiskit/primitives/containers/bindings_array.py +2 -2
- qiskit/primitives/containers/bit_array.py +108 -10
- qiskit/primitives/containers/shape.py +3 -3
- qiskit/primitives/estimator.py +9 -2
- qiskit/primitives/primitive_job.py +1 -1
- qiskit/primitives/sampler.py +10 -3
- qiskit/primitives/statevector_estimator.py +5 -3
- qiskit/primitives/statevector_sampler.py +11 -5
- qiskit/primitives/utils.py +16 -0
- qiskit/providers/backend.py +15 -6
- qiskit/providers/backend_compat.py +7 -4
- qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
- qiskit/providers/basic_provider/basic_simulator.py +32 -24
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +154 -146
- qiskit/providers/fake_provider/fake_openpulse_3q.py +226 -217
- qiskit/providers/fake_provider/fake_qasm_backend.py +5 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +80 -50
- qiskit/providers/models/__init__.py +11 -0
- qiskit/providers/models/backendconfiguration.py +50 -4
- qiskit/providers/models/backendproperties.py +13 -2
- qiskit/providers/models/pulsedefaults.py +10 -11
- qiskit/providers/options.py +13 -13
- qiskit/providers/providerutils.py +3 -1
- qiskit/pulse/configuration.py +8 -12
- qiskit/pulse/instruction_schedule_map.py +3 -5
- qiskit/pulse/instructions/acquire.py +7 -8
- qiskit/pulse/instructions/instruction.py +2 -3
- qiskit/pulse/library/samplers/decorators.py +5 -9
- qiskit/pulse/library/symbolic_pulses.py +4 -7
- qiskit/pulse/library/waveform.py +2 -5
- qiskit/pulse/macros.py +11 -6
- qiskit/pulse/parser.py +8 -10
- qiskit/pulse/schedule.py +9 -17
- qiskit/pulse/transforms/alignments.py +1 -3
- qiskit/pulse/utils.py +1 -2
- qiskit/qasm/libs/stdgates.inc +35 -28
- qiskit/qasm2/__init__.py +7 -7
- qiskit/qasm2/export.py +5 -9
- qiskit/qasm2/parse.py +1 -1
- qiskit/qasm3/ast.py +9 -25
- qiskit/qasm3/exporter.py +578 -481
- qiskit/qasm3/printer.py +7 -16
- qiskit/qobj/common.py +10 -0
- qiskit/qobj/converters/lo_config.py +9 -0
- qiskit/qobj/converters/pulse_instruction.py +13 -6
- qiskit/qobj/pulse_qobj.py +69 -15
- qiskit/qobj/qasm_qobj.py +72 -20
- qiskit/qobj/utils.py +9 -0
- qiskit/qpy/binary_io/circuits.py +8 -5
- qiskit/qpy/binary_io/schedules.py +1 -1
- qiskit/qpy/binary_io/value.py +3 -3
- qiskit/qpy/interface.py +3 -2
- qiskit/qpy/type_keys.py +2 -2
- qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
- qiskit/quantum_info/operators/channel/superop.py +2 -2
- qiskit/quantum_info/operators/channel/transformations.py +1 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
- qiskit/quantum_info/operators/dihedral/random.py +6 -3
- qiskit/quantum_info/operators/measures.py +2 -2
- qiskit/quantum_info/operators/op_shape.py +12 -20
- qiskit/quantum_info/operators/operator.py +14 -21
- qiskit/quantum_info/operators/predicates.py +1 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
- qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
- qiskit/quantum_info/operators/symplectic/random.py +1 -1
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +14 -16
- qiskit/quantum_info/quaternion.py +1 -1
- qiskit/quantum_info/states/densitymatrix.py +5 -8
- qiskit/quantum_info/states/stabilizerstate.py +128 -37
- qiskit/quantum_info/states/statevector.py +4 -8
- qiskit/result/counts.py +2 -2
- qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
- qiskit/result/mitigation/local_readout_mitigator.py +2 -2
- qiskit/result/mitigation/utils.py +1 -3
- qiskit/result/models.py +17 -16
- qiskit/result/result.py +15 -20
- qiskit/scheduler/lowering.py +2 -2
- qiskit/synthesis/__init__.py +2 -1
- qiskit/synthesis/clifford/__init__.py +1 -1
- qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
- qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
- qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
- qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
- qiskit/synthesis/evolution/lie_trotter.py +46 -19
- qiskit/synthesis/evolution/product_formula.py +111 -55
- qiskit/synthesis/evolution/qdrift.py +40 -10
- qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
- qiskit/synthesis/linear/__init__.py +1 -0
- qiskit/synthesis/linear/cnot_synth.py +22 -96
- qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
- qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
- qiskit/synthesis/permutation/permutation_full.py +5 -29
- qiskit/synthesis/permutation/permutation_lnn.py +2 -24
- qiskit/synthesis/permutation/permutation_utils.py +2 -59
- qiskit/synthesis/qft/__init__.py +1 -0
- qiskit/synthesis/qft/qft_decompose_full.py +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
- qiskit/synthesis/two_qubit/local_invariance.py +8 -38
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
- qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
- qiskit/synthesis/unitary/qsd.py +5 -3
- qiskit/transpiler/__init__.py +1 -0
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/coupling.py +3 -3
- qiskit/transpiler/instruction_durations.py +1 -2
- qiskit/transpiler/layout.py +3 -3
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +82 -63
- qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
- qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
- qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
- qiskit/transpiler/passes/layout/apply_layout.py +13 -3
- qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
- qiskit/transpiler/passes/layout/set_layout.py +2 -2
- qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
- qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +11 -8
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
- qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
- qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
- qiskit/transpiler/passes/scheduling/alap.py +1 -2
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
- qiskit/transpiler/passes/scheduling/asap.py +1 -2
- qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +11 -11
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
- qiskit/transpiler/passes/synthesis/plugin.py +2 -2
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
- qiskit/transpiler/passes/utils/check_map.py +3 -6
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
- qiskit/transpiler/passes/utils/error.py +2 -2
- qiskit/transpiler/passes/utils/fixed_point.py +3 -3
- qiskit/transpiler/passes/utils/gate_direction.py +1 -1
- qiskit/transpiler/passes/utils/gates_basis.py +1 -2
- qiskit/transpiler/passmanager.py +7 -6
- qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +117 -18
- qiskit/transpiler/preset_passmanagers/common.py +3 -6
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
- qiskit/transpiler/preset_passmanagers/level0.py +1 -1
- qiskit/transpiler/target.py +27 -8
- qiskit/user_config.py +29 -6
- qiskit/utils/classtools.py +3 -3
- qiskit/utils/deprecation.py +3 -2
- qiskit/utils/lazy_tester.py +2 -2
- qiskit/utils/optionals.py +8 -8
- qiskit/visualization/bloch.py +19 -67
- qiskit/visualization/circuit/_utils.py +34 -10
- qiskit/visualization/circuit/circuit_visualization.py +23 -16
- qiskit/visualization/circuit/latex.py +29 -27
- qiskit/visualization/circuit/matplotlib.py +4 -2
- qiskit/visualization/circuit/qcstyle.py +2 -2
- qiskit/visualization/circuit/text.py +9 -15
- qiskit/visualization/dag_visualization.py +5 -12
- qiskit/visualization/pulse_v2/core.py +1 -1
- qiskit/visualization/pulse_v2/events.py +1 -1
- qiskit/visualization/pulse_v2/generators/frame.py +3 -4
- qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
- qiskit/visualization/pulse_v2/layouts.py +1 -5
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
- qiskit/visualization/state_visualization.py +5 -6
- qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
- qiskit/visualization/transition_visualization.py +7 -2
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/METADATA +26 -26
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/RECORD +340 -338
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/WHEEL +1 -1
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/entry_points.txt +3 -0
- qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/top_level.txt +0 -0
@@ -19,6 +19,7 @@ from qiskit.circuit.controlledgate import ControlledGate
|
|
19
19
|
from qiskit.circuit.gate import Gate
|
20
20
|
from qiskit.circuit.quantumregister import QuantumRegister
|
21
21
|
from qiskit.circuit.parameterexpression import ParameterValueType
|
22
|
+
from qiskit._accelerate.circuit import StandardGate
|
22
23
|
|
23
24
|
|
24
25
|
class PhaseGate(Gate):
|
@@ -75,6 +76,8 @@ class PhaseGate(Gate):
|
|
75
76
|
`1612.00858 <https://arxiv.org/abs/1612.00858>`_
|
76
77
|
"""
|
77
78
|
|
79
|
+
_standard_gate = StandardGate.PhaseGate
|
80
|
+
|
78
81
|
def __init__(
|
79
82
|
self, theta: ParameterValueType, label: str | None = None, *, duration=None, unit="dt"
|
80
83
|
):
|
@@ -96,7 +99,7 @@ class PhaseGate(Gate):
|
|
96
99
|
num_ctrl_qubits: int = 1,
|
97
100
|
label: str | None = None,
|
98
101
|
ctrl_state: str | int | None = None,
|
99
|
-
annotated: bool =
|
102
|
+
annotated: bool | None = None,
|
100
103
|
):
|
101
104
|
"""Return a (multi-)controlled-Phase gate.
|
102
105
|
|
@@ -105,8 +108,8 @@ class PhaseGate(Gate):
|
|
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
|
109
|
-
as an annotated gate.
|
111
|
+
annotated: indicates whether the controlled gate should be implemented
|
112
|
+
as an annotated gate. If ``None``, this is handled as ``False``.
|
110
113
|
|
111
114
|
Returns:
|
112
115
|
ControlledGate: controlled version of this gate.
|
@@ -197,6 +200,8 @@ class CPhaseGate(ControlledGate):
|
|
197
200
|
phase difference.
|
198
201
|
"""
|
199
202
|
|
203
|
+
_standard_gate = StandardGate.CPhaseGate
|
204
|
+
|
200
205
|
def __init__(
|
201
206
|
self,
|
202
207
|
theta: ParameterValueType,
|
@@ -250,7 +255,7 @@ class CPhaseGate(ControlledGate):
|
|
250
255
|
num_ctrl_qubits: int = 1,
|
251
256
|
label: str | None = None,
|
252
257
|
ctrl_state: str | int | None = None,
|
253
|
-
annotated: bool =
|
258
|
+
annotated: bool | None = None,
|
254
259
|
):
|
255
260
|
"""Controlled version of this gate.
|
256
261
|
|
@@ -259,8 +264,8 @@ class CPhaseGate(ControlledGate):
|
|
259
264
|
label: An optional label for the gate [Default: ``None``]
|
260
265
|
ctrl_state: control state expressed as integer,
|
261
266
|
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
262
|
-
annotated: indicates whether the controlled gate
|
263
|
-
as an annotated gate.
|
267
|
+
annotated: indicates whether the controlled gate should be implemented
|
268
|
+
as an annotated gate. If ``None``, this is handled as ``False``.
|
264
269
|
|
265
270
|
Returns:
|
266
271
|
ControlledGate: controlled version of this gate.
|
@@ -391,7 +396,7 @@ class MCPhaseGate(ControlledGate):
|
|
391
396
|
num_ctrl_qubits: int = 1,
|
392
397
|
label: str | None = None,
|
393
398
|
ctrl_state: str | int | None = None,
|
394
|
-
annotated: bool =
|
399
|
+
annotated: bool | None = None,
|
395
400
|
):
|
396
401
|
"""Controlled version of this gate.
|
397
402
|
|
@@ -400,8 +405,8 @@ class MCPhaseGate(ControlledGate):
|
|
400
405
|
label: An optional label for the gate [Default: ``None``]
|
401
406
|
ctrl_state: control state expressed as integer,
|
402
407
|
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
403
|
-
annotated: indicates whether the controlled gate
|
404
|
-
as an annotated gate.
|
408
|
+
annotated: indicates whether the controlled gate should be implemented
|
409
|
+
as an annotated gate. If ``None``, this is handled as ``False``.
|
405
410
|
|
406
411
|
Returns:
|
407
412
|
ControlledGate: controlled version of this gate.
|
@@ -20,6 +20,7 @@ import numpy
|
|
20
20
|
from qiskit.circuit.gate import Gate
|
21
21
|
from qiskit.circuit.quantumregister import QuantumRegister
|
22
22
|
from qiskit.circuit.parameterexpression import ParameterValueType
|
23
|
+
from qiskit._accelerate.circuit import StandardGate
|
23
24
|
|
24
25
|
|
25
26
|
class RGate(Gate):
|
@@ -49,6 +50,8 @@ class RGate(Gate):
|
|
49
50
|
\end{pmatrix}
|
50
51
|
"""
|
51
52
|
|
53
|
+
_standard_gate = StandardGate.RGate
|
54
|
+
|
52
55
|
def __init__(
|
53
56
|
self,
|
54
57
|
theta: ParameterValueType,
|
@@ -12,6 +12,8 @@
|
|
12
12
|
|
13
13
|
"""Rotation around the X axis."""
|
14
14
|
|
15
|
+
from __future__ import annotations
|
16
|
+
|
15
17
|
import math
|
16
18
|
from math import pi
|
17
19
|
from typing import Optional, Union
|
@@ -20,7 +22,8 @@ import numpy
|
|
20
22
|
from qiskit.circuit.controlledgate import ControlledGate
|
21
23
|
from qiskit.circuit.gate import Gate
|
22
24
|
from qiskit.circuit.quantumregister import QuantumRegister
|
23
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
25
|
+
from qiskit.circuit.parameterexpression import ParameterValueType, ParameterExpression
|
26
|
+
from qiskit._accelerate.circuit import StandardGate
|
24
27
|
|
25
28
|
|
26
29
|
class RXGate(Gate):
|
@@ -50,6 +53,8 @@ class RXGate(Gate):
|
|
50
53
|
\end{pmatrix}
|
51
54
|
"""
|
52
55
|
|
56
|
+
_standard_gate = StandardGate.RXGate
|
57
|
+
|
53
58
|
def __init__(
|
54
59
|
self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
|
55
60
|
):
|
@@ -75,9 +80,9 @@ class RXGate(Gate):
|
|
75
80
|
def control(
|
76
81
|
self,
|
77
82
|
num_ctrl_qubits: int = 1,
|
78
|
-
label:
|
79
|
-
ctrl_state:
|
80
|
-
annotated: bool =
|
83
|
+
label: str | None = None,
|
84
|
+
ctrl_state: str | int | None = None,
|
85
|
+
annotated: bool | None = None,
|
81
86
|
):
|
82
87
|
"""Return a (multi-)controlled-RX gate.
|
83
88
|
|
@@ -86,16 +91,24 @@ class RXGate(Gate):
|
|
86
91
|
label: An optional label for the gate [Default: ``None``]
|
87
92
|
ctrl_state: control state expressed as integer,
|
88
93
|
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
89
|
-
annotated: indicates whether the controlled gate
|
90
|
-
as an annotated gate.
|
94
|
+
annotated: indicates whether the controlled gate should be implemented
|
95
|
+
as an annotated gate. If ``None``, this is set to ``True`` if
|
96
|
+
the gate contains free parameters and more than one control qubit, in which
|
97
|
+
case it cannot yet be synthesized. Otherwise it is set to ``False``.
|
91
98
|
|
92
99
|
Returns:
|
93
100
|
ControlledGate: controlled version of this gate.
|
94
101
|
"""
|
102
|
+
# deliberately capture annotated in [None, False] here
|
95
103
|
if not annotated and num_ctrl_qubits == 1:
|
96
104
|
gate = CRXGate(self.params[0], label=label, ctrl_state=ctrl_state)
|
97
105
|
gate.base_gate.label = self.label
|
98
106
|
else:
|
107
|
+
# If the gate parameters contain free parameters, we cannot eagerly synthesize
|
108
|
+
# the controlled gate decomposition. In this case, we annotate the gate per default.
|
109
|
+
if annotated is None:
|
110
|
+
annotated = any(isinstance(p, ParameterExpression) for p in self.params)
|
111
|
+
|
99
112
|
gate = super().control(
|
100
113
|
num_ctrl_qubits=num_ctrl_qubits,
|
101
114
|
label=label,
|
@@ -196,6 +209,8 @@ class CRXGate(ControlledGate):
|
|
196
209
|
\end{pmatrix}
|
197
210
|
"""
|
198
211
|
|
212
|
+
_standard_gate = StandardGate.CRXGate
|
213
|
+
|
199
214
|
def __init__(
|
200
215
|
self,
|
201
216
|
theta: ParameterValueType,
|
@@ -11,12 +11,16 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Two-qubit XX-rotation gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
14
17
|
import math
|
15
18
|
from typing import Optional
|
16
19
|
import numpy
|
17
20
|
from qiskit.circuit.gate import Gate
|
18
21
|
from qiskit.circuit.quantumregister import QuantumRegister
|
19
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
22
|
+
from qiskit.circuit.parameterexpression import ParameterValueType, ParameterExpression
|
23
|
+
from qiskit._accelerate.circuit import StandardGate
|
20
24
|
|
21
25
|
|
22
26
|
class RXXGate(Gate):
|
@@ -72,6 +76,8 @@ class RXXGate(Gate):
|
|
72
76
|
\end{pmatrix}
|
73
77
|
"""
|
74
78
|
|
79
|
+
_standard_gate = StandardGate.RXXGate
|
80
|
+
|
75
81
|
def __init__(
|
76
82
|
self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
|
77
83
|
):
|
@@ -108,6 +114,39 @@ class RXXGate(Gate):
|
|
108
114
|
|
109
115
|
self.definition = qc
|
110
116
|
|
117
|
+
def control(
|
118
|
+
self,
|
119
|
+
num_ctrl_qubits: int = 1,
|
120
|
+
label: str | None = None,
|
121
|
+
ctrl_state: str | int | None = None,
|
122
|
+
annotated: bool | None = None,
|
123
|
+
):
|
124
|
+
"""Return a (multi-)controlled-RXX gate.
|
125
|
+
|
126
|
+
Args:
|
127
|
+
num_ctrl_qubits: number of control qubits.
|
128
|
+
label: An optional label for the gate [Default: ``None``]
|
129
|
+
ctrl_state: control state expressed as integer,
|
130
|
+
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
131
|
+
annotated: indicates whether the controlled gate should be implemented
|
132
|
+
as an annotated gate. If ``None``, this is set to ``True`` if
|
133
|
+
the gate contains free parameters, in which case it cannot
|
134
|
+
yet be synthesized.
|
135
|
+
|
136
|
+
Returns:
|
137
|
+
ControlledGate: controlled version of this gate.
|
138
|
+
"""
|
139
|
+
if annotated is None:
|
140
|
+
annotated = any(isinstance(p, ParameterExpression) for p in self.params)
|
141
|
+
|
142
|
+
gate = super().control(
|
143
|
+
num_ctrl_qubits=num_ctrl_qubits,
|
144
|
+
label=label,
|
145
|
+
ctrl_state=ctrl_state,
|
146
|
+
annotated=annotated,
|
147
|
+
)
|
148
|
+
return gate
|
149
|
+
|
111
150
|
def inverse(self, annotated: bool = False):
|
112
151
|
"""Return inverse RXX gate (i.e. with the negative rotation angle).
|
113
152
|
|
@@ -12,6 +12,8 @@
|
|
12
12
|
|
13
13
|
"""Rotation around the Y axis."""
|
14
14
|
|
15
|
+
from __future__ import annotations
|
16
|
+
|
15
17
|
import math
|
16
18
|
from math import pi
|
17
19
|
from typing import Optional, Union
|
@@ -19,7 +21,8 @@ import numpy
|
|
19
21
|
from qiskit.circuit.controlledgate import ControlledGate
|
20
22
|
from qiskit.circuit.gate import Gate
|
21
23
|
from qiskit.circuit.quantumregister import QuantumRegister
|
22
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
24
|
+
from qiskit.circuit.parameterexpression import ParameterValueType, ParameterExpression
|
25
|
+
from qiskit._accelerate.circuit import StandardGate
|
23
26
|
|
24
27
|
|
25
28
|
class RYGate(Gate):
|
@@ -49,6 +52,8 @@ class RYGate(Gate):
|
|
49
52
|
\end{pmatrix}
|
50
53
|
"""
|
51
54
|
|
55
|
+
_standard_gate = StandardGate.RYGate
|
56
|
+
|
52
57
|
def __init__(
|
53
58
|
self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
|
54
59
|
):
|
@@ -74,9 +79,9 @@ class RYGate(Gate):
|
|
74
79
|
def control(
|
75
80
|
self,
|
76
81
|
num_ctrl_qubits: int = 1,
|
77
|
-
label:
|
78
|
-
ctrl_state:
|
79
|
-
annotated: bool =
|
82
|
+
label: str | None = None,
|
83
|
+
ctrl_state: str | int | None = None,
|
84
|
+
annotated: bool | None = None,
|
80
85
|
):
|
81
86
|
"""Return a (multi-)controlled-RY gate.
|
82
87
|
|
@@ -85,16 +90,24 @@ class RYGate(Gate):
|
|
85
90
|
label: An optional label for the gate [Default: ``None``]
|
86
91
|
ctrl_state: control state expressed as integer,
|
87
92
|
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
88
|
-
annotated: indicates whether the controlled gate
|
89
|
-
as an annotated gate.
|
93
|
+
annotated: indicates whether the controlled gate should be implemented
|
94
|
+
as an annotated gate. If ``None``, this is set to ``True`` if
|
95
|
+
the gate contains free parameters and more than one control qubit, in which
|
96
|
+
case it cannot yet be synthesized. Otherwise it is set to ``False``.
|
90
97
|
|
91
98
|
Returns:
|
92
99
|
ControlledGate: controlled version of this gate.
|
93
100
|
"""
|
101
|
+
# deliberately capture annotated in [None, False] here
|
94
102
|
if not annotated and num_ctrl_qubits == 1:
|
95
103
|
gate = CRYGate(self.params[0], label=label, ctrl_state=ctrl_state)
|
96
104
|
gate.base_gate.label = self.label
|
97
105
|
else:
|
106
|
+
# If the gate parameters contain free parameters, we cannot eagerly synthesize
|
107
|
+
# the controlled gate decomposition. In this case, we annotate the gate per default.
|
108
|
+
if annotated is None:
|
109
|
+
annotated = any(isinstance(p, ParameterExpression) for p in self.params)
|
110
|
+
|
98
111
|
gate = super().control(
|
99
112
|
num_ctrl_qubits=num_ctrl_qubits,
|
100
113
|
label=label,
|
@@ -195,6 +208,8 @@ class CRYGate(ControlledGate):
|
|
195
208
|
\end{pmatrix}
|
196
209
|
"""
|
197
210
|
|
211
|
+
_standard_gate = StandardGate.CRYGate
|
212
|
+
|
198
213
|
def __init__(
|
199
214
|
self,
|
200
215
|
theta: ParameterValueType,
|
@@ -11,12 +11,16 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Two-qubit YY-rotation gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
14
17
|
import math
|
15
18
|
from typing import Optional
|
16
19
|
import numpy as np
|
17
20
|
from qiskit.circuit.gate import Gate
|
18
21
|
from qiskit.circuit.quantumregister import QuantumRegister
|
19
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
22
|
+
from qiskit.circuit.parameterexpression import ParameterValueType, ParameterExpression
|
23
|
+
from qiskit._accelerate.circuit import StandardGate
|
20
24
|
|
21
25
|
|
22
26
|
class RYYGate(Gate):
|
@@ -72,6 +76,8 @@ class RYYGate(Gate):
|
|
72
76
|
\end{pmatrix}
|
73
77
|
"""
|
74
78
|
|
79
|
+
_standard_gate = StandardGate.RYYGate
|
80
|
+
|
75
81
|
def __init__(
|
76
82
|
self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
|
77
83
|
):
|
@@ -108,6 +114,39 @@ class RYYGate(Gate):
|
|
108
114
|
|
109
115
|
self.definition = qc
|
110
116
|
|
117
|
+
def control(
|
118
|
+
self,
|
119
|
+
num_ctrl_qubits: int = 1,
|
120
|
+
label: str | None = None,
|
121
|
+
ctrl_state: str | int | None = None,
|
122
|
+
annotated: bool | None = None,
|
123
|
+
):
|
124
|
+
"""Return a (multi-)controlled-YY gate.
|
125
|
+
|
126
|
+
Args:
|
127
|
+
num_ctrl_qubits: number of control qubits.
|
128
|
+
label: An optional label for the gate [Default: ``None``]
|
129
|
+
ctrl_state: control state expressed as integer,
|
130
|
+
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
131
|
+
annotated: indicates whether the controlled gate should be implemented
|
132
|
+
as an annotated gate. If ``None``, this is set to ``True`` if
|
133
|
+
the gate contains free parameters, in which case it cannot
|
134
|
+
yet be synthesized.
|
135
|
+
|
136
|
+
Returns:
|
137
|
+
ControlledGate: controlled version of this gate.
|
138
|
+
"""
|
139
|
+
if annotated is None:
|
140
|
+
annotated = any(isinstance(p, ParameterExpression) for p in self.params)
|
141
|
+
|
142
|
+
gate = super().control(
|
143
|
+
num_ctrl_qubits=num_ctrl_qubits,
|
144
|
+
label=label,
|
145
|
+
ctrl_state=ctrl_state,
|
146
|
+
annotated=annotated,
|
147
|
+
)
|
148
|
+
return gate
|
149
|
+
|
111
150
|
def inverse(self, annotated: bool = False):
|
112
151
|
"""Return inverse RYY gate (i.e. with the negative rotation angle).
|
113
152
|
|
@@ -11,12 +11,16 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Rotation around the Z axis."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
14
17
|
from cmath import exp
|
15
18
|
from typing import Optional, Union
|
16
19
|
from qiskit.circuit.gate import Gate
|
17
20
|
from qiskit.circuit.controlledgate import ControlledGate
|
18
21
|
from qiskit.circuit.quantumregister import QuantumRegister
|
19
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
22
|
+
from qiskit.circuit.parameterexpression import ParameterValueType, ParameterExpression
|
23
|
+
from qiskit._accelerate.circuit import StandardGate
|
20
24
|
|
21
25
|
|
22
26
|
class RZGate(Gate):
|
@@ -59,6 +63,8 @@ class RZGate(Gate):
|
|
59
63
|
`1612.00858 <https://arxiv.org/abs/1612.00858>`_
|
60
64
|
"""
|
61
65
|
|
66
|
+
_standard_gate = StandardGate.RZGate
|
67
|
+
|
62
68
|
def __init__(
|
63
69
|
self, phi: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
|
64
70
|
):
|
@@ -85,9 +91,9 @@ class RZGate(Gate):
|
|
85
91
|
def control(
|
86
92
|
self,
|
87
93
|
num_ctrl_qubits: int = 1,
|
88
|
-
label:
|
89
|
-
ctrl_state:
|
90
|
-
annotated: bool =
|
94
|
+
label: str | None = None,
|
95
|
+
ctrl_state: str | int | None = None,
|
96
|
+
annotated: bool | None = None,
|
91
97
|
):
|
92
98
|
"""Return a (multi-)controlled-RZ gate.
|
93
99
|
|
@@ -96,16 +102,24 @@ class RZGate(Gate):
|
|
96
102
|
label: An optional label for the gate [Default: ``None``]
|
97
103
|
ctrl_state: control state expressed as integer,
|
98
104
|
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
99
|
-
annotated: indicates whether the controlled gate
|
100
|
-
as an annotated gate.
|
105
|
+
annotated: indicates whether the controlled gate should be implemented
|
106
|
+
as an annotated gate. If ``None``, this is set to ``True`` if
|
107
|
+
the gate contains free parameters and more than one control qubit, in which
|
108
|
+
case it cannot yet be synthesized. Otherwise it is set to ``False``.
|
101
109
|
|
102
110
|
Returns:
|
103
111
|
ControlledGate: controlled version of this gate.
|
104
112
|
"""
|
113
|
+
# deliberately capture annotated in [None, False] here
|
105
114
|
if not annotated and num_ctrl_qubits == 1:
|
106
115
|
gate = CRZGate(self.params[0], label=label, ctrl_state=ctrl_state)
|
107
116
|
gate.base_gate.label = self.label
|
108
117
|
else:
|
118
|
+
# If the gate parameters contain free parameters, we cannot eagerly synthesize
|
119
|
+
# the controlled gate decomposition. In this case, we annotate the gate per default.
|
120
|
+
if annotated is None:
|
121
|
+
annotated = any(isinstance(p, ParameterExpression) for p in self.params)
|
122
|
+
|
109
123
|
gate = super().control(
|
110
124
|
num_ctrl_qubits=num_ctrl_qubits,
|
111
125
|
label=label,
|
@@ -213,6 +227,8 @@ class CRZGate(ControlledGate):
|
|
213
227
|
phase difference.
|
214
228
|
"""
|
215
229
|
|
230
|
+
_standard_gate = StandardGate.CRZGate
|
231
|
+
|
216
232
|
def __init__(
|
217
233
|
self,
|
218
234
|
theta: ParameterValueType,
|
@@ -11,11 +11,15 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Two-qubit ZX-rotation gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
14
17
|
import math
|
15
18
|
from typing import Optional
|
16
19
|
from qiskit.circuit.gate import Gate
|
17
20
|
from qiskit.circuit.quantumregister import QuantumRegister
|
18
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
21
|
+
from qiskit.circuit.parameterexpression import ParameterValueType, ParameterExpression
|
22
|
+
from qiskit._accelerate.circuit import StandardGate
|
19
23
|
|
20
24
|
|
21
25
|
class RZXGate(Gate):
|
@@ -117,6 +121,8 @@ class RZXGate(Gate):
|
|
117
121
|
\end{pmatrix}
|
118
122
|
"""
|
119
123
|
|
124
|
+
_standard_gate = StandardGate.RZXGate
|
125
|
+
|
120
126
|
def __init__(
|
121
127
|
self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
|
122
128
|
):
|
@@ -152,6 +158,39 @@ class RZXGate(Gate):
|
|
152
158
|
|
153
159
|
self.definition = qc
|
154
160
|
|
161
|
+
def control(
|
162
|
+
self,
|
163
|
+
num_ctrl_qubits: int = 1,
|
164
|
+
label: str | None = None,
|
165
|
+
ctrl_state: str | int | None = None,
|
166
|
+
annotated: bool | None = None,
|
167
|
+
):
|
168
|
+
"""Return a (multi-)controlled-RZX gate.
|
169
|
+
|
170
|
+
Args:
|
171
|
+
num_ctrl_qubits: number of control qubits.
|
172
|
+
label: An optional label for the gate [Default: ``None``]
|
173
|
+
ctrl_state: control state expressed as integer,
|
174
|
+
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
175
|
+
annotated: indicates whether the controlled gate should be implemented
|
176
|
+
as an annotated gate. If ``None``, this is set to ``True`` if
|
177
|
+
the gate contains free parameters, in which case it cannot
|
178
|
+
yet be synthesized.
|
179
|
+
|
180
|
+
Returns:
|
181
|
+
ControlledGate: controlled version of this gate.
|
182
|
+
"""
|
183
|
+
if annotated is None:
|
184
|
+
annotated = any(isinstance(p, ParameterExpression) for p in self.params)
|
185
|
+
|
186
|
+
gate = super().control(
|
187
|
+
num_ctrl_qubits=num_ctrl_qubits,
|
188
|
+
label=label,
|
189
|
+
ctrl_state=ctrl_state,
|
190
|
+
annotated=annotated,
|
191
|
+
)
|
192
|
+
return gate
|
193
|
+
|
155
194
|
def inverse(self, annotated: bool = False):
|
156
195
|
"""Return inverse RZX gate (i.e. with the negative rotation angle).
|
157
196
|
|
@@ -11,11 +11,15 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Two-qubit ZZ-rotation gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
14
17
|
from cmath import exp
|
15
18
|
from typing import Optional
|
16
19
|
from qiskit.circuit.gate import Gate
|
17
20
|
from qiskit.circuit.quantumregister import QuantumRegister
|
18
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
21
|
+
from qiskit.circuit.parameterexpression import ParameterValueType, ParameterExpression
|
22
|
+
from qiskit._accelerate.circuit import StandardGate
|
19
23
|
|
20
24
|
|
21
25
|
class RZZGate(Gate):
|
@@ -71,7 +75,7 @@ class RZZGate(Gate):
|
|
71
75
|
|
72
76
|
.. math::
|
73
77
|
|
74
|
-
R_{ZZ}(\theta = \pi) = - Z \otimes Z
|
78
|
+
R_{ZZ}(\theta = \pi) = - i Z \otimes Z
|
75
79
|
|
76
80
|
.. math::
|
77
81
|
|
@@ -84,6 +88,8 @@ class RZZGate(Gate):
|
|
84
88
|
\end{pmatrix}
|
85
89
|
"""
|
86
90
|
|
91
|
+
_standard_gate = StandardGate.RZZGate
|
92
|
+
|
87
93
|
def __init__(
|
88
94
|
self, theta: ParameterValueType, label: Optional[str] = None, *, duration=None, unit="dt"
|
89
95
|
):
|
@@ -116,6 +122,39 @@ class RZZGate(Gate):
|
|
116
122
|
|
117
123
|
self.definition = qc
|
118
124
|
|
125
|
+
def control(
|
126
|
+
self,
|
127
|
+
num_ctrl_qubits: int = 1,
|
128
|
+
label: str | None = None,
|
129
|
+
ctrl_state: str | int | None = None,
|
130
|
+
annotated: bool | None = None,
|
131
|
+
):
|
132
|
+
"""Return a (multi-)controlled-RZZ gate.
|
133
|
+
|
134
|
+
Args:
|
135
|
+
num_ctrl_qubits: number of control qubits.
|
136
|
+
label: An optional label for the gate [Default: ``None``]
|
137
|
+
ctrl_state: control state expressed as integer,
|
138
|
+
string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
|
139
|
+
annotated: indicates whether the controlled gate should be implemented
|
140
|
+
as an annotated gate. If ``None``, this is set to ``True`` if
|
141
|
+
the gate contains free parameters, in which case it cannot
|
142
|
+
yet be synthesized.
|
143
|
+
|
144
|
+
Returns:
|
145
|
+
ControlledGate: controlled version of this gate.
|
146
|
+
"""
|
147
|
+
if annotated is None:
|
148
|
+
annotated = any(isinstance(p, ParameterExpression) for p in self.params)
|
149
|
+
|
150
|
+
gate = super().control(
|
151
|
+
num_ctrl_qubits=num_ctrl_qubits,
|
152
|
+
label=label,
|
153
|
+
ctrl_state=ctrl_state,
|
154
|
+
annotated=annotated,
|
155
|
+
)
|
156
|
+
return gate
|
157
|
+
|
119
158
|
def inverse(self, annotated: bool = False):
|
120
159
|
"""Return inverse RZZ gate (i.e. with the negative rotation angle).
|
121
160
|
|