Libreria Mapper
L'API C fornisce implementazioni efficienti delle routine di mappatura degli operatori più comunemente utilizzate.
qf_edge_vertex_to_fermion
QfFermionOperator *qf_edge_vertex_to_fermion(const QfEdgeVertexOperator *edge_op)
Assegna a QfEdgeVertexOperator QfFermionOperator.
Definizione
Questa funzione scompone gli operatori di spigolo e di vertice in termini di operatori di creazione e annichilimento fermionici, come definiti qui.
Esempio
1// define some kind of edge-vertex operator
2QfEdgeVertexOperator *edge_op = qf_edge_op_one();
3
4// and map it to a fermionic operator
5QfFermionOperator *fer_op = qf_edge_vertex_to_fermion(edge_op);L'operatore mappato non viene semplificato. Poiché ogni generatore si espande in una somma di termini fermionici, il risultato contiene generalmente termini duplicati; si utilizzi seguito qf_ferm_op_normal_ordered() da qf_ferm_op_simplify() per ridurlo.
Parametri
- edge_op – Un puntatore all'operatore bordo-vertice da mappare.
Risultati
Un puntatore all'operatore fermionico mappato.
qf_edge_vertex_to_majorana
QfMajoranaOperator *qf_edge_vertex_to_majorana(const QfEdgeVertexOperator *edge_op)
Assegna a QfEdgeVertexOperator QfMajoranaOperator.
Definizione
Questa funzione scompone gli operatori di spigolo e di vertice in termini di operatori di Majorana, come definiti qui.
Esempio
1// define some kind of edge-vertex operator
2QfEdgeVertexOperator *edge_op = qf_edge_op_one();
3
4// and map it to a Majorana operator
5QfMajoranaOperator *maj_op = qf_edge_vertex_to_majorana(edge_op);L'operatore mappato non viene semplificato; si vedano e qf_maj_op_normal_ordered() qf_maj_op_simplify().
Parametri
- edge_op – Un puntatore all'operatore bordo-vertice da mappare.
Risultati
Un puntatore all'operatore di Majorana mappato.
qf_ferm_op_jordan_wigner
QfExitCode qf_ferm_op_jordan_wigner(const QfFermionOperator *op, uint32_t num_qubits, QkObs **out)
Applica la trasformazione di Jordan-Wigner a un operatore.
Associa a QfFermionOperator un QkObs o mediante la trasformazione di Jordan-Wigner. [JW-ferm]
Definizione
La trasformazione di Jordan-Wigner mappa gli operatori di creazione e annichilimento fermionici su operatori di spin (o, in questo caso, su operatori di qubit):
dove ( ) è l’operatore di creazione (annichilimento) fermionico che agisce sull’ -esima modalità fermionica senza spin, con sono gli operatori di Pauli con spin e .
Questa mappatura preserva le relazioni di anticommutazione fermioniche introducendo una catena di operatori di " " su tutti i qubit che precedono l'indice su cui agisce l'operatore .
[ JW-ferm ]
P. Jordan ed E. Wigner, “Über das Paulische Äquivalenzverbot”, Zeitschrift für Physik 47, n. 9. (1928), pp. 631–651, doi:10.1007/BF01331938.
Utilizzo della memoria
Non è garantito che il risultato sia completamente semplificato: i termini duplicati vengono uniti durante l'elaborazione, per limitare la memoria richiesta, ma alcuni potrebbero comunque rimanere. Chiama qk_obs_canonicalize se ti servono tutti insieme. Il numero esatto di termini restituiti può quindi variare in base al numero di thread utilizzati, il che non influisce sull'operatore rappresentato dal risultato.
Questa mappatura è parallelizzata per garantire maggiore velocità, ma questa scelta comporta un maggiore consumo di memoria. Ogni thread di lavoro accumula dati in un proprio osservabile, e i termini vengono assegnati al primo thread disponibile anziché essere suddivisi in base alle stringhe di Pauli che generano; di conseguenza, ogni thread finisce per contenere all’incirca una copia completa dell’operatore mappato. La memoria massima cresce quindi con il numero di thread: ci si può aspettare un valore dell’ordine della dimensione dell’operatore mappato moltiplicata per il numero di thread, più l’operatore di input.
Se la memoria è più importante del tempo di esecuzione, riduci il numero di thread tramite la variabile d'ambiente RAYON_NUM_THREADS di rayon: il picco di memoria diminuisce all'incirca in proporzione e la mappatura richiede di conseguenza più tempo; in alternativa, mappa l'operatore in batch e somma tu stesso i risultati parziali, il che limita il picco alla dimensione del batch al costo di ripetere l'operazione di unione.
Esempio
1// define some kind of fermionic operator
2QfFermionOperator *hamil = qf_ferm_op_one();
3
4// and map it to a qubit operator
5QkObs *result;
6QfExitCode exit = qf_ferm_op_jordan_wigner(hamil, 4, &result);
7
8assert(exit == QfExitCode_Success);Parametri
- op – Un puntatore all’operatore fermionico da mappare.
- num_qubits – Il numero di qubit dell'operatore risultante. Questo valore deve essere rigorosamente maggiore dell'indice della moda più grande su cui agisce
op. - out – Un puntatore alla posizione in cui verrà scritto l’operatore del qubit creato in caso di esito positivo. Se la trasformazione fallisce, rimane invariato.
Risultati
Un codice di uscita. Questo vale nel caso >0 in cui si verifichi un errore. In particolare, QfExitCode_ValueError viene restituito un se è num_qubits troppo piccolo per contenere il supporto dell'operatore.
qf_maj_op_jordan_wigner
QfExitCode qf_maj_op_jordan_wigner(const QfMajoranaOperator *op, uint32_t num_qubits, QkObs **out)
Applica la trasformazione di Jordan-Wigner a un operatore di Majorana.
Associa a QfMajoranaOperator un QkObs o mediante la trasformazione di Jordan-Wigner. [JW-maj]
Definizione
In base alla convenzione QfMajoranaOperator secondo cui anche gli indici portano e quelli dispari , l’indice di Majorana agisce sulla modalità fermionica e si proietta su una singola stringa di Pauli,
Ciò evita inoltre un’espansione intermedia rispetto alla conversione in un primo QfFermionOperator : ogni azione fermionica si mappa su una somma a due termini, per cui tale percorso espande una singola stringa di Pauli in un numero massimo di i termini per ogni termine costruito da operatori di Majorana . Il risparmio aumenta con la durata dei contratti; per i contratti con un unico operatore, le due opzioni hanno un costo pressoché identico.
[ JW-maj ]
P. Jordan ed E. Wigner, “Über das Paulische Äquivalenzverbot”, Zeitschrift für Physik 47, n. 9. (1928), pp. 631–651, doi:10.1007/BF01331938.
Utilizzo della memoria
Vedi qf_ferm_op_jordan_wigner(); si applica lo stesso comportamento di parallelizzazione e fusione.
Esempio
1// define some kind of Majorana operator
2QfMajoranaOperator *hamil = qf_maj_op_one();
3
4// and map it to a qubit operator
5QkObs *result;
6QfExitCode exit = qf_maj_op_jordan_wigner(hamil, 4, &result);
7
8assert(exit == QfExitCode_Success);Parametri
- op – Un puntatore all’operatore di Majorana da mappare.
- num_qubits – Il numero di qubit dell'operatore risultante. Si noti che questo valore è calcolato in modi fermionici, quindi deve essere rigorosamente maggiore del più grande indice di Majorana su cui agisce diviso
opper due. - out – Un puntatore alla posizione in cui verrà scritto l’operatore del qubit creato in caso di esito positivo. Se la trasformazione fallisce, rimane invariato.
Risultati
Un codice di uscita. Questo vale nel caso >0 in cui si verifichi un errore. In particolare, QfExitCode_ValueError viene restituito un se è num_qubits troppo piccolo per contenere il supporto dell'operatore.
qf_edge_op_jordan_wigner
QfExitCode qf_edge_op_jordan_wigner(const QfEdgeVertexOperator *op, uint32_t num_qubits, QkObs **out)
Applica la trasformazione di Jordan-Wigner a un operatore bordo-vertice.
Associa a QfEdgeVertexOperator un QkObs o mediante la trasformazione di Jordan-Wigner. [JW-edge]
Definizione
Indichando con e rispettivamente l’indice minore e quello maggiore, gli operatori di bordo generalizzati si mappano su singole stringhe di Pauli,
dove il segno è negativo per e positivo in tutti gli altri casi. Le catene di i dei due operatori di Majorana sottostanti si annullano sotto l’indice inferiore; ecco perché la stringa copre solo le modalità strettamente comprese tra i due estremi.
[ JW-edge ]
P. Jordan ed E. Wigner, “Über das Paulische Äquivalenzverbot”, Zeitschrift für Physik 47, n. 9. (1928), pp. 631–651, doi:10.1007/BF01331938.
[ Gandon-edge ]
L. Gandon et al., Simulazione quantistica fermionica con insiemi di flusso, arXiv:2512.11418.
Utilizzo della memoria
Vedi qf_ferm_op_jordan_wigner(); si applica lo stesso comportamento di parallelizzazione e fusione.
Esempio
1// define some kind of edge-vertex operator
2QfEdgeVertexOperator *hamil = qf_edge_op_one();
3
4// and map it to a qubit operator
5QkObs *result;
6QfExitCode exit = qf_edge_op_jordan_wigner(hamil, 4, &result);
7
8assert(exit == QfExitCode_Success);Invertendo i due indici, la stringa di Pauli rimane invariata e cambia solo il segno: questa è l'antisimmetria . Si confronti qf_transfer_op_jordan_wigner()con il caso in cui il coefficiente è lo stesso per entrambi gli orientamenti e cambiano invece le lettere di Pauli.
Queste stringhe di Pauli differiscono da quelle riportate nell'equazione (10) di [Gandon-edge] mediante uno scambio tra e sui due endpoint. Si tratta di una scelta di base a un singolo qubit – entrambe le convenzioni soddisfano tutte le relazioni che definiscono l'algebra – e quella qui utilizzata è quella coerente con qf_edge_vertex_to_fermion(), per cui la mappatura di un operatore corrisponde direttamente alla sua conversione in un prima QfFermionOperator .
Parametri
- op – Un puntatore all’operatore bordo-vertice da mappare.
- num_qubits – Il numero di qubit dell'operatore risultante. Questo valore deve essere rigorosamente maggiore dell'indice della moda più grande su cui agisce
op. - out – Un puntatore alla posizione in cui verrà scritto l’operatore del qubit creato in caso di esito positivo. Se la trasformazione fallisce, rimane invariato.
Risultati
Un codice di uscita. Questo vale nel caso >0 in cui si verifichi un errore. In particolare, QfExitCode_ValueError viene restituito un se è num_qubits troppo piccolo per contenere il supporto dell'operatore.
qf_transfer_op_jordan_wigner
QfExitCode qf_transfer_op_jordan_wigner(const QfTransferVertexOperator *op, uint32_t num_qubits, QkObs **out)
Applica la trasformazione di Jordan-Wigner a un operatore di vertice di trasferimento.
Associa a QfTransferVertexOperator un QkObs o mediante la trasformazione di Jordan-Wigner. [JW-transfer]
Definizione
Indichando con e i valori più piccolo e più grande dei due indici, gli operatori di trasferimento generalizzati si mappano su singole stringhe di Pauli,
dove per e in tutti gli altri casi.
[ JW-transfer ]
P. Jordan ed E. Wigner, “Über das Paulische Äquivalenzverbot”, Zeitschrift für Physik 47, n. 9. (1928), pp. 631–651, doi:10.1007/BF01331938.
[ Gandon-transfer ]
L. Gandon et al., Simulazione quantistica fermionica con insiemi di flusso, arXiv:2512.11418.
Utilizzo della memoria
Vedi qf_ferm_op_jordan_wigner(); si applica lo stesso comportamento di parallelizzazione e fusione.
Esempio
1// define some kind of transfer-vertex operator
2QfTransferVertexOperator *hamil = qf_transfer_op_one();
3
4// and map it to a qubit operator
5QkObs *result;
6QfExitCode exit = qf_transfer_op_jordan_wigner(hamil, 4, &result);
7
8assert(exit == QfExitCode_Success);L'ordine degli indici funziona in modo opposto rispetto a qf_edge_op_jordan_wigner(): il coefficiente è per entrambi gli orientamenti ed è l'ordine delle lettere di Pauli a invertirsi. e sono operatori realmente diversi, senza alcuna antisimmetria che li colleghi.
Per quanto riguarda qf_edge_op_jordan_wigner(), queste stringhe di Pauli differiscono dall'equazione (10) di [Gandon-transfer] mediante una scelta di base a singolo qubit; la convenzione qui utilizzata è quella coerente con qf_transfer_vertex_to_fermion().
Parametri
- op – Un puntatore all’operatore di trasferimento dei vertici da mappare.
- num_qubits – Il numero di qubit dell'operatore risultante. Questo valore deve essere rigorosamente maggiore dell'indice della moda più grande su cui agisce
op. - out – Un puntatore alla posizione in cui verrà scritto l’operatore del qubit creato in caso di esito positivo. Se la trasformazione fallisce, rimane invariato.
Risultati
Un codice di uscita. Questo vale nel caso >0 in cui si verifichi un errore. In particolare, QfExitCode_ValueError viene restituito un se è num_qubits troppo piccolo per contenere il supporto dell'operatore.
qf_fermion_to_majorana
QfMajoranaOperator *qf_fermion_to_majorana(const QfFermionOperator *fer_op)
Assegnare a QfFermionOperator a QfMajoranaOperator.
Definizione
Questa funzione implementa la seguente trasformazione semplice:
dove ( ) è l'operatore di creazione (annichilimento) fermionico che agisce sull' -esima modalità fermionica senza spin, e / sono i due operatori dei fermioni di Majorana. Nel caso di questi QfMajoranaOperator , saranno immagazzinati rispettivamente sulle modalità Majorana pari e dispari.
Esempio
1// define some kind of fermionic operator
2QfFermionOperator *fer_op = qf_ferm_op_one();
3
4// and map it to a majorana operator
5QfMajoranaOperator *maj_op = qf_fermion_to_majorana(fer_op);Parametri
- fer_op – Un puntatore all'operatore fermionico da mappare.
Risultati
Un puntatore all'operatore di Majorana mappato.
qf_majorana_to_fermion
QfFermionOperator *qf_majorana_to_fermion(const QfMajoranaOperator *maj_op)
Assegnare a QfMajoranaOperator a QfFermionOperator.
Definizione
Questa funzione implementa la seguente trasformazione semplice:
dove / sono i due operatori dei fermioni di Majorana (associati rispettivamente alle modalità pari e dispari), e ( ) è l’operatore di creazione (annichilimento) fermionico che agisce sulla ( -esima modalità fermionica senza spin.
Esempio
1// define some kind of majorana operator
2QfMajoranaOperator *maj_op = qf_maj_op_one();
3
4// and map it to a fermion operator
5QfFermionOperator *fer_op = qf_majorana_to_fermion(maj_op);Parametri
- maj_op – Un puntatore all’operatore di Majorana da mappare.
Risultati
Un puntatore all'operatore fermionico mappato.
qf_transfer_vertex_to_fermion
QfFermionOperator *qf_transfer_vertex_to_fermion(const QfTransferVertexOperator *transfer_op)
Assegna a QfTransferVertexOperator QfFermionOperator.
Definizione
Questa funzione scompone gli operatori di trasferimento e di vertice in termini di operatori di creazione e annichilimento fermionici, come definiti qui.
Esempio
1// define some kind of transfer-vertex operator
2QfTransferVertexOperator *transfer_op = qf_transfer_op_one();
3
4// and map it to a fermionic operator
5QfFermionOperator *fer_op = qf_transfer_vertex_to_fermion(transfer_op);L'operatore mappato non viene semplificato. Poiché ogni generatore si espande in una somma di termini fermionici, il risultato contiene generalmente termini duplicati; si utilizzi seguito qf_ferm_op_normal_ordered() da qf_ferm_op_simplify() per ridurlo.
Parametri
- transfer_op – Un puntatore all'operatore di trasferimento dei vertici da mappare.
Risultati
Un puntatore all'operatore fermionico mappato.
qf_transfer_vertex_to_majorana
QfMajoranaOperator *qf_transfer_vertex_to_majorana(const QfTransferVertexOperator *transfer_op)
Assegna a QfTransferVertexOperator QfMajoranaOperator.
Definizione
Questa funzione scompone gli operatori di trasferimento e di vertice in termini di operatori di Majorana, come definiti qui.
Esempio
1// define some kind of transfer-vertex operator
2QfTransferVertexOperator *transfer_op = qf_transfer_op_one();
3
4// and map it to a Majorana operator
5QfMajoranaOperator *maj_op = qf_transfer_vertex_to_majorana(transfer_op);L'operatore mappato non viene semplificato; si vedano e qf_maj_op_normal_ordered() qf_maj_op_simplify().
Parametri
- transfer_op – Un puntatore all'operatore di trasferimento dei vertici da mappare.
Risultati
Un puntatore all'operatore di Majorana mappato.
qf_transfer_vertex_to_edge_vertex
QfEdgeVertexOperator *qf_transfer_vertex_to_edge_vertex(const QfTransferVertexOperator *transfer_op)
Assegna a QfTransferVertexOperator QfEdgeVertexOperator.
Definizione
Questa funzione riscrive ciascun operatore di trasferimento in termini di operatori di spigolo e di vertice. Un operatore di vertice si mappa su se stesso, mentre un operatore di trasferimento diventa un prodotto di lunghezza due costituito da un operatore di spigolo e da un operatore di vertice.
Esempio
1// define some kind of transfer-vertex operator
2QfTransferVertexOperator *transfer_op = qf_transfer_op_one();
3
4// and map it to an edge-vertex operator
5QfEdgeVertexOperator *edge_op = qf_transfer_vertex_to_edge_vertex(transfer_op);Questo è l’unico mappatore che rimane nell’ambito delle rappresentazioni degli operatori di interazione, quindi rappresenta il percorso naturale per confrontare i due approcci: mappare un operatore di trasferimento su un operatore bordo-vertice e poi su uno fermionico coincide con il mapparlo direttamente su un operatore fermionico.
Parametri
- transfer_op – Un puntatore all'operatore di trasferimento dei vertici da mappare.
Risultati
Un puntatore all'operatore bordo-vertice mappato.