filter_diagonal_terms
filter_diagonal_terms(op)
Esclude i termini di un operatore che sono diagonali nella base dei numeri di occupazione.
In questo modo vengono rimossi tutti i termini dall'espressione fornita FermionOperator che sono prodotti di operatori numerici ( ). Ciò include il termine costante (un prodotto di zero operatori numerici), i singoli operatori numerici, nonché i prodotti di ordine superiore come .
Una delle principali ragioni per filtrare tali termini emerge nell'evoluzione temporale degli operatori, dove tali termini diagonali non influenzano l'evoluzione temporale se non per introdurre una fase globale. Di conseguenza, le stringhe di bit campionate da uno stato che ha subito un’evoluzione temporale non subiscono alcuna variazione. Si raccomanda quindi di rimuoverli, ad esempio quando si prepara un hamiltoniano della struttura elettronica per l’evoluzione temporale qDRIFT utilizzata da SqDRIFT,, in quanto ciò evita un sovraccarico di campionamento altrimenti superfluo.
L'operatore fornito deve essere ordinato secondo l'ordine normale! Si tratta di un presupposto di fondo dell'implementazione che non viene verificato. Vedi normal_ordered() per sapere come ottenere un operatore di quella forma.
L'operatore viene modificato direttamente. Se tiene traccia degli indici di gruppo (vedi groups), i termini rimanenti mantengono il loro raggruppamento relativo, ma gli indici di gruppo vengono riassegnati a un intervallo contiguo a partire da 0. Non bisogna quindi fare affidamento sul fatto che l'indice di gruppo specifico di un termine venga mantenuto durante l'esecuzione di questa funzione.
>>> from qiskit_fermions.operators import FermionOperator
>>> from qiskit_fermions.operators.terms.filtering import filter_diagonal_terms
>>> op = FermionOperator.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, # a†_0 a_1 (off-diagonal)
... }
... )
>>> filter_diagonal_terms(op)
>>> list(op.iter_terms())
[([(True, 0), (False, 1)], (4+0j))]
Parametri
op – l'operatore ordinato normalmente i cui termini diagonali devono essere eliminati.