Note di rilascio di Qiskit 0.7
0.7
In Qiskit 0.7 abbiamo introdotto Qiskit Aer e lo abbiamo combinato con Qiskit Terra.
Terra 0.7
Nuove funzioni
Questa versione include diverse nuove funzionalità e molte correzioni di bug. Con questa release le interfacce per le visualizzazioni di diagrammi di circuito, istogrammi, vettori di Bloch e stati sono dichiarate stabili. Inoltre, questa versione include un ordine di bit/endianità definito e standardizzato in tutti gli aspetti di Qiskit. Queste sono tutte interfacce dichiarate stabili in questo rilascio, che non subiranno modifiche di rottura in futuro, a meno che non ci siano appropriati e lunghi periodi di deprecazione che avvertano di eventuali modifiche in arrivo.
Sono state inoltre introdotte le seguenti novità:
- Una nuova modalità di uscita per il disegno di circuiti artistici ASCII
- Una nuova interfaccia di disegno dei circuiti a partire dagli oggetti
QuantumCircuit, che consente alle chiamate dicircuit.draw()oprint(circuit)di eseguire il rendering di un disegno di circuiti - Un visualizzatore per disegnare la rappresentazione DAG di un circuito
- Un nuovo tipo di diagramma di stato quantistico per i diagrammi di Hinton nei diagrammi di stato locali basati su matplotlib
- 2 nuovi metodi costruttori della classe
QuantumCircuitfrom_qasm_str()efrom_qasm_file()che permettono di creare facilmente un oggetto circuito da OpenQASM - Una nuova funzione
plot_bloch_multivector()per tracciare i vettori di Bloch da un vettore di stato o da una matrice di densità tensoriale - I risultati delle misurazioni per colpo sono disponibili nei simulatori e in alcuni dispositivi selezionati. È possibile accedervi impostando il kwarg
memoryaTruequando si chiamacompile()oexecute()e poi accedervi usando il metodoget_memory()sull'oggettoResult. - Un modulo
qiskit.quantum_infocon oggetti Pauli rinnovati e metodi per lavorare con gli stati quantici - Nuovi passaggi transpile per l'analisi e la trasformazione dei circuiti:
CommutationAnalysis,CommutationTransformation,CXCancellation,Decompose,Unroll,Optimize1QGates,CheckMap,CXDirection,BarrierBeforeFinalMeasurements - Nuovi passaggi alternativi di swap mapper nel transpiler:
BasicSwap,LookaheadSwap,StochasticSwap - Infrastruttura di transpiler più avanzata con supporto per i passaggi di analisi, i passaggi di trasformazione, un
property_setglobale per il gestore dei passaggi e il controllo di ripetizione fino a quando dei passaggi
Considerazioni sulla compatibilità
Nell'ambito del rilascio 0.7, i seguenti elementi sono stati deprecati e saranno rimossi o modificati in modo incompatibile con le versioni successive. Anche se non sono strettamente necessari, questi sono elementi da regolare prima del prossimo rilascio per evitare una modifica dirompente.
plot_circuit(),latex_circuit_drawer(),generate_latex_source(), ematplotlib_circuit_drawer()da qiskit.tools.visualization sono deprecati. Si dovrebbe invece usare la funzionecircuit_drawer()dello stesso modulo; ci sono opzioni kwarg per rispecchiare la funzionalità di tutte le funzioni deprecate.- L'attuale output predefinito di
circuit_drawer()(che usa latex e ricorre a python) è deprecato e sarà modificato in modo da usare l'output predefinito ditextnelle prossime versioni. - Le funzioni
qiskit.wrapper.load_qasm_string()eqiskit.wrapper.load_qasm_file()sono deprecate e al loro posto devono essere utilizzati i metodi dei costruttoriQuantumCircuit.from_qasm_str()eQuantumCircuit.from_qasm_file(). - Le chiavi
plot_barriersereverse_bitsnel dizionario dei kwarg distylesono deprecate; al loro posto vanno usati i kwarg diqiskit.tools.visualization.circuit_drawer(),plot_barriersereverse_bits. - Le funzioni
plot_state()eiplot_state()sono state ammortizzate. Invece le funzioniplot_state_*()eiplot_state_*()devono essere richiamate per il metodo di visualizzazione richiesto. - L'argomento
skip_transpilerè stato deprecato dacompile()eexecute(). Si può invece usare direttamentePassManager, basta impostarepass_managersu un oggettoPassManagervuoto conPassManager() - La funzione
transpile_dag()formatkwarg per l'emissione di diversi formati di output è deprecata; si dovrebbe invece convertire l'oggetto di output predefinitoDAGCircuitnel formato desiderato. - Gli srotolatori sono stati deprecati, in futuro sarà supportato solo lo srotolamento da DAG a DAG.
Si noti che in questa versione sono state apportate alcune modifiche compatibili con le versioni precedenti. Le note seguenti contengono informazioni su come adattarsi a questi cambiamenti.
Modifiche agli oggetti Risultato
Nell'ambito della riscrittura dell'oggetto Risultati per renderlo più coerente e per creare un'interfaccia stabile, sono state apportate alcune modifiche al modo in cui si accede ai dati memorizzati nell'oggetto Risultati. Innanzitutto il metodo get_data() è stato rinominato in data(). Questo cambiamento è accompagnato da una modifica del formato dei dati restituiti dalla funzione. Ora restituisce i dati grezzi dai backend invece di eseguire una post-elaborazione. Ad esempio, nelle versioni precedenti si poteva chiamare:
result = execute(circuit, backend).result()
unitary = result.get_data()['unitary']
print(unitary)e che restituirebbe la matrice unitaria come:
[[1+0j, 0+0.5j], [0-0.5j][-1+0j]]Ma ora se si chiama (con il metodo rinominato):
result.data()['unitary']restituirà qualcosa come:
[[[1, 0], [0, -0.5]], [[0, -0.5], [-1, 0]]]Per ottenere i risultati postelaborati nello stesso formato utilizzato prima del rilascio di 0.7, è necessario utilizzare i metodi get_counts(), get_statevector() e get_unitary() sull'oggetto risultato invece di get_data()['counts'], get_data()['statevector'] e get_data()['unitary'] rispettivamente.
Inoltre, è stato rimosso il supporto per len() e l'indicizzazione su un oggetto Result . Si deve invece gestire l'output dei metodi postelaborati sugli oggetti Result.
Inoltre, i metodi get_snapshot() e get_snapshots() della classe Result sono stati rimossi. È invece possibile accedere alle istantanee utilizzando Result.data()['snapshots'].
Modifiche alla visualizzazione
La principale modifica apportata alla visualizzazione nella release 0.7 è la rimozione di Matplotlib e di altre dipendenze di visualizzazione dai requisiti del progetto. Ciò è stato fatto per semplificare i requisiti e la configurazione richiesti per l'installazione di Qiskit. Se si intende usare qualsiasi visualizzazione (comprese tutte le magie di jupyter), tranne gli output text, latex e latex_source per il cassetto dei circuiti, è necessario assicurarsi manualmente che le dipendenze della visualizzazione siano installate. A tal fine, è possibile sfruttare i requisiti opzionali del pacchetto Qiskit Terra:
pip install qiskit-terra[visualization]A parte questo, sono state apportate modifiche a diverse interfacce nell'ambito della stabilizzazione, che possono avere un impatto sul codice esistente. Il primo è che il kwarg basis nella funzione circuit_drawer() non è più accettato. Se ci si affida a circuit_drawer() per regolare le porte di base utilizzate nel disegno di un circuito, è necessario farlo prima di chiamare circuit_drawer(). Ad esempio:
from qiskit.tools import visualization
visualization.circuit_drawer(circuit, basis_gates='x,U,CX')dovrà essere adattato:
from qiskit import BasicAer
from qiskit import transpiler
from qiskit.tools import visualization
backend = BasicAer.backend('qasm_simulator')
draw_circ = transpiler.transpile(circuit, backend, basis_gates='x,U,CX')
visualization.circuit_drawer(draw_circ)In futuro la funzione circuit_drawer() sarà l'unica interfaccia per il disegno dei circuiti nel modulo di visualizzazione. Prima della versione 0.7 esistevano diverse altre funzioni che utilizzavano backend di output diversi o cambiavano l'output per disegnare i circuiti. Tuttavia, tutte le altre funzioni sono state deprecate e tali funzionalità sono state integrate come opzioni in circuit_drawer().
Anche per le altre funzioni di visualizzazione, plot_histogram() e plot_state() , ci sono alcune modifiche da verificare durante l'aggiornamento. La prima è che l'output di queste funzioni è cambiato: nelle versioni precedenti queste funzioni mostravano interattivamente la visualizzazione dell'output. Tuttavia, è stato modificato per restituire un oggetto matplotlib.Figure . Ciò offre una maggiore flessibilità e opzioni per interagire con la visualizzazione prima di salvarla o mostrarla. Ciò richiederà un adeguamento delle modalità di consumo di queste funzioni. Ad esempio, prima di questa versione, quando si chiamava:
plot_histogram(counts)
plot_state(rho)aprirà nuove finestre (a seconda del backend matplotlib) per visualizzare la visualizzazione. Tuttavia, a partire da 0.7, dovrete chiamare show() sull'output per rispecchiare questo comportamento. Ad esempio:
plot_histogram(counts).show()
plot_state(rho).show()oppure:
hist_fig = plot_histogram(counts)
state_fig = plot_state(rho)
hist_fig.show()
state_fig.show()Si noti che questo vale solo per l'esecuzione al di fuori di Jupyter. Non è necessario alcun adattamento all'interno di un ambiente Jupyter, perché i notebook Jupyter comprendono in modo nativo come rendere gli oggetti matplotlib.Figure .
Tuttavia, la restituzione dell'oggetto Figura offre una maggiore flessibilità nella gestione dell'output. Ad esempio, invece di mostrare semplicemente la figura, è possibile salvarla direttamente in un file sfruttando il metodo savefig() . Ad esempio:
hist_fig = plot_histogram(counts)
state_fig = plot_state(rho)
hist_fig.savefig('histogram.png')
state_fig.savefig('state_plot.png')L'altro aspetto chiave che è cambiato con queste funzioni è l'esecuzione sotto jupyter. Nelle versioni 0.6 plot_state() e plot_histogram() , quando si eseguiva sotto jupyter, il comportamento predefinito era quello di usare le trame interattive Javascript se la libreria Javascript ospitata esternamente per il rendering della visualizzazione era raggiungibile in rete. In caso contrario, userebbe semplicemente la versione di matplotlib. Tuttavia, nella versione 0.7 non è più così e si devono usare funzioni separate per i grafici interattivi, iplot_state() e iplot_histogram() . plot_state() e plot_histogram() utilizzano sempre le versioni di matplotlib.
Inoltre, a partire da questa versione, la funzione plot_state() viene deprecata in favore della chiamata di metodi individuali per ogni metodo di rappresentazione di uno stato quantico. La funzione plot_state() continuerà a funzionare fino alla release 0.9, ma emetterà un avviso ogni volta che verrà utilizzata. L'intestazione
Qiskit Terra 0.6 | Qiskit Terra 0.7 + |
|---|---|
| stato_tracciato(rho) | grafico_stato_città(rho) |
| plot_state(rho, method='city') | grafico_stato_città(rho) |
| plot_state(rho, metodo='paulivec') | stato_paulivec(rho) |
| plot_state(rho, metodo='qsphere') | tracciare lo stato della sferaq(rho) |
| plot_state(rho, metodo='bloch') | grafico_bloch_multivettore(rho) |
| plot_state(rho, metodo='hinton') | trama_stato_hinton(rho) |
Lo stesso vale per l'equivalente JS interattivo, iplot_state(). I nomi delle funzioni sono tutti uguali, solo con una i in più per ogni funzione. Ad esempio, iplot_state(rho, method='paulivec') è iplot_state_paulivec(rho).
Modifiche ai backend
Con i miglioramenti apportati nella versione 0.7, ci sono alcune cose relative ai backend da tenere a mente quando si effettua l'aggiornamento. Il cambiamento più importante è la ristrutturazione delle istanze dei provider nello spazio dei nomi principale qiskit` . Il provider Aer non è installato di default e richiede l'installazione del pacchetto qiskit-aer . Questo pacchetto contiene il nuovo simulatore ad alte prestazioni con tutte le funzioni. Se l'installazione è avvenuta tramite pip install qiskit , questo è già installato. I simulatori python sono ora disponibili sotto qiskit.BasicAer e i vecchi simulatori C++ sono disponibili con qiskit.LegacySimulators. Questo significa anche che il fallback implicito ai simulatori basati su python quando i simulatori C++ non vengono trovati non esiste più. Se si richiede un backend locale del simulatore basato su C++ e non lo si trova, verrà sollevata un'eccezione invece di usare il simulatore python.
Inoltre, le funzioni di primo livello register() e available_backends() , precedentemente deprecate, sono state rimosse. Inoltre, i metodi deprecati backend.parameters() e backend.calibration() sono stati rimossi a favore di backend.properties(). Per maggiori dettagli su queste modifiche, si può consultare la sezione delle note di rilascio di 0.6 Lavorare con i backend.
Le chiamate backend.jobs() e backend.retrieve_jobs() non restituiscono più i risultati di questi lavori. È invece necessario richiamare il metodo result() sugli oggetti di lavoro restituiti.
Modifiche al compilatore, al transpiler e agli unroller
Nell'ambito del tentativo di stabilizzare le interfacce del compilatore, sono state apportate diverse modifiche di cui tenere conto quando si utilizzano le funzioni del compilatore. Innanzitutto, è importante notare che la funzione qiskit.transpiler.transpile() ora prende un oggetto QuantumCircuit (o un elenco di oggetti) e restituisce un oggetto QuantumCircuit (o un elenco di oggetti). L'elaborazione del DAG viene ora eseguita internamente.
È inoltre possibile passare facilmente da un circuito all'altro, da un DAG all'altro e da un Qobj all'altro utilizzando le funzioni di qiskit.converters.
Aer 0.1
Nuove funzioni
Aer fornisce tre backend di simulatori:
QasmSimulatorsimulare esperimenti e restituire i risultati della misurazioneStatevectorSimulator: restituisce il vettore di stato finale per un circuito quantistico che agisce sullo stato tutto zeroUnitarySimulator: restituisce la matrice unitaria di un circuito quantistico
noise modulo: contiene funzioni avanzate di modellazione del rumore per il modulo QasmSimulator
NoiseModel,QuantumError,ReadoutErrorclassi per la simulazione di un circuito quantistico Qiskit in presenza di errorierrorssottomodulo che include funzioni per la generazione di oggettiQuantumErrorper i seguenti tipi di errori quantistici: Kraus, unitario misto, unitario coerente, Pauli, depolarizzante, rilassamento termico, smorzamento di ampiezza, smorzamento di fase, smorzamento combinato di fase e di ampiezzadevicesottomodulo per la generazione automatica di un modello di rumore basato suBackendPropertiesdi un dispositivo
utils Modulo:
qobj_utilsfornisce funzioni per modificare direttamente un Qobj per inserire istruzioni speciali del simulatore non ancora supportate dall'API di Qiskit Terra.
Acqua 0.4
Nuove funzioni
-
API programmatiche per algoritmi e componenti: ogni componente può ora essere istanziato e inizializzato tramite una singola chiamata a un costruttore (non vuoto)
-
QuantumInstanceAPI per il disaccoppiamento algoritmo/backend -QuantumInstanceincapsula un backend e le sue impostazioni -
Documentazione aggiornata e Jupyter Notebook che illustrano le nuove API programmatiche
-
Parallelizzazione trasparente per ottimizzatori basati sul gradiente
-
Funzionamento a controllo multiplo-NOT (cnx)
-
Componente algoritmico collegabile
RandomDistribution -
Implementazioni concrete di
RandomDistribution:BernoulliDistribution,LogNormalDistribution,MultivariateDistribution,MultivariateNormalDistribution,MultivariateUniformDistribution,NormalDistribution,UniformDistribution, eUnivariateDistribution -
Implementazioni concrete di
UncertaintyProblem:FixedIncomeExpectedValue,EuropeanCallExpectedValue, eEuropeanCallDelta -
Algoritmo di stima dell'ampiezza
-
Ottimizzazione Qiskit: Nuovi modelli di Ising per problemi di ottimizzazione: copertura esatta, impacchettamento di insiemi, copertura di vertici, cricca e partizione di un grafo
-
Qiskit AI:
- Nuove mappe di funzionalità che estendono l'interfaccia collegabile di
FeatureMap:PauliExpansionePauliZExpansion - Meccanismo di serializzazione/deserializzazione del modello di addestramento
- Nuove mappe di funzionalità che estendono l'interfaccia collegabile di
-
Qiskit Finance:
- Stima dell'ampiezza per una variabile casuale di Bernoulli: illustrazione della stima dell'ampiezza su un problema di un singolo qubit
- Caricamento di distribuzioni casuali multiple univariate e multivariate
- Opzione call europea: valore atteso e delta (utilizzando distribuzioni univariate)
- Pricing degli asset a reddito fisso: valore atteso (utilizzando distribuzioni multivariate)
-
La stringa Pauli nella classe
Operatorè allineata con Terra 0.7. Ora l'ordine di una stringa di n-qubit pauli èq_{n-1}...q{0}Pertanto, anche i (de)serializzatori (save_to_dicteload_from_dict) della classeOperatorvengono modificati per adottare le modifiche della classePauli.
Considerazioni sulla compatibilità
HartreeFockcomponente di tipo pluggableInitialStatespostato in Qiskit ChemistryUCCSDcomponente di tipo pluggableVariationalFormspostato in Qiskit Chemistry