Skip to main content
IBM Quantum Platform

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 con version impostato in modo appropriato, se:

    • ci sono oggetti non vincolati ParameterExpression nel file QPY,
    • il flag use_symengine=True è stato impostato (come predefinito in Qiskit >= 1.0.0 ) in qpy.dump()e
    • la versione di symengine installata 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.

  • 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 QuantumCircuit o ScheduleBlock da scaricare conteneva oggetti ParameterExpression oggetti,
    • la versione installata di symengine era 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 symengine 0.9.

    In questo caso, è possibile recuperare il file QPY ricaricandolo con un ambiente in cui siano installati Qiskit 0.45.3 e symengine 0.9.2. Quindi, utilizzare qpy.dump() con use_symengine=False per riesportare il file. Questo sarà quindi leggibile da qualsiasi versione più recente di Qiskit.

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 qpy quando si serializzano gli oggetti ParameterExpression oggetti. La serializzazione utilizzata nelle versioni 10, 11 e 12 del formato QPY per gli oggetti è legata alla versione di symengine utilizzata per generarla ParameterExpression è 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 usando qpy.load().

Correzioni di bug

  • Corretto un problema con qpy.load() quando si caricava un file QPY contenente un elemento ParameterExpressionse le versioni di symengine installate negli ambienti di generazione e di caricamento non erano le stesse. Ad esempio, se un file QPY contenente oggetti ParameterExpression è stato generato utilizzando Qiskit 1.2.2 con symengine==0.11.0 installato, Qiskit 1.2.2 con symengine==0.13.0 installato non sarebbe in grado di caricarlo.

    In precedenza, symengine sollevava un errore su questa mancata corrispondenza di versione. Questo problema è stato risolto per symengine 0.11 e 0.13 (non esisteva 0.12 ). Tuttavia, se si sta cercando di utilizzare versioni diverse di symengine e 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 ElidePermutations in cui la mappatura dei qubit non veniva aggiornata correttamente in presenza di PermutationGates.

  • Ha risolto una potenziale fonte di non-determinismo in DenseLayout (e per estensione SabreLayout) quando si punta a un oggetto CouplingMap o Target che 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 HighLevelSynthesis non solleva più un'eccezione quando incontra un gate personalizzato che si chiama "qft" ma non è un'istanza di QFTGate. 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 metodo StagedPassManager.run() di un gestore di passaggi generato da generate_preset_pass_manager()utilizzando optimization_level 2 o 3 quando l'argomento routing_method è impostato su "none" per disabilitare esplicitamente il routing. In precedenza, in queste condizioni il transpiler eseguiva il passaggio ElidePermutations come parte dello stadio di init, poiché in condizioni normali questa è un'utile ottimizzazione per rimuovere SwapGate e PermutationGate istanze dal circuito. Ma in routing_method="none" questa ottimizzazione non era prevista, poiché permuta il circuito in modo simile al routing, che non dovrebbe essere eseguito in routing_method="none". Il problema è stato risolto eliminando l'esecuzione di ElidePermutations se è impostato routing_method="none" . Corretto #13144.

  • L'esportatore OpenQASM 3 ha ripristinato il comportamento di accettare file di inclusione di librerie non standard nell'argomento includes a qasm3.dump(), dumps(), e Exporter. Queste inseriranno una dichiarazione include appropriata 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'argomento basis_gates alle 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 prism restituisce 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 usa QuantumCircuit.append() e l'oggetto gate. In precedenza c'era una discrepanza per cui l'uso del metodo QuantumCircuit.crx() avrebbe causato un'estrazione corretta nello spazio Rust, ma la forma append() non l'avrebbe fatto. In linea di massima, il bug non dovrebbe aver causato alcuna disfunzione da parte di Python.

  • Corretto un bug in TwoQubitBasisDecomposer per cui il codice basato su Rust andava in panico se il gate KAK dato non era una versione predefinita dei gate standard (per esempio, usando CXGate(ctrl_state=0)). Corretto #12998.

  • Corretto un bug per cui InstructionDurations.from_backend() non funzionava per i backend BackendV2 backend. Corretto #12760.

  • Corretta la definizione della matrice CUGate nello spazio di Rust. Sebbene questo non fosse evidente quando si gestiva l'elemento CUGate solo dal lato Python, questo aveva effetti a catena quando i passaggi del transpiler utilizzavano la rappresentazione di Rust, come poteva accadere in Consolidate2qBlocks. Corretto #13118.

  • Corretto un bug in HoareOptimizer in 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 se seed_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 Split2QUnitaries che non riusciva ad essere eseguito su circuiti con oggetti personalizzati Gate che non implementavano __array__. Vedere #12970.

  • Corretto un bug in StatePreparation in cui l'argomento normalize veniva 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_level 2 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 limitando Split2QUnitaries per considerare solo gli oggetti UnitaryGate oggetti. 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 QFTGate per rappresentare in modo nativo le trasformate di Fourier quantistiche (QFT). Il vecchio modo di rappresentare le QFT attraverso i circuiti quantistici, vedi QFTrimane 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 classe QFTSynthesisFull è basata su synth_qft_full() e sintetizza un gate QFT assumendo una connettività da tutto a tutto. La classe QFTSynthesisLine è basata su synth_qft_line() e sintetizza un gate QFT ipotizzando una connettività lineare a prossimità.

  • Aggiunti due parametri a GenericBackendV2 per escludere l'errore (noise_info) e le informazioni sul canale degli impulsi (pulse_channels) dalla costruzione del backend. Questi parametri sono True per impostazione predefinita, replicando il comportamento iniziale del costruttore. Un utente sensibile alla memoria può impostare queste opzioni a False per ridurre il carico di memoria di 40x quando si esegue il transpiling su larga scala GenericBackendV2.

  • La classe StabilizerState ha ora un nuovo metodo StabilizerState.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 funzione StabilizerState.probabilities_dict() sarebbe stato utilizzato e, nel peggiore dei casi, avrebbe calcolato ( 2n2^n ) 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 1Mj=0M1j\frac{1}{\sqrt{M}} \sum_{j=0}^{M-1} |j\rangle, dove MM è un intero positivo che rappresenta il numero di stati base computazionali con un'ampiezza di 1M\frac{1}{\sqrt{M}}. Questa implementazione supporta la creazione efficiente di stati di sovrapposizione uniforme, richiedendo solo O(log2(M))O(\log_2 (M)) qubit e O(log2(M))O(\log_2 (M)) 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() a qiskit.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')
    _images/release_notes-1.png
  • Aggiunto il supporto per AnnotatedOperation.params e AnnotatedOperation.validate_parameter()che consentono la gestione dei parametri a livello di circuito (come i parametri di binding) per le operazioni annotate.

  • CircuitInstruction e DAGOpNode dispongono di nuovi metodi per interrogare varie proprietà dei loro oggetti interni, senza dover necessariamente accedervi Operationsenza dover necessariamente accedervi. Questi metodi sono:

    Se applicabile, l'utilizzo di uno di questi metodi è significativamente più veloce dell'interrogazione di CircuitInstruction.operation o DAGOpNode.op direttamente, 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 QuantumCircuit o DAGCircuit è 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 distribuzione num_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 passato num_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 se num_operand_distribution non è specificato, max_operands sarà impostato su 4 e verrà generato un circuito casuale con una distribuzione casuale dei gate. Se num_operand_distribution e max_operands sono specificati contemporaneamente, num_operand_distribution verrà 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")
    _images/release_notes-2.png
  • 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_barriers al metodo QuantumCircuit.repeat() al metodo. Impostando True si inseriscono delle barriere tra le ripetizioni del circuito.

  • Sostituzione dell'algoritmo di sintesi interno di StatePreparation e Initialize di Shende et al. con l'algoritmo riportato in Isometry di Iten et al. Il nuovo algoritmo riduce di un fattore 2 il numero di porte CX e la profondità del circuito.

  • ParameterExpression supporta 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, BackendSamplerV2 e BackendEstimatorV2è stato aggiornato per corrispondere a quello dei dispositivi quantistici di IBM.

    Si noti che i metadati di StatevectorEstimator non hanno shots perché la classe calcola i valori di aspettativa con Statevector e 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ù oggetti RZXGateora 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

  • MCXRecursive con kk qubit di controllo e un singolo qubit ausiliario pulito richiede ora al massimo 16k816k-8 porte CX.

  • MCXVChain ha due nuovi parametri booleani relative_phase e action_only. Se action_only è True il circuito non pulisce i qubit sporchi. Se relative_phase è True il gate viene implementato fino a una fase globale. Entrambi i parametri vengono utilizzati per ottimizzare la decomposizione di MCXVChain.

  • MCXVChain con kk controlli e k2k-2 qubit ausiliari sporchi ora richiede 8k68k-6 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_size impostandolo su None. Quindi, si sceglie un valore che tenta di minimizzare il limite superiore del numero di porte CX, cioè αlog2(n)\alpha \log_2(n) dove nn è il numero di qubit e α0.56\alpha \approx 0.56.

  • La funzione synth_clifford_bm() è stata portata in Rust. Ricordiamo che questa funzione sintetizza in modo ottimale Clifford operatori 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 operatori Clifford è 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 wrap alle classi ProductFormula che (se abilitato) avvolge i singoli termini dell'evoluzione di Pauli. Questo può essere utile per la visualizzazione dei circuiti.

  • L'argomento atomic_evolution di ProductFormula (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_manager

    invece di dover digitare il percorso completo:

    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

    La funzione è anche importabile dal modulo qiskit.transpiler come:

    from qiskit.transpiler import generate_preset_pass_manager
  • Aggiunta una nuova opzione al file di configurazione dell'utente sabre_all_threads e una corrispondente variabile d'ambiente QISKIT_SABRE_ALL_THREADS. Quando questo flag è impostato, i gestori dei passaggi preimpostati eseguono i task SabreLayout e SabreSwap utilizzando 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 computer SwapGates.

    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 Split2QUnitaries che 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, ConsolidateBlocks e Split2QUnitaries sono stati aggiunti allo stadio init dei gestori di passaggi preimpostati con livello di ottimizzazione 2 e livello di ottimizzazione 3. La modifica dello stadio init dovrebbe 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 Target che 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 SabreLayout il passaggio del transpiler è stato aggiornato in modo da eseguire sempre un'ulteriore prova utilizzando lo stesso algoritmo di DenseLayout per 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 predefinita SabreLayout inizia ancora con layout_trials prove 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 dt a generate_preset_pass_manager() per corrispondere all'insieme di argomenti di transpile(). Ciò consentirà di convertire internamente i vincoli di transpilazione in una Target rappresentazione.

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'opzione idle_wires dei cassetti dei circuiti QuantumCircuit.draw() e circuit_drawer(). Ad esempio, aggiungendo una sezione a ~/.qiskit/settings.conf con:

    [default]
    circuit_idle_wires = false

    cambierà 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 di 1 (cioè QISKIT_NO_CACHE_GATES=1) diminuisce l'overhead di memoria di a CircuitInstruction e DAGOpNode al costo di un aumento del tempo di esecuzione sugli accessi multipli a CircuitInstruction.operation e DAGOpNode.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 annotated del metodo Gate.control() è ora None per 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 Operation istanze di DAGOpNode.op restituite non condivideranno più necessariamente un riferimento comune all'oggetto sottostante. Non è mai stato garantito che ciò avvenisse e la mutazione del parametro DAGOpNode.op direttamente per riferimento non era corretto e rischiava sempre di corrompere il tracciamento dello stato interno del DAG A causa della rifattorizzazione interna delle classi QuantumCircuit e DAGCircuit per memorizzare porte standard in Rust, l'oggetto in uscita da DAGOpNode.op sarà 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.14159

    che 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 Operation istanze di CircuitInstruction.operation restituite non condivideranno più necessariamente un riferimento comune all'oggetto sottostante. Non è mai stato garantito che ciò avvenisse e la mutazione del parametro CircuitInstruction.operation direttamente 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 metodo QuantumCircuit per memorizzare le porte standard in Rust, l'oggetto in uscita da CircuitInstruction.operation sarà 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.14

    che 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() e BitArray.slice_shots() ora solleva IndexError quando gli indici sono fuori dai limiti. Nel caso, hanno utilizzato il sito ValueError .

  • BitArray.__getitem__() ora solleverà IndexError quando gli indici sono fuori dai limiti o il numero di dimensioni degli indici non corrisponde a quello di BitArray. Nel caso, hanno utilizzato il sito ValueError .

