group_order
group_order(op)
Renvoie une copie d'un opérateur dont les termes sont classés par indice de groupe.
Les termes sont triés uniquement en fonction de leur index de groupe, ce qui fait que chaque groupe forme une suite contiguë de termes et que les indices de groupe sont non décroissants. Le tri est stable; ainsi, les termes au sein d'un groupe conservent leur ordre relatif : le fait de trier d'abord selon l'ordre canonique, puis par groupe, affine donc l'ordre canonique plutôt que de le remplacer par une permutation arbitraire. 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.
Les indices de groupe indiquent uniquement quels termes vont ensemble; cela modifie donc la disposition de l'opérateur, mais pas sa valeur. Ce que cette structure permet de gagner, c'est le coût de la recherche : en général, il split_out_groups() faut parcourir chaque terme pour trouver les groupes demandés, mais avec un opérateur ordonné par groupes, les termes de chaque groupe forment une plage que l'on peut localiser par recherche binaire; ainsi, une recherche coûte autant que les groupes demandés plutôt que les termes qu'ils contiennent. C'est le fait d'extraire cet appel d'une boucle qui échantillonne de manière répétée quelques groupes parmi un grand opérateur qui rend ces recherches abordables.
Un opérateur ne traçant aucun groupe (voir par exemple groups) n'a aucun critère de tri et renvoie une copie inchangée; il s'intègre donc dans un pipeline sans condition de garde à chaque étape. Le résultat ne fait état d'aucun groupe non plus.
>>> 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]
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 par indice de groupe.
Augmentations
TypeError – si n'est op pas un type d'opérateur pris en charge (voir OperatorTrait).