Qiskit SDK 2.3 note di rilascio
2.3.1
Preludio
Qiskit v2.3.1 risolve diversi bug individuati dopo il rilascio di Qiskit v2.3.0.
Correzioni di bug
-
Il plugin di sintesi
permutation.kmsintegrato in oraqiskit.synthesisgestisce correttamente le permutazioni di lunghezza zero. Risolto il problema n. 15550. -
Fisso
synth_clifford_depth_lnn()per Clifford a un singolo qubit. Vedi n. 15780. -
È stato risolto un bug nel passaggio
HighLevelSynthesisdel transpiler in cui gli stati dei qubit non venivano aggiornati correttamente dopo la sintesi ricorsiva di un'operazione. In alcuni casi, ciò potrebbe comportare la generazione di circuiti errati da parte del pass. -
È stato risolto un problema nella
qs_decomposition()funzione in cui eventuali problemi di tolleranza nelle routine interne di algebra lineare causavano un errore di panico, provocando l'arresto anomalo del programma. Il problema è stato risolto, quindi in queste situazioni viene generata invece un'eccezione appropriataQiskitErroro una sua sottoclasse.Risolto il problema n. 15610.
-
La sintesi predefinita di un
UnitaryGatequando si accedeUnitaryGate.definitione si chiamaUnitaryGate.control()per i gate che coinvolgono più di due qubit si baserà internamente sullaqs_decomposition()funzione. In alcune situazioni, a causa della tolleranza intrinseca dei numeri in virgola mobile utilizzata nelle routine di algebra lineare coinvolte nella decomposizione iterativa di Shannon-Quantum, il calcolo potrebbe non andare sempre a buon fine. Per evitare che questi attributi o metodi generino un errore, in tali situazioni si ricorre invece allaIsometryscomposizione da. Sebbene ciò comporti una decomposizione meno efficiente,qs_decomposition()fungerà da soluzione alternativa nel caso in cuiqs_decomposition()fallisca. -
È stato risolto un bug per
ParameterExpression.sympify()cui, in determinate combinazioni diParameter,ParameterExpressione valori numerici, le operazioni aritmetiche asimmetriche (come ** o -) potevano invertire gli operandi. Vedi n. 15642. -
Corretto
qk_obs_term()durante l'accesso a un termine osservabile di identità. Vedi n. 15536. -
È stato risolto un artefatto di visualizzazione in
plot_state_qsphere()cui gli stati simmetrici intrecciati (come gli stati di Bell) venivano ruotati in modo arbitrario a causa del rumore dei numeri in virgola mobile. -
Risolto
QuantumCircuit.repeat()per circuiti con porte parametrizzate.Vedi n. 15645.
-
Risolve un bug che causava
qpy.load()il crash di sui circuiti creati utilizzandoQuantumCircuit.ensure_physical()quando era presente un registro creato dall'utente denominato «ancilla». -
È stato risolto
BreakLoopOpil problema per cuiContinueLoopOpalcune operazioni venivano erroneamente interpretate come operazioni di controllo del flusso in determinati passaggi del transpiler, il che poteva causare la generazione diAttributeErrorun'eccezione. Vedi n. 15579. -
Risolve un bug che causava
qpy.load()il crash di sui circuiti creati utilizzandoSabreLayoutquando era presente un registro creato dall'utente denominato «ancilla». -
La versione minima richiesta di NumPy è ora correttamente indicata come 1.21 (anziché 1.17 ). Questo limite è in vigore già da diverse versioni a causa dell'uso di
numpy.typing.NDArray, introdotto in NumPy 1.21, pertanto Qiskit non riuscirebbe a importarsi con le versioni precedenti di NumPy. -
L'esportatore
OpenQASM 3(qasm3.dumps()edump()) ora esegue correttamente l'escape dei caratteri Unicode "numerici" diversi dalle cifre ASCII, quando questi vengono utilizzati negli identificatori. In precedenza, caratteri come gli apici superiori rimanevano nell'output, il che non è consentito n OpenQASM e 3. -
L'esportatore
OpenQASM 3(qasm3.dumps()edump()) ora esegue correttamente l'escape degli identificatori il cui nome inizia con una cifra ASCII. -
I metodi
SparsePauliOp.from_list()eSparsePauliOp.from_sparse_list()ora deducono automaticamente il tipo di dati del coefficiente, sedtypel'argomento non è specificato.Ad esempio:
from qiskit.quantum_info import SparsePauliOp from qiskit.circuit import Parameter theta = Parameter("theta") # Previously required manually setting dtype=object op_list = SparsePauliOp.from_list([("X", theta)]) op_sparse = SparsePauliOp.from_sparse_list([("X", [0], theta)], num_qubits=1)
2.3.0
Preludio
Qiskit v2.3.0 è una nuova funzionalità rilasciata dall' Qiskit SDK.
Questa nuova versione amplia notevolmente l'API C per la transpilazione, rendendo disponibili dal C ulteriori funzionalità di Target (QkTarget) e consentendo la creazione e la manipolazione di DAGCircuit (QkDag). Ciò consente di scrivere passaggi personalizzati del transpiler durante la compilazione dell'oggetto libqiskit autonomo. L'API C mette a disposizione singole funzioni relative alla fase di transpilazione (ad esempio, qk_transpile_stage_layout()), per facilitare l'inserimento di logica personalizzata nella transpilazione senza dover ricreare manualmente l'intera pipeline.
Sono state migliorate anche le prestazioni e le funzionalità della transpilazione verso destinazioni precoci tolleranti ai guasti. Con la nuova PauliProductMeasurement istruzione, che rappresenta una trasformazione proiettiva in una base di prodotto di Pauli, Qiskit ora supporta pienamente la transpilazione dei circuiti in una base di calcolo basata su Pauli utilizzando il pass LitinskiTransformation esistente. Il nuovo metodo di sintesi unitaria, RossSelingerSynthesis, che può essere configurato nel transpiler tramite unitary_synthesis_method="gridsynth", consente di utilizzare l'algoritmo di Ross-Selinger, asintoticamente ottimale, per la sintesi Clifford+T a singolo qubit. Altri miglioramenti includono, ad esempio, un passaggio OptimizeCliffordT migliore o il CommutativeOptimization passaggio, che tiene conto delle ottimizzazioni commutative dei circuiti basati su Pauli.
A livello interno, la rappresentazione degli ControlFlowOp oggetti è stata modificata per essere nativa di Rust. Questa trasformazione non è ancora stata completata; potresti riscontrare un calo delle prestazioni in Qiskit 2.3 per quanto riguarda le operazioni relative al flusso di controllo. Le versioni successive di Qiskit dovrebbero approfondire ulteriormente questo aspetto, risolvendo le questioni relative alle prestazioni e alle API, da tempo oggetto di discussione, in merito alle operazioni di controllo del flusso.
Si noti che a partire da questa versione, Python 3.9 non è più supportato poiché ha superato la fine del ciclo di vita nell'ottobre 2025, mentre macOS sui processori Intel è stato declassato al supporto di piattaforma di livello 2 poiché Apple ha iniziato a ritirare la piattaforma. Sono supportate tutte le versioni di CPython a partire da 3.10. Vedere Supporto del sistema operativo per i livelli di supporto attuali delle diverse piattaforme.
Ci saranno ulteriori rilasci di funzionalità di Qiskit nella serie " 2.x "; non prevediamo di rilasciare Qiskit 3.0 fino a molto più avanti nel 2026, poiché al momento non vi è alcuna necessità di apportare modifiche sostanziali.
Funzionalità API C
-
È stata aggiunta la funzione
qk_target_instruction_supported()per verificare la compatibilità di qualsiasi gate o istruzione con l'istanza diQkTarget. Questo controllo viene eseguito in base al nome dell'istruzione fornita, ai qargs e ai parametri. -
È stata aggiunta la funzione
qk_target_entry_set_name()per impostare il nome di una voce di destinazione esistente. -
È stata aggiunta una nuova funzione
qk_circuit_library_quantum_volume()per generare un circuito con modello di volume quantistico. -
Aggiunti metodi per iterare e controllare la mappa dei gate di un
QkTarget. Sono stati aggiunti i seguenti metodi:qk_target_op_num_properties()qk_target_op_index()qk_target_op_name()qk_target_op_qargs_index()qk_target_op_qargs()qk_target_op_props()
È stata aggiunta la seguente rappresentazione:
QkInstructionProperties: per rappresentare ilInstructionProperties.
Esempio:
// Create Target with a mix of global and non-global gates. QkTarget *target = qk_target_new(2); // Create a CX entry QkTargetEntry *cx_entry = qk_target_entry_new(QkGate_CX); uint32_t qarg_samples[2][2] = { {0, 1}, {1, 0}, }; double props[2][2] = { {2.7022e-11, 0.00713}, {3.0577e-11, 0.00713} }; for (int i = 0; i < 2; i++) { qk_target_entry_add_property(cx_entry, qarg_samples[i], 2, props[i][0], props[i][1]); } qk_target_add_instruction(target, cx_entry); // Create an SX entry QkTargetEntry *sx_entry = qk_target_entry_new(QkGate_SX); for (int i = 0; i < 2; i++) { uint32_t qargs[1] = {i}; qk_target_entry_add_property(sx_entry, qargs, 1, 35.5e-9, 0.); } qk_target_add_instruction(target, sx_entry); // Create an H entry qk_target_add_instruction(target, qk_target_entry_new(QkGate_H)); // Get the size of the size_t target_length = qk_target_num_instructions(target); for (size_t op_idx = 0; op_idx < target_length; op_idx++) { // Allocate space for qargs and props uint32_t *qargs; uint32_t qargs_len; QkInstructionProperties props; // Retrieve the operation's name char *name = qk_target_op_name(target, op_idx); size_t num_props = qk_target_op_num_properties(target, op_idx); for (size_t props_idx = 0; props_idx < num_props; props_idx++) { // Populate qargs qk_target_op_qargs(target, op_idx, props_idx, &qargs, &qargs_len); // Populate properties qk_target_op_props(target, op_idx, props_idx, &props); } // Free the name string qk_str_free(name); } -
QkTargetora offre ai propri utenti la possibilità di recuperare le operazioni direttamente da esso. Sono stati aggiunti i seguenti metodi:È stata aggiunta la seguente rappresentazione:
QkTargetOp: Per rappresentare un'operazione nelQkTarget.
-
L'API C ora espone
QkParamper rappresentare i parametri di gate, inclusi simboli ed espressioni parametrizzate. L'interfacciaQkParamstessa supporta calcoli simbolici, comprese operazioni aritmetiche standard e funzioni trigonometriche. Ad esempio:QkParam *x = qk_symbol_new("x"); // a symbol called "x" QkParam *y = qk_symbol_new("y"); // a symbol called "y" QkParam *val = qk_symbol_from_double(2.0); // the value 2.0 QkParam *out = qk_symbol_zero(); // to store the final expression // build 2 sin(x + y) qk_param_add(out, x, y); // out = x + y qk_param_sin(out, out); // out = sin(out) qk_param_mul(out, out, val); // out = out * 2 qk_param_free(x); qk_param_free(y); qk_param_free(val); qk_param_free(out); -
L'API C è ora in grado di rappresentare e manipolare
DAGCircuitcome oggetto opacoQkDag. Sono state aggiunte le seguenti funzioni relative al DAG:qk_dag_new()qk_dag_add_quantum_register()qk_dag_add_classical_register()qk_dag_free()qk_dag_copy_empty_like()qk_dag_num_qubits()qk_dag_num_clbits()qk_dag_num_op_nodes()qk_dag_node_type()qk_dag_qubit_in_node()qk_dag_qubit_out_node()qk_dag_clbit_in_node()qk_dag_clbit_out_node()qk_dag_wire_node_value()qk_dag_op_node_clbits()qk_dag_op_node_gate_op()qk_dag_op_node_kind()qk_dag_op_node_num_clbits()qk_dag_op_node_num_params()qk_dag_op_node_num_qubits()qk_dag_op_node_qubits()qk_dag_op_node_unitary()qk_dag_apply_barrier()qk_dag_apply_gate()qk_dag_apply_measure()qk_dag_apply_reset()qk_dag_apply_unitary()qk_dag_get_instruction()qk_dag_compose()qk_dag_topological_op_nodes()qk_dag_substitute_node_with_dag()qk_dag_predecessors()qk_dag_successors()
-
È stata aggiunta
QkDagNodeTypel'enumerazione per distinguere il tipo di un nodo DAG. Questo è il tipo di ritorno diqk_dag_node_type(). -
È stata aggiunta
QkOperationKindl'enumerazione per distinguere i diversi tipi di operazioni native. Questo è il tipo di ritorno diqk_dag_op_node_kind(). -
Aggiunto
qk_circuit_copy_empty_like()per creare una copia del circuito specificato, come immagine speculare diQuantumCircuit.copy_empty_like(). -
Aggiunte nuove enumerazioni da utilizzare con alcune funzioni API di circuito e DAG per specificare le modalità di copia:
-
È stata aggiunta la
QkDagNeighborsstruttura, che è il tipo di ritorno diqk_dag_successors()eqk_dag_predecessors(), e la relativa funzione diqk_dag_neighbors_clear()liberazione. -
Viene aggiunta una nuova struttura,
QkNeighbors, che rappresenta il grafico di accoppiamento a due qubit implicito in unTarget. Viene inizializzato dalla funzione newqk_neighbors_from_target(), azzerato conqk_neighbors_clear()clear e dispone di una funzione di supportoqk_neighbors_is_all_to_all(). -
Sono state aggiunte le funzioni
qk_dag_to_circuit()qk_circuit_to_dag()e per supportare, rispettivamente, la conversione da DAG a circuito e da circuito a DAG. -
Le funzioni
qk_transpiler_pass_standalone_unitary_synthesis()qk_transpile()e ora supportano la sintesi di oggetti aUnitaryGate3 o più qubit in un circuito. In Qiskit 2.2 questa funzionalità non era supportata poiché l'algoritmo di sintesiqs_decomposition()sottostante utilizzato per la sintesi unitaria di 3 o più qubit era stato originariamente scritto in Python; tuttavia, ora che è stato portato su Rust, questa funzionalità è disponibile anche in C. -
Aggiunte nuove funzioni per l'esecuzione delle fasi di transpilazione all'API C. Queste funzioni sono:
Queste funzioni vengono utilizzate per eseguire queste fasi dal gestore di passaggi preimpostato su un
QkDagoggetto. L'obiettivo di queste funzioni è consentire flussi di lavoro di transpilazione componibili da C quando combinati con passaggi di transpilazione personalizzati. -
È stata aggiunta una nuova funzione
qk_transpile_layout_generate_from_mapping()che serve a generare un layout personalizzatoQkTranspileLayoutcon un layout iniziale definito da un array di mappatura. Lo scopo di questa funzione è consentire la creazione di un oggetto layout per i passaggi del transpiler di layout personalizzati. -
Le due forme di selezione del layout "perfetto" tramite l'algoritmo di isomorfismo dei sottografi VF2 sono ora disponibili come passaggi transpiler autonomi nell'API C. Queste funzioni sono
Questi differiscono nel modo in cui vengono gestiti la direzionalità e i gate set delle interazioni;
exactrichiede che le corrispondenze supportino direttamente tutti i gate in modo nativo, mentreaveragesi aspetta che ulteriori passaggi del transpiler scompongano i gate nell'insieme supportato di un dato qubit o link.Queste funzioni utilizzano una versione incapsulata della configurazione VF2 (
QkVF2LayoutConfiguration), che dispone di metodi setter per ciascuna delle opzioni. Ciò include consentire l'accesso alla nuova forma a due limiticall_limitdell'argomento.
Caratteristiche dei circuiti
-
È stata aggiunta una nuova classe di istruzioni,
PauliProductMeasurement, che rappresenta una misura proiettiva congiunta su più qubit, in cui l'osservabile misurato è un prodotto tensoriale di operatori di Pauli. Il risultato di questa misurazione è un singolo autovalore, che può essere o , indicante lo stato proprio del prodotto di Pauli.Per ulteriori informazioni, consultare A Game of Surface Codes: Large-Scale Quantum Computing with Lattice Surgery (Un gioco di codici superficiali: calcolo quantistico su larga scala con chirurgia reticolare) di Daniel Litinski.
Un
PauliProductMeasurementpuò essere istanziato da unPauli, dove il Pauli può includere una fase di , ma non di o . L'istruzione ha lo stesso numero di qubit del Pauli e un singolo bit classico.Ad esempio:
from qiskit.circuit import QuantumCircuit from qiskit.quantum_info import Pauli from qiskit.circuit.library import PauliProductMeasurement ppm = PauliProductMeasurement(Pauli("XZ")) qc = QuantumCircuit(6, 2) qc.append(ppm, [4, 1], [1]) -
Un nuovo
QuantumCircuit.to_dag()metodo offre ora una comoda interfaccia attorno acircuit_to_dag(). -
ParameterExpressionora dispone di unnum_parametersattributo, il cui valore è pari alla lunghezza del suoparametersinsieme, ma calcolato con un minor dispendio di risorse.
OpenQASM Caratteristiche
- L'esportatore OpenQASM 2(
qasm2.dumps()) ora supporta la generazione di sempliciIfElseOpblocchi a istruzione singola, se la condizione è un semplice test di uguaglianza tra un registro e un numero intero. Ciò corrisponde a ciò che il linguaggio di seconda generazione dell' OpenQASM e è in grado di rappresentare.
Caratteristiche QPY
- La versione 17 di QPY ora include formati di serializzazione per
SparseObservablegli oggetti utilizzati come parametri di altri oggetti. In particolare, ciò consente di serializzarePauliEvolutionGategli oggetti che utilizzano internamente questo operatore e il payload del gate di evoluzione viene aggiornato.
Caratteristiche dell'informazione quantistica
-
Aggiunto
Statevector.from_circuit()come mirror diOperator.from_circuit(). Ciò consente di istanziare direttamente unStatevectornello spazio dei qubit virtuali, anche per i circuiti che sono stati transpilati in uno spazio di qubit fisici. -
Sono state migliorate le prestazioni di
Clifford.dot()e diClifford.compose()quando vengono chiamati confront=Truee unQuantumCircuitcontenente solo porte di Clifford. In precedenza, il circuito veniva prima elaborato interamente in unCliffordoggetto, e poi i due oggetti venivano uniti. Ora, la baseCliffordviene aggiornata in modo iterativo, il che risulta notevolmente più veloce per i circuiti di piccole dimensioni. -
È stato aggiunto il
PauliLindbladMap.parity_sample()metodo. Questo metodo è molto simile a quelloPauliLindbladMap.signed_sample()preesistente, tuttavia utilizza una convenzione di segno più coerente con il resto di Qiskit e, pertanto, è il metodo da preferire in futuro. Dispone di ulteriori argomenti opzionali per applicare ridimensionamenti alle frequenze durante il campionamento senza modificare l'istanza. -
Diverse funzioni "
quantum_infopredicate", come ad esempiois_identity_matrix(), sono state ottimizzate per evitare allocazioni di matrici non necessarie.
Caratteristiche della sintesi
-
Aggiunto
gridsynth_rz(), che costruisce un circuito quantistico a singolo qubit che approssima una rotazione RZ con un angolo specificato. L'algoritmo è descritto nell'articolo «Optimal ancilla-free Clifford+T approximation of z-rotations» di Neil J. Ross e Peter Selinger ed è implementato all'indirizzo https://github.com/qiskit-community/rsgridsynth. -
Aggiunto
gridsynth_unitary(), che costruisce un circuito quantistico a singolo qubit che approssima una data matrice unitaria a singolo qubit. L'algoritmo funziona scomponendo la matrice unitaria in una rotazione RZ, una rotazione RX e un'altra rotazione RZ, e applicando l'algoritmo di Ross-Selinger a ciascuna delle tre rotazioni. -
L'algoritmo generale di sintesi
qs_decomposition()unitaria è stato riscritto in Rust, migliorando notevolmente le prestazioni di esecuzione della funzione.
Funzionalità del transpiler
-
È stato aggiunto un nuovo passaggio del transpiler,
CommutativeOptimization, che esegue la cancellazione e l'unione dei gate sfruttando le relazioni di commutatività. Il pass unifica ed estende le funzionalità sia diCommutativeCancellationche diCommutativeInverseCancellation.Nello specifico, il pass:
- Cancella coppie di porte inverse, comprese le coppie che sono inverse fino a una fase globale (regolando la fase globale se necessario).
- Tenta di unire porte consecutive quando possibile, ad esempio sequenze di porte RZ, porte RX, rotazioni di Pauli e così via.
-
È stata aggiunta una nuova opzione,
fallback_on_default, al passaggio delUnitarySynthesistranspiler. Questa opzione si applica quando il pass viene richiamato con un plugin di sintesi non predefinito, specificato tramite l'argomentomethod.Per impostazione predefinita, il plugin specificato viene utilizzato per sintetizzare ogni operatore unitario nel circuito (a condizione che il plugin sia applicabile; ad esempio, non verrà eseguito se non supporta il numero di qubit su cui è definito l'operatore unitario). Se il plugin non è in grado di sintetizzare l'operatore unitario e restituisce
None, l'operatore unitario originale rimane invariato nel circuito. Quandofallback_on_defaultè impostato suTrue, il pass richiamerà inveceDefaultUnitarySynthesisil plugin nel caso in cui il metodo specificato fallisca.Questa funzione è particolarmente utile quando i plugin personalizzati sono destinati a gestire solo un sottoinsieme di tutte le unità: gli utenti possono fare affidamento sulla loro logica personalizzata quando è applicabile e utilizzare la sintesi predefinita quando non lo è.
-
È stato aggiunto un nuovo plugin per la sintesi unitaria,
RossSelingerSynthesis, che sintetizza porte unitarie a singolo qubit utilizzando l'algoritmo di Ross-Selinger e produce un circuito quantistico a singolo qubit composto da porte Clifford, e .Il plugin viene attivato dal passaggio del
UnitarySynthesistranspiler quando il parametromethodè impostato su"gridsynth". -
Durante la transpilazione nella base Clifford+T, il passaggio
UnitarySynthesisdi transpilazione utilizza ora per impostazione predefinita un algoritmo di sintesi Clifford+T per approssimare le operazioni unitarie su un singolo qubit.Allo stesso modo, il
DefaultUnitarySynthesisplugin utilizza ora lo stesso algoritmo di sintesi Clifford+T per approssimare le operazioni unitarie su un singolo qubit. -
Un nuovo
DAGCircuit.to_circuit()metodo offre ora una comoda interfaccia attorno adag_to_circuit(). -
È stato aggiunto un nuovo passaggio del
SubstitutePi4Rotationstranspiler che converte i gate di rotazione a singoloRYGatequbitRZGate,RXGatee i cui angoli sono multipli interi di , in insiemi discreti di gate diTdgGateClifford,TGatee. Si noti che i multipli dispari di richiedono un singoloTGateeTdgGate, oltre ad alcune porte di Clifford, mentre i multipli pari di , o, equivalentemente, i multipli interi di , possono essere scritti utilizzando solo porte di Clifford. -
Il passaggio del
LitinskiTransformationtranspiler è stato esteso per gestire le misurazioni. Pertanto, la trasformazione si applica ora a un circuito contenente porte Clifford, porte di rotazione RZ a singolo qubit (comprese e ) e misurazioni Z standard, e sposta le porte Clifford alla fine del circuito. Nel corso del processo, trasforma le rotazioni RZ in rotazioni di Pauli moltiplicate (implementate comePauliEvolutionGategate) e le misurazioni Z in misurazioni di Pauli moltiplicate (implementate tramitePauliProductMeasurementistruzioni). -
Il ciclo di ottimizzazione del
OptimizeCliffordTtranspiler è stato notevolmente migliorato e reimplementato in Rust.Questo passaggio esegue un'ottimizzazione peephole sui circuiti espressi utilizzando il set di porte Clifford+T. Più precisamente, collassa tutte le catene di porte a singolo qubit contenenti Clifford+T in un utilizzo minimo di (o ). Il passaggio viene eseguito su una catena in un tempo proporzionale al numero di porte presenti nella catena.
-
Aggiunto
WrapAngles.DEFAULT_REGISTRYcontenente il registro predefinito perWrapAngles. Questo nuovo attributo sostituisce quello precedenteWRAP_ANGLE_REGISTRYe invitiamo gli utenti a passare alla nuova forma il prima possibile. -
I metodi
DAGCircuit.topological_op_nodes()DAGCircuit.topological_nodes()e ora supportano unreverseargomento di tipo booleano. Se impostati suTrue, i metodi restituiscono i nodi in ordine topologico inverso, dalle uscite del circuito verso gli ingressi. Questo offre un modo diretto ed efficiente per percorrere un DAG all'indietro senza l'onere di invertire esplicitamente l'elenco dei nodi restituito dalle funzioni, creando un nuovo DAG strutturalmente invertito conDAGCircuit.reverse_ops(). -
Ora
CommutationCheckersupporta controlli di commutazione efficienti tra i gate basati suPauliGatePauli,PauliEvolutionGateePauliProductMeasurementverificando se gli operatori di Pauli generatori commutano. Ciò consente di effettuare ottimizzazioni, in particolare per i circuiti nel formato di calcolo basato su Pauli, espressi in termini di evoluzioni di Pauli e misurazioni del prodotto di Pauli. Si noti che le commutazioni tra questi gate basati sui stati di Pauli e altri gate standard non vengono ancora gestite con la stessa efficienza. -
È stato aggiunto un nuovo argomento,
matrix_max_num_qubits, aCommutationChecker.commute(). Ciò consente di limitare la dimensione delle istruzioni per le quali il verificatore di commutazione è autorizzato a calcolare la rappresentazione matriciale, che comporta un costo esponenziale. Questo nuovo parametro consente di distinguere tra il limite di dimensione delle istruzioni da elaborare (impostato tramite,max_num_qubitsche ora èNoneimpostato di default su, ovvero nessun limite) e il limite di dimensione della matrice. -
Le funzioni
generate_preset_pass_manager()etranspile()ora tengono contounitary_synthesis_methoddell'argomento durante la compilazione nel set di basi Clifford+T, consentendo così l'utilizzo di plugin personalizzati per la sintesi unitaria. -
VF2LayouteVF2PostLayoutora tiene traccia dei punteggi parziali dei layout candidati durante l'abbinamento degli isomorfismi dei sottografi. Ciò non ha alcun effetto significativo quando non esiste una disposizione perfetta da individuare, ma può ridurre drasticamente il costo del calcolo delle disposizioni per scegliere la migliore in casi di elevata simmetria. -
L'argomento
call_limitdiVF2LayouteVF2PostLayoutpuò ora essere una tupla a due elementi, in cui il primo elemento viene utilizzato prima che venga trovata la prima corrispondenza, dopodiché il limite passa al secondo. Si tratta di un limitatore di tempo di esecuzione più affidabile rispettomax_trialsall'argomento, ora che i layout vengono valutati al volo con un pruning più aggressivo.
Caratteristiche varie
- È stata aggiunta la possibilità di calcolare il valore atteso di a
SparseObservablea partire da stringhe di bit campionate nella base Z utilizzando lasampled_expectation_value()funzione.
Note sull'aggiornamento
ConsolidateBlocksora legge unaPropertySetchiaveConsolidateBlocks_qubit_mapall'accesso. Questa chiave e il suo valore non sono pubblici e non devono essere letti o modificati da altre pass.
Note sull'aggiornamento dell'API C
qk_target_entry_new_fixed()ha un parametronameaggiuntivo per impostare il nome della voce di destinazione. Le voci ad angolo fisso richiedono quasi sempre di sovrascrivere il nome del gate standard per funzionare correttamente.
Note sull'aggiornamento dei circuiti
-
I nomi dei circuiti prodotti come definizioni dei gate della libreria dei circuiti standard sono ora impostati su
None. In precedenza, questi circuiti avevano lo stesso nome del gate, rendendo molto facile costruire gate opachi con nomi corrispondenti a un gate standard. Ciò viola un presupposto comune in Qiskit, secondo cui i nomi dei gate standard dovrebbero essere univoci. -
La rappresentazione interna di
ControlFlowOps è cambiata quando sono stati aggiunti a aQuantumCircuitoDAGCircuit. L'oggetto memorizzato nel circuito e restituito in occasione di un accesso successivo non sarà necessariamente la stessa istanza aggiunta al circuito. Gli utenti non devono tentare di modificare in loco alcun oggetto una volta che questi sono stati aggiunti a un circuito. Ciò rischia di danneggiare il circuito, che si tratti del flusso di controllo o di un altro oggetto.Come per tutte le mutazioni in loco apportate agli oggetti Python memorizzati all'interno di un
QuantumCircuito di unDAGCircuit, è necessario riassegnare l'istruzione al circuito affinché Rust Space rilevi le modifiche. Ad esempio, quando si aggiungono annotazioni a unBoxOpche si trova già in un circuito, un passaggio del transpiler dovrebbe assicurarsi di utilizzareDAGCircuit.substitute_node()per aggiornare l'oggetto nello spazio Rust:from qiskit.circuit import QuantumCircuit, Annotation class MyAnnotation(Annotation): namespace = "my" qc = QuantumCircuit(2) with qc.box(): qc.cx(0, 1) dag = qc.to_dag() # Modifications to the box's annotations in-place require # writing back the information to Rust space. box_node = next(dag.topological_op_nodes()) box_node.op.annotations.append(MyAnnotation()) # Write back the operation. dag.substitute_node(box_node, box_node.op) -
Si prevede che le prestazioni del transpiler in presenza di
ControlFlowOpistruzioni, tra cuiBoxOp, risulteranno temporaneamente inferiori in Qiskit 2.3, poiché stiamo passando dalla versione precedente, incentrata su Python, a una rappresentazione del flusso di controllo nativa di Rust. Prevediamo che le prestazioni migliorino ulteriormente in una versione successiva di Qiskit e che ciò ci consenta di risolvere le carenze di lunga data dell'API nei passaggi del transpiler relativi alle operazioni di flusso di controllo. -
I blocchi di
ControlFlowOpistanze non terranno più traccianamedeimetadatacampi. Questi elementi non erano già configurabili tramite l'interfaccia del generatore di flussi di controllo, e la loro esistenza era un dettaglio di implementazione non previsto piuttosto che un'API intenzionale. -
Il metodo
Gate.control()non restituisce più unAnnotatedOperationquando l'argomentoannotatedè impostato suTrueed è disponibile una classe nativa di gate controllato. Questa modifica è in linea con il modo in cui l'argomentoannotatedviene utilizzato nella libreria dei circuiti standard e consente una scomposizione più efficiente delle porte con annotazioni di controllo. I cancelli interessati sono:- Porte a comando singolo
H``CZ,S,Sdg,U3Y,Z,SX,RX,RY,,RZ,Swape; - Porta a doppio
Zcontrollo; - controllati arbitrariamente
Phase,CPhase,MCPhase,U1CU1,,MCU1eMCMTgate.
- Porte a comando singolo
-
Il valore predefinito dell'argomento
annotatedinQuantumCircuit.control()è oraNoneinvece diFalse. Ciò non influisce sui circuiti stessi, ma è coerente con il valore predefinito utilizzato in tutta laannotatedlibreria dei circuiti.
Note sull'aggiornamento QPY
- La versione predefinita di QPY (
QPY_VERSION) utilizzata inqpy.dump()è ora la 17.
Note sull'aggiornamento delle informazioni quantistiche
- Sono state migliorate le prestazioni degli operatori di Pauli identici ricorrendo
Statevector.expectation_value()all'implementazione ottimizzata per il caso generale, anziché a una scorciatoia dedicata che scalava male con il numero di qubit.
Note sull'aggiornamento del transpiler
-
I limiti massimi di chiamate e tentativi per la sequenza a corrispondenza esatta di
VF2PostLayoutinoptimization_level=3sono stati ridotti per evitare tempi di esecuzione eccessivi nel caso di circuiti di prova altamente simmetrici mappati su mappe di accoppiamento di grandi dimensioni. -
Il percorso predefinito per il registro del passaggio del
WrapAnglestranspiler è oraWrapAngles.DEFAULT_REGISTRY. Il percorso precedente, caratterizzatoWRAP_ANGLE_REGISTRYda un'impostazione profondamente annidata, continuerà a funzionare per motivi di compatibilità con le versioni precedenti, ma invitiamo i pacchetti a valle a utilizzare il nuovo percorso. Il percorso precedente era un errore di Qiskit 2.2 e attraversa moduli che non erano mai stati pensati per far parte dell'API pubblica. -
Sebbene l'interfaccia per
VF2LayouteVF2PostLayoutrimanga logicamente invariata,max_trialsl'argomento ora ha un effetto molto minore come limitatore di runtime, tranne quando è impostato sul valore1. Questo perché, grazie al nuovo algoritmo di calcolo e ottimizzazione in tempo reale utilizzato internamente dalla classe, i layout «completi» si verificano molto più raramente, e il conteggio dei «tentativi» aumenta solo quando si incontra un nuovo layout che presenta un tasso di errore inferiore rispetto a quello precedente. Si dovrebbe invece utilizzarecall_limitcome limitatore deterministico del tempo di esecuzione; dovemax_trialsmisura i layout completi rilevati,call_limitmisura le estensioni dei layout parziali.
Note varie sull'aggiornamento
-
La versione minima supportata di Python è ora 3.10, a seguito della fine del ciclo di vita di Python 3.9 nell'ottobre 2025 e degli avvisi di obsolescenza in Qiskit dalla versione 2.1.
-
Il supporto per macOS x86-64 (Intel) è stato declassato dal livello 1 al livello 2. Qiskit continuerà a fornire componenti testati e precompilati per questa piattaforma, ma i test saranno eseguiti solo al momento del rilascio, anziché ad ogni modifica. Ciò potrebbe causare ritardi nel rilascio delle ruote per questa piattaforma.
Questa modifica è stata apportata perché Apple ha iniziato a ritirare la piattaforma e il team Qiskit non dispone più delle risorse di sviluppo o CI necessarie per continuare a fornire il supporto di primo livello. Possiamo supportare solo macOS x86-64 mentre GitHub continua a fornire runner per esso, e prevediamo che questo supporto verrà rimosso nella seconda metà del 2027.
Deprecazioni API C
-
La funzione
qk_transpiler_pass_standalone_vf2_layout()è obsoleta; gli utenti dovrebbero ora utilizzareqk_transpiler_pass_standalone_vf2_layout_average(). Il nuovo nome della funzione descrive meglio l'euristica di punteggio, e l'API consente un accesso incapsulato all'intero nuovo oggetto di configurazione, compresa la forma a due limiti dicall_limit.Questa deprecazione non è del tutto necessaria per gli utenti, ma dato che l'API C è ancora esplicitamente instabile, la stiamo utilizzando come prova per gestire le deprecazioni e gli avvisi specifici del compilatore nell'API C, prima di raggiungere garanzie di stabilità.
Circuiti deprecati
-
A partire dalla versione 1.0 di Qiskit, i metodi
Gate.control()eQuantumCircuit.control()accettano l'argomento,annotatedche puòFalseessere,TrueoNone. Attualmente, un gate controllato viene rappresentato utilizzando una classe dedicata ai gate controllati, qualora esista, indipendentemente dal valore diannotated; ad esempio, una versione a due controlli di unXGateè unCCXGate. Se non esiste una classe specifica per i gate controllati, il gate controllato viene rappresentato come unControlledGatequandoannotated=Falsee come unAnnotatedOperationquandoannotated=True. Il valoreannotated=Nonepredefinito viene trattato esattamente comeFalse.In Qiskit 3.0, non sarà più possibile impostare
annotated=Nonee invece cambieremo l'impostazione predefinita inannotated=True. Questo è consigliabile, poiché differisce la costruzione del circuito controllato dalla costruzione del circuito al transpiler e consente ulteriori ottimizzazioni del gate controllato, che in genere portano a circuiti di qualità superiore (in particolare per i circuiti gerarchici).Tuttavia, sarà ancora possibile impostare esplicitamente
annotated=Falseper mantenere il comportamento precedente.
Deprecazioni del transpiler
- È stato deprecato il formato di serializzazione legacy utilizzato in
SolovayKitaevDecomposition, che si basava sulla conversione in formato pickle delle approssimazioni di base sotto forma di un oggetto Pythondict. Il processo di caricamento rappresenta una potenziale vulnerabilità di sicurezza e dovrebbe essere utilizzato solo con file affidabili. Il nuovo formato di serializzazione elimina questa vulnerabilità. Le funzioni per generare il formato legacy,generate_basic_approximations(), e caricarlo,SolovayKitaevDecomposition.load_basic_approximations()e nell'inizializzatore diSolovayKitaevDecomposition, sono state deprecate. Utilizza inveceSolovayKitaevDecomposition.save_basic_approximations()per generare un formato che possa essere caricato in tutta sicurezza nell'inizializzatore della classe.
Modifiche al sistema di compilazione
- Quando si compila o si impacchetta Qiskit dal codice sorgente, la versione richiesta di setuptools è ora almeno la versione 77.0 (rilasciata nel marzo 2025). Questo serve a supportare le nuove specifiche dei metadati delle licenze di PEP 639. Questa dipendenza è specificata nei requisiti di compilazione, quindi non dovrebbe essere necessaria alcuna azione manuale.
Correzioni di bug
-
Correzione dell'implementazione di
__deepcopy__()inQuantumCircuitche non eseguiva la copia profonda dei parametri del circuito. Di conseguenza, la mutazione di un elementoBoxOpin un circuito copiato non influisce più sul circuito originale. -
DAGCircuit.apply_operation_back(),apply_operation_back()e oracircuit_to_dag()aggiungerà i nuovi spigoli in un ordine deterministico. Il comportamento precedente potrebbe far sì che alcuni passaggi del transpiler (comeSabreSwap) percorrano il DAG in ordini non deterministici. -
DAGCircuit.apply_operation_front()Non è più possibile inserire cicli su se stessi non validi durante la gestione dei nodi che includono condizioni classiche. -
È stato risolto un problema che si verificava
Optimize1qGatesDecompositionquando il percorso veniva inizializzato con unTargetfile contenente porte " 1q " con parametri di angolo fissi. In precedenza, il passaggio avrebbe potuto generare porte al di fuori dell'area di destinazione, poiché non verificava che la porta nell'area di destinazione supportasse valori arbitrari dei parametri. Risolto il problema n. 14743. -
È stato risolto un comportamento errato nel
BasisTranslatorpassaggio in cui un gate multi-qubit all'interno di unControlFlowOpblocco utilizzava gli indici dei qubit locali invece degli indici assoluti del circuito di origine. -
È stato risolto il problema del riutilizzo della stessa
ConsolidateBlocksistanza su più circuiti, comprese le chiamate con più di untranspile()circuito e senza parallelizzazione basata sui processi. Un bug introdotto in Qiskit 2.2.2 causava un errore di panico o un output non valido se la stessa istanza veniva riutilizzata su circuiti diversi. -
Il passaggio del
ConsolidateBlockstranspiler ora valuterà correttamente se una determinata porta è supportata dall'hardware durante la ricorsione nelle operazioni di flusso di controllo. -
qpy.dump()ora è in grado di scrivere su.gzfile aperti tramite il modulo dellagziplibreria standard con le versioni 16 o successive di QPY. Per ulteriori dettagli, consultare il n. 15157. -
Sono stati corretti i metodi
MCPhaseGate.inverse()eMCU1Gate.inverse()per preservare gli stati di controllo dei gate a controllo aperto durante il calcolo dei loro inversi. -
ConsolidateBlocksora genererà un'eccezione di tipo " Python -space" invece di andare in panico quando rileva un'analisi non valida o non aggiornata nelle chiavi legacyrun_list``block_listPropertySeto. -
Optimize1qGatesDecompositionora genererà unTranspilerErroranziché un panic di spazio Rust quando si tenta di eseguire il codice su un circuito troppo grande per ilTarget. -
È stato risolto un problema relativo
pickleal supporto per il metodoSabreSwapin cuiSabreSwapun'istanza generava un errore durante la serializzazione dopo l'esecuzioneSabreSwap.run()del metodo. Risolto il problema n. 15071. -
I passaggi di pianificazione
ALAPScheduleAnalysise oraASAPScheduleAnalysisgestiranno correttamente i circuiti privi di operazioni. In precedenza, veniva visualizzato un messaggioTranspilerErrorerrato che recitava: «Nessuna durata specificata». Risolto il problema n. 15145. -
È stato risolto un problema per cui
is_unitary()non venivano rispettati correttamente i valori di tolleranza di ingresso durante la verifica dell'unitarità di un operatore. Il metodo ora utilizza correttamente i parametrirtoleatolforniti durante la semplificazione dell'operatore e la verifica della sua identità. Questo risolve il problema n. 14107. -
È stato risolto un errore nel passaggio
UnitarySynthesisdel transpiler, quando viene chiamato con un plugin di sintesi non predefinito (specificato tramitemethod) che supportabasis_gatesma nontarget. Il pass ora trasmette correttamente i segnali di base daltargetal plugin. -
È stato risolto un errore nel pannello di testo del circuito, che poteva verificarsi quando i blocchi del circuito all'interno delle operazioni di flusso di controllo erano definiti su registri diversi rispetto al circuito esterno. Questa situazione potrebbe verificarsi, ad esempio, quando si aggiungono
ControlFlowOpoperazioni direttamente o nei circuiti dopo la transpilazione. -
È stato risolto il problema relativo alla serializzazione
PauliEvolutionGatecon operatori di tipoSparseObservable, quando si utilizza la versione 17 di QPY. -
È stata risolta una discrepanza in
QkTargetOpcui la lunghezza dell'array memorizzato in nonQkTargetOp.paramscorrispondeva al numero restituito daQkTargetOp.num_params. I parametri jolly sono ora rappresentati daNAN, e la lunghezza dell'array sarà sempreQkTargetOp.num_params. Questo bug era presente solo nella versione 2.3.0rc1. -
È stata risolta una regressione nella rappresentazione dell'espressione classica di tipo
UintValuecon larghezza superiore a 64 bit. In precedenza, il valore delle espressioni contenenti questi tipi veniva involontariamente convertito internamente in un valore in virgola mobile di tipo double, con conseguente perdita di precisione. -
Il
HighLevelSynthesispassaggio ora selezionerà correttamente la metrica di ottimizzazione in base al set di basi: il numero di porte a due qubit per le basi continue e il numero di T per le basi Clifford+T. In precedenza, queste informazioni non venivano trasmesse correttamente, con il risultato che i conteggi dei T erano inferiori alle aspettative. -
Corretto il disegno del testo del circuito in modo che le istruzioni del circuito con cavi classici siano disegnate in livelli separati.
-
La moltiplicazione matriciale (
@) traOperatoreStatevectorapplicherà ora l'operatore allo stato e restituirà il risultatoStatevector. -
È stato risolto un bug nel passaggio
ElidePermutationsdel transpiler che causava un arresto anomalo durante la gestione delle permutazioni di un singolo qubit. -
È stato risolto un potenziale problema di deadlock che si verificava durante l'esecuzione di passaggi di layout, ad esempio
SabreLayoutcon una connettività disgiunta nelTargete in un contesto di elaborazione multiprocesso, derivante dall'esecuzionePassManager.run()di otranspile()con più di un circuito. Su Linux questo è il comportamento predefinito quando si eseguePassManager.run()otranspile()con più di un circuito; su tutte le altre piattaforme, è necessario abilitare espressamente l'uso di un contesto di multiprocessing.Ciò era dovuto a un problema sottostante in CPython tracciato in python/cpython#84559 quando si combinavano multiprocessing e multithreading. In genere Qiskit impedisce la combinazione dei due metodi di parallelismo, ma nel caso della gestione di grafici di connettività disgiunti questa protezione era assente nel codice Rust multithread.
-
Il metodo ora
Statevector.to_dict()terrà conto dell'argomentodecimalschiave, che in precedenza ignorava. -
È stato risolto un problema con la funzione
timeline_drawer()di visualizzazione che causava un errore durante la visualizzazione di un circuito pianificato proveniente da un target contenente porte parametrizzate con una durata impostata. -
Generazione fissa delle etichette per gli
SparseObservableoperatoriPauliEvolutionGate«with». Le etichette ora mostrano gli operatori di Pauli con indici di qubit (ad es."X0 X2") anziché nel formato a stringa concatenata (ad es."XX"), migliorando la chiarezza nella distinzione tra i diversi operatori. -
Pauli.evolve()ora gestisce correttamente i circuiti quantistici contenenti determinati gate di rotazione parametrizzati, quando l'angolo è un multiplo di , ad esempioRZGate(math.pi/2)oppureRZZGate(math.pi/2). In precedenza non venivano riconosciuti come cancelli Clifford e veniva segnalato un errore. -
BasePassManagernon sostituisce più i risultati falsi ma validi ottenuti dai passaggi con il programma di input originale. Un valore "pass returning0"Falseo un altro valore falso verrà ora mantenuto, e solo "failureNone" indicherà un errore. -
QuantumCircuit.compose()ora rimapperà correttamente tutte le variabili e gli intervalli utilizzati nelleDelayistruzioni quando viene specificatovar_remapl'argomento.