pub struct GateInstruction {
pub gate: QuantumGate,
pub target: usize,
pub control: BTreeSet<usize>,
pub control_locked: bool,
pub is_approximated: bool,
pub decomposed: Option<Vec<DecomposedGate>>,
}Expand description
A fully-specified gate instruction applied to one or more logical qubits.
A GateInstruction bundles a QuantumGate with its target qubit index
and a set of control qubit indices. It also tracks whether new
controls may still be added (control_locked), whether approximate
decomposition algorithms may be used (is_approximated), and the optional
pre-computed gate decomposition (decomposed).
Fields§
§gate: QuantumGateThe quantum gate to apply.
target: usizeThe index of the target qubit.
control: BTreeSet<usize>The set of control qubit indices.
control_locked: boolWhen true, no additional control qubits may be added to this instruction.
is_approximated: boolWhen true, the gate decomposition may use relative-phase decompostion that
reduce the gate count.
decomposed: Option<Vec<DecomposedGate>>The gate decomposed into primitive (CNOT + single-qubit) operations.
Implementations§
Source§impl GateInstruction
impl GateInstruction
Sourcepub const fn new(gate: QuantumGate, target: usize) -> Self
pub const fn new(gate: QuantumGate, target: usize) -> Self
Creates a new uncontrolled gate instruction for gate applied to target.
Sourcepub fn inverse(&self) -> Self
pub fn inverse(&self) -> Self
Returns the adjoint (inverse) of this gate instruction.
The control set and lock status are preserved. If the instruction has already been decomposed, the decomposition is reversed and each constituent gate is individually inverted.
Sourcepub fn control(&self, control_qubits: &[usize]) -> Result<Self, KetError>
pub fn control(&self, control_qubits: &[usize]) -> Result<Self, KetError>
Adds control_qubits to the control set of this instruction.
§Errors
KetError::DuplicateControlQubit: one ofcontrol_qubitsis already present in the control set.KetError::ControlTargetConflict: one ofcontrol_qubitsis the same qubit asself.target.
If the instruction’s controls are locked (GateInstruction::control_locked
is true), the call is a no-op and Ok(self.clone()) is returned.
Sourcepub fn enable_approximated_decomposition(&mut self)
pub fn enable_approximated_decomposition(&mut self)
Enable approximate decomposition.
When is_approximated is true, decomposition algorithms use a
smaller circuits are permitted.
Sourcepub fn lock_control(&mut self)
pub fn lock_control(&mut self)
Lock the control set.
A locked instruction will silently ignore any subsequent calls to
GateInstruction::control, returning a clone of itself unchanged.
Sourcepub fn commutes_with(&self, other: &Self) -> bool
pub fn commutes_with(&self, other: &Self) -> bool
Returns true if this instruction commutes with other.
Two instructions commute when both are diagonal, or when they apply the same gate to the same target.
Sourcepub fn decompose(&mut self, clean_auxiliary_range: (usize, usize))
pub fn decompose(&mut self, clean_auxiliary_range: (usize, usize))
Decomposes a multi-controlled gate into primitive two-qubit operations.
The decomposition is written into self.decomposed. If the instruction
has no control qubits, or if decomposed is already populated, this
method is a no-op.
clean_auxiliary_range is a half-open range (start, end) of qubit
indices that are guaranteed to be in the |0⟩ state (clean auxiliary).
Trait Implementations§
Source§impl Clone for GateInstruction
impl Clone for GateInstruction
Source§fn clone(&self) -> GateInstruction
fn clone(&self) -> GateInstruction
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for GateInstruction
impl Debug for GateInstruction
Source§impl From<&DecomposedGate> for GateInstruction
impl From<&DecomposedGate> for GateInstruction
Source§fn from(value: &DecomposedGate) -> Self
fn from(value: &DecomposedGate) -> Self
Source§impl PartialEq for GateInstruction
impl PartialEq for GateInstruction
Source§impl Serialize for GateInstruction
impl Serialize for GateInstruction
impl StructuralPartialEq for GateInstruction
Auto Trait Implementations§
impl Freeze for GateInstruction
impl RefUnwindSafe for GateInstruction
impl Send for GateInstruction
impl Sync for GateInstruction
impl Unpin for GateInstruction
impl UnsafeUnpin for GateInstruction
impl UnwindSafe for GateInstruction
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more