filter_diagonal_terms
filter_diagonal_terms(op)
Filters out the terms of an operator that are diagonal in the occupation-number basis.
This removes every term from the provided BosonOperator that is a product of number operators (). This includes the constant term (a product of zero number operators), single number operators, as well as higher-order products such as . A mode may repeat, so products such as are diagonal, too.
A diagonal term only multiplies each Fock state by a phase. Filtering such terms is therefore only appropriate when that phase is irrelevant to what you compute, for example when only the sampled occupations of a time-evolved state matter. It is not a general simplification: on a superposition of Fock states, the phases differ between its components.
The provided operator must be normal-ordered! This is an underlying assumption of the implementation that is not being verified. See normal_ordered() for how to get an operator of that form.
The operator is modified in place. If it tracks group indices (see groups), surviving terms retain their relative grouping but the group indices are reassigned to a contiguous range starting from 0. You must therefore not rely on the specific group index of any term being preserved across a call to this function.
>>> from qiskit_bosons.operators import BosonOperator
>>> from qiskit_bosons.operators.terms.filtering import filter_diagonal_terms
>>> op = BosonOperator.from_dict(
... {
... (): 1.0, # constant (diagonal)
... ((True, 0), (False, 0)): 2.0, # n_0 (diagonal)
... ((True, 0), (True, 1), (False, 1), (False, 0)): 3.0, # n_0 n_1 (diagonal)
... ((True, 0), (False, 1)): 4.0, # b†_0 b_1 (off-diagonal)
... }
... )
>>> filter_diagonal_terms(op)
>>> list(op.iter_terms())
[([(True, 0), (False, 1)], (4+0j))]
Parameters
op – the normal-ordered operator whose diagonal terms to filter out.