Skip to main content
IBM Quantum Platform

RelabelModes

class RelabelModes(permutation=None, *, solver=None, **kwargs)

기호: GenericPass[DAGCircuit, DAGCircuit]

페르미온 모드의 레이블을 재지정하기 위한 트랜스파일레이션 단계.

이 패스는 회로의 페르미온 모드를 재정렬합니다. 재순서는 permutation 목록으로 표현되며, 이는 원래 모드에서 새로운 모드 인덱스로의 매핑으로 해석됩니다. 즉, 원래 모드는 재표기된 회로 내에서 permutation[i] 새로운 인덱스에 배치됩니다 i . 예를 들어, 원본 모드를 새로운 인덱스 에 1 permutation = [0, 2, 4, 1, 3, 5] 배치하고 2, 원본 모드를 새로운 인덱스 에 2 배치하는 식으로 이어집니다 4. 순열이므로, 각 인덱스는 정확히 한 번씩만 나타나야 합니다.

사후 처리

이러한 재표기 과정은 페르미온 모드의 순서를 재조정하며, 이는 결과적으로 후속 합성 단계에서 선택되는 페르미온-큐비트 매핑(그리고 이에 따라 달성 가능한 회로 깊이)에 영향을 미칩니다. 모드 순서가 변경되기 때문에, 최종 회로에서 샘플링된 모든 비트열은 새로운 모드 순서로 표현되며, 이를 해석하기 전에 원래 순서로 다시 매핑해야 합니다. 실제로 적용된 재라벨링 정보는 반환된 FermionicDAGCircuitpermutation 필드에 기록됩니다 metadata.

중요

