Note di rilascio di Qiskit SDK 1.2
1.2.4
Preludio
Qiskit 1.2.4 è una patch che risolve un problema QPY introdotto nella versione di correzione dei bug 1.2.3. In 1.2.3, si verificava un errore quando si caricava un file QPY generato con una versione di symengine diversa da quella installata al momento del caricamento.
Correzioni di bug
- Corretto un problema introdotto nella release di bugfix 1.2.3, ora cancellata, che causava un'eccezione con il messaggio di errore "Qiskit non supporta il caricamento di un payload symengine generato con symengine >= 1.0 " quando si caricava un file QPY generato con una versione di symengine diversa da quella installata al momento del caricamento. Questo problema potrebbe verificarsi solo in 1.2.3.
1.2.3
Preludio
Qiskit 1.2.3 è un rilascio di patch che risolve un problema di QPY che poteva causare il mancato caricamento di file generati da un ambiente Python in un ambiente Python diverso, nonostante il formato fosse presumibilmente trasferibile. Questo è legato a differenze nella versione della libreria symengine, da cui QPY avrebbe dovuto proteggersi.
Problemi noti
-
Le versioni di Qiskit precedenti a 1.2.4 non saranno in grado di caricare i file QPY scaricati con il comando
qpy.dump()anche conversionimpostato in modo appropriato, se:- ci sono oggetti non vincolati
ParameterExpressionnel file QPY, - il flag
use_symengine=Trueè stato impostato (come predefinito in Qiskit >= 1.0.0 ) inqpy.dump()e - la versione di
symengineinstallata negli ambienti di generazione e di caricamento non sono della stessa versione minore.
Questo vale indipendentemente dalla versione di Qiskit utilizzata nella generazione (almeno fino a Qiskit 1.2.4 incluso).
Se si vuole massimizzare la compatibilità con le versioni di Qiskit < 1.2.3, you should set
use_symengine=False. Versions of Qiskit > = 1.2.3 non dovrebbe essere necessario. - ci sono oggetti non vincolati
-
I file QPY della serie Qiskit 0.45 possono, in una serie di circostanze molto specifiche e improbabili, non caricarsi con qualsiasi versione più recente di Qiskit, incluso Qiskit 1.2.4. I criteri sono:
- il
QuantumCircuitoScheduleBlockda scaricare conteneva oggettiParameterExpressionoggetti, - la versione installata di
symengineera della serie 0.9 (che era la versione più recente durante la finestra di supporto di Qiskit 0.45 ), e - è stato impostato il flag
use_symengine=True(che non era quello predefinito).
Le versioni successive di Qiskit utilizzate durante la generazione non sono interessate, perché richiedevano versioni più recenti di
symengine0.9.In questo caso, è possibile recuperare il file QPY ricaricandolo con un ambiente in cui siano installati Qiskit 0.45.3 e
symengine0.9.2. Quindi, utilizzareqpy.dump()conuse_symengine=Falseper riesportare il file. Questo sarà quindi leggibile da qualsiasi versione più recente di Qiskit. - il
Note sull'aggiornamento
- Le versioni supportate di symengine sono state preventivamente limitate a < 0.14.0 (che dovrebbe essere la prossima versione minore, a partire da questa release di Qiskit). Questo è stato fatto per proteggere da una potenziale incompatibilità di
qpyquando si serializzano gli oggettiParameterExpressionoggetti. La serializzazione utilizzata nelle versioni 10, 11 e 12 del formato QPY per gli oggetti è legata alla versione di symengine utilizzata per generarlaParameterExpressionè legata alla versione di symengine usata per generarla e c'è la possibilità che una futura versione di symengine non sia compatibile. Questo limite superiore di versione serve per evitare che una futura versione di symengine provochi incompatibilità quando si cerca di caricare i file QPY usandoqpy.load().
Correzioni di bug
-
Corretto un problema con
qpy.load()quando si caricava un file QPY contenente un elementoParameterExpressionse le versioni disymengineinstallate negli ambienti di generazione e di caricamento non erano le stesse. Ad esempio, se un file QPY contenente oggettiParameterExpressionè stato generato utilizzando Qiskit 1.2.2 consymengine==0.11.0installato, Qiskit 1.2.2 consymengine==0.13.0installato non sarebbe in grado di caricarlo.In precedenza,
symenginesollevava un errore su questa mancata corrispondenza di versione. Questo problema è stato risolto persymengine0.11 e 0.13 (non esisteva 0.12 ). Tuttavia, se si sta cercando di utilizzare versioni diverse disymenginee c'è una mancata corrispondenza, questa versione di Qiskit potrebbe non funzionare.
1.2.2
Preludio
Qiskit 1.2.2 è una versione con correzione di bug minori per la serie 1.2.
Correzioni di bug
-
Corretto un bug nel passaggio del transpiler
ElidePermutationsin cui la mappatura dei qubit non veniva aggiornata correttamente in presenza diPermutationGates. -
Ha risolto una potenziale fonte di non-determinismo in
DenseLayout(e per estensioneSabreLayout) quando si punta a un oggettoCouplingMapoTargetche ha più di un sottografo con lo stesso grado di connettività. In questo caso, l'esatto layout di output del passaggio potrebbe fluttuare in base al numero di CPU locali e alla velocità di esecuzione dei thread. -
Il passo del transpiler
HighLevelSynthesisnon solleva più un'eccezione quando incontra un gate personalizzato che si chiama "qft" ma non è un'istanza diQFTGate. Invece, i plugin di sintesi per le porte QFT ignorano tale porta e viene utilizzata la definizione della porta (se fornita). -
È stato risolto un bug nei cassetti dei circuiti, che potevano fallire o omettere i fili se
idle_wires=False. Corretti i punti #13128 e #13146. -
È stato risolto un problema quando si chiamava
transpile()o il metodoStagedPassManager.run()di un gestore di passaggi generato dagenerate_preset_pass_manager()utilizzandooptimization_level2 o 3 quando l'argomentorouting_methodè impostato su"none"per disabilitare esplicitamente il routing. In precedenza, in queste condizioni il transpiler eseguiva il passaggioElidePermutationscome parte dello stadio di init, poiché in condizioni normali questa è un'utile ottimizzazione per rimuovereSwapGateePermutationGateistanze dal circuito. Ma inrouting_method="none"questa ottimizzazione non era prevista, poiché permuta il circuito in modo simile al routing, che non dovrebbe essere eseguito inrouting_method="none". Il problema è stato risolto eliminando l'esecuzione diElidePermutationsse è impostatorouting_method="none". Corretto #13144. -
L'esportatore OpenQASM 3 ha ripristinato il comportamento di accettare file di inclusione di librerie non standard nell'argomento
includesaqasm3.dump(),dumps(), eExporter. Queste inseriranno una dichiarazioneincludeappropriata nell'output, come prima, e l'esportatore rimarrà all'oscuro dei cancelli previsti in quel file di inclusione; dovrete passare i cancelli che vi aspettate che definisca nell'argomentobasis_gatesalle stesse funzioni.Ci aspettiamo di migliorare il meccanismo di esportazione contro i file di inclusione non standard in una prossima versione di Qiskit.
1.2.1
Preludio
Qiskit 1.2.1 è una versione con correzione di bug minori per la serie 1.2.
Correzioni di bug
-
È stato risolto un problema con le visualizzazioni di alcuni backend/mappe di accoppiamento che venivano visualizzati come piegati da soli. L'impostazione predefinita <https://graphviz.org/docs/layouts/neato/> funziona bene nella maggior parte dei casi. Tuttavia, la sovrapposizione di
prismrestituisce un layout più regolare per altri scenari. -
I gate standard controllati parametrici (come ad esempio
CRXGate) saranno ora estratti correttamente in un gate standard dello spazio di Rust quando si usaQuantumCircuit.append()e l'oggetto gate. In precedenza c'era una discrepanza per cui l'uso del metodoQuantumCircuit.crx()avrebbe causato un'estrazione corretta nello spazio Rust, ma la formaappend()non l'avrebbe fatto. In linea di massima, il bug non dovrebbe aver causato alcuna disfunzione da parte di Python. -
Corretto un bug in
TwoQubitBasisDecomposerper cui il codice basato su Rust andava in panico se il gate KAK dato non era una versione predefinita dei gate standard (per esempio, usandoCXGate(ctrl_state=0)). Corretto #12998. -
Corretto un bug per cui
InstructionDurations.from_backend()non funzionava per i backendBackendV2backend. Corretto #12760. -
Corretta la definizione della matrice
CUGatenello spazio di Rust. Sebbene questo non fosse evidente quando si gestiva l'elementoCUGatesolo dal lato Python, questo aveva effetti a catena quando i passaggi del transpiler utilizzavano la rappresentazione di Rust, come poteva accadere inConsolidate2qBlocks. Corretto #13118. -
Corretto un bug in
HoareOptimizerin cui un cancello controllato veniva semplificato rimuovendo i suoi controlli, ma il nuovo cancello non veniva gestito correttamente. Corretto #13079. -
generate_preset_pass_manager()solleva correttamente un'eccezione seseed_transpilerè impostato su un valore non valido (cioè non è un intero non negativo). Corretto #12938. -
Corretto un caso limite in
SabreLayoutin cui, in rari casi su dispositivi di grandi dimensioni e circuiti impegnativi, l'instradamento falliva. Ciò è dovuto al fatto che la valvola di rilascio rende instradabile più di un gate a due qubit, laddove ci si aspettava che ne fosse uno solo. Corretto #13081. -
Corretto un bug in
Split2QUnitariesche non riusciva ad essere eseguito su circuiti con oggetti personalizzatiGateche non implementavano__array__. Vedere #12970. -
Corretto un bug in
StatePreparationin cui l'argomentonormalizeveniva ignorato per gli array di input. Corretto #12984. -
Corretto un bug per cui vari metodi di sintesi creavano circuiti senza registri quantistici o classici. Questo ha avuto ripercussioni anche sulle funzioni che utilizzano internamente i metodi di sintesi, come ad esempio
Clifford.to_circuit(). Anche se i circuiti erano validi, questo poteva causare problemi quando si confrontavano i circuiti con i registri. Corretto #13041. -
Corretto un bug che causava il fallimento del metodo
Initialize.gates_to_uncompute()fallisse. Corretto #12969. -
Corretto un caso limite durante la trasposizione di un circuito con
optimization_level2 o 3 con un set di porte di base a 1 qubit incompleto su un circuito contenente porte a 2 qubit, che può essere implementato come prodotto di porte a singolo qubit. Questo bug viene risolto limitandoSplit2QUnitariesper considerare solo gli oggettiUnitaryGateoggetti. Corretto #12970.
1.2.0
Preludio
La release di Qiskit 1.2.0 si concentra principalmente sul miglioramento delle prestazioni e della qualità del compilatore. Inoltre, è l'ultima versione che supporta Python 3.8. In Qiskit 1.3.0 la versione minima richiesta di Python sarà 3.9. Tra una vasta gamma di nuove funzionalità, miglioramenti e correzioni, i punti salienti della release sono:
- L'infrastruttura del circuito, compresi i cancelli e le operazioni, viene trasferita a Rust. Ciò consente una serie di accelerazioni nella costruzione e nella manipolazione dei circuiti.
- Sfruttando il punto precedente, alcune parti della libreria di sintesi costruiscono ora circuiti in Rust. Ciò produce una notevole accelerazione nella sintesi di operazioni come Clifford, permutazioni o funzioni lineari. Ad esempio, la decomposizione di Clifford da oltre 50 qubit beneficia di una velocità di esecuzione di circa 1000 volte superiore.
- La qualità dei circuiti compilati viene migliorata ottimizzando con un'ottimizzazione unitaria peephole nella fase iniziale del flusso di lavoro di transpilazione (al livello di ottimizzazione
>1) e utilizzando un layout denso come prova di impaginazione Sabre (al livello di ottimizzazione>0).
Nuove funzioni
-
Aggiunta una nuova classe
QFTGateper rappresentare in modo nativo le trasformate di Fourier quantistiche (QFT). Il vecchio modo di rappresentare le QFT attraverso i circuiti quantistici, vediQFTrimane per compatibilità con il passato. Il nuovo modo di rappresentare una QFT tramite un gate evita di sintetizzare il suo circuito di definizione quando il gate viene dichiarato, rimandando la sintesi vera e propria al transpiler. Permette inoltre di scegliere facilmente tra diversi algoritmi per la sintesi delle QFT, disponibili come plugin di sintesi ad alto livello. -
Aggiunto un metodo di sintesi
synth_qft_full()per costruire un circuito QFT assumendo un'architettura completamente connessa. -
Aggiunti due plugin di sintesi ad alto livello per sintetizzare un file
QFTGate. La classeQFTSynthesisFullè basata susynth_qft_full()e sintetizza un gate QFT assumendo una connettività da tutto a tutto. La classeQFTSynthesisLineè basata susynth_qft_line()e sintetizza un gate QFT ipotizzando una connettività lineare a prossimità. -
Aggiunti due parametri a
GenericBackendV2per escludere l'errore (noise_info) e le informazioni sul canale degli impulsi (pulse_channels) dalla costruzione del backend. Questi parametri sonoTrueper impostazione predefinita, replicando il comportamento iniziale del costruttore. Un utente sensibile alla memoria può impostare queste opzioni aFalseper ridurre il carico di memoria di 40x quando si esegue il transpiling su larga scalaGenericBackendV2. -
La classe
StabilizerStateha ora un nuovo metodoStabilizerState.probabilities_dict_from_bitstring()che consente all'utente di passare una singola stringa di bit per la quale misurare un risultato. In precedenza veniva utilizzata la funzioneStabilizerState.probabilities_dict()sarebbe stato utilizzato e, nel peggiore dei casi, avrebbe calcolato ( ) un numero di calcoli di probabilità (a seconda dello stato), anche se l'utente voleva un solo risultato. Con questo nuovo metodo, l'utente può calcolare solo il valore della singola stringa di bit del risultato che passa per misurare la probabilità. Con l'aumentare del numero di qubit, il miglioramento delle prestazioni può essere maggiore (a seconda dello stato), poiché viene misurato solo il risultato di una stringa di bit. -
Implementata la classe
UniformSuperpositionGate, che consente di creare uno stato di sovrapposizione uniforme utilizzando l'algoritmo di Shukla-Vedula. Questa caratteristica facilita la creazione di circuiti quantistici che producono uno stato di sovrapposizione uniforme , dove è un intero positivo che rappresenta il numero di stati base computazionali con un'ampiezza di . Questa implementazione supporta la creazione efficiente di stati di sovrapposizione uniforme, richiedendo solo qubit e porte. Esempio di utilizzo:from qiskit import QuantumCircuit from qiskit.circuit.library.data_preparation import UniformSuperpositionGate M = 5 num_qubits = 3 usp_gate = UniformSuperpositionGate(M, num_qubits) qc = QuantumCircuit(num_qubits) qc.append(usp_gate, list(range(num_qubits))) qc.draw()
Caratteristiche dei circuiti
-
Aggiunta una nuova funzione
random_clifford_circuit()aqiskit.circuitche permette di generare un circuito Clifford pseudocasuale con porte della libreria standard. Utilizzo di esempio:from qiskit.circuit.random import random_clifford_circuit circ = random_clifford_circuit(num_qubits=2, num_gates=6) circ.draw(output='mpl')
-
Aggiunto il supporto per
AnnotatedOperation.paramseAnnotatedOperation.validate_parameter()che consentono la gestione dei parametri a livello di circuito (come i parametri di binding) per le operazioni annotate. -
CircuitInstructioneDAGOpNodedispongono di nuovi metodi per interrogare varie proprietà dei loro oggetti interni, senza dover necessariamente accederviOperationsenza dover necessariamente accedervi. Questi metodi sono:CircuitInstruction.is_standard_gate()eDAGOpNode.is_standard_gate(),CircuitInstruction.is_controlled_gate()eDAGOpNode.is_controlled_gate(),CircuitInstruction.is_directive()eDAGOpNode.is_directive(),CircuitInstruction.is_control_flow()eDAGOpNode.is_control_flow(), eCircuitInstruction.is_parameterized()eDAGOpNode.is_parameterized().
Se applicabile, l'utilizzo di uno di questi metodi è significativamente più veloce dell'interrogazione di
CircuitInstruction.operationoDAGOpNode.opdirettamente, soprattutto se l'istruzione o il nodo rappresenta un gate standard di Qiskit. Questo perché le porte standard sono memorizzate in modo nativo in Rust e la loro rappresentazione Python viene creata solo quando viene richiesta. -
È stata aggiunta una rappresentazione nativa rust della libreria standard di gate di Qiskit. Quando un cancello standard viene aggiunto a un elemento
QuantumCircuitoDAGCircuitè ora rappresentato in modo più efficiente direttamente in Rust. Accedendo a questo oggetto gate da un circuito o da un DAG, si otterrà un nuovo oggetto Python che rappresenta il gate standard. Questo porta a una trasposizione e manipolazione più rapida ed efficiente dei circuiti per le funzionalità scritte in Rust. -
La funzione
random_circuit()ha una nuova caratteristica che consente agli utenti di specificare una distribuzionenum_operand_distribution(un dict) che indica il rapporto tra porte a 1, 2, 3 e 4 qubit nel circuito casuale. Ad esempio, se alla funzione viene passatonum_operand_distribution = {1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25}, il circuito generato avrà circa il 25% di porte a 1-qubit, 2-qubit, 3-qubit e 4-qubit. Si noti inoltre che senum_operand_distributionnon è specificato,max_operandssarà impostato su 4 e verrà generato un circuito casuale con una distribuzione casuale dei gate. Senum_operand_distributionemax_operandssono specificati contemporaneamente,num_operand_distributionverrà utilizzato per generare il circuito casuale.Utilizzo di esempio:
from qiskit.circuit.random import random_circuit circ = random_circuit( num_qubits=6, depth=5, num_operand_distribution={1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25} ) circ.draw(output="mpl")
-
Miglioramento delle prestazioni del metodo
DAGCircuit.quantum_causal_cone()evitando di esaminare più volte lo stesso nodo non direttivo quando viene raggiunto da percorsi diversi. -
Aggiunto l'argomento della parola chiave
insert_barriersal metodoQuantumCircuit.repeat()al metodo. ImpostandoTruesi inseriscono delle barriere tra le ripetizioni del circuito. -
Sostituzione dell'algoritmo di sintesi interno di
StatePreparationeInitializedi Shende et al. con l'algoritmo riportato inIsometrydi Iten et al. Il nuovo algoritmo riduce di un fattore 2 il numero di porte CX e la profondità del circuito. -
ParameterExpressionsupporta ora l'operatore unario+.
Caratteristiche primitive
-
Aggiunto un nuovo metodo
BitArray.postselect()che restituisce tutti gli scatti contenenti i valori di bit specificati. Utilizzo di esempio:from qiskit.primitives.containers import BitArray ba = BitArray.from_counts({'110': 2, '100': 4, '000': 3}) print(ba.postselect([0,2], [0,1]).get_counts()) # {'110': 2, '100': 4} -
I metadati delle implementazioni di Primitives V2, vale a dire,
StatevectorSampler,StatevectorEstimator,BackendSamplerV2eBackendEstimatorV2è stato aggiornato per corrispondere a quello dei dispositivi quantistici di IBM.versionecircuit_metadatasono aggiunti per tutte le implementazioni di V2shotsviene aggiunto perBackendSamplerV2eBackendEstimatorV2precisionè rinominato contarget_precisionperStatevectorEstimator
Si noti che i metadati di
StatevectorEstimatornon hannoshotsperché la classe calcola i valori di aspettativa conStatevectore gli scatti non vengono utilizzati.
OpenQASM Caratteristiche
-
La tabella dei simboli interna dell'esportatore di OpenQASM 3 (
qiskit.qasm3) è stata riscritta, il che dovrebbe portare a risultati più puliti quando si utilizzano le porte della libreria standard di Qiskit che non sono presenti negli header della libreria standard di OpenQASM 3 e a risultati più deterministici. Ad esempio, l'uso di più oggettiRZXGateora si ottiene una sola definizione parametrica e quando si verificano collisioni di nomi, la tabella dei simboli assegna un contatore deterministico per rendere i nomi univoci, anziché un intero non deterministico (prima si usava l'identità dell'oggetto). -
La versione venduta della libreria standard OpenQASM 3.0 è stata aggiornata per corrispondere allo stato del commit 4ca1d79383. Questo non dovrebbe avere alcun effetto sull'uso di Qiskit, a meno che non si stia recuperando un file venduto per uso personale.
Caratteristiche della sintesi
-
MCXRecursivecon qubit di controllo e un singolo qubit ausiliario pulito richiede ora al massimo porte CX. -
MCXVChainha due nuovi parametri booleani relative_phase e action_only. Seaction_onlyèTrueil circuito non pulisce i qubit sporchi. Serelative_phaseèTrueil gate viene implementato fino a una fase globale. Entrambi i parametri vengono utilizzati per ottimizzare la decomposizione diMCXVChain. -
MCXVChaincon controlli e qubit ausiliari sporchi ora richiede porte CX. -
Port
synth_permutation_acg(), utilizzata per sintetizzare le permutazioni dei qubit, a Rust. Questo produce un miglioramento delle prestazioni di circa 3x sui circuiti a 1000 qubit. -
Port
synth_permutation_basic(), utilizzata per sintetizzare le permutazioni dei qubit, a Rust. -
Porta
synth_cnot_count_full_pmh(), utilizzato per sintetizzare una funzione lineare in una rete CX, a Rust. Questo produce un aumento di velocità di circa 44x, misurato su circuiti di 100 qubit. -
La funzione
synth_cnot_count_full_pmh()permette ora di scegliere l'ottimo (euristicamente)section_sizeimpostandolo suNone. Quindi, si sceglie un valore che tenta di minimizzare il limite superiore del numero di porte CX, cioè dove è il numero di qubit e . -
La funzione
synth_clifford_bm()è stata portata in Rust. Ricordiamo che questa funzione sintetizza in modo ottimaleCliffordoperatori su 1, 2 o 3 qubit rispetto al numero di CX-gates. Ciò comporta un aumento significativo delle prestazioni. Per i Clifford su 3 qubit, l'aumento di velocità è dell'ordine di 80 volte. -
La funzione
synth_clifford_greedy()che sintetizza gli operatoriCliffordè stata trasferita a Rust, con un significativo aumento delle prestazioni per tutti i numeri di qubit. Per i Clifford superiori a 50 qubit, l'aumento di velocità è dell'ordine di 1000 volte. -
Aggiunto l'argomento della parola chiave
wrapalle classiProductFormulache (se abilitato) avvolge i singoli termini dell'evoluzione di Pauli. Questo può essere utile per la visualizzazione dei circuiti. -
L'argomento
atomic_evolutiondiProductFormula(e le sue sottoclassi) ha una nuova firma di funzione. Invece di prendere un operatore Pauli e un coefficiente temporale e restituire il circuito di evoluzione, la nuova funzione prende un circuito esistente e dovrebbe aggiungere a questo circuito l'evoluzione del Pauli e del tempo forniti. Questa nuova implementazione offre prestazioni nettamente superiori. -
Migliorate le prestazioni di
synth_permutation_depth_lnn_kms()utilizzato per sintetizzare le permutazioni per la connettività lineare, portandolo in Rust.
Funzionalità del transpiler
-
Aggiunta una nuova opzione di percorso di importazione per
generate_preset_pass_manager()in modo che ora possa essere importato come:from qiskit import generate_preset_pass_managerinvece di dover digitare il percorso completo:
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_managerLa funzione è anche importabile dal modulo
qiskit.transpilercome:from qiskit.transpiler import generate_preset_pass_manager -
Aggiunta una nuova opzione al file di configurazione dell'utente
sabre_all_threadse una corrispondente variabile d'ambienteQISKIT_SABRE_ALL_THREADS. Quando questo flag è impostato, i gestori dei passaggi preimpostati eseguono i taskSabreLayouteSabreSwaputilizzando tutte le CPU disponibili sul sistema locale. L'uso di questa opzione è un compromesso tra il determinismo dell'output tra diversi computer e un output potenzialmente migliore con un numero inferiore di computerSwapGates.Questi passaggi del transpiler eseguono più prove casuali in parallelo e scelgono l'output che produce il minor numero di
SwapGates. Come regola generale, se si eseguono più prove, l'algoritmo ha più opportunità di trovare un risultato migliore. Per impostazione predefinita, i gestori dei passaggi preimpostati utilizzano un numero fisso di prove, in questa versione 5 prove per i livelli 0 e 1 e 20 prove per i livelli 2 e 3, ma questi numeri potrebbero cambiare nelle versioni future (ed erano diversi nelle versioni storiche). Utilizzando un numero fisso di prove si ottengono risultati deterministici indipendentemente dal sistema locale, perché anche con un seme fisso, se si dovesse scegliere il numero di CPU locali disponibili, i risultati sarebbero diversi se eseguiti su computer diversi.Se il numero di prove predefinito per un determinato livello di ottimizzazione è superiore al numero di CPU locali, verrà utilizzato il livello di ottimizzazione predefinito più alto.
-
Aggiunto un nuovo passaggio
Split2QUnitariesche itera su tutti i gate o unitari a due equbit in un circuito e li sostituisce con due unitari a un solo equbit, se possibile senza introdurre errori, cioè il gate/unitario a due equbit è in realtà un prodotto tensoriale di unitari a un solo equbit. -
I passaggi
Collect2qBlocks,ConsolidateBlockseSplit2QUnitariessono stati aggiunti allo stadioinitdei gestori di passaggi preimpostati con livello di ottimizzazione 2 e livello di ottimizzazione 3. La modifica dello stadioinitdovrebbe consentire un instradamento più efficiente per i circuiti quantistici:- contengono porte/unità a due qubit che sono in realtà il prodotto di porte a un qubit, oppure
- contengono più porte a due-qubit in un blocco continuo di porte a due-qubit.
Nel primo caso, l'instradamento del gate a due qubit può essere semplicemente saltato, poiché non si verifica alcuna interazione reale tra una coppia di qubit. In quest'ultimo caso, lo spazio di lookahead degli algoritmi di routing non è "inquinato" da porte a due bit superflue, cioè per il routing è sufficiente considerare una sola porta a due bit per ogni blocco continuo di porte a due bit. Questi passaggi non vengono eseguiti se i gestori del passaggio si rivolgono a un sistema
Targetche ha un insieme di porte di base discrete, cioè tutte le porte di base non sono parametrizzate. -
Le prestazioni di
StarPreRouting, utilizzato per trovare un sottocircuito di connettività del grafo a stella, viene migliorato eseguendo il lavoro pesante nello spazio di Rust. -
Il
SabreLayoutil passaggio del transpiler è stato aggiornato in modo da eseguire sempre un'ulteriore prova utilizzando lo stesso algoritmo diDenseLayoutper scegliere il punto di partenza dell'algoritmo di layout di Sabre. Il punto di partenza utilizzato dall'algoritmo di layout può influire notevolmente sulla qualità dei risultati. Per impostazione predefinitaSabreLayoutinizia ancora conlayout_trialsprove casuali, ma in aggiunta ci sarà una singola prova che utilizza il sottografo più denso del grafo di connettività come punto di partenza. In alcuni casi si possono ottenere risultati migliori, soprattutto nei casi di circuiti più piccoli per mappe di accoppiamento più ampie. -
È stato aggiunto un nuovo argomento
dtagenerate_preset_pass_manager()per corrispondere all'insieme di argomenti ditranspile(). Ciò consentirà di convertire internamente i vincoli di transpilazione in unaTargetrappresentazione.
Funzionalità di visualizzazione
-
Il file di configurazione utente ha una nuova opzione
circuit_idle_wires, che assume un valore booleano. Questo consente agli utenti di impostare il comportamento preferito dell'opzioneidle_wiresdei cassetti dei circuitiQuantumCircuit.draw()ecircuit_drawer(). Ad esempio, aggiungendo una sezione a~/.qiskit/settings.confcon:[default] circuit_idle_wires = falsecambierà l'impostazione predefinita per non visualizzare i fili inattivi.
Varie Funzioni
- Aggiunta una nuova variabile d'ambiente in fase di compilazione,
QISKIT_NO_CACHE_GATES, che se impostata su un valore di1(cioèQISKIT_NO_CACHE_GATES=1) diminuisce l'overhead di memoria di aCircuitInstructioneDAGOpNodeal costo di un aumento del tempo di esecuzione sugli accessi multipli aCircuitInstruction.operationeDAGOpNode.op. Se questa variabile d'ambiente è impostata quando si costruisce il pacchetto Qiskit Python dai sorgenti, la cache della restituzione di questi attributi sarà disabilitata.
Note sull'aggiornamento dei circuiti
-
L'argomento
annotateddel metodoGate.control()è oraNoneper impostazione predefinita, il che consente a Qiskit di scegliere se annotare un'operazione controllata. Se l'implementazione concreta (annotated=False) è disponibile, verrà restituita per impostazione predefinita. Altrimenti, verrà restituita l'implementazione annotata (annotated=True). Ciò consente, ad esempio, di rinviare la sintesi di porte controllate e parametrizzate. -
Le
Operationistanze diDAGOpNode.oprestituite non condivideranno più necessariamente un riferimento comune all'oggetto sottostante. Non è mai stato garantito che ciò avvenisse e la mutazione del parametroDAGOpNode.opdirettamente per riferimento non era corretto e rischiava sempre di corrompere il tracciamento dello stato interno del DAG A causa della rifattorizzazione interna delle classiQuantumCircuiteDAGCircuitper memorizzare porte standard in Rust, l'oggetto in uscita daDAGOpNode.opsarà probabilmente una copia invece di un'istanza condivisa. Se è necessario mutare un elemento, bisogna assicurarsi di farlo:op = dag_node.op op.params[0] = 3.14159 dag.substitute_node(dag_node, op)invece di fare qualcosa come:
dag_node.op.params[0] = 3.14159che non funzionerà per nessun gate standard in questa versione. Probabilmente avrebbe funzionato per caso in una versione precedente, ma non è mai stata una garanzia API.
-
Le
Operationistanze diCircuitInstruction.operationrestituite non condivideranno più necessariamente un riferimento comune all'oggetto sottostante. Non è mai stato garantito che ciò avvenisse e la mutazione del parametroCircuitInstruction.operationdirettamente per riferimento non era corretto e rischiava sempre di corrompere il circuito, soprattutto quando erano in uso dei parametri. A causa della rifattorizzazione interna del metodoQuantumCircuitper memorizzare le porte standard in Rust, l'oggetto in uscita daCircuitInstruction.operationsarà probabilmente una copia invece di un'istanza condivisa. Se è necessario mutare un elemento del circuito (cosa fortemente sconsigliata, perché inefficiente e soggetta a errori), è necessario assicurarsi di farlo:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) qc.p(0) op = qc.data[0].operation op.params[0] = 3.14 qc.data[0] = qc.data[0].replace(operation=op)invece di fare qualcosa come:
from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) qc.p(0) qc.data[0].operation.params[0] = 3.14che non funzionerà per nessuna porta standard in questa versione. Probabilmente avrebbe funzionato per caso in una versione precedente, ma non è mai stata una garanzia API.
Note sull'aggiornamento delle primitive
-
BitArray.slice_bits()eBitArray.slice_shots()ora sollevaIndexErrorquando gli indici sono fuori dai limiti. Nel caso, hanno utilizzato il sitoValueError. -
BitArray.__getitem__()ora solleveràIndexErrorquando gli indici sono fuori dai limiti o il numero di dimensioni degli indici non corrisponde a quello diBitArray. Nel caso, hanno utilizzato il sitoValueError.
Note sull'aggiornamento della sintesi
LieTrottereSuzukiTrottere non avvolgere più i termini di Pauli evoluti individualmente in definizioni di cancelli. Se si fa affidamento su un certo livello di decomposizione del circuito, è necessario rimuovere un livello diQuantumCircuit.decompose()o aggiungere l'argomento della parola chiavewrap=Trueall'oggetto di sintesi.
Note sull'aggiornamento del transpiler
-
I livelli di ottimizzazione 2 e 3 impiegano ora anche l'ottimizzazione peephole prima della fase di traduzione/sintesi (in precedenza veniva eseguita solo nella fase di ottimizzazione). Gli effetti dell'ottimizzazione dello spioncino includono la rimozione dei gate molto vicini all'identità, ad esempio i gate a fase controllata con un angolo di rotazione inferiore a .
-
Il passaggio di instradamento predefinito usato dal livello di ottimizzazione 0 per
generate_preset_pass_manager()etranspile()è stato cambiato daStochasticSwapaSabreSwap. Il passaggioSabreSwapesegue esattamente la stessa funzione, ma si comporta meglio sia in termini di tempo di esecuzione che di qualità dell'output (in numero di porte di swap e profondità) rispetto aStochasticSwap. Peroptimization_level=0questo non dovrebbe essere importante, perché non è previsto che venga eseguito il routing per il caso d'uso tipico del livello 0.Se per qualche motivo ci si affidava all'algoritmo di routing predefinito precedente, si può usare l'argomento
routing_methodpertranspile()egenerate_preset_pass_manager()a"stochastic"per utilizzare ilStochasticSwappass. -
La funzione
generate_preset_pass_manager()è stata aggiornata per convertire internamente, quando possibile, i vincoli del transpiler in unaTargetistanza. Se viene fornito un input di backend di tipoBackendV1viene fornito, sarà convertito inBackendV2per esporre il suoTarget. Questa modifica non richiede alcun intervento da parte dell'utente.
Varie Note sull'aggiornamento
- La versione minima di rustworkx richiesta per eseguire questa release è stata aumentata da 0.14.0 a 0.15.0. Questo è necessario perché Qiskit utilizza ora le nuove funzionalità aggiunte nella release rustworkx 0.15.0 che migliorano le prestazioni.
Circuiti deprecati
-
I seguenti metodi di circuito non erano destinati all'uso pubblico, ma sono stati accidentalmente lasciati documentati nell'API pubblica durante il rilascio di 1.0. Sono ora deprecati da Qiskit 1.2 e saranno rimossi in Qiskit 2.0:
-
Trattare
CircuitInstructioncome un iterabile simile a una tupla è deprecato e questa modalità di percorso sarà rimossa in Qiskit 2.0. Si devono utilizzare i campi di accesso agli attributiCircuitInstruction.operation,CircuitInstruction.qubits, eCircuitInstruction.clbitsal loro posto. Ad esempio:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0, 1) qc.measure([0, 1], [0, 1]) # Deprecated. for op, qubits, clbits in qc.data: pass # New style. for instruction in qc.data: op = instruction.operation qubits = instruction.qubits clbits = instruction.clbits
Deprecazioni delle primitive
-
Le implementazioni primitive di V1 e gli alias di tipo non versionato di V1-exclusive sono ora deprecati a favore delle loro controparti di V2. La deprecazione è estesa alle seguenti classi che implementano le interfacce di V1 :
Estimator, a favore dell'equivalente V2,StatevectorEstimatorSampler, a favore dell'equivalente V2,StatevectorSamplerBackendEstimator, a favore dell'equivalente V2,BackendEstimatorV2BackendSampler, a favore dell'equivalente V2,BackendSamplerV2
Oltre ai seguenti alias di tipo non aggiornato:
BaseEstimator, alias perBaseEstimatorV1BaseSampler, alias perBaseSamplerV1
Questa deprecazione non riguarda le versioni esplicite di
BaseEstimatorV1eBaseSamplerV1o le relative classi di risultati e lavori.
Deprecazioni dei provider
-
La classe
BackendV1è deprecata e sarà rimossa non prima della prossima major release, 2.0.0. Consultare la guida alla migrazione per i dettagli sull'aggiornamento aBackendV2. -
La struttura Qobj e le classi correlate (vedere
qiskit.qobj) sono ora deprecate. Sono stati introdotti come parte delBackendV1e non sono più necessari per interagire con ilBackendV2backend.QuantumCircuitla serializzazione deve essere effettuata tramite QPY (vediqiskit.qpy) o OpenQASM (vediqiskit.qasm2eqiskit.qasm3).
Deprecazioni del transpiler
- La funzione
assemble()è ora deprecata e sarà rimossa nella versione 2.0. La funzione è stata utilizzata principalmente per creare unQobj, che non è più necessario nei flussi di lavoro basati suBackendV2-flussi di lavoro basati su È stato utilizzato anche per il binding dei parametri, una funzionalità completamente coperta daQuantumCircuit.assign_parameters().
Deprecazioni relative alla visualizzazione
-
L'argomento
justifydicircuit_drawer()oQuantumCircuit.draw()non supporterà più i valori non validi (in precedenza li cambiava con quelli predefiniti) e in una futura versione darà errore. I valori di giustificazione validi sono"left","right"o"none". -
La funzione
visualize_transition()è stata deprecata e sarà rimossa nella versione 2.0.0. Questa funzione aveva una serie di limitazioni che ne limitavano l'utilità a casi d'uso molto specifici e non si integrava con il resto del modulo di visualizzazione di Qiskit.
Correzioni di bug
-
Corretta una serie di problemi durante il controllo di porte standard parametrizzate. La versione controllata di alcuni cancelli (ad es.
RXXGateoRYGateper più di un controllo) non possono essere sintetizzati se contengono parametri non vincolati. In precedenza, la chiamata a.control()in questo caso falliva, ma ora creiamo un oggettoAnnotatedOperationcome segnaposto. Ciò consente di inserire il gate controllato in un circuito, di vincolare i parametri in una fase successiva e di sintetizzare il funzionamento. Correzioni #10311, #10697 e #12135. -
Il
SGateeSdgGateora restituiscono correttamente aCSGate, risp.CSdgGate, se sono controllati da un singolo qubit di controllo. -
Fissare il calcolo della deviazione standard in
BackendEstimatorV2tenendo conto della co-varianza delle paulie non commutative. Fissato Qiskit/qiskit-ibm-runtime#1751. -
Corretto un problema in cui
circuit_drawer()o il metodoQuantumCircuit.draw()non emetteva un avviso quando veniva passato un valore non valido all'argomentojustify, prima di cambiarlo con quello predefinito. Ora, se viene passato un valore non valido, viene emesso un avviso. I valori di giustificazione validi sono"left","right"o"none". Per maggiori dettagli, consultare il documento #12089. -
Fisso
SparsePauliOp.apply_layout()ePauli.apply_layout()per sollevareQiskitErrorse vengono forniti indici duplicati o negativi come parte di un layout. -
È stato risolto un bug nel passaggio
ConsolidateBlocksquando il circuito di ingresso contiene un gate opaco personalizzato e non sono impostate le opzionibasis_gatesotarget, il passaggio sollevava un problema e fallivaQiskitErrore falliva. Questo è stato corretto in modo che in queste situazioni il passaggio del transpiler non consolidi il blocco identificato contenente un gate personalizzato invece di fallire. -
Corretto un bug in
PadDynamicalDecouplingche in precedenza non visualizzava correttamente il messaggio di errore che indicava che un ritardo non è allineato agli impulsi, se il nodo precedente o successivo era un nodo di ingresso/uscita. Ora il messaggio di errore viene visualizzato correttamente. -
L'argomento della parola chiave
orderdella funzioneBitArray.from_bool_array()deve essere"little"o"big". Aggiunti controlli per generare un errore se viene inserito un valore non valido. -
Migliorare la decomposizione della porta generata da
QuantumCircuit.mcx()senza utilizzare qubit ancilla, in modo che il numero diCXGates cresca quadraticamente con il numero di qubit, come previsto, e non esponenzialmente. -
Fissato
SparsePauliOp.apply_layout()per funzionare correttamente con gli operatori zero-qubit. Ad esempio, se in precedenza si è creato un qubit 0 e si è applicato un layout come:op = SparsePauliOp("") op.apply_layout(None, 3)questo avrebbe precedentemente generato un errore. Ora questo restituirà correttamente un operatore della forma:
SparsePauliOp(['III'], coeffs=[1.+0.j]) -
Corretto un bug di
StatevectorSamplerche ignorava le porte conc_if. Verrà generato un errore perchéStatevectornon può gestirec_if. -
È stata corretta una svista nel
Commuting2qGateRouterin cui le permutazioni del registro quantistico non venivano aggiunte all'insieme di proprietà del passaggio, per cui dovevano essere rintracciate manualmente dall'utente. Ora è possibile accedere alla permutazione attraverso la proprietàlayoutdel circuito di uscita e inserire il passaggio in qualsiasi pipeline di transpilazione senza perdita di informazioni. -
Corretta un'imprecisione in virgola mobile durante la scalatura di alcune unità di impulso tra secondi e nanosecondi. Se l'impulso fosse stato definito simbolicamente, la scalatura avrebbe potuto introdurre un inutile errore in virgola mobile per alcuni costrutti di
symengine, che si sarebbe potuto manifestare con risultati inaspettati una volta che i simboli fossero stati completamente vincolati. Corretto #12392. -
Corretto un bug in
synth_cnot_count_full_pmh()in cui fornire unsection_sizeche non divideva il numero di qubit senza resto poteva portare a risultati errati. Ora qualsiasisection_size(al massimo pari al numero di qubit) sintetizza il circuito corretto. Per un valore (euristicamente) ottimale, impostaresection_size=None. -
PassManager.run()non perderà più tempo a serializzare se gli vengono dati più ingressi, se deve lavorare solo in serie. -
È stato risolto un bug in
plot_coupling_map()che causava una colorazione errata dei bordi della mappa di accoppiamento. Corretto #12354. -
Il parser OpenQASM 2.0 (
qasm2.load()eqasm2.loads()) è ora in grado di valutare espressioni gate-angle che includono operandi interi che farebbero traboccare l'intero della dimensione di sistema. Questi saranno valutati in un contesto di virgola mobile a doppia precisione, proprio come il resto dell'espressione. Attenzione: un intero arbitrariamente grande non è necessariamente rappresentabile in virgola mobile a doppia precisione, quindi è possibile che il circuito, comunque sia stato generato, abbia già perso tutta la precisione numerica modulo . -
L'esportatore di OpenQASM 3 (vedere
qiskit.qasm3) ora darà correttamente errore quando gli viene chiesto di usare una parola chiave o un altro identificatore non valido come "cancello di base", poiché non ha modo di generare un output corretto in questi casi. -
L'esportatore di OpenQASM 3 (
qiskit.qasm3) ora esporta correttamente istanze multiple diPauliEvolutionGateda un circuito. In precedenza, veniva esportata solo una singola istanza e tutte le altre istanze utilizzavano silenziosamente la stessa versione (errata). -
L'esportatore di OpenQASM 3 (
qiskit.qasm3) ora esegue correttamente l'escape dei nomi dei gate. In precedenza, un gate il cui nome era un identificatore OpenQASM 3 non valido causava la generazione di OpenQASM 3 non validi. -
Una serie di incongruenze nella gestione degli input tra
transpile()egenerate_preset_pass_manager()sono state corrette. Queste incongruenze porterebbero a risultati di transpilazione diversi per gli stessi input, oppuregenerate_preset_pass_manager()non riescono per alcune combinazioni di ingressi accettate datranspile().