Transpilează circuite fermionice
Conceptele din acest ghid sunt disponibile în prezent doar în API-ul Python. Funcționalitatea echivalentă va fi disponibilă în API-ul C într-o versiune viitoare.
Acest ghid explică cum să transpilezi un FermionicCircuit într-un QuantumCircuit standard. Continuă cu același exemplu de evoluție în timp din ghidul circuitelor fermionice.
Etapele transpilării
După cum este explicat în qiskit_fermions.transpiler, managerii de pași presetați din acest proiect împart transpilarea în următoarele etape:
Intrare
Convertește circuitul de intrare într-o structură de date de graf aciclic orientat (DAG).
Optimizare
Păstrează circuitul în spațiul fermionic. Acești pași folosesc structura fermionică și relațiile de comutare, în timp ce cunoștințele specifice problemei rămân pe deplin disponibile. F2FSynthesis este pasul care trotterizează aici o poartă Evolution, cu o formulă produs sau cu FermionicQDrift, iar QDriftTrotterization este varianta sa conștientă de ocupare; vezi Pași de optimizare pentru setul complet și Sintetizează o poartă Evolution în spațiul fermionic pentru modul în care se alege o formulă produs.
Aranjare
Mapează registrele de moduri fermionice pe registre cuantice. Pentru mapările în baza de ocupare, precum Jordan-Wigner, fiecare mod fermionic se mapează pe un singur qubit. Această etapă acceptă și mapări mai generale, în care numărul de qubiți diferă de numărul de moduri fermionice.
Sinteză
Convertește porțile fermionice în operații pe qubiți folosind maparea fermion-qubit aleasă. Instanțele FermionicGate sunt transformate în secvențe de porți cuantice standard. O barieră este purtată pe fiecare qubit al fiecărui registru pe care l-a atins, astfel că ea continuă să separe porțile de o parte și de alta a ei în timpul etapei qubit.
Qubit
Transpilează circuitul de qubiți rezultat folosind metode Qiskit standard, inclusiv optimizare, aranjare și rutare pentru hardware-ul tău țintă.
Ieșire
Convertește structura de date DAG internă în formatul de ieșire dorit.
Un exemplu practic: transpilarea cu Jordan-Wigner
Folosește managerul de pași presetat pentru a transpila circuitul tău fermionic cu maparea fermion-qubit 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.
Compară cu fluxul tradițional
Ghidul circuitelor fermionice descrie cum fluxul tradițional realizează încodarea fermion-qubit înainte de a construi QuantumCircuit. Compară cele două abordări:
>>> 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 ...>
Ambele fluxuri produc circuite echivalente. Totuși, fluxul tradițional îți cere să implementezi manual pașii de optimizare, în timp ce cu abordarea fermionică mai întâi poți integra optimizări conștiente de problemă în procesul de transpilare.
Fluxuri avansate
Managerul de pași presetat oferă un punct de plecare convenabil. Pentru cazuri de utilizare mai avansate, poți face următoarele:
-
Personalizează pașii transpilerului rulați în fiecare etapă.
-
Alege formula produs care trotterizează o poartă
Evolutionîn spațiul fermionic, fie per poartă, fie pentru un întreg flux cuF2FSynthesis(vezi Sintetizează o poartă Evolution în spațiul fermionic). -
Implementează mapări fermion-qubit personalizate creând plugin-uri de sinteză (vezi
F2QSynthesisPlugin). -
Construiește pași de transpiler personalizați.