페르미온 회로 트랜스파일
이 가이드의 개념은 현재 Python API에서만 사용할 수 있습니다. 동등한 기능은 향후 릴리스에서 C API로도 제공될 예정입니다.
이 가이드는 FermionicCircuit을 표준 QuantumCircuit으로 트랜스파일하는 방법을 설명합니다. 페르미온 회로 가이드의 시간 발전 예제를 이어서 사용합니다.
트랜스파일 단계
qiskit_fermions.transpiler에서 설명하듯이, 이 프로젝트의 프리셋 패스 매니저는 트랜스파일을 다음 단계로 나눕니다.
입력
입력 회로를 방향 비순환 그래프(DAG) 데이터 구조로 변환합니다.
최적화
회로를 페르미온 공간에 유지합니다. 이 패스들은 문제 인식 지식을 완전히 사용할 수 있는 상태에서 페르미온 구조와 교환 관계를 활용합니다. F2FSynthesis는 곱 공식이나 FermionicQDrift로 여기서 Evolution 게이트를 트로터화하는 패스이고, QDriftTrotterization은 그 점유 인식 변형입니다. 전체 목록은 최적화 패스를, 곱 공식을 고르는 방법은 페르미온 공간에서 Evolution 게이트 합성하기를 참고하세요.
레이아웃
페르미온 모드 레지스터를 양자 레지스터에 매핑합니다. Jordan-Wigner와 같은 점유 기저 매핑에서는 각 페르미온 모드가 하나의 큐비트에 매핑됩니다. 이 단계는 큐비트 수가 페르미온 모드 수와 다른 보다 일반적인 매핑도 지원합니다.
합성
선택한 페르미온-큐비트 매핑을 사용해 페르미온 게이트를 큐비트 연산으로 변환합니다. FermionicGate 인스턴스는 표준 양자 게이트의 시퀀스로 변환됩니다. 배리어는 그것이 걸쳐 있던 각 레지스터의 모든 큐비트로 전달되므로, 큐비트 단계에서도 양쪽의 게이트를 계속 구분합니다.
큐비트
표준 Qiskit 방법으로 결과 큐비트 회로를 트랜스파일하며, 대상 하드웨어에 맞는 최적화, 레이아웃, 라우팅이 포함됩니다.
출력
내부 DAG 데이터 구조를 원하는 출력 형식으로 변환합니다.
실용적인 예제: Jordan-Wigner를 사용한 트랜스파일
프리셋 패스 매니저를 사용해 Jordan-Wigner 페르미온-큐비트 매핑으로 페르미온 회로를 트랜스파일합니다.
- Python
- C
>>> 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 C API for transpilation will be made available in a future release.
기존 워크플로와 비교
페르미온 회로 가이드는 기존 워크플로가 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 ...>
두 워크플로 모두 동등한 회로를 만듭니다. 다만 기존 워크플로에서는 최적화 단계를 직접 구현해야 하는 반면, 페르미온 우선 접근 방식에서는 문제 인식 최적화를 트랜스파일 과정에 통합할 수 있습니다.
고급 워크플로
프리셋 패스 매니저는 편리한 출발점을 제공합니다. 더 고급 사용 사례에서는 다음을 할 수 있습니다.
-
각 단계에서 실행되는 트랜스파일러 패스를 사용자 지정합니다.
-
Evolution게이트를 페르미온 공간에서 트로터화하는 곱 공식을 게이트별로, 또는F2FSynthesis로 파이프라인 전체에 대해 선택합니다(페르미온 공간에서 Evolution 게이트 합성하기 참고). -
합성 플러그인을 만들어 사용자 지정 페르미온-큐비트 매핑을 구현합니다(
F2QSynthesisPlugin참고). -
사용자 지정 트랜스파일러 패스를 만듭니다.