항상.에서가 아니라 회로 메타데이터에 있는 재표기 정보를 확인하십시오 permutation. 자동 최적화 기능을 사용할 경우 (즉, permutation (인 경우 None), 적용된 순열은 메타데이터를 통해서만 확인할 수 있으며, 가 명시적으로 제공된 permutation 경우에도 메타데이터에는 해당 패스가 수행한 작업이 반드시 반영됩니다.

메타데이터 permutation 필드는 패스가 실제로 회로의 레이블을 재지정한 경우에만 존재한다는 점에 유의하십시오. 패스가 아무런 효과를 발휘하지 못하는 경우(예를 들어, 선택적 pyomo 종속성이나 가 누락되어 solver 자동 최적화가 실행될 수 없는 경우 등)에는 반환된 회로가 변경되지 않고 permutation 메타데이터도 포함되지 않으므로, 이를 신중하게 처리해야 합니다(예: qcirc.metadata.get("permutation")).

개념적으로, 재표기 작업을 되돌리면 각 원래 모드에 새로운 모드에서 측정된 값이 m 할당됩니다 permutation[m]. 실제로는 FermionicRegister 모드와 Qiskit의 고전 비트가 반대 방향(리틀 엔디안)으로 실행된다는 사실 때문에 상황이 복잡해지는데, 이로 인해 모드 공간 수집 작업은 카운트 비트열에 대한 인덱스 부호 반전(~idx)과 그 뒤를 잇는 최종 역순 처리([::-1])로 이루어지게 됩니다.

아래 예제는 6모드 시스템을 블록형 스핀 배열([u0, u1, u2, d0, d1, d2])에서 인터리브형 배열([u0, d0, u1, d1, u2, d2])로 재라벨링합니다. 이는 구현의 복잡도를 줄이기 위해 흔히 사용되는 기법이며, 이후 샘플링된 카운트에 대해 이 재라벨링을 취소합니다:

>>> from qiskit.passmanager import MultiStagePassManager
>>> from qiskit.providers.basic_provider import BasicSimulator
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import InitializeModes
>>> from qiskit_fermions.transpiler import FermionicCircuitToDAG, QuantumDAGToCircuit
>>> from qiskit_fermions.transpiler.passes import (
...     F2QSynthesis, F2QSynthesisPluginManager, RelabelModes, TrivialF2QLayout,
... )
>>>
>>> # blocked occupation: spin-up orbitals 0 and 1 and spin-down orbital 0 are occupied
>>> circ = FermionicCircuit(6)
>>> circ.append(InitializeModes([1, 1, 0, 1, 0, 0]), circ.modes)
>>>
>>> synth_plugins = F2QSynthesisPluginManager()
>>> synth = F2QSynthesis()
>>> synth.methods["InitializeModes"] = synth_plugins.method("InitializeModes", "TrivialOccupation")()
>>>
>>> # map blocked mode order onto the interleaved one
>>> relabel = RelabelModes(permutation=[0, 2, 4, 1, 3, 5])
>>>
>>> pm = MultiStagePassManager(
...     init=FermionicCircuitToDAG(),
...     optimization=relabel,
...     layout=TrivialF2QLayout(),
...     synthesis=synth,
...     output=QuantumDAGToCircuit(),
... )
>>>
>>> qcirc = pm.run(circ)
>>> qcirc.measure_all()
>>>
>>> bit_permutation = qcirc.metadata.get("permutation")
>>> print(bit_permutation)
[0, 2, 4, 1, 3, 5]
>>>
>>> res = BasicSimulator().run(qcirc, shots=1).result()
>>> counts = res.get_counts()
>>> print(counts)  # measured in the interleaved ordering
{'000111': 1}
>>>
>>> # undo the relabeling to recover the counts in the original blocked ordering
>>> post_processed = {
...     "".join(bitstring[~idx] for idx in bit_permutation)[::-1]: count
...     for bitstring, count in counts.items()
... }
>>> print(post_processed)  # recovered in the original blocked ordering
{'001011': 1}

이 트랜스파일러 단계를 초기화하려면 아래에 나열된 인수를 사용할 수 있습니다.

매개변수


속성

permutation

페르미온 모드 인덱스를 재표기하는 데 사용되는 인덱스 순열.

이는 원래 모드 인덱스 를 새로운 모드 인덱스 i 로 매핑하는 것일 수도 있습니다 list[int]( permutation[i] 자세한 내용은 클래스 문서 문자열을 참조하십시오). 그 길이는 트랜스파일되는 회로의 페르미온 모드 수와 일치해야 하며, 각 인덱스는 정확히 한 번씩만 나타나야 합니다. 따라서 이러한 시나리오에서는 트랜스파일러 패스를 사용자의 회로에 매우 구체적으로 맞춰야 합니다.

아니면 그럴 수도 있는데 None, 이 경우 해당 build_excitation_span_minimization_model() 함수는 발생하는 모든 페르미온 여기 상태의 스팬을 최소화하려는 최적화 문제를 정의하는 데 사용된다. 이 경우, 적용된 순열은 트랜스파일된 회로의 메타데이터에서만 확인할 수 있습니다(클래스 닥스트링 참조).

참고

이 최적화 모델의 사용은 FermionOperator 인스턴스를 포함하는 시간 진화 게이트에 대해서만 구현됩니다.

solver

.을 자동으로 찾아주는 최적화 문제 해결기 인스턴스 permutation.

가 일 permutationNone, 로 정의된 최적화 문제를 build_excitation_span_minimization_model() 활용하여 모드 인덱스의 적절한 순열을 자동으로 찾습니다. 이러한 경우, 사용자는 이 모델을 해결하기 위한 최적화기를 제공해야 합니다.


메소드

find_permutation

find_permutation(dag)

사용자가 지정하지 않은 경우 permutation 모드 인덱스를 찾습니다.

이 함수는 사용자가 를 지정하지 permutation 않은 경우(즉, 인 경우 None)에만 호출됩니다. 그런 경우에는 다음과 같이 처리합니다:

  1. 선택적 의존성인 pyomo가 설치되어 있는지 확인하십시오. 그렇지 않으면 최적화를 수행할 수 없으며, 이 트랜스파일러 단계는 아무런 효과도 발휘하지 못합니다.
  2. a가 지정되었는지 solver 확인하십시오. 그렇지 않으면 최적화를 수행할 수 없으며, 이 트랜스파일러 단계는 아무런 효과도 발휘하지 못합니다.
  3. 해당 FermionOperator 인스턴스가 포함된 모든 게이트에서 Evolution 페르미온 여기 상태를 모두 수집한다.
  4. 를 사용하여 최적화 문제를 구성하고 build_excitation_span_minimization_model(), 이 트랜스파일러 패스가 생성될 때 전달된 추가 키워드 인자 (kwargs)를 전달합니다.
  5. 을 사용하여 최적화 문제를 풀고, solver 최종 순열을 도출한다.

매개변수

dag (FermionicDAGCircuit) – 트랜스파일링할 회로.

리턴

사용할 순열. 이 경우 None, 이 트랜스파일러 단계는 아무런 효과도 미치지 않습니다.

인상

NotImplementedErrorFermionOperator 가 아닌 연산자가 포함된 Evolution 게이트를 만나면.

리턴 유형

튜플 [ 리스트 [ 정수 ] | None, pyomo.opt.results.results_.SolverResults | None]

run

run(dag)

이 트랜스파일링 단계를 실행합니다.

매개변수

dag (DAGCircuit) – 페르미온 기반 명령어를 사용하는 입력 회로. 해당 DAGOpNode FermionicGate 인스턴스만 지원됩니다 op .

리턴

여전히 페르미온 레지스터에 작용하고 있는 출력 회로.

인상

NotImplementedError – 제공된 입력 회로에 레지스터가 두 개 이상인 경우.

리턴 유형

DAGCircuit

상속된 메소드

execute

execute(passmanager_ir, state, callback=None)

입력된 Qiskit IR에 대해 최적화 작업을 실행합니다.

매개변수

  • passmanager_ir (IR) – 최적화할 Qiskit IR.
  • state (PassManagerState) – 패스 관리자 자체에 의한 워크플로 실행과 관련된 상태.
  • callback (Callable[[Task, IR_OUT, PropertySet, float, int], None] | None) – 최적화 작업이 실행될 때마다 호출되는 콜백 함수입니다.

리턴

최적화된 Qiskit IR 및 워크플로우 현황.

리턴 유형

튜플 [ IR_OUT, PassManagerState ]

name

name()

고개 이름.

리턴 유형

str

update_status

update_status(state, run_state)

워크플로우 상태를 업데이트합니다.

매개변수

  • state (PassManagerState) – 업데이트할 매니저 상태를 전달합니다.
  • run_state (RunState) – 현재 작업의 완료 상태.

리턴

패스 관리자 상태를 업데이트했습니다.

리턴 유형

PassManagerState

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.