canonical_order
canonical_order(op)
Renvoie une copie d'un opérateur dont les termes sont classés selon un ordre canonique.
Les termes sont classés selon un ordre canonique qui dépend uniquement de la structure de chaque terme (la chaîne d'opérateurs qu'il représente) et non de son coefficient. L'ordre est donc déterministe pour un ensemble donné de termes, quelle que soit la manière dont l'opérateur a été construit. Les termes eux-mêmes restent inchangés : cela ne fait que les réorganiser, sans simplifier ni mettre l'opérateur en ordre normal.
Cela fonctionne pour tous les types d'opérateurs intégrés qui implémentent le protocole OperatorTrait ; l'opérateur renvoyé est du même type que l'entrée.
Tout indice de groupe (voir par exemple groups) sont conservés : chaque terme conserve son indice de groupe lorsqu'il est déplacé, car l'indice de groupe est une balise propre à chaque terme, indépendante de l'ordre des termes. Les termes d’un même groupe ne sont tout simplement plus contigus par la suite. Si les données d'entrée ne comportent pas de groupes, le résultat n'en comporte pas non plus.
>>> from qiskit_fermions.operators import FermionOperator
>>> from qiskit_fermions.operators.terms.ordering import canonical_order
>>> op = FermionOperator.from_dict(
... {
... ((True, 1), (False, 0)): 1.0, # a†_1 a_0
... ((True, 0), (False, 1)): 2.0, # a†_0 a_1
... }
... )
>>> ordered = canonical_order(op)
>>> list(ordered.iter_terms())
[([(True, 0), (False, 1)], (2+0j)), ([(True, 1), (False, 0)], (1+0j))]
Paramètres
op – l'opérateur dont les termes doivent être réorganisés.
Retours
Un nouvel opérateur du même type, dont les termes sont classés dans l'ordre canonique.
Augmentations
TypeError – si n'est op pas un type d'opérateur pris en charge (voir OperatorTrait).