Lavoro con 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 utilizzare il FermionicCircuit per implementare algoritmi quantistici direttamente nello spazio fermionico, anziché effettuare prima una mappatura sui qubit.
Perché utilizzare i circuiti fermionici?
Si consideri il flusso di lavoro tradizionale per l'implementazione dell'evoluzione temporale di un Hamiltoniano fermionico su un'architettura basata su qubit:
- Definire l'Hamiltoniano fermionico (ad esempio, ).
- Mappalo su un operatore su qubit (ad esempio, utilizzando la mappatura di Jordan-Wigner).
- Implementare l'evoluzione temporale nello spazio dei qubit (utilizzando la trotterizzazione o altri metodi).
Questo approccio presenta un limite fondamentale: la mappatura precoce sui qubit comporta la perdita delle informazioni relative alla struttura fermionica, che sono rilevanti per il problema. I passaggi di ottimizzazione standard non sono in grado di sfruttare le simmetrie fermioniche né i riordini consentiti dei termini, il che porta alla creazione di circuiti subottimali con profondità e numero di porte non necessari.
Ciò consente FermionicCircuit un flusso di lavoro più efficiente:
- Definire l'Hamiltoniano fermionico (ad esempio, ).
- Implementare l'evoluzione temporale direttamente nello spazio fermionico utilizzando porte fermioniche.
- Mappatura nello spazio dei qubit come parte del processo di transpilazione.
Questo approccio ovvia a tale limitazione mantenendo le conoscenze relative al problema nello spazio fermionico, dove le fasi di ottimizzazione possono sfruttare la struttura fermionica e le relazioni di commutazione per ridurre la profondità del circuito. Il circuito fermionico descrive quale calcolo eseguire, mentre la transpilazione si occupa di come mapparlo sui qubit, garantendo una separazione più netta delle responsabilità.
Indicizzazione in modalità generica
Sia il operators modulo che il FermionicCircuit utilizzano un'indicizzazione generica basata sulle modalità che non fa ipotesi sulla natura delle modalità stesse. Una modalità è semplicemente un indice astratto che identifica un grado di libertà fermionico, privo di semantica intrinseca. Questa scelta progettuale rispecchia quella del modulo operatori e garantisce la massima flessibilità. Ad esempio, è possibile implementare l'evoluzione nel tempo per qualsiasi operatore che implementi il protocollo OperatorTrait , indipendentemente dalla sua rappresentazione matematica.
Costruire un circuito fermionico
L'esempio riportato di seguito implementa l'evoluzione temporale descritta nella sezione precedente. Costruisce un FermionicCircuit specificando il numero di modi fermionici, quindi aggiunge porte fermioniche dal qiskit_fermions.circuit.library per implementare l'evoluzione temporale.
L'esempio illustra inoltre come integrare le conoscenze di dominio in un operatore utilizzando il raggruppamento dei termini dell'operatore. Assegnando indici di gruppo ai termini dell’Hamiltoniano, si preservano le informazioni strutturali che i passaggi di ottimizzazione possono sfruttare lungo l’intero stack di transpilazione.
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import Evolution
>>> from qiskit_fermions.operators import FermionOperator, cre, ann
>>>
>>> # Create a circuit with 4 fermionic modes
>>> circuit = FermionicCircuit(4)
>>>
>>> # Define a simple fermionic Hamiltonian
>>> 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),
... ])
>>> # Add some problem structure by grouping our Hamiltonian terms
>>> hamiltonian.groups = [0, 0, 1, 1]
>>>
>>> # Add an evolution gate to implement exp(-i * t * H)
>>> evolution = Evolution(4, hamiltonian, time=1.0)
>>> circuit.append(evolution, circuit.register)// The C API for FermionicCircuit is not available yet.
Si noti come il raggruppamento dei termini dell'operatore venga mantenuto anche in operazioni semplici come la scomposizione. Questo illustra come le informazioni strutturali fluiscono attraverso la pila di circuiti. Per comprendere appieno il processo di transpilazione in qubit, consultare la guida alla transpilazione dei circuiti fermionici.
Transpile dei circuiti fermionici
Per implementare l'algoritmo quantistico rappresentato dal tuo, FermionicCircuit è necessario traspilarlo in un QuantumCircuit. Puoi scoprire come farlo nella guida " Transpile dei circuiti fermionici".
Passi successivi
- Scopri quali sono i gate fermionici disponibili nella documentazione
qiskit_fermions.circuit.library. - Consulta la guida esplicativa degli operatori per capire come costruire gli hamiltoniani fermionici che puoi utilizzare con i circuiti fermionici.
- Consulta la guida introduttiva di SQDRIFT per un esempio pratico completo.
- Leggi la guida alle relazioni di ffsim per capire come
FermionicCircuitsia possibile simulare direttamente un e come questi indici di modalità generici assumano una semantica di spin solo al momento della simulazione.