group_order
group_order(op)
Restituisce una copia di un operatore con i suoi termini ordinati in base all'indice di gruppo.
I termini sono ordinati esclusivamente in base al loro indice di gruppo, il che fa sì che ogni gruppo costituisca una sequenza contigua di termini e che gli indici di gruppo siano non decrescenti. L'ordinamento è stabile, quindi i termini all'interno di un gruppo mantengono il loro ordine relativo: ordinare prima in modo canonico e poi per gruppo affina quindi l'ordine canonico anziché sostituirlo con una permutazione arbitraria. I termini stessi rimangono invariati: questa operazione si limita a riorganizzarli, senza semplificare né riportare l’operatore all’ordine normale.
Questo funziona per qualsiasi tipo di operatore integrato che implementi il protocollo OperatorTrait ; l'operatore restituito è dello stesso tipo dell'operando.
Gli indici di gruppo indicano solo quali termini vanno raggruppati, quindi ciò modifica la disposizione dell’operatore, non il suo valore. Ciò che il layout comporta è il costo della ricerca: in genere split_out_groups() deve scansionare ogni termine per trovare i gruppi richiesti, ma su un operatore ordinato per gruppi i termini di ciascun gruppo formano un intervallo che può essere individuato tramite ricerca binaria, quindi una ricerca costa quanto i gruppi richiesti anziché quanto i termini contenuti. Il fatto di estrarre questa chiamata da un ciclo che campiona ripetutamente alcuni gruppi all'interno di un operatore di grandi dimensioni è ciò che rende queste ricerche economicamente sostenibili.
Un operatore che non tiene traccia di alcun gruppo (vedi ad esempio groups) non ha alcun criterio di ordinamento e restituisce una copia inalterata, quindi si compone in una pipeline senza condizioni di filtro in ogni fase. Il risultato non rileva nemmeno alcun gruppo.
>>> from qiskit_fermions.operators import FermionOperator
>>> from qiskit_fermions.operators.terms.ordering import group_order
>>> op = FermionOperator.from_dict(
... {
... ((True, 0), (False, 1)): 1.0,
... ((True, 1), (False, 0)): 2.0,
... ((True, 2), (False, 3)): 3.0,
... }
... )
>>> op.groups = [1, 0, 1] # group 1's terms are not contiguous
>>> ordered = group_order(op)
>>> print(ordered.groups)
[0, 1, 1]
Parametri
op – l'operatore i cui termini devono essere riordinati.
Risultati
Un nuovo operatore dello stesso tipo con i termini ordinati in base all'indice di gruppo.
Aumenti
TypeError – se non op è un tipo di operatore supportato (vedi OperatorTrait).