Struct pauli::PauliOperator [−][src]
pub struct PauliOperator { /* fields omitted */ }
Expand description
A Pauli operator optimized for sparse operations.
A Pauli operator is a string of Paulis
such as IXIX
or XIYIZ
.
However,
we usually only care about the non-identity positions
and we refer to the previous as operators as X_1 X_3
and X_0 Y_2 Z_4
.
Implementations
impl PauliOperator
[src]
impl PauliOperator
[src]pub fn new(length: usize, positions: Vec<usize>, paulis: Vec<Pauli>) -> Self
[src]
pub fn new(length: usize, positions: Vec<usize>, paulis: Vec<Pauli>) -> Self
[src]Builds a new Pauli Operator.
To build an operator, we specify the length, the position of non-identity elements and their values.
Exemple
This creates the XIYIZ
operator.
let operator = PauliOperator::new(5, vec![0, 2, 4], vec![X, Y, Z]);
Panic
Panics if a position is greater or equal to the length or if the number of positions and Paulis are different.
pub fn try_new(
length: usize,
positions: Vec<usize>,
paulis: Vec<Pauli>
) -> Result<Self, PauliError>
[src]
pub fn try_new(
length: usize,
positions: Vec<usize>,
paulis: Vec<Pauli>
) -> Result<Self, PauliError>
[src]Builds a new Pauli Operator or returns an error if either a position is greater or equal to the length or if the numbers of positions and Paulis are different.
Exemple
This creates the XIYIZ
operator.
let operator = PauliOperator::try_new(5, vec![0, 2, 4], vec![X, Y, Z]); assert!(operator.is_ok());
pub fn commutes_with(&self, other: &Self) -> bool
[src]
pub fn commutes_with(&self, other: &Self) -> bool
[src]Checks if two operators commute.
If an operator is smaller than the other, it is padded with identities.
Example
let op1 = PauliOperator::new(5, vec![1, 2, 3], vec![X, Y, Z]); let op2 = PauliOperator::new(5, vec![2, 3, 4], vec![X, X, X]); let op3 = PauliOperator::new(5, vec![0, 1], vec![Z, Z]); assert!(op1.commutes_with(&op2)); assert!(!op1.commutes_with(&op3));
pub fn anticommutes_with(&self, other: &Self) -> bool
[src]
pub fn anticommutes_with(&self, other: &Self) -> bool
[src]Checks if two operators anticommute.
If an operator is smaller than the other, it is padded with identities.
Example
let op1 = PauliOperator::new(5, vec![1, 2, 3], vec![X, Y, Z]); let op2 = PauliOperator::new(5, vec![2, 3, 4], vec![X, X, X]); let op3 = PauliOperator::new(5, vec![0, 1], vec![Z, Z]); assert!(!op1.anticommutes_with(&op2)); assert!(op1.anticommutes_with(&op3));
pub fn iter(&self) -> VectorIterator<'_, Pauli, usize>
[src]
pub fn iter(&self) -> VectorIterator<'_, Pauli, usize>
[src]Returns an iterator over pairs of positions and Paulis.
Example
let operator = PauliOperator::new(5, vec![0, 2, 4], vec![X, Y, Z]); let mut iter = operator.iter(); assert_eq!(iter.next(), Some((0, &X))); assert_eq!(iter.next(), Some((2, &Y))); assert_eq!(iter.next(), Some((4, &Z))); assert_eq!(iter.next(), None);
pub fn get(&self, position: usize) -> Option<Pauli>
[src]
pub fn get(&self, position: usize) -> Option<Pauli>
[src]Returns the Pauli at the given position or None if the position is out of bound.
Example
let operator = PauliOperator::new(5, vec![0, 2, 4], vec![X, Y, Z]); assert_eq!(operator.get(0), Some(X)); assert_eq!(operator.get(1), Some(I)); assert_eq!(operator.get(2), Some(Y)); assert_eq!(operator.get(10), None);
pub fn non_trivial_positions(&self) -> &[usize]
[src]
pub fn non_trivial_positions(&self) -> &[usize]
[src]Returns a slice of the positions where the element is not identity.
Example
let operator = PauliOperator::new(5, vec![0, 2, 4], vec![X, Y, Z]); assert_eq!(operator.non_trivial_positions(), &[0, 2, 4]);
pub fn partition_x_and_z(&self) -> (Self, Self)
[src]
pub fn partition_x_and_z(&self) -> (Self, Self)
[src]Returns two operators such that there product is the original operator and the first contains only Xs and the second only Zs.
Example
let operator = PauliOperator::new(5, vec![0, 2, 4], vec![X, Y, Z]); let (x_operator, z_operator) = operator.partition_x_and_z(); assert_eq!(x_operator, PauliOperator::new(5, vec![0, 2], vec![X, X])); assert_eq!(z_operator, PauliOperator::new(5, vec![2, 4], vec![Z, Z]));
pub fn x_part(&self) -> Self
[src]
pub fn x_part(&self) -> Self
[src]Returns the X part of the operator.
Example
let operator = PauliOperator::new(5, vec![0, 2, 4], vec![X, Y, Z]); let x_operator = operator.x_part(); assert_eq!(x_operator, PauliOperator::new(5, vec![0, 2], vec![X, X]));
pub fn z_part(&self) -> Self
[src]
pub fn z_part(&self) -> Self
[src]Returns the Z part of the operator.
Example
let operator = PauliOperator::new(5, vec![0, 2, 4], vec![X, Y, Z]); let z_operator = operator.z_part(); assert_eq!(z_operator, PauliOperator::new(5, vec![2, 4], vec![Z, Z]));
pub fn multiply_with(&self, other: &Self) -> Result<Self, PauliError>
[src]
pub fn multiply_with(&self, other: &Self) -> Result<Self, PauliError>
[src]Returns the element-wise product of two operators or an Error if they have different lengths.
For a panicking version, use the *
operator.
Example
let op1 = PauliOperator::new(5, vec![1, 2, 3], vec![X, Y, Z]); let op2 = PauliOperator::new(5, vec![2, 3, 4], vec![Y, X, Z]); let product = PauliOperator::new(5, vec![1, 3, 4], vec![X, Y, Z]); assert_eq!(op1.multiply_with(&op2), Ok(product))
pub fn into_raw_positions(self) -> Vec<usize>
[src]
pub fn into_raw_positions(self) -> Vec<usize>
[src]Converts a PauliOperator to a Vec of its non trivial positions consumming the operator.
Example
let operator = PauliOperator::new(5, vec![1, 2, 3], vec![X, Y, Z]); let positions = operator.into_raw_positions(); assert_eq!(positions, vec![1, 2, 3]);
pub fn into_raw_paulis(self) -> Vec<Pauli>
[src]
pub fn into_raw_paulis(self) -> Vec<Pauli>
[src]Converts a PauliOperator to a Vec of the Paulis consumming the operator.
Example
let operator = PauliOperator::new(5, vec![1, 2, 3], vec![X, Y, Z]); let paulis = operator.into_raw_paulis(); assert_eq!(paulis, vec![X, Y, Z]);
pub fn into_raw(self) -> (Vec<usize>, Vec<Pauli>)
[src]
pub fn into_raw(self) -> (Vec<usize>, Vec<Pauli>)
[src]Converts a PauliOperator to a Vec of the positions and a Vec of Paulis consumming the operator.
Example
let operator = PauliOperator::new(5, vec![1, 2, 3], vec![X, Y, Z]); let (positions, paulis) = operator.into_raw(); assert_eq!(positions, vec![1, 2, 3]); assert_eq!(paulis, vec![X, Y, Z]);
Trait Implementations
impl Clone for PauliOperator
[src]
impl Clone for PauliOperator
[src]fn clone(&self) -> PauliOperator
[src]
fn clone(&self) -> PauliOperator
[src]Returns a copy of the value. Read more
fn clone_from(&mut self, source: &Self)
1.0.0[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]Performs copy-assignment from source
. Read more
impl Debug for PauliOperator
[src]
impl Debug for PauliOperator
[src]impl<'de> Deserialize<'de> for PauliOperator
[src]
impl<'de> Deserialize<'de> for PauliOperator
[src]fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
[src]
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
[src]Deserialize this value from the given Serde deserializer. Read more
impl Display for PauliOperator
[src]
impl Display for PauliOperator
[src]impl Hash for PauliOperator
[src]
impl Hash for PauliOperator
[src]impl<'a> Mul<&'a PauliOperator> for &'a PauliOperator
[src]
impl<'a> Mul<&'a PauliOperator> for &'a PauliOperator
[src]impl PartialEq<PauliOperator> for PauliOperator
[src]
impl PartialEq<PauliOperator> for PauliOperator
[src]fn eq(&self, other: &PauliOperator) -> bool
[src]
fn eq(&self, other: &PauliOperator) -> bool
[src]This method tests for self
and other
values to be equal, and is used
by ==
. Read more
fn ne(&self, other: &PauliOperator) -> bool
[src]
fn ne(&self, other: &PauliOperator) -> bool
[src]This method tests for !=
.
impl Serialize for PauliOperator
[src]
impl Serialize for PauliOperator
[src]impl Eq for PauliOperator
[src]
impl StructuralEq for PauliOperator
[src]
impl StructuralPartialEq for PauliOperator
[src]
Auto Trait Implementations
impl RefUnwindSafe for PauliOperator
impl Send for PauliOperator
impl Sync for PauliOperator
impl Unpin for PauliOperator
impl UnwindSafe for PauliOperator
Blanket Implementations
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]pub fn borrow_mut(&mut self) -> &mut T
[src]
pub fn borrow_mut(&mut self) -> &mut T
[src]Mutably borrows from an owned value. Read more
impl<T> Pointable for T
impl<T> Pointable for T
impl<SS, SP> SupersetOf<SS> for SP where
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SP where
SS: SubsetOf<SP>,
pub fn to_subset(&self) -> Option<SS>
pub fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct self
from the equivalent element of its
superset. Read more
pub fn is_in_subset(&self) -> bool
pub fn is_in_subset(&self) -> bool
Checks if self
is actually part of its subset T
(and can be converted to it).
pub unsafe fn to_subset_unchecked(&self) -> SS
pub unsafe fn to_subset_unchecked(&self) -> SS
Use with care! Same as self.to_subset
but without any property checks. Always succeeds.
pub fn from_subset(element: &SS) -> SP
pub fn from_subset(element: &SS) -> SP
The inclusion map: converts self
to the equivalent element of its superset.
impl<T> ToOwned for T where
T: Clone,
[src]
impl<T> ToOwned for T where
T: Clone,
[src]type Owned = T
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn to_owned(&self) -> T
[src]Creates owned data from borrowed data, usually by cloning. Read more
pub fn clone_into(&self, target: &mut T)
[src]
pub fn clone_into(&self, target: &mut T)
[src]🔬 This is a nightly-only experimental API. (toowned_clone_into
)
recently added
Uses borrowed data to replace owned data, usually by cloning. Read more
impl<T> DeserializeOwned for T where
T: for<'de> Deserialize<'de>,
[src]
T: for<'de> Deserialize<'de>,