group_order
group_order(op)
연산자의 항들을 그룹 인덱스 순서로 정렬한 사본을 반환합니다.
항들은 그룹 인덱스만을 기준으로 정렬되므로, 각 그룹은 연속된 항들의 집합이 되며 그룹 인덱스는 비감소 순서를 이룹니다. 이 정렬은 안정적이므로, 한 그룹 내의 항들은 상대적인 순서를 유지합니다. 따라서 먼저 표준 순서에 따라 정렬한 다음 그룹별로 정렬하는 것은, 표준 순서를 임의의 순열로 대체하는 것이 아니라 이를 더 세분화하는 것입니다. 항 자체는 변경되지 않습니다. 이는 단지 항의 순서만 바꾸는 것이지, 연산자를 단순화하거나 정규 순서로 바꾸는 것은 아닙니다.
이는 OperatorTrait 프로토콜을 구현하는 모든 내장 연산자 유형에 적용되며, 반환되는 연산자는 입력과 동일한 유형입니다.
그룹 인덱스는 어떤 항들이 서로 묶여야 하는지만 나타내므로, 이는 연산자의 값이 아닌 배열만 변경합니다. 이 레이아웃이 가져다주는 이점은 조회 비용입니다. 일반적으로는 요청된 그룹을 찾기 위해 모든 항을 split_out_groups() 스캔해야 하지만, 그룹 순서 연산자의 경우 각 그룹의 항들이 하나의 범위를 형성하므로 이진 검색을 통해 위치를 찾을 수 있습니다. 따라서 조회 비용은 보유한 항의 수에 따른 비용이 아니라 요청된 그룹의 수에 따른 비용이 됩니다. 대규모 연산자에서 몇 개의 그룹을 반복적으로 추출하는 루프 밖으로 이 호출을 분리해 둠으로써, 이러한 조회 작업의 수행 비용을 낮출 수 있습니다.
그룹을 추적하지 않는 연산자(예: 참조 groups)는 정렬 기준이 없으므로 변경되지 않은 사본으로 반환되며, 따라서 이 연산자는 각 단계마다 가드 조건 없이 파이프라인 내에서 조합됩니다. 결과에서도 어떤 그룹도 나타나지 않습니다.
>>> 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]
매개변수
op – 순서를 재조정할 항을 가진 연산자.
리턴
그룹 인덱스 순서대로 조건이 정렬된, 동일한 유형의 새로운 연산자.
인상
TypeError – 가 op 지원되는 연산자 유형이 아닌 경우 (참조 OperatorTrait).