Przejdź do głównej treści
Ten projekt jest w wersji beta. Znalazłeś błąd? Otwórz zgłoszenie na GitHub. Masz pytanie lub pomysł? Zapytaj w Discussions — chętnie poznamy Twoją opinię!
Jak oceniasz jakość tłumaczenia tej strony?

Transpilacja obwodów fermionowych

Ważne

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:

>>> 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.

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 ...>

The directly constructed QuantumCircuit of the fermionic time evolution.

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: