group_order
group_order(op)
Devuelve una copia de un operador con sus términos ordenados por índice de grupo.
Los términos se ordenan únicamente por su índice de grupo, lo que hace que cada grupo sea una secuencia contigua de términos y que los índices de grupo sean no decrecientes. La ordenación es estable, por lo que los términos dentro de un grupo mantienen su orden relativo: ordenar primero canónicamente y, a continuación, por grupo, refina por tanto el orden canónico en lugar de sustituirlo por una permutación arbitraria. Los términos en sí no se modifican: esto solo cambia su orden, no simplifica ni pone el operador en orden normal.
Esto funciona con cualquiera de los tipos de operadores integrados que implementen el protocolo OperatorTrait ; el operador devuelto es del mismo tipo que la entrada.
Los índices de grupo solo indican qué términos van juntos, por lo que esto modifica la disposición del operador, pero no su valor. Lo que se gana con esta estructura es en el coste de la búsqueda: por lo general, split_out_groups() hay que recorrer todos los términos para encontrar los grupos solicitados, pero en un operador ordenado por grupos, los términos de cada grupo forman un intervalo que se puede localizar mediante búsqueda binaria, por lo que una búsqueda cuesta lo que cuestan los grupos solicitados, en lugar de lo que cuestan los términos que contiene. El hecho de extraer esta llamada de un bucle que muestrea repetidamente unos pocos grupos de un operador de gran tamaño es lo que hace que esas búsquedas resulten asequibles.
Un operador que no realice el seguimiento de ningún grupo (véase, por ejemplo, groups) no tiene ningún criterio de ordenación y devuelve una copia sin modificar, por lo que esto se compone en una cadena de operaciones sin un filtro en cada paso. El resultado tampoco incluye a ningún grupo.
>>> 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]
Parámetros
op : el operador cuyos términos se van a reordenar.
Devuelve
Un nuevo operador del mismo tipo, con sus términos ordenados según el índice del grupo.
Subidas
TypeError – si no op es un tipo de operador admitido (véase OperatorTrait).