Note sull'aggiornamento della sintesi

  • LieTrotter e SuzukiTrotter e 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 di QuantumCircuit.decompose() o aggiungere l'argomento della parola chiave wrap=True all'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 2π2252\pi \otimes 2^{-25}.

  • Il passaggio di instradamento predefinito usato dal livello di ottimizzazione 0 per generate_preset_pass_manager() e transpile() è stato cambiato da StochasticSwap a SabreSwap. Il passaggio SabreSwap esegue 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 a StochasticSwap. Per optimization_level=0 questo 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_method per transpile() e generate_preset_pass_manager() a "stochastic" per utilizzare il StochasticSwap pass.

  • La funzione generate_preset_pass_manager() è stata aggiornata per convertire internamente, quando possibile, i vincoli del transpiler in una Target istanza. Se viene fornito un input di backend di tipo BackendV1 viene fornito, sarà convertito in BackendV2 per esporre il suo Target. 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

Deprecazioni delle primitive

Deprecazioni dei provider

Deprecazioni del transpiler

  • La funzione assemble() è ora deprecata e sarà rimossa nella versione 2.0. La funzione è stata utilizzata principalmente per creare un Qobj, che non è più necessario nei flussi di lavoro basati su BackendV2-flussi di lavoro basati su È stato utilizzato anche per il binding dei parametri, una funzionalità completamente coperta da QuantumCircuit.assign_parameters().

