주 콘텐츠로 건너뛰기
이 프로젝트는 베타 단계입니다. 버그를 발견하셨나요? GitHub 이슈 만들기. 질문이나 아이디어가 있으신가요? Discussions에서 질문하기 — 피드백을 기다립니다!
이 페이지의 번역 품질은 어떻습니까?

페르미온 회로 트랜스파일

중요

이 가이드의 개념은 현재 Python API에서만 사용할 수 있습니다. 동등한 기능은 향후 릴리스에서 C API로도 제공될 예정입니다.

이 가이드는 FermionicCircuit을 표준 QuantumCircuit으로 트랜스파일하는 방법을 설명합니다. 페르미온 회로 가이드의 시간 발전 예제를 이어서 사용합니다.

트랜스파일 단계​

qiskit_fermions.transpiler에서 설명하듯이, 이 프로젝트의 프리셋 패스 매니저는 트랜스파일을 다음 단계로 나눕니다.

입력​

입력 회로를 방향 비순환 그래프(DAG) 데이터 구조로 변환합니다.

최적화​

회로를 페르미온 공간에 유지합니다. 이 패스들은 문제 인식 지식을 완전히 사용할 수 있는 상태에서 페르미온 구조와 교환 관계를 활용합니다. F2FSynthesis는 곱 공식이나 FermionicQDrift로 여기서 Evolution 게이트를 트로터화하는 패스이고, QDriftTrotterization은 그 점유 인식 변형입니다. 전체 목록은 최적화 패스를, 곱 공식을 고르는 방법은 페르미온 공간에서 Evolution 게이트 합성하기를 참고하세요.

레이아웃​

페르미온 모드 레지스터를 양자 레지스터에 매핑합니다. Jordan-Wigner와 같은 점유 기저 매핑에서는 각 페르미온 모드가 하나의 큐비트에 매핑됩니다. 이 단계는 큐비트 수가 페르미온 모드 수와 다른 보다 일반적인 매핑도 지원합니다.

합성​

선택한 페르미온-큐비트 매핑을 사용해 페르미온 게이트를 큐비트 연산으로 변환합니다. FermionicGate 인스턴스는 표준 양자 게이트의 시퀀스로 변환됩니다. 배리어는 그것이 걸쳐 있던 각 레지스터의 모든 큐비트로 전달되므로, 큐비트 단계에서도 양쪽의 게이트를 계속 구분합니다.

큐비트​

표준 Qiskit 방법으로 결과 큐비트 회로를 트랜스파일하며, 대상 하드웨어에 맞는 최적화, 레이아웃, 라우팅이 포함됩니다.

출력​

내부 DAG 데이터 구조를 원하는 출력 형식으로 변환합니다.

실용적인 예제: Jordan-Wigner를 사용한 트랜스파일​

프리셋 패스 매니저를 사용해 Jordan-Wigner 페르미온-큐비트 매핑으로 페르미온 회로를 트랜스파일합니다.

>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import Evolution
>>> from qiskit_fermions.operators import FermionOperator, cre, ann
>>> from qiskit_fermions.transpiler.presets import generate_preset_jw_pass_manager
>>>
>>> # Create the same fermionic circuit from the previous guide
>>> circuit = FermionicCircuit(4)
>>> hamiltonian = FermionOperator.from_terms([
... ([cre(0), ann(2)], 0.5),
... ([cre(2), ann(0)], 0.5),
... ([cre(1), ann(3)], 0.5),
... ([cre(3), ann(1)], 0.5),
... ])
>>> hamiltonian.groups = [0, 0, 1, 1]
>>> evolution = Evolution(4, hamiltonian, time=1.0)
>>> circuit.append(evolution, circuit.register)
>>>
>>> # Generate the Jordan-Wigner transpilation pipeline
>>> pm = generate_preset_jw_pass_manager()
>>>
>>> # Transpile the fermionic circuit to a qubit circuit
>>> qubit_circuit = pm.run(circuit)
>>>
>>> # The result is a standard QuantumCircuit
>>> print(type(qubit_circuit))
<class 'qiskit.circuit.quantumcircuit.QuantumCircuit'>

The transpiled QuantumCircuit of the fermionic time evolution.

기존 워크플로와 비교​

페르미온 회로 가이드는 기존 워크플로가 QuantumCircuit을 만들기 전에 페르미온-큐비트 인코딩을 수행하는 방법을 설명합니다. 두 접근 방식을 비교해 보세요.

>>> from qiskit_fermions.mappers.library import jordan_wigner
>>> from qiskit.circuit import QuantumCircuit
>>> from qiskit.circuit.library import PauliEvolutionGate
>>>
>>> # Map the fermionic Hamiltonian to a qubit operator
>>> qubit_hamiltonian = jordan_wigner(hamiltonian, 4).simplify()
>>>
>>> # Build the QuantumCircuit directly
>>> quantum_circuit = QuantumCircuit(4)
>>> pauli_evolution = PauliEvolutionGate(qubit_hamiltonian, time=1.0)
>>> quantum_circuit.append(pauli_evolution, quantum_circuit.qubits)
<qiskit.circuit.instructionset.InstructionSet object at ...>

The directly constructed QuantumCircuit of the fermionic time evolution.

두 워크플로 모두 동등한 회로를 만듭니다. 다만 기존 워크플로에서는 최적화 단계를 직접 구현해야 하는 반면, 페르미온 우선 접근 방식에서는 문제 인식 최적화를 트랜스파일 과정에 통합할 수 있습니다.

고급 워크플로​

프리셋 패스 매니저는 편리한 출발점을 제공합니다. 더 고급 사용 사례에서는 다음을 할 수 있습니다.

  • 각 단계에서 실행되는 트랜스파일러 패스를 사용자 지정합니다.

  • Evolution 게이트를 페르미온 공간에서 트로터화하는 곱 공식을 게이트별로, 또는 F2FSynthesis로 파이프라인 전체에 대해 선택합니다(페르미온 공간에서 Evolution 게이트 합성하기 참고).

  • 합성 플러그인을 만들어 사용자 지정 페르미온-큐비트 매핑을 구현합니다(F2QSynthesisPlugin 참고).

  • 사용자 지정 트랜스파일러 패스를 만듭니다.