View source on GitHub |
A sum of terms acting on qubits, e.g., 0.5 * 'X0 X5' + 0.3 * 'Z1 Z2'.
Inherits From: SymbolicOperator
openfermion.ops.QubitOperator(
term=None, coefficient=1.0
)
Used in the notebooks
Used in the tutorials |
---|
A term is an operator acting on n qubits and can be represented as:
coefficient * local_operator[0] x ... x local_operator[n-1]
where x is the tensor product. A local operator is a Pauli operator ('I', 'X', 'Y', or 'Z') which acts on one qubit. In math notation a term is, for example, 0.5 * 'X0 X5', which means that a Pauli X operator acts on qubit 0 and 5, while the identity operator acts on all other qubits.
A QubitOperator represents a sum of terms acting on qubits and overloads operations for easy manipulation of these objects by the user.
Note for a QubitOperator to be a Hamiltonian which is a hermitian operator, the coefficients of all terms must be real.
.. code-block:: python
hamiltonian = 0.5 * QubitOperator('X0 X5') + 0.3 * QubitOperator('Z0')
QubitOperator is a subclass of SymbolicOperator. Importantly, it has attributes set as follows::
actions = ('X', 'Y', 'Z')
action_strings = ('X', 'Y', 'Z')
action_before_index = True
different_indices_commute = True
See the documentation of SymbolicOperator for more details.
Example | |
---|---|
.. code-block:: python
ham = ((QubitOperator('X0 Y3', 0.5)
Equivalentlyham2 = QubitOperator('X0 Y3', 0.5) ham2 += 0.6 * QubitOperator('X0 Y3') |
Note | |
---|---|
Adding QubitOperators is faster using += (as this is done by in-place addition). Specifying the coefficient during initialization is faster than multiplying a QubitOperator with a scalar. |
Methods
accumulate
@classmethod
accumulate( operators, start=None )
Sums over SymbolicOperators.
compress
compress(
abs_tol=EQ_TOLERANCE
)
Eliminates all terms with coefficients close to zero and removes small imaginary and real parts.
Args | |
---|---|
abs_tol
|
float
Absolute tolerance, must be at least 0.0 |
get_operator_groups
get_operator_groups(
num_groups
)
Gets a list of operators with a few terms.
Args | |
---|---|
num_groups
|
int
How many operators to get in the end. |
Returns | |
---|---|
operators
|
[self.__class__]
A list of operators summing up to self. |
get_operators
get_operators()
Gets a list of operators with a single term.
Returns | |
---|---|
operators
|
[self.__class__]
A generator of the operators in self. |
identity
@classmethod
identity()
Returns: multiplicative_identity (SymbolicOperator): A symbolic operator u with the property that ux = xu = x for all operators x of the same class.
induced_norm
induced_norm(
order=1
)
Compute the induced p-norm of the operator.
If we represent an operator as \(\sum_{j} w_j H_j\) where \(w_j\) are scalar coefficients then this norm is \(\left(\sum_{j} \| w_j \|^p \right)^{\frac{1}{p} }\) where \(p\) is the order of the induced norm
Args | |
---|---|
order
|
int
the order of the induced norm. |
isclose
isclose(
other, tol=EQ_TOLERANCE
)
Check if other (SymbolicOperator) is close to self.
Comparison is done for each term individually. Return True if the difference between each term in self and other is less than EQ_TOLERANCE
Args | |
---|---|
other
|
SymbolicOperator
SymbolicOperator to compare against. |
many_body_order
many_body_order()
Compute the many-body order of a SymbolicOperator.
The many-body order of a SymbolicOperator is the maximum length of a term with nonzero coefficient.
Returns | |
---|---|
int |
renormalize
renormalize()
Fix the trace norm of an operator to 1
zero
@classmethod
zero()
Returns: additive_identity (SymbolicOperator): A symbolic operator o with the property that o+x = x+o = x for all operators x of the same class.
__add__
__add__(
addend
)
Args: addend (SymbolicOperator): The operator to add.
Returns | |
---|---|
sum (SymbolicOperator) |
__div__
__div__(
divisor
)
For compatibility with Python 2.
__eq__
__eq__(
other
)
Approximate numerical equality (not true equality).
__iter__
__iter__()
__mul__
__mul__(
multiplier
)
Return self * multiplier for a scalar, or a SymbolicOperator.
Args | |
---|---|
multiplier
|
A scalar, or a SymbolicOperator. |
Returns | |
---|---|
product (SymbolicOperator) |
Raises | |
---|---|
TypeError
|
Invalid type cannot be multiply with SymbolicOperator. |
__ne__
__ne__(
other
)
Return self!=value.
__neg__
__neg__()
Returns: negation (SymbolicOperator)
__pow__
__pow__(
exponent
)
Exponentiate the SymbolicOperator.
Args | |
---|---|
exponent
|
int
The exponent with which to raise the operator. |
Returns | |
---|---|
exponentiated (SymbolicOperator) |
Raises | |
---|---|
ValueError
|
Can only raise SymbolicOperator to non-negative integer powers. |
__radd__
__radd__(
addend
)
Args: addend (SymbolicOperator): The operator to add.
Returns | |
---|---|
sum (SymbolicOperator) |
__rmul__
__rmul__(
multiplier
)
Return multiplier * self for a scalar.
We only define rmul for scalars because the left multiply exist for SymbolicOperator and left multiply is also queried as the default behavior.
Args | |
---|---|
multiplier
|
A scalar to multiply by. |
Returns | |
---|---|
product
|
A new instance of SymbolicOperator. |
Raises | |
---|---|
TypeError
|
Object of invalid type cannot multiply SymbolicOperator. |
__rsub__
__rsub__(
subtrahend
)
Args: subtrahend (SymbolicOperator): The operator to subtract.
Returns | |
---|---|
difference (SymbolicOperator) |
__sub__
__sub__(
subtrahend
)
Args: subtrahend (SymbolicOperator): The operator to subtract.
Returns | |
---|---|
difference (SymbolicOperator) |
__truediv__
__truediv__(
divisor
)
Return self / divisor for a scalar.
Note | |
---|---|
This is always floating point division. |
Args | |
---|---|
divisor
|
A scalar to divide by. |
Returns | |
---|---|
A new instance of SymbolicOperator. |
Raises | |
---|---|
TypeError
|
Cannot divide local operator by non-scalar type. |