Transpilacja obwodów fermionowych
Koncepcje z tego przewodnika są obecnie dostępne tylko w API Pythona. Równoważna funkcjonalność zostanie udostępniona w API C w przyszłym wydaniu.
Ten przewodnik wyjaśnia, jak transpilować FermionicCircuit do standardowego QuantumCircuit. Kontynuuje ten sam przykład ewolucji w czasie z przewodnika o obwodach fermionowych.
Etapy transpilacji
Jak wyjaśniono w qiskit_fermions.transpiler, gotowe menedżery przebiegów w tym projekcie dzielą transpilację na następujące etapy:
Wejście
Konwertuje obwód wejściowy na strukturę danych skierowanego grafu acyklicznego (DAG).
Optymalizacja
Utrzymuje obwód w przestrzeni fermionowej. Te przebiegi wykorzystują strukturę fermionową i relacje komutacji, podczas gdy wiedza specyficzna dla problemu pozostaje w pełni dostępna. F2FSynthesis to przebieg, który tutaj trotteryzuje bramkę Evolution, za pomocą wzoru iloczynowego lub FermionicQDrift, a QDriftTrotterization to jego wariant uwzględniający obsadzenie; pełny zestaw znajdziesz w Optimization Passes, a informacje o wyborze wzoru iloczynowego w Synteza bramki Evolution w przestrzeni fermionowej.
Układ
Odwzorowuje rejestry modów fermionowych na rejestry kwantowe. Dla odwzorowań w bazie obsadzeń, takich jak Jordan-Wigner, każdy mod fermionowy odwzorowuje się na pojedynczy kubit. Ten etap obsługuje też bardziej ogólne odwzorowania, w których liczba kubitów różni się od liczby modów fermionowych.
Synteza
Konwertuje bramki fermionowe na operacje kubitowe za pomocą wybranego odwzorowania fermion–kubit. Instancje FermionicGate są przekształcane w sekwencje standardowych bramek kwantowych. Bariera jest przenoszona na każdy kubit każdego rejestru, którego dotykała, więc nadal oddziela bramki po obu jej stronach podczas etapu kubitowego.
Kubit
Transpiluje powstały obwód kubitowy standardowymi metodami Qiskit, w tym optymalizacją, układem i routingiem dla docelowego sprzętu.
Wyjście
Konwertuje wewnętrzną strukturę danych DAG na żądany format wyjściowy.
Praktyczny przykład: transpilacja z użyciem Jordana-Wignera
Użyj gotowego menedżera przebiegów, aby transpilować obwód fermionowy z odwzorowaniem fermion–kubit Jordana-Wignera:
- 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.
Porównanie z tradycyjnym przepływem pracy
Przewodnik o obwodach fermionowych opisuje, jak tradycyjny przepływ pracy wykonuje kodowanie fermion–kubit przed zbudowaniem QuantumCircuit. Porównaj oba podejścia:
>>> 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 ...>
Oba przepływy pracy dają równoważne obwody. Jednak tradycyjny przepływ wymaga ręcznego implementowania kroków optymalizacji, podczas gdy w podejściu fermionowym najpierw możesz włączyć do procesu transpilacji optymalizacje uwzględniające problem.
Zaawansowane przepływy pracy
Gotowy menedżer przebiegów to wygodny punkt wyjścia. W bardziej zaawansowanych przypadkach możesz zrobić następujące rzeczy:
-
Dostosować przebiegi transpilera uruchamiane na każdym etapie.
-
Wybrać wzór iloczynowy, który trotteryzuje bramkę
Evolutionw przestrzeni fermionowej, osobno dla każdej bramki lub dla całego potoku za pomocąF2FSynthesis(zobacz Synteza bramki Evolution w przestrzeni fermionowej). -
Zaimplementować własne odwzorowania fermion–kubit, tworząc wtyczki syntezy (zobacz
F2QSynthesisPlugin). -
Zbudować własne przebiegi transpilera.