Transpile dei circuiti fermionici
I concetti illustrati in questa guida sono attualmente disponibili solo nell'API Python. In una versione futura, nell'API C saranno rese disponibili funzionalità equivalenti.
Questa guida spiega come traspilare un FermionicCircuit in uno standard QuantumCircuit. Si prosegue con lo stesso esempio di evoluzione temporale tratto dalla guida sui circuiti fermionici.
Fasi della traspirazione
Come spiegato in qiskit_fermions.transpiler, i gestori di passaggi predefiniti in questo progetto suddividono la transpilazione nelle seguenti fasi:
Input
Converte il circuito di ingresso in una struttura dati di tipo grafo aciclico orientato (DAG).
Ottimizzazione
Mantiene il circuito nello spazio fermionico. Questi passaggi si avvalgono della struttura fermionica e delle relazioni di commutazione, pur mantenendo pienamente accessibile la conoscenza relativa al problema. FermionicTrotterization e sono QDriftTrotterization le fasi che realizzano la "Trotterizzazione" di un gate Evolution in questo contesto; si veda la sezione "Fasi di ottimizzazione" per l'insieme completo e "Sintesi di un gate di evoluzione nello spazio fermionico" per capire come viene scelta una formula di prodotto.
Layout
Mappa i registri della modalità fermionica ai registri quantistici. Nelle mappature basate sull’occupazione, come quella di Jordan-Wigner, ogni modo fermionico viene mappato su un singolo qubit. Questa fase supporta anche mappature più generali in cui il numero di qubit differisce dal numero di modi fermionici.
Sintesi
Converte i gate fermionici in operazioni sui qubit utilizzando la mappatura scelta da fermione a qubit. FermionicGate Le istanze vengono trasformate in sequenze di porte quantistiche standard.
Qubit
Trasforma il circuito di qubit risultante utilizzando i metodi standard di Qiskit, tra cui l'ottimizzazione, il layout e l'instradamento per l'hardware di destinazione.
Output
Converte la struttura dati interna DAG nel formato di output desiderato.
Un esempio pratico: la transpilazione con il metodo di Jordan-Wigner
Utilizza il gestore di passaggi predefinito per traspilare il tuo circuito fermionico con la mappatura da fermioni a qubit di Jordan-Wigner:
>>> 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.
Confronta con il flusso di lavoro tradizionale
La guida sui circuiti fermionici illustra come il flusso di lavoro tradizionale esegua la codifica da fermioni a qubit prima di costruire il QuantumCircuit. Confrontiamo i due approcci:
>>> 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 ...>
Entrambi i flussi di lavoro generano circuiti equivalenti. Tuttavia, il flusso di lavoro tradizionale richiede di implementare manualmente le fasi di ottimizzazione, mentre con l’approccio “fermionic-first” è possibile integrare ottimizzazioni specifiche per il problema nel processo di transpilazione.
Flussi di lavoro avanzati
Il gestore dei passaggi predefiniti offre un comodo punto di partenza. Per casi d'uso più avanzati, è possibile procedere come segue:
- Personalizza i passaggi del transpiler eseguiti durante ciascuna fase.
- Scegli la formula del prodotto che "Trotterizza" un gate
Evolutionnello spazio fermionico, sia per singolo gate che per un'intera pipeline conFermionicTrotterization(vedi "Sintetizzare un gate di evoluzione nello spazio fermionico "). - Implementare mappature personalizzate da fermioni a qubit creando plugin di sintesi (vedi
F2QSynthesisPlugin). - Creare passaggi personalizzati del transpiler.