Vai al contenuto principale
Questo progetto è in fase beta. Hai trovato un bug? Apri una issue su GitHub. Hai una domanda o un'idea? Chiedi su GitHub Discussions — apprezziamo il tuo feedback!
Com'è la qualità della traduzione su questa pagina?

Transpila circuiti fermionici

Importante

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:

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

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

The directly constructed QuantumCircuit of the fermionic time evolution.

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: