Транспіляція ферміонних схем
Концепції цього посібника наразі доступні лише в Python API. Еквівалентна функціональність стане доступною в C API у майбутньому випуску.
Цей посібник пояснює, як транспілювати FermionicCircuit у стандартну QuantumCircuit. Він продовжує той самий приклад часової еволюції з посібника про ферміонні схеми.
Етапи транспіляції
Як пояснено в qiskit_fermions.transpiler, попередньо налаштовані менеджери проходів у цьому проєкті розділяють транспіляцію на такі етапи:
Вхід
Перетворює вхідну схему на структуру даних — напрямлений ациклічний граф (DAG).
Оптимізація
Залишає схему у ферміонному просторі. Ці проходи використовують ферміонну структуру та комутаційні співвідношення, тоді як знання, специфічні для задачі, залишаються повністю доступними. F2FSynthesis — це прохід, який тут тротеризує вентиль Evolution за допомогою формули добутку або FermionicQDrift, а QDriftTrotterization — його варіант з урахуванням заповнення; повний набір дивись у Проходи оптимізації, а про вибір формули добутку — у Синтез вентиля Evolution у ферміонному просторі.
Розкладка
Відображає регістри ферміонних мод на квантові регістри. Для відображень у базисі заповнення, як-от Йордана—Вігнера, кожна ферміонна мода відображається на один кубіт. Цей етап також підтримує загальніші відображення, де кількість кубітів відрізняється від кількості ферміонних мод.
Синтез
Перетворює ферміонні вентилі на кубітні операції за допомогою обраного відображення ферміонів на кубіти. Екземпляри FermionicGate перетворюються на послідовності стандартних квантових вентилів. Бар'єр переноситься на кожен кубіт кожного регістру, якого він торкався, тож він і далі розділяє вентилі по обидва боки від нього під час кубітного етапу.
Кубіти
Транспілює отриману кубітну схему за допомогою стандартних методів Qiskit, зокрема оптимізації, розкладки та маршрутизації для твого цільового обладнання.
Вихід
Перетворює внутрішню структуру даних DAG на потрібний вихідний формат.
Практичний приклад: транспіляція з використанням Йордана—Вігнера
Використай попередньо налаштований менеджер проходів, щоб транспілювати ферміонну схему з відображенням ферміонів на кубіти за Йорданом—Вігнером:
- 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). -
Створювати власні проходи транспілятора.