Skip to main content
IBM Quantum Platform

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 di circuit.draw() o print(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 QuantumCircuit from_qasm_str() e from_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 memory a True quando si chiama compile() o execute() e poi accedervi usando il metodo get_memory() sull'oggetto Result .
  • Un modulo qiskit.quantum_info con 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_set globale 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(), e matplotlib_circuit_drawer() da qiskit.tools.visualization sono deprecati. Si dovrebbe invece usare la funzione circuit_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 di text nelle prossime versioni.
  • Le funzioni qiskit.wrapper.load_qasm_string() e qiskit.wrapper.load_qasm_file() sono deprecate e al loro posto devono essere utilizzati i metodi dei costruttori QuantumCircuit.from_qasm_str() e QuantumCircuit.from_qasm_file() .
  • Le chiavi plot_barriers e reverse_bits nel dizionario dei kwarg di style sono deprecate; al loro posto vanno usati i kwarg di qiskit.tools.visualization.circuit_drawer() , plot_barriers e reverse_bits .
  • Le funzioni plot_state() e iplot_state() sono state ammortizzate. Invece le funzioni plot_state_*() e iplot_state_*() devono essere richiamate per il metodo di visualizzazione richiesto.
  • L'argomento skip_transpiler è stato deprecato da compile() e execute(). Si può invece usare direttamente PassManager , basta impostare pass_manager su un oggetto PassManager vuoto con PassManager()
  • La funzione transpile_dag() format kwarg per l'emissione di diversi formati di output è deprecata; si dovrebbe invece convertire l'oggetto di output predefinito DAGCircuit nel 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 misurazione
  • StatevectorSimulator: restituisce il vettore di stato finale per un circuito quantistico che agisce sullo stato tutto zero
  • UnitarySimulator: restituisce la matrice unitaria di un circuito quantistico

noise modulo: contiene funzioni avanzate di modellazione del rumore per il modulo QasmSimulator

  • NoiseModel, QuantumError, ReadoutError classi per la simulazione di un circuito quantistico Qiskit in presenza di errori
  • errors sottomodulo che include funzioni per la generazione di oggetti QuantumError per 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 ampiezza
  • device sottomodulo per la generazione automatica di un modello di rumore basato su BackendProperties di un dispositivo

utils Modulo:

  • qobj_utils fornisce 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)

  • QuantumInstance API per il disaccoppiamento algoritmo/backend - QuantumInstance incapsula 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, e UnivariateDistribution

  • Implementazioni concrete di UncertaintyProblem: FixedIncomeExpectedValue, EuropeanCallExpectedValue, e EuropeanCallDelta

  • 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 : PauliExpansion e PauliZExpansion
    • Meccanismo di serializzazione/deserializzazione del modello di addestramento
  • 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_dict e load_from_dict) della classe Operator vengono modificati per adottare le modifiche della classe Pauli .

Considerazioni sulla compatibilità

  • HartreeFock componente di tipo pluggable InitialState spostato in Qiskit Chemistry
  • UCCSD componente di tipo pluggable VariationalForm spostato in Qiskit Chemistry
Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.