Note di rilascio di Qiskit 0.43
0.43.3
Terra 0.24.2
Preludio
Qiskit Terra 0.24.2 è una release di correzione dei bug, che risolve alcuni problemi minori identificati dopo la release 0.24.1.
Note sull'aggiornamento
- La versione del formato QPY emessa da
dumpè passata a 8. Questa nuova versione del formato aggiunge il supporto per la serializzazione dell'attributoQuantumCircuit.layoutattributo.
Correzioni di bug
-
Corretta la deserializzazione delle
DiagonalGateattraverso QPY. Corretto #10364 -
È stato risolto un problema con la funzione
qs_decomposition(), che esegue la decomposizione quantistica di Shannon; quando veniva chiamata su unitari numerici banali che non traggono vantaggio da questa decomposizione, veniva generato un errore imprevisto. Questo errore è stato corretto in modo che tali unitari vengano rilevati e venga restituito il circuito equivalente. Corretto #10036 -
Corretto un problema nella classe
BasicSwapche impediva al metodoBasicSwap.run()se l'argomento della parola chiavefake_runera impostato suTruequando la classe veniva istanziata. Corretto #10147 -
È stato risolto un problema con la copia dei circuiti con il nuovo stile di
Clbits eQubits (bit senza registri) in cui i riferimenti a questi bit dal circuito contenente potevano essere interrotti, causando problemi con la serializzazione e la visualizzazione dei circuiti. Corretto #10409 -
Il passaggio
CheckMapnon darà più errori spuri quando si tratta di strutture condizionali annidate create dall'interfaccia del costruttore di flussi di controllo. Vedere #10394. -
Corretto un errore del Pulse Builder quando il contesto è inizializzato con
BackendV2. -
Fissata l'uscita dell'impulso
measure()emeasure_all()quando le funzioni sono chiamate con l'opzioneBackendV2backend. -
Fissa le dimensioni della matrice di densità di uscita da
DensityMatrix.partial_transpose()in modo che corrispondano alle dimensioni della corrispondente matrice di densità di ingresso. -
L'importazione
qiskit.primitivesnon causerà più avvisi di deprecazione derivanti dal modulo deprecatoqiskit.opflowdeprecato. Questi avvertimenti sarebbero stati nascosti agli utenti dai filtri predefiniti di Python, ma hanno innescato l'importazione desiderosa diopflow, il che significa che una successiva importazione da parte di un utente non avrebbe fatto scattare gli avvertimenti. Corretto #10245 -
Corretto l'output di OpenQASM 2 di
QuantumCircuit.qasm()quando un oggetto gate personalizzato conteneva un gate con lo stesso nome. Idealmente questo non dovrebbe accadere per la maggior parte delle porte, ma operazioni algoritmiche complesse come quelle della classeGroverOperatorpotrebbero produrre accidentalmente tali strutture. Vedere #10162. -
Corretta una regressione nel cassetto LaTeX di
QuantumCircuit.draw()quando i file temporanei sono collocati su un filesystem separato da quello della directory di lavoro. Vedere #10211. -
È stato risolto un problema con
UnitarySynthesisquando si usa il parametrotarget: i circuiti con flusso di controllo non venivano mappati correttamente sulla destinazione. -
Corretto il bug in
VQDin cuiresult.optimal_valuesera una copia diresult.optimal_points. Ora restituisce i valori corrispondenti. Corretto #10263 -
Migliorati i messaggi di errore restituiti quando un tentativo di convertire un'espressione completamente vincolata
ParameterExpressionin unfloatointconcreto fallisce, ad esempio perché l'espressione è naturalmente un numero complesso. Corretto #9187 -
Conversioni fisse di
floatperParameterExpressionche avevano, a un certo punto della loro storia di costruzione, una componente immaginaria che era stata successivamente annullata. Quando si utilizza Sympy come backend, queste conversioni di solito hanno già funzionato. Quando si usa Symengine come backend, queste conversioni spesso falliscono con errori di tipo, nonostante il risultato sia stato valutato simbolicamente come reale eParameterExpression.is_real()fosse vero. Corretto #10191 -
Corretta la
qpyserializzazione diQuantumCircuit.layoutattribue. In precedenza, l'attributolayoutveniva eliminato quando si serializzava un circuito in QPY. Corretto #10112
Aer 0.12.2
Preludio
Qiskit Aer 0.12.2 è la seconda release della patch di 0.12.0. Questo risolve alcuni bug scoperti dopo il rilascio di 0.12.1.
Note sull'aggiornamento
-
Qiskit Aer ora richiede la versione di CUDA per il simulatore di GPU a 11.2 o superiore. In precedenza, CUDA 10.1 era la versione minima supportata. Questa modifica si è resa necessaria a causa dei cambiamenti nell'ecosistema CUDA upstream, compreso il supporto di cuQuantum. Per supportare gli utenti che utilizzano versioni diverse di CUDA, è ora disponibile un pacchetto separato per l'esecuzione con CUDA 11:
qiskit-aer-gpu-cu11e l'utilizzo del pacchettoqiskit-aer-gpurichiede ora CUDA 12. Se siete già utenti del pacchettoqiskit-aer-gpue volete usare CUDA 11, dovrete eseguire il programma:pip uninstall qiskit-aer-gpu && pip install -U qiskit-aer-gpu-cu11per passare dalle release del pacchetto
qiskit-aer-gpuprecedentemente compatibili con CUDA 10.x all'aggiornamento al nuovo pacchetto compatibile con CUDA 11. Se si sta già eseguendo CUDA 12 in locale, è possibile aggiornare il pacchettoqiskit-aer-gpucome di consueto.
Correzioni di bug
-
Se un circuito ha condizionali e parametri, il circuito non veniva simulato correttamente perché i binding dei parametri di Aer utilizzavano posizioni errate per applicare i parametri. Ciò è dovuto alla mancata considerazione delle operazioni bfunc iniettate dai condizionali. Con questo commit, i parametri vengono impostati nelle posizioni corrette tenendo conto delle operazioni bfun iniettate.
-
I parametri delle fasi globali non erano impostati correttamente in #1814. https://github.com/Qiskit/qiskit-aer/pull/1814 I valori dei parametri per le fasi globali venivano copiati in un circuito modello e non nei circuiti reali da simulare. Questo commit copia correttamente i valori dei parametri nei circuiti da simulare.
-
I risultati di
backend.run()non erano serializzabili perché includonoAerCircuits. Questo commit rende i risultati serializzabili, rimuovendoAerCircuits dai metadati. -
:meth:
QuantumCircuit.save_statevector()non funziona se il circuito è generato dal testo OpenQASM3 perché i suoi registri quantici hanno istanze di qubit duplicate. Con questo commit, :meth:QuantumCircuit.save_statevector()utilizza :data:QuantumCircuit.qubitsper ottenere i qubit da salvare.
IBM Q Fornitore 0.20.2
Nessuna modifica.
0.43.2
Come promemoria, l'inclusione di Qiskit Aer nel pacchetto qiskit è deprecata. La prossima versione minore di Qiskit Aer ( 0.13 ) non sarà inclusa in nessuna release del pacchetto qiskit e si dovrà iniziare immediatamente a installare Aer separatamente:
pip install qiskit-aere importarlo come:
import qiskit_aerA partire da Qiskit 0.44, il comando pip install qiskit non installerà più Qiskit Aer, né l'obsoleto IBM Q Provider che è già stato sostituito dal nuovo IBM Provider.
Terra 0.24.1
Nessuna modifica
Aer 0.12.1
Preludio
Qiskit Aer 0.12.1 è la prima patch rilasciata a 0.12.0. Questo risolve alcuni bug scoperti dopo il rilascio di 0.12.0.
Problemi noti
- Correggere un bug che restituisce valori di aspettativa errati in
Estimatorquandoabelian_grouping=True.
Note sull'aggiornamento
- Prestazioni migliorate quando gli stessi circuiti e più parametri vengono passati a
Estimatorconapproximation=True.
Note di deprecazione
- Le opzioni di meth:~.AerSimulator.run devono utilizzare i tipi corretti.
Correzioni di bug
-
La regressione delle prestazioni dovuta all'introduzione di
AER::Configè stata corretta. Questa classe ha molti campi, ma è spesso copiata inAER::Transpile::CircuitOptimization. Originariamente anchejson_t(ex classe per la configurazione) veniva copiato spesso, ma nella maggior parte dei casi ha delle voci e quindi questo overhead di copia non è un problema. Con questa correzione,AER::Transpile::CircuitOptimizationnon copiaAER::Config. -
Quando le chiamate BLAS falliscono, poiché i thread di omp non gestiscono le eccezioni, Aer si blocca senza alcun messaggio di errore. Questa correzione serve a far sì che i thread di omp catturino correttamente le eccezioni e le rilancino al di fuori dei loop di omp.
-
In precedenza, i parametri per i gate non venivano convalidati in C++. Se i parametri sono più corti del previsto (a causa di un gate personalizzato), vengono lanciati errori di segmentazione. Questo commit aggiunge un controllo per verificare se la lunghezza del parametro è espressa. Questo commit risolve i problemi segnalati in #1612. https://github.com/Qiskit/qiskit-aer/issues/1612
-
Da 0.12.0, i valori dei parametri nei circuiti sono temporaneamente sostituiti da valori costanti e i valori dei parametri sono assegnati nella libreria C++. Pertanto, se viene specificato parameter_binds, il simulatore restituisce i risultati con i valori costitutivi come valori dei parametri. Con questo commit, Aer solleva un errore se parameter_binds non è specificato, anche se i circuiti hanno dei parametri.
-
I dispositivi e i metodi disponibili non vengono più interrogati durante l'importazione di Aer.
-
In precedenza
AerSimulatormodificava i metadati del circuito per mantenere la coerenza tra l'input e l'output della simulazione, con l'effetto collaterale di una visualizzazione inaspettata dei metadati da parte dell'applicazione nella simulazione. Questa soluzione evita di utilizzare i metadati del circuito per mantenere la coerenza interna e fornisce sempre una visione coerente dei metadati all'applicazione. -
È stato risolto un bug per cui la varianza dei metadati in EstimatorResult era complessa e ora restituisce un valore fluttuante.
-
Corretta un'interruzione della compilazione di Qiskit Aer con il supporto di cuQuautum (AER_ENABLE_CUQUANTUM=true). Questa modifica non influisce sulla creazione di binari per CPU e GPU normali.
-
Corretto un bug in
from_backend()che generava un errore quando il backend non aveva valori T1 e T2 (cioè None) per un qubit nelle sue proprietà. Questo commit aggiornaNoiseModel.from_backend()ebasic_device_gate_errors()in modo che aggiungano un'identitàQuantumError(cioè effettivamente nessun errore di rilassamento termico) a un qubit senza valori T1 e T2 per tutti i gate che agiscono sui qubit, incluso il qubit. Corretti i numeri #1779 e #1815. -
Correzione di un problema: anche se il numero di qubit è impostato da una mappa di accoppiamento o dalla configurazione del dispositivo, quando viene configurato il metodo di simulazione, il numero di qubit viene sovrascritto in base al metodo. Corretto #1769
-
Si tratta di una correzione per l'impostazione del percorso della libreria in CMakeLists.txt per cuQuantum SDK. Poiché l'ultimo cuQuantum include le librerie per CUDA 11.x e 12.x, questa correzione utilizza la versione di CUDA restituita da FindCUDA per il percorso delle librerie di cuQuantum e cuTENSOR.
-
Si tratta di una correzione per le librerie di collegamento statico di cuQuantum quando si costruisce con CUQUANTUM_STATIC=true.
-
La parallelizzazione MPI non è stata abilitata perché non abbiamo usato qobj. Questa correzione imposta correttamente il numero di processi e il rango MPI.
-
AerCircuitviene creato da un circuito iterando le sue operazioni e saltando le istruzioni di barriera. Tuttavia, saltando le istruzioni di barriera, i parametri vengono posizionati in modo errato. Questa correzione aggiungebarrier()e mantiene corretti i binding dei parametri. -
Aer supporta ancora Qobj come argomento di
run(), sebbene sia stato deprecato. Tuttavia, a partire da 0.12.0, fallisce sempre se non viene specificatorun_options. Questa correzione consente la simulazione di Qobj senzarun_options. -
Da 0.12.0,
AerConfigviene utilizzato per la configurazione della simulazione, mentre viene eseguito un controllo di tipo rigoroso per gli argomenti di meth:~.AerSimulator.run. Questa modifica aggiunge la fusione se i tipi di argomenti non sono previsti. -
:meth:
QuantumCircuit.initialize()con valore int non veniva elaborato correttamente, come segnalato in #1821 <https://github.com/Qiskit/qiskit-aer/issues/1821>. Questo commit abilita tale inizializzazione scomponendo le istruzioni di initialize. -
QuantumCircuitsupporta la parametrizzazione per la sua fase globale. Tuttavia, Aer non consente tale parametrizzazione e fallisce quando il transpiler genera fasi globali parametrizzate. Questo commit supporta la parametrizzazione di global_phase e risolve i problemi relativi a https://github.com/Qiskit/qiskit-aer/issues/1795, https://github.com/Qiskit/qiskit-aer/issues/1781, e https://github.com/Qiskit/qiskit-aer/issues/1798. -
Aer userà ora
omp_set_max_active_levels()invece del deprecatoomp_set_nested()quando compilato con versioni recenti di OpenMP.
IBM Q Fornitore 0.20.2
Nessuna modifica.
0.43.1
Terra 0.24.1
Preludio
Qiskit Terra 0.24.1 è la prima patch rilasciata a 0.24.0. Questo risolve alcuni bug scoperti dopo il rilascio di 0.24.0.
Note sull'aggiornamento
- Modificato
QuantumCircuit.assign_parameters()per vincolare i valori interi e float assegnati direttamente nei parametri delle istanze diInstructionnel circuito, invece di legare i valori avvolti all'interno di un oggettoParameterExpression. Questa modifica dovrebbe avere un impatto minimo sull'utente, poichéfloat(QuantumCircuit.data[i].operation.params[j])produce ancora unfloat(ed è l'unico modo per accedere al valore di un oggettoParameterExpression). Inoltre,Instruction()potrebbe già esserefloat, così come un parametro aParameterExpressionquindi il codice che tratta i parametri delle istruzioni dovrebbe già gestire entrambi i casi. La possibilità più probabile di impatto sull'utente è nel codice che utilizzaisinstanceper verificare la presenza diParameterExpressione si comporta in modo diverso a seconda del risultato. Inoltre, qpy serializza il valore numerico in un boundParameterExpressioncon una precisione diversa da quella difloat(si veda anche la nota di correzione del bug relativo aQuantumCircuit.assign_parameters()).
Correzioni di bug
-
Aggiornato
plot_gate_map(),plot_error_map(), eplot_circuit_layout()per supportare mappe di accoppiamento heavy-hex a 433 qubit. Questo permette di accoppiare le visualizzazioni delle mappe con il backend IBM Quantumibm_seattle. -
Modificato il legame dei valori numerici con
QuantumCircuit.assign_parameters()per evitare una mancata corrispondenza tra i valori dei parametri delle istruzioni del circuito e le corrispondenti chiavi dei parametri nel dizionario di calibrazione del circuito. Corretti i numeri #9764 e #10166. Si veda anche la nota di aggiornamento relativa aQuantumCircuit.assign_parameters(). -
Corretto un bug in
BlockCollapserper cui i bit classici venivano ignorati quando si collassava un blocco di nodi. -
Corretto un bug in
replace_block_with_op()ereplace_block_with_op()che portava a ignorare i bit classici. -
È stato risolto un bug in
QuantumCircuit.compose()in cui l'attributoSwitchCaseOp.targetdel sottocircuito non veniva correttamente mappato su un registro del circuito di base. -
Correzione di un bug in
RZXCalibrationBuilderin cui la chiamata alla calibrazione con parametri errati si bloccava invece di sollevare un'eccezione. -
Corretto un problema con il metodo
BooleanExpression.from_dimacs_file()in cui il tipo di eccezione sollevato quando tweedledum non era installato non era quello previstoMissingOptionalLibrary. Corretto #10079 -
L'uso di
initial_layoutnelle chiamate atranspile()non darà più errore se il circuito contiene qubit non presenti in alcun registro o qubit che esistono in più di un registro. Vedere #10125. -
Corretta la decomposizione dei gate di rotazione Z multicontrollati aggiunti via
QuantumCircuit.mcrz(). In precedenza, questo metodo ha implementato un gate di fase multicontrollato, che ha una differenza di fase relativa rispetto alla rotazione Z. Per ottenere il comportamento precedenteQuantumCircuit.mcrz()si usaQuantumCircuit.mcp(). -
Corretto un problema con il costruttore
PassManagerConfig.from_backend()quando si costruisce un oggettoPassManagerConfigda un'istanzaBackendV1che non aveva un attributo di mappa di accoppiamento definito. In precedenza, il costruttore creava in modo errato un oggettoCouplingMapcon 0 qubit, invece di usareNone. Corretto #10171 -
Corregge un bug introdotto in Qiskit 0.24.0 per cui gli angoli di rotazione numerici non venivano più sostituiti da quelli simbolici prima di preparare la sintesi a due qubit. Ciò ha causato un'eccezione perché le routine di sintesi richiedono matrici numeriche.
-
Correzione di un bug per cui l'esecuzione di
Optimize1qGatesDecompositionin parallelo generava un errore dovuto al fatto che OneQubitGateErrorMap non era decapabile. -
Correzione di un bug nel menu
VF2LayouteVF2PostLayoutin cui i passaggi non tenevano conto della componente di errore di 1 qubit quando valutavano un layout potenziale.
Aer 0.12.0
Nessuna modifica
IBM Q Fornitore 0.20.2
Nessuna modifica
0.43.0
Terra 0.24.0
Preludio
Si tratta di un'importante release che include numerose nuove funzioni e correzioni di bug.
Questa versione è la versione finale con il supporto per l'esecuzione di Qiskit con Python 3.7. A partire dalla prossima versione minore Python >= 3.8 sarà necessario per eseguire Qiskit.
I punti salienti di questa release:
QuantumInstance, OpFlow, e obsolescenza dell'uso degli algoritmi
In questo rilascio viene ufficialmente deprecata la classe QuantumInstance (e i suoi metodi e classi di aiuto associati), il modulo qiskit.opflow e qualsiasi utilizzo di questi in qiskit.algorithms. Questa deprecazione deriva da un lungo lavoro iniziato in Qiskit Terra 0.21.0 per rifattorizzare il modulo qiskit.algorithms per essere basato sul modulo computazionale primitives. Sono disponibili guide alla migrazione per tutti gli utenti esistenti che devono migrare al nuovo flusso di lavoro:
QuantumInstanceguida alla migrazione: https://qisk.it/qi \migrazioneOpflowguida alla migrazione: https://qisk.it/opflow \migrazione- Guida alla migrazione degli algoritmi: https://qisk.it/algo \migrazione
OpenQASM2 miglioramenti
Questa versione include un importante refactoring per il supporto di OpenQASM 2.0 in Qiskit. Il primo cambiamento è l'introduzione di un nuovo parser per OpenQASM 2.0 nel modulo qiskit.qasm2 nel modulo. Questo nuovo modulo sostituisce il modulo qiskit.qasm modulo. Il nuovo parser è più esplicito e corretto rispetto alle specifiche del linguaggio. Anch'esso è implementato in Rust ed è significativamente più veloce del parser precedente. Insieme al nuovo parser, l'esportatore di OpenQASM 2.0 è stato sottoposto a un ampio refactor che ha migliorato la correttezza dell'output quando si utilizza il metodo QuantumCircuit.qasm() per generare l'output QASM da un oggetto QuantumCircuit oggetto.
Supporto Transpiler per dispositivi con connettività disgiunta
Il transpiler ora supporta il targeting di backend con connettività disgiunta. In precedenza, il transpiler supportava solo i backend completamente connessi (dove esiste un percorso per eseguire operazioni tra tutte le coppie di qubit del backend). Ora, se un backend ha una connettività disconnessa, il transpiler è in grado di ragionare su come applicare il layout (Layout Stage ) e il routing (Routing Stage ) per il backend. Se il circuito di ingresso non può essere eseguito sull'hardware a causa della mancanza di connettività tra i componenti collegati, verrà restituito un errore descrittivo.
Ad esempio, il dispositivo Heron descritto nella roadmap hardware di IBM Quantum descrive un futuro backend che avrà un hardware di controllo condiviso e una comunicazione classica in tempo reale tra processori quantistici separati. Questo supporto consente di Target di modellare accuratamente questi tipi di dispositivi futuri o altri hardware con vincoli simili.
Funzionamento dell'interruttore
Questa versione aggiunge una nuova operazione del flusso di controllo, l'istruzione switch. Questo viene implementato utilizzando una nuova classe di operazioni SwitchCaseOp e il metodo QuantumCircuit.switch() metodo. Ciò consente di attivare un ingresso numerico (come un registro classico o un bit) e di eseguire il circuito che corrisponde al valore corrispondente.
Nuove funzioni
-
Sono state aggiunte le funzioni
add_deprecation_to_docstring(),deprecate_arg(), edeprecate_func()al moduloqiskit.utilsal modulo.add_deprecation_to_docstring()riscriverà la docstring della funzione per includere una direttiva Sphinx.. deprecated::in modo che la deprecazione venga visualizzata nei documenti e conhelp(). I decoratori di deprezzamento daqiskit.utilschiamanoadd_deprecation_to_docstring()già per voi; ma potete chiamarlo direttamente se state usando meccanismi diversi per le deprecazioni.@deprecate_funcsostituisce@deprecate_functione si usa per deprecare un'intera funzione. Genererà automaticamente la maggior parte dei messaggi di deprezzamento.@deprecate_argsostituisce@deprecate_argumentse si usa per deprecare un argomento di una funzione. Genererà un messaggio più utile rispetto alla funzione precedente. È anche più flessibile, ad esempio permette di impostare unpredicatein modo da deprecare solo determinate situazioni, come l'uso di un valore o di un tipo di dati deprecato.
Funzionalità del transpiler
-
Aggiunto un modo alternativo per specificare in
HLSConfigl'elenco dei metodi di sintesi utilizzati per un determinato oggetto di alto livello. Come in precedenza, un metodo di sintesi può essere specificato come una tupla composta dal nome del metodo e da argomenti aggiuntivi. Inoltre, un metodo di sintesi può essere specificato come una tupla composta da un'istanza diHighLevelSynthesisPlugine da argomenti aggiuntivi. Inoltre, quando non ci sono argomenti aggiuntivi, un metodo di sintesi può essere specificato semplicemente con il nome o con un'istanza diHighLevelSynthesisPlugin. L'esempio seguente illustra la nuova funzionalità:from qiskit import QuantumCircuit from qiskit.circuit.library.generalized_gates import PermutationGate from qiskit.transpiler import PassManager from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis from qiskit.transpiler.passes.synthesis.high_level_synthesis import ACGSynthesisPermutation qc = QuantumCircuit(6) qc.append(PermutationGate([1, 2, 3, 0]), [1, 2, 3, 4]) # All of the ways to specify hls_config are equivalent hls_config = HLSConfig(permutation=[("acg", {})]) hls_config = HLSConfig(permutation=["acg"]) hls_config = HLSConfig(permutation=[(ACGSynthesisPermutation(), {})]) hls_config = HLSConfig(permutation=[ACGSynthesisPermutation()]) # The hls_config can then be passed as an argument to HighLevelSynthesis pm = PassManager(HighLevelSynthesis(hls_config=hls_config)) qc_synthesized = pm.run(qc) -
Aggiunto il supporto all'oggetto
CouplingMapper avere una connettività disgiunta. In precedenza, unCouplingMappoteva essere costruito solo se il grafo era connesso. Ciò consentirà di utilizzareCouplingMapper rappresentare hardware con qubit disgiunti, come ad esempio hardware con qubit su più chip separati. -
Aggiunto un nuovo metodo
CouplingMap.connected_components()che viene utilizzato per ottenere un elenco diCouplingMapcomponenti di un sottografo disgiuntoCouplingMap. Se l'oggettoCouplingMapè collegato, restituirà un singolo oggettoCouplingMapequivalente all'originale. -
Aggiunte nuove regole all'istanza incorporata
EquivalenceLibraryqiskit.circuit.equivalence_library.SessionEquivalenceLibrary. Le nuove regole aggiunte sono: -
Aggiunti plugin di sintesi ad alto livello per
LinearFunctione perqiskit.quantum_info.Cliffordestendendo l'insieme dei metodi di sintesi che possono essere richiamati daHighLevelSynthesisda un passaggio del transpiler.Per
LinearFunctioni plugin disponibili sono elencati di seguito:Nome del pluginPlugin di sintesi ad alto livellodefaultDefaultSynthesisLinearFunctionkmsKMSSynthesisLinearFunctionpmhPMHSynthesisLinearFunctionPer
qiskit.quantum_info.Cliffordi plugin disponibili sono elencati di seguito:Nome del pluginPlugin di sintesi ad alto livellodefaultDefaultSynthesisCliffordagAGSynthesisCliffordbmBMSynthesisCliffordgreedyGreedySynthesisCliffordlayersLayerSynthesisCliffordlnnLayerLnnSynthesisCliffordPer ulteriori informazioni su ogni singolo metodo, consultare la
qiskit.synthesisper ulteriori informazioni su ogni singolo metodo.L'esempio seguente illustra alcuni dei nuovi plugin:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import LinearFunction from qiskit.quantum_info import Clifford from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis # Create a quantum circuit with one linear function and one clifford qc1 = QuantumCircuit(3) qc1.cx(0, 1) qc1.swap(0, 2) lin_fun = LinearFunction(qc1) qc2 = QuantumCircuit(3) qc2.h(0) qc2.cx(0, 2) cliff = Clifford(qc2) qc = QuantumCircuit(4) qc.append(lin_fun, [0, 1, 2]) qc.append(cliff, [1, 2, 3]) # Choose synthesis methods that adhere to linear-nearest-neighbour connectivity hls_config = HLSConfig(linear_function=["kms"], clifford=["lnn"]) # Synthesize qct = HighLevelSynthesis(hls_config)(qc) print(qct.decompose()) -
Aggiunto un nuovo passaggio del transpiler,
MinimumPointche viene utilizzato principalmente come passaggio per verificare una condizione di ciclo in un filePassManager. Questo passaggio tiene traccia dello stato dei campi dell'insieme di proprietà nelle sue esecuzioni passate e imposta un campo booleano quando viene raggiunto un punto fisso sulla profondità del backtracking o selezionando il valore minimo trovato se viene raggiunta la profondità del backtracking. Si tratta di un'alternativa al metodoFixedPointche si limita a verificare la presenza di un valore fisso in un campo del set di proprietà tra le esecuzioni successive. -
Aggiunto un nuovo metodo,
swap_nodes(), al metodoDAGCircuitper consentire lo scambio di nodi parzialmente connessi. Connessione parziale significa che i due nodi condividono almeno un bordo (che rappresenta un qubit o un clbit). Se i nodi non condividono alcuno spigolo, viene sollevato unDAGCircuitErrorviene sollevato. -
Aggiungere un nuovo algoritmo di sintesi
synth_cz_depth_line_mr()di un circuito CZ per la connettività linear nearest neighbor (LNN) nella profondità di 2 qubit di 2n+2 utilizzando porte CX e di fase (S, Sdg o Z). Il circuito sintetizzato inverte l'ordine dei qubit. L'algoritmo di sintesi si basa sul documento di Maslov e Roetteler ( https://arxiv.org/abs/1705.09176 ). -
Aggiungere un nuovo algoritmo di sintesi
synth_clifford_depth_lnn()di un circuito Clifford per la connettività LNN con profondità di 2 qubit di 9n+4 (che non è ancora ottimale), utilizzando la sintesi Clifford a strati (synth_clifford_layers()),synth_cnot_depth_line_kms()per sintetizzare lo strato CX in profondità 5n, esynth_cz_depth_line_mr()per sintetizzare ciascuno degli strati CZ in profondità 2n+2. Questa PR sarà seguita da un'altra PR basata sul recente lavoro di Maslov e Yang ( https://arxiv.org/abs/2210.16195 ), che sintetizza gli strati CX-CZ alla profondità di 5n per la connettività LNN ed esegue un'ulteriore ottimizzazione, riducendo così la profondità di un circuito Clifford a 7n-4 per la connettività LNN. -
Le equivalenze tra le rotazioni di Pauli controllate e le traslazioni su rotazioni di due Pauli sono ora disponibili nella libreria delle equivalenze per le porte standard di Qiskit. Questo permette, ad esempio, di tradurre un elemento
CRZGatein unRZZGatepiùRZGateo aCRYGatea un singoloRZXGatepiù a porte a singolo qubit:from qiskit.circuit import QuantumCircuit from qiskit.compiler import transpile angle = 0.123 circuit = QuantumCircuit(2) circuit.cry(angle, 0, 1) basis = ["id", "sx", "x", "rz", "rzx"] transpiled = transpile(circuit, basis_gates=basis) print(transpiled.draw()) -
È stata aggiunta una nuova opzione,
copy_operations, acircuit_to_dag()per abilitare la disabilitazione opzionale della copia profonda delle operazioni dall'inputQuantumCircuitall'uscitaQuantumCircuit. Nei casi in cui l'ingresso :class`~.QuantumCircuit` non viene più utilizzato dopo la conversione, questa copia profonda è un overhead non necessario, in quanto qualsiasi riferimento condiviso non avrebbe alcun effetto collaterale indesiderato se l'inputQuantumCircuitviene scartato. -
È stata aggiunta una nuova opzione,
copy_operations, adag_to_circuit()per abilitare la disabilitazione opzionale della copia profonda delle operazioni dall'inputDAGCircuitall'uscitaQuantumCircuit. Nei casi in cui l'inputDAGCircuitnon viene più utilizzato dopo la conversione, questa copia profonda è un overhead non necessario, poiché qualsiasi riferimento condiviso non avrebbe alcun effetto collaterale indesiderato se l'inputDAGCircuitviene scartato. -
Aggiunta di una nuova funzione
passmanager_stage_plugins()al moduloqiskit.transpiler.preset_passmanagers.pluginmodulo. Questa funzione è usata per ottenere una mappatura dei nomi dei plugin con il loro tipo di classe. Ciò consente di identificare e interrogare la documentazione del plugin di uno stage di pass manager definito. Ad esempio:>>> from qiskit.transpiler.preset_passmanagers.plugin import passmanager_stage_plugins >>> passmanager_stage_plugins('routing')['lookahead'].__class__ qiskit.transpiler.preset_passmanagers.builtin_plugins.LookaheadSwapPassManager >>> help(passmanager_stage_plugins('routing')['lookahead']) Help on BasicSwapPassManager in module qiskit.transpiler.preset_passmanagers.builtin_plugins object: class BasicSwapPassManager(qiskit.transpiler.preset_passmanagers.plugin.PassManagerStagePlugin) | Plugin class for routing stage with :class:`~.BasicSwap` ... -
Il passaggio del transpiler
Errorora accetta anche input richiamabili per il suo parametromsg. Se utilizzate, queste callable di input passeranno l'attributoproperty_setdel passaggio e dovranno restituire una stringa che sarà usata per il messaggio di errore quando il passaggio viene eseguito. Ad esempio:from qiskit.transpiler.passes import Error def error_message(property_set): size = property_set["size'] return f"The circuit size is: {size}" error_pass = Error(error_message)Quando
error_passè incluso in un gestore di passaggi, si verificherà un errore con il messaggio"The circuit size is: n", dovenè la dimensione del circuito impostata nel set di proprietà (in genere dalla precedente esecuzione del passaggio)Sizepassaggio). -
Il metodo
build_coupling_map()ha un nuovo argomento chiave,filter_idle_qubitsche, se impostato aTrue, rimuove dall'output tutti i qubit che non supportano alcuna operazioneCouplingMapche non supportano alcuna operazione. -
Il passaggio
GateDirectiontranspiler può ora gestire correttamenteSwapGateche possono essere presenti nel circuito quando si esegue su un circuito. In questi casi, se gli argomenti del qubit dello swap gate si trovano nella direzione non nativa di un bordo, il passaggio invertirà l'ordine degli argomenti. -
Il
RZXCalibrationBuildereRZXCalibrationBuilderNoEchoora useranno correttamente un gate di entanglingECRGateper il gate di entangling se il gate di entangling nativo del backend èECRGate. In precedenza, i passaggi funzionavano correttamente solo se il cancello di entangling eraCXGate. -
Aggiunto un nuovo costruttore per la classe
Targetper la classeTarget.from_configuration()che consente di costruire un oggettoTargetdai tipi di oggetto separati per descrivere i vincoli di un backend (ad esempio, i cancelli di base,CouplingMap,BackendProperties, ecc.). Ad esempio:target = Target.from_configuration( basis_gates=["u", "cx", "measure"], coupling_map=CouplingMap.from_line(25), )Si costruirà un oggetto
Targetche haUGate,CXGate, eMeasuredisponibili globalmente su 25 qubit collegati in linea. -
Aggiunta una nuova funzione
synth_cnot_phase_aam()utilizzata per sintetizzare circuiti a fase cnot per architetture all-to-all utilizzando il metodo di Amy, Azimzadeh e Mosca. Questa funzione è identica alla funzione disponibileqiskit.transpiler.synthesis.graysynth(), ma ha un nome più descrittivo ed è collocata in modo più logico nell'albero dei pacchetti. Questa nuova funzione sostituisce la funzione precedente, che probabilmente sarà deprecata in una versione futura. -
Le modifiche interne all'algoritmo di instradamento in
SabreSwaputilizzato nella transpilazione di circuiti non dinamici a tutti i livelli di ottimizzazione non nulli, hanno velocizzato l'instradamento per circuiti molto grandi. Ad esempio, il tempo per instradare un circuito depth-5QuantumVolumeper una mappa di accoppiamento heavy-hex a 1081-qubit è approssimativamente dimezzato. -
Le prestazioni di runtime del
Optimize1qGatesDecompositiontranspiler è stata notevolmente migliorata. Questo è stato fatto sia riscrivendo tutti i calcoli del passaggio in Rust, sia diminuendo la quantità di oggetti intermedi creati durante l'esecuzione del passaggio. Questo dovrebbe corrispondere a un miglioramento simile delle prestazioni di runtime ditranspile()con l'argomento della parola chiaveoptimization_levelimpostato su1,2, o3. -
Aggiungere un nuovo metodo di sintesi
synth_stabilizer_layers()di uno stato stabilizzatore in strati. Fornisce una decomposizione simile alla sintesi descritta nel Lemma 8 di Bravyi e Maslov, ( arxiv:2003.09412 ) senza il sottocircuito iniziale privo di Hadamard che non influisce sullo stato stabilizzatore. -
Aggiungere un nuovo metodo di sintesi
synth_stabilizer_lnn()di uno stato stabilizzatore per la connettività lineare nearest neighbor nella profondità di 2 qubit di 2n+2 e due strati CX distinti, utilizzando CX e porte di fase (S, Sdg o Z). L'algoritmo di sintesi si basa sul documento di Maslov e Roetteler ( https://arxiv.org/abs/1705.09176 ). -
Il passaggio
SabreLayoutsupporta ora l'esecuzione contro un bersaglio con un file disgiuntoCouplingMap. Quando si punta a un accoppiamento disgiunto, l'ingressoDAGCircuitviene suddiviso nelle sue componenti connesse di qubit virtuali, ogni componente viene mappato sulle componenti connesse dell'oggettoCouplingMapil layout viene eseguito su ciascun componente collegato in modo isolato, quindi tutti i layout vengono combinati e restituiti. Si noti che quando l'argomentorouting_passè impostato, il passaggio non supporta l'esecuzione con connettività disgiunte. -
I seguenti passaggi del transpiler di layout e routing dei moduli
qiskit.transpiler.passessupporteranno ora l'accettazione di un oggettoTargetche viene usato per modellare i vincoli di un backend di destinazione tramite il primo argomento posizionale (attualmente chiamatocoupling_mapobackend_properties).L'elenco dei passaggi con il nuovo supporto per
Targetsono:CSPLayoutFullAncillaAllocationLayout2qDistanceNoiseAdaptiveLayoutSabreLayoutTrivialLayoutBasicSwapBIPMappingLayoutTransformationLookaheadSwapSabreSwapStochasticSwapCheckMap
-
La funzione di aiuto alla costruzione del gestore di passaggi
generate_embed_passmanager()accetta ora anche un parametroTargetcome unico argomento posizionale (attualmente chiamatocoupling_map). Questo può essere utilizzato per costruire un'incorporazione di layoutPassManagerda unTargetinvece che da un oggettoCouplingMap. -
I seguenti passaggi del transpiler di layout e routing dei moduli
qiskit.transpiler.passeshanno una nuova parola chiave,target, che accetta un oggettoTargetche viene usato per modellare i vincoli di un backend di destinazione. Se viene specificato l'argomento della parola chiavetarget, esso verrà utilizzato come fonte di verità per qualsiasi vincolo hardware utilizzato nel funzionamento del passaggio del transpiler. Sostituisce tutti gli altri argomenti per specificare i vincoli hardware, in genere quelli che prendono un valore diCouplingMap,InstructionScheduleMapo un elenco di gate di base. L'elenco di questi passaggi con il nuovo argomentotargetè il seguente: -
La funzione di aiuto alla costruzione del gestore di passaggi
generate_scheduling()ha un nuovo argomento chiavetarget, utilizzato per specificare un oggettoTargetper modellare i vincoli del backend di destinazione per il quale si sta compilando, quando si genera un nuovo filePassManager. Se specificato, questo nuovo argomento sostituisce l'altroinst_map. -
Il plugin
defaultutilizzato dalUnitarySynthesissceglie ora la sintesi unitaria a uno e due qubit in base ai tassi di errore riportati nel fileTarget. In particolare, esegue tutti i possibili metodi di sintesi supportati dal plugin e sceglie l'opzione che comporta l'errore minore. Per una decomposizione a un qubit, si può puntare sulla base di Pauli (ad esempio RZ-RX-RZ o RZ-RY-RZ), su una generica base unitaria (ad esempio U) e su alcune altre. Per una decomposizione a due qubit, si può puntare su qualsiasi base supercontrollata (ad esempio CNOT, iSWAP, B) o su basi multiple controllate (ad esempio CZ, CH, ZZ^.5, ZX^.2, ecc.). -
L'interfaccia per
UnitarySynthesisPluginha due nuove proprietà opzionalisupports_gate_lengths_by_qubitesupports_gate_errors_by_qubitche, se impostate, aggiungono rispettivamente i campigate_lengths_by_qubitegate_errors_by_qubitalle opzioni di input del metodorun()del plugin. Questi nuovi campi sono una visione alternativa dei dati forniti dagate_lengthsegate_errors, ma hanno la forma:{(qubits,): [Gate, length]}(doveGateè l'istanza diGateper quella definizione). Ciò consente ai plugin di ragionare sul lavoro con porte dello stesso tipo, ma con parametri diversi. -
Aggiunto un nuovo passaggio di transpiler,
UnrollForLoopsche viene usato per srotolare qualsiasiForLoopOpin un circuito. Questo passaggio srotola i cicli for quando è possibile, se non ci sonoContinueLoopOpoBreakLoopOpall'interno del blocco del corpo del ciclo. Ad esempio:from qiskit.transpiler.passes import UnrollForLoops from qiskit import QuantumCircuit unroll_pass = UnrollForLoops() qc = QuantumCircuit(1) # For loop over range 5 with qc.for_loop(range(5)) as i: qc.rx(i, 0) # Unroll loop into 5 rx gates unroll_pass(qc).draw("mpl")
-
È stato aggiunto un nuovo parametro
max_trialsda passareVF2PostLayoutche, se specificato, limita il numero di layout scoperti e confrontati durante la ricerca del layout migliore. Questo differisce dai parametri esistenticall_limitetime_limit(che sono usati per limitare il numero di visite agli stati eseguite dall'algoritmo VF2 e il tempo totale impiegato da passVF2PostLayoutrispettivamente), in quanto viene utilizzato per porre un limite superiore al tempo di valutazione dei potenziali layout, il che può essere utile per i dispositivi più grandi. -
Il passo del transpiler
CheckMapha un nuovo argomento di parola chiave nel suo costruttore,property_set_field. Questo argomento può essere usato per specificare un campo dell'insieme di proprietà in cui memorizzare i risultati dell'analisi. In precedenza, era possibile memorizzare il risultato solo nel campo"is_swap_mapped"(che è quello predefinito). Ciò consente di memorizzare il risultato di più istanze del passaggio in un filePassManagerin campi diversi.
Caratteristiche dei circuiti
-
Aggiunta di una nuova classe gate,
GlobalPhaseGateche può essere usata per aggiungere una fase globale sull'istanzaQuantumCircuitistanza. -
Aggiunto un nuovo attributo,
layout, alla classeQuantumCircuitalla classe. Questo attributo è tipicamente popolato datranspile()oPassManager.run()(quando la fase di layout e la fase di instradamento vengono eseguite nella classePassManager) e contiene un attributoTranspileLayoutche contiene le informazioni sulla permutazione del circuito di ingresso durante l'esecuzione del progettotranspile(). -
Aggiunto un nuovo argomento,
var_order, al costruttore della classePhaseOracleper consentire di impostare l'ordine in cui vengono considerate le variabili dell'espressione logica. Ad esempio:from qiskit.tools.visualization import plot_histogram from qiskit.primitives import Sampler from qiskit.circuit.library import PhaseOracle from qiskit.algorithms import Grover, AmplificationProblem oracle = PhaseOracle('((A & C) | (B & D)) & ~(C & D)', var_order=['A', 'B', 'C', 'D']) problem = AmplificationProblem(oracle=oracle, is_good_state=oracle.evaluate_bitstring) grover = Grover(sampler=Sampler()) result = grover.amplify(problem) print(result.circuit_results[0]) -
Un nuovo parser OpenQASM 2 è disponibile in
qiskit.qasm2. Ha due punti di ingresso:qasm2.load()eqasm2.loads()per leggere il codice sorgente rispettivamente da un file e da una stringa:import qiskit.qasm2 program = """ OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; h q[0]; cx q[0], q[1]; """ bell = qiskit.qasm2.loads(program)Questo nuovo parser è approssimativamente 10x più veloce di quelli esistenti a
QuantumCircuit.from_qasm_file()eQuantumCircuit.from_qasm_str()per i file di grandi dimensioni e ha anche un minore overhead per ogni chiamata. Il nuovo parser è più estensibile, personalizzabile e generalmente anche più sicuro dal punto di vista tipologico; non tenterà di produrre oggetti Qiskit personalizzati quando la definizione nel file OpenQASM 2 si scontra con l'oggetto Qiskit, a differenza dell'esportatore attuale. Si veda la documentazione delqiskit.qasm2per tutti i dettagli e ulteriori esempi. -
Migliorare la decomposizione di rotazioni Pauli-X e Pauli-Y a più controlli con
QuantumCircuit.mcrx()eQuantumCircuit.mcry on :math:`n()controlli a porte CX, per . Questo miglioramento si basa su arXiv:2302.06377. -
Qiskit supporta ora la rappresentazione degli enunciati
switch, utilizzando la nuova istruzioneSwitchCaseOpe il metodoQuantumCircuit.switch()metodo. Ciò consente di attivare un ingresso numerico (come un registro classico o un bit) e di eseguire il circuito che corrisponde al valore corrispondente. Più valori possono puntare allo stesso circuito eCASE_DEFAULTpuò essere usato come etichetta sempre corrispondente.È anche possibile utilizzare un'interfaccia costruttore, simile agli altri costrutti del flusso di controllo, per costruire queste istruzioni di commutazione:
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister qreg = QuantumRegister(2) creg = ClassicalRegister(2) qc = QuantumCircuit(qreg, creg) qc.h([0, 1]) qc.measure([0, 1], [0, 1]) with qc.switch(creg) as case: with case(0): # if the register is '00' qc.z(0) with case(1, 2): # if the register is '01' or '10' qc.cx(0, 1) with case(case.DEFAULT): # the default case qc.h(0)L'istruzione
switchè supportata da tutto lo stack del compilatore Qiskit; si possonotranspile()contenenti circuiti (se il backend pubblicizza il supporto per il costrutto) e la serializzazione avverrà in QPY.La dichiarazione
switchnon è attualmente una caratteristica di OpenQASM 3, ma è in fase di progettazione e considerazione, e si prevede che sarà adottata nel prossimo futuro. Qiskit Terra ha un supporto sperimentale per esportare questa dichiarazione nella sintassi di OpenQASM 3 proposta nella richiesta di pull collegata, utilizzando un flag di funzionalità sperimentale. Per esportare un circuito di dichiarazioneswitch(come quello creato sopra) in OpenQASM 3 utilizzando questo supporto speculativo, procedere come segue:from qiskit import qasm3 qasm3.dumps(qc, experimental=qasm3.ExperimentalFeatures.SWITCH_CASE_V1)
Caratteristiche degli algoritmi
-
Aggiunto un nuovo attributo
eigenvalue_thresholdalla classeAdaptVQEper configurare un nuovo tipo di soglia per terminare l'algoritmo quando l'autovalore cambia meno di un valore stabilito. -
Aggiunto un nuovo attributo
gradient_thresholdalla classeAdaptVQEche sostituirà l'attributothresholdin futuro. Questo nuovo attributo si comporta come l'attributo esistentethreshold, ma ha un nome più preciso, data l'introduzione di opzioni di soglia aggiuntive nella classe. -
È stato aggiunto l'attributo
EstimationProblem.has_good_stateche consente di verificare se un elementoEstimationProblemha un nome personalizzatoEstimationProblem.is_good_stateo se è quello predefinito. Questo è utile per i controlli negli stimatori di ampiezza, come ad esempioAmplitudeEstimationche supportano solo l'implementazione predefinita. -
Aggiunge un flag
localalla classeComputeUncomputeche consente di calcolare la fedeltà locale, definita dalla media dei proiettori a singolo qubit. -
Le classi di gradiente riordinano il risultato del gradiente in base all'ordine dei parametri di ingresso.
Esempio:
from qiskit.algorithms.gradients import ParamShiftEstimatorGradient from qiskit.circuit import QuantumCircuit, Parameter from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp # Create a circuit with a parameter p = {i: Parameter(f'p{i}') for i in range(3)} qc = QuantumCircuit(1) qc.rx(p[0], 0) qc.ry(p[1], 0) qc.rz(p[2], 0) op = SparsePauliOp.from_list([("Z", 1)]) param_values = [0.1, 0.2, 0.3] # Create a gradient object estimator = Estimator() grad = ParamShiftEstimatorGradient(estimator) result = grad.run(qc, op, [param_values]).result() # would produce a gradient of the form [df/dp0, df/dp1, df/dp2] result = grad.run(qc, op, [param_values], parameters=[[p[2], p[0]]]).result() # would produce a gradient of the form [df/dp2, df/dp0] -
Aggiunto il supporto per la gestione di hamiltoniani dipendenti dal tempo (cioè operatori singolarmente parametrizzati) alla classe
TrotterQRTEclasse. Per facilitare il lavoro con questo, è stato aggiunto l'attributonum_timestepse un argomento di parola chiave corrispondente al costruttoreTrotterQRTEper controllare il numero di fasi temporali in cui suddividere l'evoluzione completa. -
Aggiunto il supporto per le valutazioni osservabili a ogni passo temporale durante l'esecuzione della classe
TrotterQRTEclasse. L'attributoTimeEvolutionProblem.aux_operatorsviene valutato a ogni passo temporale se l'attributoProductFormula.repsdell'argomento di inputproduct_formulanel costruttore è impostato su 1. -
Aggiunte estensioni all'algoritmo
VQDche consentono di passare un elenco di ottimizzatori e di punti iniziali per le diverse corse di minimizzazione. Ad esempio, ilk-esimo punto iniziale e ilk-esimo ottimizzatore saranno utilizzati per l'ottimizzazione delk-1-esimo stato previsto.
Caratteristiche dell'informazione quantistica
-
Aggiunti due nuovi metodi costruttori,
Clifford.from_matrix()eClifford.from_operator()che creano un oggettoClifforddalla sua matrice unitaria e dalla rappresentazione dell'operatore, rispettivamente. -
Il costruttore di
Cliffordpuò ora accettare qualsiasi oggetto porta Clifford fino a 3 qubit, purché implementi un metodoto_matrix, comprese porte parametrizzate comeRz(pi/2), che prima non erano convertibili. -
Aggiunte nuove funzioni di utilità:
commutator(),anti_commutator(), edouble_commutator()che vengono utilizzate per calcolare i commutatori per qualsiasi oggetto che implementa la classe base astrattaLinearOpcomeQuantumChannel,SparsePauliOp, oScalarOp. -
Aggiunto il metodo
StabilizerState.equiv, che verifica se gli insiemi generatori di due stati stabilizzatori generano lo stesso gruppo stabilizzatore. Ad esempio, il gruppo stabilizzatore dello stato di Bell a due qubit contiene i quattro elementi e quindi può essere generato da , o . -
Aggiunto un nuovo metodo,
partial_transpose(), al moduloqiskit.quantum_infodel moduloDensityMatrixdel modulo. Questo metodo viene utilizzato per calcolare la trasposizione parziale di una matrice di densità, necessaria per rilevare l'entanglement tra sistemi quantistici bipartiti. -
Aggiunto un metodo
qiskit.quantum_info.Operator.apply_permutation()che precompone o postcompone un Operatore con una Permutazione. Questo metodo funziona per i qudits in generale.Ecco un esempio di calcolo di che riordina i bit dell'Operatore:
import numpy as np from qiskit.quantum_info.operators import Operator op = Operator(np.array(range(576)).reshape((24, 24)), input_dims=(2, 3, 4), output_dims=(2, 3, 4)) perm = [1, 2, 0] inv_perm = [2, 0, 1] conjugate_op = op.apply_permutation(inv_perm, front=True).apply_permutation(perm, front=False)L'operatore coniugato ha dimensioni (4, 2, 3) x (4, 2, 3), il che è coerente con la permutazione che sposta il qutrit in posizione 0, il qubit in posizione 1 e il 4-qudit in posizione 2.
-
Supportare in modo nativo la costruzione di
SparsePauliOpoggetti conParameterExpressionsenza richiedere la costruzione esplicita di una matrice di oggetti. Ora è supportato quanto segue:from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp x = Parameter("x") op = SparsePauliOp(["Z", "X"], coeffs=[1, x]) -
È stato aggiunto il metodo
SparsePauliOp.assign_parameters()e l'attributoSparsePauliOp.parametersper assegnare e interrogare parametri non vincolati all'interno di un fileSparsePauliOp. Questa funzione può essere utilizzata, ad esempio, come:from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp x = Parameter("x") op = SparsePauliOp(["Z", "X"], coeffs=[1, x]) # free_params will be: ParameterView([x]) free_params = op.parameters # assign the value 2 to the parameter x bound = op.assign_parameters([2])
Caratteristiche di Pulse
-
Aggiunte nuove
SymbolicPulsealla libreria degli impulsi (qiskit.pulse.library) I nuovi impulsi della libreria sono:Queste nuove classi sono istanze di
ScalableSymbolicPulse. Ad eccezione della faseSawtooth, il comportamento è identico a quello della corrispondente funzione di generatore di forme d'onda (ad es.sin()). La fase per la classeSawtoothè definita in modo tale che una fase di si sposti di un ciclo completo. -
Aggiunto il supporto a QPY (
qiskit.qpy) per lavorare con istanze di impulsiScheduleBlockcon riferimenti non assegnati e preservando la struttura dei dati per il riferimento alle subroutine. Questa funzione consente agli utenti di serializzare e deserializzare un programma di impulsi modello per attività quali la calibrazione degli impulsi. Ad esempio:from qiskit import pulse from qiskit import qpy with pulse.build() as schedule: pulse.reference("cr45p", "q0", "q1") pulse.reference("x", "q0") pulse.reference("cr45p", "q0", "q1") with open('template_ecr.qpy', 'wb') as fd: qpy.dump(schedule, fd) -
È stato aggiunto un nuovo metodo
CalibrationEntry.user_provided()alle voci di calibrazione. Questo metodo può essere chiamato per verificare se la voce è definita da un utente finale o da un backend. -
Aggiunto un nuovo metodo
Target.get_calibration()che fornisce un comodo accesso alla calibrazione di un'istruzione in un oggettoTargetquesto metodo può essere chiamato con i parametri args e kwargs e restituisce un programma di impulsi costruito con i parametri quando la calibrazione è modellata con i parametri.
Funzionalità dei fornitori
-
La classe
BackendV2Converterha un nuovo argomento di parola chiave,filter_faulty, nel suo costruttore. Quando questo argomento è impostato suTrue, la classe convertitore filtrerà tutti i qubit o le operazioni elencate come non operative nel payload dell'inputBackendPropertiesper l'ingressoBackendV1. Sebbene non sia molto utilizzato, unBackendPropertiessupporta l'annotazione di qubit e porte come non operativi. In precedenza, se un backend aveva impostato quel flag su qualsiasi qubit o gate, l'istanza di output diBackendV2e il suoTargetincludevano tutte le operazioni, indipendentemente dal fatto che fossero elencate come operative o meno. Sfruttando il nuovo flag, è possibile filtrare questi qubit e gate non operativi dal fileTarget. Quando il flag è impostato, il backend in uscita sarà ancora elencato come l'intera larghezza (ad esempio, un backend a 24 qubit con 4 qubit elencati come non operativi mostrerà comunque di avere 24 qubit), ma i qubit difettosi non avranno alcuna operazione elencata come supportata nel fileTarget. -
La classe
Optionsimplementa ora il protocolloMappinge il metodo__setitem__. Questo significa cheOptionsoffrono ora la stessa interfaccia dei dizionari standard, tranne che per i metodi di cancellazione (_delitem_, pop, clear). Le assegnazioni delle chiavi vengono convalidate dai validatori, se registrati.
Funzionalità di visualizzazione
-
È stata aggiunta una nuova funzione,
staged_pass_manager_drawer(), utilizzata per visualizzare un'istanza diStagedPassManageristanza. Disegna il gestore del passaggio completo con ogni fase rappresentata come un riquadro esterno.Ad esempio:
from qiskit.visualization import staged_pass_manager_drawer from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import FakeSherbrooke backend = FakeSherbrooke() pm = generate_preset_pass_manager(3, backend) staged_pass_manager_drawer(pm) -
Il metodo
StagedPassManager.draw()è stato aggiornato per includere la visualizzazione delle fasi oltre al gestore del passaggio complessivo. Le fasi sono rappresentate da riquadri esterni nella visualizzazione. Nelle versioni precedenti le fasi non erano incluse nella visualizzazione. Ad esempio:from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import FakeSherbrooke backend = FakeSherbrooke() pm = generate_preset_pass_manager(3, backend) pm.draw(pm) -
Aggiunto un nuovo argomento di parola chiave,
figsize, alla funzioneplot_bloch_multivector()funzione. Questo argomento può essere utilizzato per impostare una dimensione per le singole sottotrame della sfera di Bloch. Ad esempio, se ci sono qubit efigsizeè impostato su(w, h), la larghezza complessiva della figura è impostata su , mentre l'altezza complessiva è impostata su . -
Aggiunto un nuovo argomento di parola chiave,
font_size, alla funzioneplot_bloch_multivector()funzione. Questo argomento può essere usato per controllare la dimensione dei caratteri nella visualizzazione di output. -
Aggiunti due nuovi argomenti di parole chiave,
title_font_sizeetitle_pad, alla funzioneplot_bloch_multivector()alla funzione. Questi argomenti possono essere usati per controllare la dimensione del carattere del titolo complessivo e del suo padding, rispettivamente.
Note sull'aggiornamento
-
La versione minima supportata di Rust (MSRV) è stata aumentata da 1.56.1 a 1.61.0. Se state costruendo Qiskit dai sorgenti, dovrete assicurarvi di avere installato almeno Rust 1.61.0 per poter costruire Qiskit. Questa modifica è stata apportata perché diverse dipendenze a monte hanno aumentato i loro MSRV.
-
Rimosso l'uso di primitive con il gestore di contesto e l'inizializzazione con circuiti (osservabili solo per Estimator) e parametri, che è stata deprecata nel rilascio di Qiskit Terra 0.22.0 nell'ottobre 2022.
-
PrimitiveJob.submit()non si blocca più al termine dell'esecuzione. Di conseguenza,Sampler.run(),BackendSampler.run(),Estimator.run()eBaseEstimator.run()non si bloccano finché non viene chiamato il metodoPrimitiveJob.result().
Note sull'aggiornamento del transpiler
-
Il numero massimo di prove valutate durante la ricerca del layout migliore utilizzando
VF2LayouteVF2PostLayoutè ora limitato inlevel_1_pass_manager(),level_2_pass_manager(), elevel_3_pass_manager()a2 500,25 000, e250 000, rispettivamente. In precedenza sono stati valutati tutti i possibili layout. Questa modifica è stata apportata per evitare che la transpilazione si blocchi durante l'assegnazione del punteggio per i circuiti con molti componenti collegati su dispositivi più grandi, che hanno una scala combinatoria poiché ogni componente collegato verrebbe valutato in tutte le posizioni possibili sul dispositivo. Per eseguire una ricerca completa come in precedenza, eseguire manualmenteVF2PostLayoutsul circuito transpilato in modalità rigorosa, specificando0permax_trials. -
L'attributo
conditiondella classeDAGDepNodeè stato rimosso. È stato contrassegnato come deprecato nella versione 0.18 (07-2021). Si dovrebbe invece usare l'attributoconditiondell'attributoopper accedere alla condizione di un nodo operazione. Per gli altri tipi di nodo non c'è alcuna condizione di accesso. -
Il valore predefinito di
metadatain entrambi i campiDAGCircuiteDAGDependencyè stato cambiato daNonea{}per compatibilità con l'attributo corrispondentemetadatadiQuantumCircuit. -
Il metodo
CouplingMap.__eq__`()è stato aggiornato per verificare che le liste di bordi dei grafi sottostanti contengano gli stessi elementi. Sotto l'ipotesi che i grafi sottostanti siano connessi, questa verifica garantisce inoltre che i grafi abbiano lo stesso numero di nodi con le stesse etichette. Tutto il codice che utilizzaCouplingMap() == CouplingMap()per verificare l'uguaglianza degli oggetti deve essere aggiornato aCouplingMap() is CouplingMap(). -
Quando si esegue la funzione
transpile()con un backendBackendV1o con un argomento della parola chiaveBackendPropertiestramite l'argomento della parola chiavebackend_propertiesche ha dei qubit o dei gate segnalati come difettosi, la funzione non cercherà più di rimappare automaticamente i qubit in base a queste informazioni. Il metodo con cuitranspile()ha tentato di effettuare questa rimappatura è fondamentalmente errato e nella maggior parte dei casi di un backend di questo tipo si ottiene un errore interno. In pratica, pochissimi backend impostano i campi inBackendPropertiesper segnalare un qubit o un gate come difettoso. Se ci si affidava atranspile()per effettuare questa rimappatura, ora dovrete farlo manualmente e passare agli argomenticoupling_mapebackend_propertiesun ingresso mappato che abbia filtrato i qubit e le porte difettose, per poi rimappare manualmente l'uscita. -
Il risultato delle transpilazioni per i semi fissi potrebbe essere cambiato rispetto alle versioni precedenti di Qiskit Terra. Ciò è dovuto a modifiche interne dell'algoritmo di routing utilizzato da
SabreSwapeSabreLayout, che sono rispettivamente i passaggi di routing e layout predefiniti, per renderli significativamente più veloci per i circuiti di grandi dimensioni.
Note sull'aggiornamento dei circuiti
- Il
QuantumCircuitmetadatarestituisce sempre un dizionario e può essere impostato solo su un dizionario. In precedenza, il valore predefinito eraNonee poteva essere impostato manualmente suNoneo su un dizionario.
Note sull'aggiornamento degli algoritmi
- I moduli deprecati
factorizerselinear_solvers, contenentiHHLeShorsono stati rimossi daqiskit.algorithms. Queste funzionalità sono state originariamente deprecate nell'ambito della release 0.22.0 (rilasciata il 13 ottobre 2022). È invece possibile accedere al codice attraverso il libro di testo Qiskit: Risolutori lineari (HHL), Fattorizzatori (Shor)
Note sull'aggiornamento Pulse
Target.update_from_instruction_schedule_map()non solleva piùKeyErrornéValueErrorquando mancano dei qubit nell'istruzione di destinazione oinst_name_mapnon è fornito per l'istruzione non definita. Nel primo caso, ignora semplicemente la definizione dell'inputInstructionScheduleMapper i qubit non definiti. In quest'ultimo caso, una mappatura del gate viene estratta dai gate standard di Qiskit e infine, un oggetto opaco personalizzatoGatepersonalizzato viene definito a partire dal nome del programma, se non viene trovata alcuna mappatura.
Note sull'aggiornamento dei provider
-
L'argomento deprecato
max_creditsdiexecute(),assemble()e tutte le configurazioni diQobj(ad es.QasmQobjConfigePulseQobjConfig) è stato rimosso. Questa argomentazione risale alle prime versioni di Qiskit, che era più strettamente legato all'offerta di servizi IBM Quantum. All'epoca il campomax_creditsfaceva parte del "sistema di crediti" utilizzato dall'offerta di servizi di IBM Quantum. Tuttavia, quel sistema di crediti non è più in uso sui backend di IBM Quantum da quasi tre anni e inoltre Qiskit non è più legato alle offerte di servizi di IBM Quantum (e non lo è più da molto tempo). Se si fa affidamento su questa opzione in qualche modo per un backend, è necessario assicurarsi che la propria implementazioneBackendV2esponga un campomax_creditsnel suo oggettoOptionsoggetto. -
L'attributo
namesulla classeBackendV2basato su classi backend false inqiskit.providers.fake_providersono cambiati rispetto alle versioni precedenti. In precedenza, i nomi avevano un suffisso"_v2"per differenziare la classe dalla versioneBackendV1versione. Questo suffisso è stato rimosso perché potrebbe causare incongruenze con altri dati snapshottati usati per costruire l'oggetto backend.
Note di deprecazione
- I moduli
qiskit.opflow,qiskit.utils.backend_utils,qiskit.utils.mitigation,qiskit.utils.measurement_error_mitigation, la classeqiskit.utils.QuantumInstancee i metodifind_regs_by_name(),run_circuits()sono stati deprecati e saranno rimossi in una prossima versione. L'utilizzoQuantumInstanceè sostituito daBaseSampler. Vedere Migrazione Opflow. Vedere QuantumInstance Migrazione.
Deprecazioni del transpiler
-
Il passaggio di routing del transpiler,
BIPMapping, è stato deprecato e sarà rimosso in una prossima versione. È stato sostituito da un pacchetto di plugin esterni:qiskit-bip-mapper. I dettagli di questo nuovo pacchetto sono disponibili nel repository github del pacchetto:https://github.com/qiskit-community/qiskit-bip-mapper
Il passaggio è stato trasformato in un pacchetto di plugin separato per due motivi: in primo luogo la dipendenza da CPLEX lo rende più difficile da usare e in secondo luogo il pacchetto di plugin si integra in modo più pulito con
transpile(). -
L'errore di scrittura
aquire_alignmentnella classeTargetè stato sostituito dall'ortografia correttaacquire_alignment. I vecchi argomenti del costruttore aquire_alignment eTarget.aquire_alignmentsono deprecati e saranno rimossi in una prossima versione. Utilizzare inveceTarget.acquire_alignmentper ottenere e impostare il valore del vincolo di allineamento.
Circuiti deprecati
- Impostazione del
QuantumCircuitmetadataaNoneè stata deprecata e non sarà più supportata nelle prossime versioni. Si deve invece impostare un dizionario vuoto, se si vuole che non contenga dati.
Deprecazioni degli algoritmi
-
Tutte le seguenti caratteristiche sono ora deprecate, dopo essere state rese in attesa di deprezzamento da 0.22.0. Maggiori informazioni sono disponibili sul sito https://qisk.it/algo _migrazione.
-
Il modulo
qiskit.algorithms.minimum_eigen_solversè deprecato e sostituito daqiskit.algorithms.minimum_eigensolvers. -
Il modulo
qiskit.algorithms.eigen_solversè deprecato e sostituito daqiskit.algorithms.eigensolvers. -
Il modulo
qiskit.algorithms.evolversè deprecato e sostituito daqiskit.algorithms.time_evolvers. -
Classe
qiskit.algorithms.TrotterQRTEè deprecata e sostituita daqiskit.algorithms.time_evolvers.trotterization.TrotterQRTE. -
Utilizzo
QuantumInstanceoBackendè deprecato e sostituito daBaseSamplernelle seguenti classi: -
Utilizzo
QuantumInstanceoBackendoExpectationBaseè deprecato e sostituito daBaseSamplernel seguente metodo statico:get_fidelity() -
La funzione
eval_observables()è deprecata e sostituita dalla funzioneestimate_observables().
-
Deprecazioni delle informazioni quantistiche
PauliTableeStabilizerTablesono deprecati e saranno rimossi in una prossima versione. Si deve invece utilizzare il simboloPauliListdovrebbe essere utilizzato. Con questa modifica,table()è stato deprecato, in modo che si possa operare direttamente datableau()senza di esso.
Deprecazioni Pulse
- L'assegnazione di valori complessi a
ParameterExpressionin qualsiasi oggetto Qiskit Pulse solleva ora unPendingDeprecationWarning. Questo allineerà il modulo Pulse con altri moduli in cui tale assegnazione non era possibile all'inizio. Il tipico caso d'uso dei parametri complessi nel modulo era la libreria SymbolicPulse. A partire da Qiskit-Terra 0.23.0 tutti gli impulsi della libreria sono stati convertiti da una rappresentazione di ampiezza complessa a una rappresentazione reale utilizzando due float (amp,angle), come utilizzato nella classeScalableSymbolicPulse. In questo modo si è eliminata la necessità di parametri complessi. Qualsiasi uso di parametri complessi (e in particolare di impulsi personalizzati) deve essere convertito in modo analogo per evitare l'uso di parametri complessi.
Correzioni di bug
-
La classe
AmplitudeEstimationora avverte correttamente se viene passato come input un oggettoEstimationProblemcon una proprietàis_good_stateimpostata viene passato come input, poiché non è supportato e viene ignorato. In precedenza, l'algoritmo ignorava silenziosamente questa opzione, dando luogo a risultati inaspettati. -
QuantumCircuit.append()ora solleva correttamente un errore se viene dato un numero errato di bit classici da applicare a un'operazione. Correzione #9385. -
Il
BarrierBeforeFinalMeasurementseMergeAdjacentBarriersin precedenza avevano un ordine non deterministico delle istruzioni emesseBarrieristruzioni emesse. Questo non cambiava la semantica dei circuiti ma poteva, in casi limitati in cui c'erano barriere non a larghezza piena, far sì che i passaggi successivi del transpiler stocastico vedessero un diverso ordinamento topologico del circuito e di conseguenza avessero uscite diverse per semi fissi. I passaggi sono stati resi deterministici per evitare questo problema. -
Il tipo di ritorno di
run()sarà sempre uguale a quello del suo primo parametro. Il passaggio di un singolo circuito restituisce un singolo circuito, mentre il passaggio di un elenco di circuiti, anche di lunghezza 1, restituisce un elenco di circuiti. Vedere il numero 9798. -
Corretto un bug per cui
PauliOp.adjoint()non restituiva un valore corretto per le Paulis con coefficienti complessi, comePauliOp(Pauli("iX")). Corretto #9433. -
Corretto un problema con la funzione del cassetto dei circuiti
circuit_drawer()eQuantumCircuit.draw()quando si visualizzano parametri di istruzione di tipoQuantumCircuitche dava luogo a un disegno illeggibile. Corretto #9908 -
Corretto un problema con la funzione del cassetto dei circuiti
circuit_drawer()eQuantumCircuit.draw()quando si utilizzava il metodotexte l'argomentovertical_compression="low", in cui veniva utilizzato un carattere errato per l'angolo superiore destro delle caselle utilizzate per rappresentare le porte nel circuito. -
È stato risolto un problema con il metodo
Gate.control()che in precedenza gestiva in modo errato i tipi di inputstroNoneper l'argomentoctrl_state. -
Corretto un caso limite nella costruzione delle istanze
Pauliuna stringa con una fase opzionale e nessun qubit è ora un'etichetta valida, rendendo un operatore senza qubit (comePauli("-i")). Questo era già possibile quando si utilizzavano i moduli array o le fette vuote. Corretto #9720. -
È stato risolto un problema durante l'utilizzo della macro
pulsemeasure()quando si lavora con un backend basato suBackendV2basato su backend. In precedenza, provando a usareqiskit.pulse.macros.measure()con un backend basato suBackendV2avrebbe dato luogo a un errore. Corretto #9488 -
È stato risolto un problema con la funzione
marginal_distribution()che sollevava erroneamente un errore quando un dizionario di conteggi in ingresso utilizzava un tipo numpy integer invece del tipo Python int. La funzione sottostante gestisce sempre correttamente i diversi tipi, ma in precedenza il controllo del tipo di ingresso sollevava erroneamente unTypeErrorin questo caso. -
Corretto un bug per cui
Parameter.is_real()non restituivaNonequando il parametro non era vincolato. Corretto #8619. -
I circuiti contenenti
C3SXGatepossono ora essere emessi e riletti in modo sicuro dall'esportatore OpenQASM 2.0 (QuantumCircuit.qasm()) e dal parser (QuantumCircuit.from_qasm_str()). -
Corretto un bug in QPY (
qiskit.qpy) in cui i circuiti contenenti porte di classeMCXGate,MCXGrayCode, eMCXRecursive, eMCXVChainnon venivano serializzati. Vedere il numero 9390. -
Corretto il routing del transpiler passa
StochasticSwap,SabreSwap,LookaheadSwap, eBasicSwapin modo che sollevino coerentemente un erroreTranspilerErrorquando viene chiamato il rispettivo metodo.run()se i passaggi sono stati inizializzati concoupling_map=None. In precedenza, questi passaggi sollevavano errori in questo caso, ma erano tutti causati da effetti collaterali e l'eccezione specifica non era prevedibile. Corretto #7127 -
L'impostazione manuale di un elemento in
QuantumCircuit.dataconsentirà ora correttamente che l'operazione sia qualsiasi oggetto che implementi il metodoOperatione non solo un oggettocircuit.Instruction. Si noti che qualsiasi mutazione manuale diQuantumCircuit.dataè sconsigliata; di solito non è più efficiente della creazione di un nuovo oggetto circuito, poiché la verifica degli invarianti che circondano gli oggetti parametrati può essere sorprendentemente costosa. -
Corretto un bug quando si costruisce
DAGDependencydall'interno del passaggioTemplateOptimizationche poteva portare a ottimizzazioni errate. -
Corretto un bug in
TensoredOp.to_matrix()in cui il coefficiente globale dell'operatore veniva moltiplicato alla matrice finale più di una volta. Ora, il coefficiente globale viene applicato in modo corretto, indipendentemente dal numero di operatori o stati tensurati. Corretto #9398. -
Corretta la gestione della fase globale nel
UnrollCustomDefinitionsse l'istruzione in questione aveva una fase globale, ma nessuna istruzione nel suo campo di definizione. -
Corretta l'annotazione del tipo per la funzione
transpile()funzione. Il tipo di ritorno viene ora ristretto correttamente a seconda che sia stato passato un singolo circuito o un elenco di circuiti. -
Corretto un bug per cui
IterativePhaseEstimationgenerava il circuito sbagliato, causando il fallimento dell'algoritmo in casi semplici. Corretto #9280. -
È stato risolto un bug che consentiva la trasmissione quando un oggetto
PauliListè inizializzato daPaulio etichette. Ad esempio, il codicePauliList(["XXX", "Z"])ora solleva unValueErrorinvece di costruire l'equivalente diPauliList(["XXX", "ZZZ"]). -
L'esportatore di OpenQASM 2 (
QuantumCircuit.qasm()) non emetterà più definizioni duplicate per le porte che appaiono nelle definizioni di altre porte. Vedere i numeri #7771, #8086, #8402, #8558 e #9805. -
L'esportatore di OpenQASM 2 (
QuantumCircuit.qasm()) ora gestisce le definizioni multiple e annidate diUnitaryGate. Vedere i numeri 4623, 6712, 7772 e 8222. -
L'esportatore di OpenQASM 2 (
QuantumCircuit.qasm()) produce ora le definizioni delle porte utilizzate solo nelle definizioni di altre porte in un ordine corretto. Vedere i numeri #7769 e #7773. -
I gate standard definiti da Qiskit, come ad esempio
RZXGateavranno ora definizioni correttamente parametrate quando vengono esportati con l'esportatore OpenQASM 2 (QuantumCircuit.qasm()). Vedere #7172. -
I circuiti volumetrici quantistici (
QuantumVolume) sono ora supportati dall'esportatore di OpenQASM 2 (QuantumCircuit.qasm()). Vedere #6466 e #7051. -
L'esportatore OpenQASM 2 ora emette i gate senza definizione nota con le dichiarazioni
opaque, invece di fallire. Vedere il n. 5036. -
È stato risolto un problema che impediva a
transpile()di funzionare quando veniva passato un elenco di oggettiCouplingMapè stato risolto. Si noti che il passaggio di un tale elenco di mappe di accoppiamento è deprecato e non sarà più possibile a partire da Qiskit Terra 0.25. Correzioni #9885. -
Prima di questa versione, l'argomento
figsizediplot_bloch_multivector()non veniva utilizzato dalla visualizzazione, rendendo impossibile modificarne le dimensioni (ad esempio per rimpicciolirlo per gli stati a singolo qubit). Questa versione risolve il problema introducendo l'uso dell'argomentofigsize. -
Corretto un problema in
transpile()conoptimization_level=1(così come nei gestori di passaggi preimpostati restituiti dagenerate_preset_pass_manager()elevel_1_pass_manager()) per cui in precedenza se gli argomentirouting_methodelayout_methodnon erano impostati e nel circuito non erano presenti operazioni di flusso di controllo, nei casi in cui era richiesto l'instradamento il passaggio di transpiler non veniva eseguitoVF2PostLayoutnon veniva eseguito il passaggio del transpiler. Questo è il comportamento opposto a quello previsto, perchéVF2PostLayoutha lo scopo di trovare un layout potenzialmente più performante dopo l'esecuzione di un passaggio euristico di layout e di instradamento. Corretto #9936 -
Costruzione di un
Statevectorda un oggettoQuantumCircuitcontenente operazioni a zero-qubit non darà più luogo a un errore. Queste operazioni conferiscono una fase globale al vettore di stato risultante. -
Corretto un problema nei passaggi del tranpiler per i ritardi di padding, che non rispettava i vincoli del target e inseriva ritardi anche per i qubit che non supportavano le istruzioni
Delayistruzione.PadDelayePadDynamicalDecouplingsono fissate in modo da non imbottire il tempo di inattività dei qubit in modo tale che il target non supporti le istruzioniDelayper i qubit. Anche i passaggi di schedulazione legacyASAPScheduleeALAPSchedule, che imbottiscono i ritardi internamente, vengono corretti allo stesso modo. Inoltre,transpile()è stato corretto per chiamarePadDelaycon un oggettotarget, in modo da funzionare correttamente quando viene chiamato con l'opzionescheduling_method. Corretto #9993 -
Corrette le annotazioni sul tipo del metodo
QuantumCircuit.assign_parameters()per riflettere correttamente il cambiamento del tipo di ritorno a seconda del valore dell'argomentoinplace. -
È stato risolto un problema di scalabilità delle prestazioni con le funzioni
VF2LayouteVF2PostLayoutnei gestori di passaggi preimpostati etranspile()che si verificava durante la trasposizione di circuiti con molti componenti collegati su dispositivi di grandi dimensioni. Ora il transpiler passa a impostare dei limiti massimi sul numero di layout potenziali che verranno valutati. -
È stato risolto un problema nella funzione
state_to_latex()che poteva produrre LaTeX non valido a causa dell'arrotondamento involontario dei coefficienti. Questo potrebbe anche causare errori quando viene richiamato il sitostate_drawer(). Corretto #9297.
Aer 0.12.0
Nessuna modifica
IBM Q Fornitore 0.20.2
Nessuna modifica