Transpila circuiti fermionici
I concetti di questa guida sono attualmente disponibili solo nell'API Python. Funzionalità equivalenti saranno rese disponibili nell'API C in una versione futura.
Questa guida spiega come transpilare una FermionicCircuit in una QuantumCircuit standard. Prosegue con lo stesso esempio di evoluzione temporale della guida ai circuiti fermionici.
Fasi della transpilazione
Come spiegato in qiskit_fermions.transpiler, i pass manager preimpostati di questo progetto suddividono la transpilazione nelle fasi seguenti:
Ingresso
Converte il circuito in ingresso in una struttura dati a grafo aciclico diretto (DAG).
Ottimizzazione
Mantiene il circuito nello spazio fermionico. Questi pass usano la struttura fermionica e le relazioni di commutazione mentre la conoscenza specifica del problema rimane pienamente disponibile. F2FSynthesis è il pass che trotterizza qui un gate Evolution, con una formula di prodotto o con FermionicQDrift, e QDriftTrotterization ne è la variante consapevole dell'occupazione; consulta Optimization Passes per l'insieme completo e Sintetizza un gate Evolution nello spazio fermionico per come viene scelta una formula di prodotto.
Disposizione
Mappa i registri di modi fermionici su registri quantistici. Per le mappature in base di occupazione come 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 su qubit usando la mappatura fermione-qubit scelta. Le istanze di FermionicGate vengono trasformate in sequenze di gate quantistici standard. Una barriera viene riportata su ogni qubit di ciascun registro che toccava, così continua a separare i gate ai suoi due lati durante la fase dei qubit.
Qubit
Transpila il circuito di qubit risultante usando i metodi standard di Qiskit, inclusi ottimizzazione, layout e instradamento per il tuo hardware di destinazione.
Uscita
Converte la struttura dati DAG interna nel formato di output desiderato.
Un esempio pratico: transpilazione con Jordan-Wigner
Usa il pass manager preimpostato per transpilare il tuo circuito fermionico con la mappatura fermione-qubit di 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.
Confronto con il flusso di lavoro tradizionale
La guida ai circuiti fermionici descrive come il flusso di lavoro tradizionale esegue la codifica fermione-qubit prima di costruire la QuantumCircuit. Confronta 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 producono circuiti equivalenti. Tuttavia, il flusso di lavoro tradizionale richiede di implementare manualmente i passi di ottimizzazione, mentre con l'approccio fermionico-first puoi integrare ottimizzazioni consapevoli del problema nel processo di transpilazione.
Flussi di lavoro avanzati
Il pass manager preimpostato offre un comodo punto di partenza. Per casi d'uso più avanzati, puoi fare quanto segue:
-
Personalizzare i pass del transpiler eseguiti durante ciascuna fase.
-
Scegliere la formula di prodotto che trotterizza un gate
Evolutionnello spazio fermionico, per singolo gate o per un'intera pipeline conF2FSynthesis(vedi Sintetizza un gate Evolution nello spazio fermionico). -
Implementare mappature fermione-qubit personalizzate creando plugin di sintesi (vedi
F2QSynthesisPlugin). -
Costruire pass del transpiler personalizzati.