Deprecazioni relative alla visualizzazione

  • L'argomento justify di circuit_drawer() o QuantumCircuit.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. RXXGate o RYGate per 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 oggetto AnnotatedOperation come 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 SGate e SdgGate ora restituiscono correttamente a CSGate, 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 metodo QuantumCircuit.draw() non emetteva un avviso quando veniva passato un valore non valido all'argomento justify , 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() e Pauli.apply_layout() per sollevare QiskitError se vengono forniti indici duplicati o negativi come parte di un layout.

  • È stato risolto un bug nel passaggio ConsolidateBlocks quando il circuito di ingresso contiene un gate opaco personalizzato e non sono impostate le opzioni basis_gates o target , il passaggio sollevava un problema e falliva QiskitError e 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 order della funzione BitArray.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 di CXGates 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 StatevectorSampler che ignorava le porte con c_if. Verrà generato un errore perché Statevector non può gestire c_if.

  • È stata corretta una svista nel Commuting2qGateRouter in 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à layout del 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 un section_size che non divideva il numero di qubit senza resto poteva portare a risultati errati. Ora qualsiasi section_size (al massimo pari al numero di qubit) sintetizza il circuito corretto. Per un valore (euristicamente) ottimale, impostare section_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() e qasm2.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 2π2\pi.

  • 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 di PauliEvolutionGate da 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() e generate_preset_pass_manager() sono state corrette. Queste incongruenze porterebbero a risultati di transpilazione diversi per gli stessi input, oppure generate_preset_pass_manager() non riescono per alcune combinazioni di ingressi accettate da transpile().

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.