Skip to main content
IBM Quantum Platform

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'attributo QuantumCircuit.layout attributo.

Correzioni di bug

  • Corretta la deserializzazione delle DiagonalGate attraverso 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 BasicSwap che impediva al metodo BasicSwap.run() se l'argomento della parola chiave fake_run era impostato su True quando la classe veniva istanziata. Corretto #10147

  • È stato risolto un problema con la copia dei circuiti con il nuovo stile di Clbits e Qubits (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 CheckMap non 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() e measure_all() quando le funzioni sono chiamate con l'opzione BackendV2 backend.

  • 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.primitives non causerà più avvisi di deprecazione derivanti dal modulo deprecato qiskit.opflow deprecato. Questi avvertimenti sarebbero stati nascosti agli utenti dai filtri predefiniti di Python, ma hanno innescato l'importazione desiderosa di opflow, 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 classe GroverOperator potrebbero 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 UnitarySynthesis quando si usa il parametro target : i circuiti con flusso di controllo non venivano mappati correttamente sulla destinazione.

  • Corretto il bug in VQD in cui result.optimal_values era una copia di result.optimal_points. Ora restituisce i valori corrispondenti. Corretto #10263

  • Migliorati i messaggi di errore restituiti quando un tentativo di convertire un'espressione completamente vincolata ParameterExpression in un float o int concreto fallisce, ad esempio perché l'espressione è naturalmente un numero complesso. Corretto #9187

  • Conversioni fisse di float per ParameterExpression che 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 e ParameterExpression.is_real() fosse vero. Corretto #10191

  • Corretta la qpy serializzazione di QuantumCircuit.layout attribue. In precedenza, l'attributo layout veniva 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-cu11 e l'utilizzo del pacchetto qiskit-aer-gpu richiede ora CUDA 12. Se siete già utenti del pacchetto qiskit-aer-gpu e volete usare CUDA 11, dovrete eseguire il programma:

    pip uninstall qiskit-aer-gpu && pip install -U qiskit-aer-gpu-cu11

    per passare dalle release del pacchetto qiskit-aer-gpu precedentemente 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 pacchetto qiskit-aer-gpu come 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é includono AerCircuits. Questo commit rende i risultati serializzabili, rimuovendo AerCircuits 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.qubits per 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-aer

e importarlo come:

import qiskit_aer

A 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 Estimator quando abelian_grouping=True.

Note sull'aggiornamento

  • Prestazioni migliorate quando gli stessi circuiti e più parametri vengono passati a Estimator con approximation=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 in AER::Transpile::CircuitOptimization. Originariamente anche json_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::CircuitOptimization non copia AER::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 AerSimulator modificava 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 aggiorna NoiseModel.from_backend() e basic_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.

  • AerCircuit viene 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 aggiunge barrier() 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 specificato run_options . Questa correzione consente la simulazione di Qobj senza run_options.

  • Da 0.12.0, AerConfig viene 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.

  • QuantumCircuit supporta 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 deprecato omp_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 di Instruction nel circuito, invece di legare i valori avvolti all'interno di un oggetto ParameterExpression. Questa modifica dovrebbe avere un impatto minimo sull'utente, poiché float(QuantumCircuit.data[i].operation.params[j]) produce ancora un float (ed è l'unico modo per accedere al valore di un oggetto ParameterExpression). Inoltre, Instruction() potrebbe già essere float , così come un parametro a ParameterExpressionquindi 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 utilizza isinstance per verificare la presenza di ParameterExpression e si comporta in modo diverso a seconda del risultato. Inoltre, qpy serializza il valore numerico in un bound ParameterExpression con una precisione diversa da quella di float (si veda anche la nota di correzione del bug relativo a QuantumCircuit.assign_parameters()).

Correzioni di bug

  • Aggiornato plot_gate_map(), plot_error_map(), e plot_circuit_layout() per supportare mappe di accoppiamento heavy-hex a 433 qubit. Questo permette di accoppiare le visualizzazioni delle mappe con il backend IBM Quantum ibm_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 a QuantumCircuit.assign_parameters().

  • Corretto un bug in BlockCollapser per cui i bit classici venivano ignorati quando si collassava un blocco di nodi.

  • Corretto un bug in replace_block_with_op() e replace_block_with_op() che portava a ignorare i bit classici.

  • È stato risolto un bug in QuantumCircuit.compose() in cui l'attributo SwitchCaseOp.target del sottocircuito non veniva correttamente mappato su un registro del circuito di base.

  • Correzione di un bug in RZXCalibrationBuilder in 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 previsto MissingOptionalLibrary. Corretto #10079

  • L'uso di initial_layout nelle chiamate a transpile() 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 precedente QuantumCircuit.mcrz() si usa QuantumCircuit.mcp().

  • Corretto un problema con il costruttore PassManagerConfig.from_backend() quando si costruisce un oggetto PassManagerConfig da un'istanza BackendV1 che non aveva un attributo di mappa di accoppiamento definito. In precedenza, il costruttore creava in modo errato un oggetto CouplingMap con 0 qubit, invece di usare None. 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 Optimize1qGatesDecomposition in parallelo generava un errore dovuto al fatto che OneQubitGateErrorMap non era decapabile.

  • Correzione di un bug nel menu VF2Layout e VF2PostLayout in 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:

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(), e deprecate_func() al modulo qiskit.utils al 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 con help(). I decoratori di deprezzamento da qiskit.utils chiamano add_deprecation_to_docstring() già per voi; ma potete chiamarlo direttamente se state usando meccanismi diversi per le deprecazioni.

    @deprecate_func sostituisce @deprecate_function e si usa per deprecare un'intera funzione. Genererà automaticamente la maggior parte dei messaggi di deprezzamento.

    @deprecate_arg sostituisce @deprecate_arguments e 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 un predicate in 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 HLSConfig l'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 di HighLevelSynthesisPlugin e 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 di HighLevelSynthesisPlugin. 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 CouplingMap per avere una connettività disgiunta. In precedenza, un CouplingMap poteva essere costruito solo se il grafo era connesso. Ciò consentirà di utilizzare CouplingMap per 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 di CouplingMap componenti di un sottografo disgiunto CouplingMap. Se l'oggetto CouplingMap è collegato, restituirà un singolo oggetto CouplingMap equivalente 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 LinearFunction e per qiskit.quantum_info.Cliffordestendendo l'insieme dei metodi di sintesi che possono essere richiamati da HighLevelSynthesis da un passaggio del transpiler.

    Per LinearFunction i plugin disponibili sono elencati di seguito:

    Nome del plugin
    Plugin di sintesi ad alto livello
    defaultDefaultSynthesisLinearFunction
    kmsKMSSynthesisLinearFunction
    pmhPMHSynthesisLinearFunction

    Per qiskit.quantum_info.Clifford i plugin disponibili sono elencati di seguito:

    Nome del plugin
    Plugin di sintesi ad alto livello
    defaultDefaultSynthesisClifford
    agAGSynthesisClifford
    bmBMSynthesisClifford
    greedyGreedySynthesisClifford
    layersLayerSynthesisClifford
    lnnLayerLnnSynthesisClifford

    Per ulteriori informazioni su ogni singolo metodo, consultare la qiskit.synthesis per 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, MinimumPoint che viene utilizzato principalmente come passaggio per verificare una condizione di ciclo in un file PassManager. 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 metodo FixedPoint che 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 metodo DAGCircuit per 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 un DAGCircuitError viene 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, e synth_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 CRZGate in un RZZGate più RZGate o a CRYGate a un singolo RZXGate più 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, a circuit_to_dag() per abilitare la disabilitazione opzionale della copia profonda delle operazioni dall'input QuantumCircuit all'uscita QuantumCircuit. 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'input QuantumCircuit viene scartato.

  • È stata aggiunta una nuova opzione, copy_operations, a dag_to_circuit() per abilitare la disabilitazione opzionale della copia profonda delle operazioni dall'input DAGCircuit all'uscita QuantumCircuit. Nei casi in cui l'input DAGCircuit non 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'input DAGCircuit viene scartato.

  • Aggiunta di una nuova funzione passmanager_stage_plugins() al modulo qiskit.transpiler.preset_passmanagers.plugin modulo. 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 Error ora accetta anche input richiamabili per il suo parametro msg . Se utilizzate, queste callable di input passeranno l'attributo property_set del 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" , dove n è la dimensione del circuito impostata nel set di proprietà (in genere dalla precedente esecuzione del passaggio) Size passaggio).

  • Il metodo build_coupling_map() ha un nuovo argomento chiave, filter_idle_qubits che, se impostato a True , rimuove dall'output tutti i qubit che non supportano alcuna operazione CouplingMap che non supportano alcuna operazione.

  • Il passaggio GateDirection transpiler può ora gestire correttamente SwapGate che 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 RZXCalibrationBuilder e RZXCalibrationBuilderNoEcho ora useranno correttamente un gate di entangling ECRGate per 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 era CXGate.

  • Aggiunto un nuovo costruttore per la classe Target per la classe Target.from_configuration()che consente di costruire un oggetto Target dai 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 Target che ha UGate, CXGate, e Measure disponibili 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 disponibile qiskit.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-5 QuantumVolume per una mappa di accoppiamento heavy-hex a 1081-qubit è approssimativamente dimezzato.

  • Le prestazioni di runtime del Optimize1qGatesDecomposition transpiler è 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 di transpile() con l'argomento della parola chiave optimization_level impostato su 1, 2, o 3.

  • 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 SabreLayout supporta ora l'esecuzione contro un bersaglio con un file disgiunto CouplingMap. Quando si punta a un accoppiamento disgiunto, l'ingresso DAGCircuit viene suddiviso nelle sue componenti connesse di qubit virtuali, ogni componente viene mappato sulle componenti connesse dell'oggetto CouplingMapil layout viene eseguito su ciascun componente collegato in modo isolato, quindi tutti i layout vengono combinati e restituiti. Si noti che quando l'argomento routing_pass è impostato, il passaggio non supporta l'esecuzione con connettività disgiunte.

  • I seguenti passaggi del transpiler di layout e routing dei moduli qiskit.transpiler.passes supporteranno ora l'accettazione di un oggetto Target che viene usato per modellare i vincoli di un backend di destinazione tramite il primo argomento posizionale (attualmente chiamato coupling_map o backend_properties).

    L'elenco dei passaggi con il nuovo supporto per Target sono:

  • La funzione di aiuto alla costruzione del gestore di passaggi generate_embed_passmanager() accetta ora anche un parametro Target come unico argomento posizionale (attualmente chiamato coupling_map). Questo può essere utilizzato per costruire un'incorporazione di layout PassManager da un Target invece che da un oggetto CouplingMap.

  • I seguenti passaggi del transpiler di layout e routing dei moduli qiskit.transpiler.passes hanno una nuova parola chiave, target , che accetta un oggetto Target che viene usato per modellare i vincoli di un backend di destinazione. Se viene specificato l'argomento della parola chiave target , 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 di CouplingMap, InstructionScheduleMap o un elenco di gate di base. L'elenco di questi passaggi con il nuovo argomento target è il seguente:

  • La funzione di aiuto alla costruzione del gestore di passaggi generate_scheduling() ha un nuovo argomento chiave target , utilizzato per specificare un oggetto Target per modellare i vincoli del backend di destinazione per il quale si sta compilando, quando si genera un nuovo file PassManager. Se specificato, questo nuovo argomento sostituisce l'altro inst_map.

  • Il plugin default utilizzato dal UnitarySynthesis sceglie ora la sintesi unitaria a uno e due qubit in base ai tassi di errore riportati nel file Target. 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 UnitarySynthesisPlugin ha due nuove proprietà opzionali supports_gate_lengths_by_qubit e supports_gate_errors_by_qubit che, se impostate, aggiungono rispettivamente i campi gate_lengths_by_qubit e gate_errors_by_qubit alle opzioni di input del metodo run() del plugin. Questi nuovi campi sono una visione alternativa dei dati forniti da gate_lengths e gate_errors , ma hanno la forma: {(qubits,): [Gate, length]} (dove Gate è l'istanza di Gate per 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 qualsiasi ForLoopOp in un circuito. Questo passaggio srotola i cicli for quando è possibile, se non ci sono ContinueLoopOp o BreakLoopOp all'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")
    _images/legacy_release_notes-1.png
  • È stato aggiunto un nuovo parametro max_trials da passare VF2PostLayout che, se specificato, limita il numero di layout scoperti e confrontati durante la ricerca del layout migliore. Questo differisce dai parametri esistenti call_limit e time_limit (che sono usati per limitare il numero di visite agli stati eseguite dall'algoritmo VF2 e il tempo totale impiegato da pass VF2PostLayoutrispettivamente), 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 CheckMap ha 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 file PassManager in campi diversi.

Caratteristiche dei circuiti
  • Aggiunta di una nuova classe gate, GlobalPhaseGateche può essere usata per aggiungere una fase globale sull'istanza QuantumCircuit istanza.

  • Aggiunto un nuovo attributo, layout, alla classe QuantumCircuit alla classe. Questo attributo è tipicamente popolato da transpile() o PassManager.run() (quando la fase di layout e la fase di instradamento vengono eseguite nella classe PassManager) e contiene un attributo TranspileLayout che contiene le informazioni sulla permutazione del circuito di ingresso durante l'esecuzione del progetto transpile().

  • Aggiunto un nuovo argomento, var_order, al costruttore della classe PhaseOracle per 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() e qasm2.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() e QuantumCircuit.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 del qiskit.qasm2 per tutti i dettagli e ulteriori esempi.

  • Migliorare la decomposizione di rotazioni Pauli-X e Pauli-Y a più controlli con QuantumCircuit.mcrx() e QuantumCircuit.mcry on :math:`n() controlli a 16n4016n - 40 porte CX, per n4n \geq 4. Questo miglioramento si basa su arXiv:2302.06377.

  • Qiskit supporta ora la rappresentazione degli enunciati switch , utilizzando la nuova istruzione 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. Più valori possono puntare allo stesso circuito e CASE_DEFAULT può 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 possono transpile() contenenti circuiti (se il backend pubblicizza il supporto per il costrutto) e la serializzazione avverrà in QPY.

    La dichiarazione switch non è 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 dichiarazione switch (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_threshold alla classe AdaptVQE per configurare un nuovo tipo di soglia per terminare l'algoritmo quando l'autovalore cambia meno di un valore stabilito.

  • Aggiunto un nuovo attributo gradient_threshold alla classe AdaptVQE che sostituirà l'attributo threshold in futuro. Questo nuovo attributo si comporta come l'attributo esistente threshold , ma ha un nome più preciso, data l'introduzione di opzioni di soglia aggiuntive nella classe.

  • È stato aggiunto l'attributo EstimationProblem.has_good_state che consente di verificare se un elemento EstimationProblem ha un nome personalizzato EstimationProblem.is_good_state o se è quello predefinito. Questo è utile per i controlli negli stimatori di ampiezza, come ad esempio AmplitudeEstimationche supportano solo l'implementazione predefinita.

  • Aggiunge un flag local alla classe ComputeUncompute che 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 TrotterQRTE classe. Per facilitare il lavoro con questo, è stato aggiunto l'attributo num_timesteps e un argomento di parola chiave corrispondente al costruttore TrotterQRTE per 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 TrotterQRTE classe. L'attributo TimeEvolutionProblem.aux_operators viene valutato a ogni passo temporale se l'attributo ProductFormula.reps dell'argomento di input product_formula nel costruttore è impostato su 1.

  • Aggiunte estensioni all'algoritmo VQD che consentono di passare un elenco di ottimizzatori e di punti iniziali per le diverse corse di minimizzazione. Ad esempio, il k-esimo punto iniziale e il k-esimo ottimizzatore saranno utilizzati per l'ottimizzazione del k-1-esimo stato previsto.

Caratteristiche dell'informazione quantistica
  • Aggiunti due nuovi metodi costruttori, Clifford.from_matrix() e Clifford.from_operator()che creano un oggetto Clifford dalla sua matrice unitaria e dalla rappresentazione dell'operatore, rispettivamente.

  • Il costruttore di Clifford può ora accettare qualsiasi oggetto porta Clifford fino a 3 qubit, purché implementi un metodo to_matrix , comprese porte parametrizzate come Rz(pi/2), che prima non erano convertibili.

  • Aggiunte nuove funzioni di utilità: commutator(), anti_commutator(), e double_commutator() che vengono utilizzate per calcolare i commutatori per qualsiasi oggetto che implementa la classe base astratta LinearOp come QuantumChannel, SparsePauliOp, o ScalarOp.

  • 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 {II,XX,YY,ZZ}\{II, XX, -YY, ZZ\} e quindi può essere generato da [XX,ZZ][XX, ZZ], [XX,YY][XX, -YY] o [YY,ZZ][-YY, ZZ].

  • Aggiunto un nuovo metodo, partial_transpose(), al modulo qiskit.quantum_info del modulo DensityMatrix del 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 P.O.PP^\dagger.O.P 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 SparsePauliOp oggetti con ParameterExpression senza 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'attributo SparsePauliOp.parameters per assegnare e interrogare parametri non vincolati all'interno di un file SparsePauliOp. 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 SymbolicPulse alla libreria degli impulsi (qiskit.pulse.library) I nuovi impulsi della libreria sono:

    Queste nuove classi sono istanze di ScalableSymbolicPulse. Ad eccezione della fase Sawtooth , il comportamento è identico a quello della corrispondente funzione di generatore di forme d'onda (ad es. sin()). La fase per la classe Sawtooth è definita in modo tale che una fase di 2π2\pi si sposti di un ciclo completo.

  • Aggiunto il supporto a QPY (qiskit.qpy) per lavorare con istanze di impulsi ScheduleBlock con 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 oggetto Target questo 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 BackendV2Converter ha un nuovo argomento di parola chiave, filter_faulty, nel suo costruttore. Quando questo argomento è impostato su True , la classe convertitore filtrerà tutti i qubit o le operazioni elencate come non operative nel payload dell'input BackendProperties per l'ingresso BackendV1. Sebbene non sia molto utilizzato, un BackendProperties supporta 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 di BackendV2 e il suo Target includevano 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 file Target. 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 file Target.

  • La classe Options implementa ora il protocollo Mapping e il metodo __setitem__ . Questo significa che Options offrono 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 di StagedPassManager istanza. 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 funzione plot_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 nn qubit e figsize è impostato su (w, h), la larghezza complessiva della figura è impostata su nwn \cdot w, mentre l'altezza complessiva è impostata su hh.

  • Aggiunto un nuovo argomento di parola chiave, font_size, alla funzione plot_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_size e title_pad, alla funzione plot_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() e BaseEstimator.run() non si bloccano finché non viene chiamato il metodo PrimitiveJob.result() .

Note sull'aggiornamento del transpiler
  • Il numero massimo di prove valutate durante la ricerca del layout migliore utilizzando VF2Layout e VF2PostLayout è ora limitato in level_1_pass_manager(), level_2_pass_manager(), e level_3_pass_manager() a 2 500, 25 000, e 250 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 manualmente VF2PostLayout sul circuito transpilato in modalità rigorosa, specificando 0 per max_trials.

  • L'attributo condition della classe DAGDepNode è stato rimosso. È stato contrassegnato come deprecato nella versione 0.18 (07-2021). Si dovrebbe invece usare l'attributo condition dell'attributo op per accedere alla condizione di un nodo operazione. Per gli altri tipi di nodo non c'è alcuna condizione di accesso.

  • Il valore predefinito di metadata in entrambi i campi DAGCircuit e DAGDependency è stato cambiato da None a {} per compatibilità con l'attributo corrispondente metadata di QuantumCircuit.

  • 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 utilizza CouplingMap() == CouplingMap() per verificare l'uguaglianza degli oggetti deve essere aggiornato a CouplingMap() is CouplingMap().

  • Quando si esegue la funzione transpile() con un backend BackendV1 o con un argomento della parola chiave BackendProperties tramite l'argomento della parola chiave backend_properties che 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 cui transpile() 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 in BackendProperties per segnalare un qubit o un gate come difettoso. Se ci si affidava a transpile() per effettuare questa rimappatura, ora dovrete farlo manualmente e passare agli argomenti coupling_map e backend_properties un 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 SabreSwap e SabreLayout, 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 QuantumCircuit metadata restituisce sempre un dizionario e può essere impostato solo su un dizionario. In precedenza, il valore predefinito era None e poteva essere impostato manualmente su None o su un dizionario.
Note sull'aggiornamento degli algoritmi
  • I moduli deprecati factorizers e linear_solvers, contenenti HHL e Shor sono stati rimossi da qiskit.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ù KeyErrorValueError quando mancano dei qubit nell'istruzione di destinazione o inst_name_map non è fornito per l'istruzione non definita. Nel primo caso, ignora semplicemente la definizione dell'input InstructionScheduleMapper i qubit non definiti. In quest'ultimo caso, una mappatura del gate viene estratta dai gate standard di Qiskit e infine, un oggetto opaco personalizzato Gate personalizzato viene definito a partire dal nome del programma, se non viene trovata alcuna mappatura.
Note sull'aggiornamento dei provider
  • L'argomento deprecato max_credits di execute(), assemble() e tutte le configurazioni di Qobj (ad es. QasmQobjConfig e PulseQobjConfig) è stato rimosso. Questa argomentazione risale alle prime versioni di Qiskit, che era più strettamente legato all'offerta di servizi IBM Quantum. All'epoca il campo max_credits faceva 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 implementazione BackendV2 esponga un campo max_credits nel suo oggetto Options oggetto.

  • L'attributo name sulla classe BackendV2 basato su classi backend false in qiskit.providers.fake_provider sono cambiati rispetto alle versioni precedenti. In precedenza, i nomi avevano un suffisso "_v2" per differenziare la classe dalla versione BackendV1 versione. Questo suffisso è stato rimosso perché potrebbe causare incongruenze con altri dati snapshottati usati per costruire l'oggetto backend.

Note di deprecazione

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_alignment nella classe Target è stato sostituito dall'ortografia corretta acquire_alignment. I vecchi argomenti del costruttore aquire_alignment e Target.aquire_alignment sono deprecati e saranno rimossi in una prossima versione. Utilizzare invece Target.acquire_alignment per ottenere e impostare il valore del vincolo di allineamento.

Circuiti deprecati
  • Impostazione del QuantumCircuit metadata a None è 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
Deprecazioni delle informazioni quantistiche
  • PauliTable e StabilizerTable sono deprecati e saranno rimossi in una prossima versione. Si deve invece utilizzare il simbolo PauliList dovrebbe essere utilizzato. Con questa modifica, table() è stato deprecato, in modo che si possa operare direttamente da tableau() senza di esso.
Deprecazioni Pulse
  • L'assegnazione di valori complessi a ParameterExpression in qualsiasi oggetto Qiskit Pulse solleva ora un PendingDeprecationWarning. 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 classe ScalableSymbolicPulse . 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 AmplitudeEstimation ora avverte correttamente se viene passato come input un oggetto EstimationProblem con una proprietà is_good_state impostata 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 BarrierBeforeFinalMeasurements e MergeAdjacentBarriers in precedenza avevano un ordine non deterministico delle istruzioni emesse Barrier istruzioni 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, come PauliOp(Pauli("iX")). Corretto #9433.

  • Corretto un problema con la funzione del cassetto dei circuiti circuit_drawer() e QuantumCircuit.draw() quando si visualizzano parametri di istruzione di tipo QuantumCircuit che dava luogo a un disegno illeggibile. Corretto #9908

  • Corretto un problema con la funzione del cassetto dei circuiti circuit_drawer() e QuantumCircuit.draw() quando si utilizzava il metodo text e l'argomento vertical_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 input str o None per l'argomento ctrl_state .

  • Corretto un caso limite nella costruzione delle istanze Pauli una stringa con una fase opzionale e nessun qubit è ora un'etichetta valida, rendendo un operatore senza qubit (come Pauli("-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 su BackendV2 basato su backend. In precedenza, provando a usare qiskit.pulse.macros.measure() con un backend basato su BackendV2 avrebbe 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 un TypeError in questo caso.

  • Corretto un bug per cui Parameter.is_real() non restituiva None quando il parametro non era vincolato. Corretto #8619.

  • I circuiti contenenti C3SXGate possono 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 classe MCXGate, MCXGrayCode, e MCXRecursive, e MCXVChain non venivano serializzati. Vedere il numero 9390.

  • Corretto il routing del transpiler passa StochasticSwap, SabreSwap, LookaheadSwap, e BasicSwap in modo che sollevino coerentemente un errore TranspilerError quando viene chiamato il rispettivo metodo .run() se i passaggi sono stati inizializzati con coupling_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.data consentirà ora correttamente che l'operazione sia qualsiasi oggetto che implementi il metodo Operatione non solo un oggetto circuit.Instruction. Si noti che qualsiasi mutazione manuale di QuantumCircuit.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 DAGDependency dall'interno del passaggio TemplateOptimization che 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 UnrollCustomDefinitions se 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 IterativePhaseEstimation generava 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 da Paulio etichette. Ad esempio, il codice PauliList(["XXX", "Z"]) ora solleva un ValueError invece di costruire l'equivalente di PauliList(["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 di UnitaryGate. 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 oggetti CouplingMap è 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 figsize di plot_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'argomento figsize .

  • Corretto un problema in transpile() con optimization_level=1 (così come nei gestori di passaggi preimpostati restituiti da generate_preset_pass_manager() e level_1_pass_manager()) per cui in precedenza se gli argomenti routing_method e layout_method non 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 eseguito VF2PostLayout non veniva eseguito il passaggio del transpiler. Questo è il comportamento opposto a quello previsto, perché VF2PostLayout ha 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 Statevector da un oggetto QuantumCircuit contenente 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 Delay istruzione. PadDelay e PadDynamicalDecoupling sono fissate in modo da non imbottire il tempo di inattività dei qubit in modo tale che il target non supporti le istruzioni Delay per i qubit. Anche i passaggi di schedulazione legacy ASAPSchedule e ALAPSchedule, che imbottiscono i ritardi internamente, vengono corretti allo stesso modo. Inoltre, transpile() è stato corretto per chiamare PadDelay con un oggetto target , in modo da funzionare correttamente quando viene chiamato con l'opzione scheduling_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'argomento inplace .

  • È stato risolto un problema di scalabilità delle prestazioni con le funzioni VF2Layout e VF2PostLayout nei gestori di passaggi preimpostati e transpile()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 sito state_drawer() . Corretto #9297.

Aer 0.12.0

Nessuna modifica

IBM Q Fornitore 0.20.2

Nessuna modifica

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