Note di rilascio di Qiskit 0.18
0.18.3
Terra 0.13.0
Nessuna modifica
Aer 0.5.1
Note sull'aggiornamento
- Modifica il modo in cui vengono gestiti i passaggi di transpilazione nelle classi Controller C++, in modo che ogni passaggio debba essere chiamato esplicitamente. Ciò consente una maggiore personalizzazione del momento in cui ogni passaggio deve essere richiamato e con quali parametri. In particolare, ciò consente di impostare parametri diversi per il passaggio di ottimizzazione della fusione dei gate a seconda del metodo di simulazione QasmController.
- Aggiungere
gate_length_unitskwarg aqiskit.providers.aer.noise.NoiseModel.from_device()per specificaregate_lengthspersonalizzato nella funzione del modello di rumore del dispositivo per gestire le conversioni di unità per il codice interno. - Aggiunta del gate Controlled-Y ("cy") ai metodi di simulazione dello stabilizzatore supportati dal gateset.
- Per il backend di Aer la validazione jsonschema degli oggetti qobj in ingresso da terra è ora opt-in invece di essere abilitata di default. Se si vuole abilitare la validazione jsonschema di qobj, impostare il kwarg
validatesul metodoqiskit.providers.aer.QasmSimualtor.run()per l'oggetto backend aTrue.
Correzioni di bug
-
Rimuovere "extended_stabilizer" dai metodi di simulazione selezionati automaticamente. Questo è necessario perché il metodo dello stabilizzatore esteso non è esatto e può dare risultati errati per alcuni circuiti, a meno che l'utente non sappia come ottimizzare i suoi parametri di configurazione.
Il metodo automatico ora seleziona solo i metodi "stabilizzatore", "matrice_densità" e "vettore di stato". Se viene eseguito un circuito non-Clifford troppo grande per il metodo statevector, viene sollevata un'eccezione che suggerisce di provare a usare esplicitamente i metodi "extended_stabilizer" o "matrix_product_state".
-
Corregge le classi Controller in modo che il passaggio di transpilazione ReduceBarrier sia applicato per primo. In questo modo si evita che le istruzioni barriera impediscano il troncamento dei qubit inutilizzati se l'unica istruzione definita su di essi è una barriera.
-
Disabilita la fusione dei gate per il metodo di simulazione di stato del prodotto matriciale, poiché in alcuni casi causava problemi con la restituzione di risultati errati.
-
Correzione dell'errore di conversione dell'unità di tempo del gate per il modello di rumore del dispositivo con errori di rilassamento termico ed errori del gate. La probabilità di errore di depolarizzazione veniva calcolata con il tempo di gate in microsecondi, mentre per il rilassamento termico veniva calcolata in nanosecondi. In questo modo non è stato applicato alcun errore di depolarizzazione, poiché le unità errate avrebbero fatto sembrare il dispositivo limitato nella coerenza.
-
Correzione del bug della composizione errata di QuantumErrors quando i qubit delle istruzioni composte differiscono.
-
Correzione del problema per cui il gate "diagonale" viene controllato come unitario con una tolleranza troppo alta. In questo modo le diagonali generate dalle funzioni Numpy spesso non superavano il test.
-
Correggere il passaggio di ottimizzazione del circuito remove-barrier da applicare prima della trucazione dei qubit. In questo modo si risolve un problema per cui le barriere inserite dal transpiler Terra attraverso qubit altrimenti inattivi impedivano il loro troncamento.
Ignis 0.3.0
Nessuna modifica
Acqua 0.6.6
Nessuna modifica
IBM Q Fornitore 0.6.1
Nessuna modifica
0.18.0
Terra 0.13.0
Preludio
La release 0.13.0 include molti cambiamenti importanti. Alcuni punti salienti di questa release sono:
Per il transpiler abbiamo cambiato la libreria di grafi usata per costruire la classe qiskit.dagcircuit.DAGCircuit che è la struttura dati sottostante a tutte le operazioni, si basa su retworkx per migliorare notevolmente le prestazioni. La velocità di transpilazione dei circuiti nella versione 0.13.0 dovrebbe essere significativamente più veloce rispetto alle versioni precedenti.
Lo stile di costruzione delle istruzioni Pulse è stato notevolmente semplificato. Ora, gli Command s sono deprecati e viene supportato un insieme unificato di Instruction sono supportati.
Il modulo qiskit.quantum_info include diverse nuove funzioni per la generazione di operatori casuali (come i canali Cliffords e quantistici) e per il calcolo della norma di diamante dei canali quantistici; aggiornamenti alle funzioni Statevector e DensityMatrix per supportare il calcolo delle probabilità di misura e il campionamento delle misure; diverse nuove classi sono basate sulla rappresentazione simplettica delle matrici di Pauli. Queste nuove classi includono gli operatori di Clifford (Clifford), matrici di N-qubit che sono rade nella base di Pauli (SparsePauliOp), liste di Pauli (PauliTable) e liste di stabilizzatori (StabilizerTable).
Questa versione presenta anche una documentazione notevolmente migliorata in tutto Qiskit, compresa la documentazione migliorata per i file qiskit.circuit, qiskit.pulse e qiskit.quantum_info .
Inoltre, la denominazione degli oggetti e dei metodi dei gate QuantumCircuit sono stati aggiornati per essere più coerenti. Ciò ha comportato la deprecazione di diverse classi e metodi, in quanto si è passati a uno schema di nomi più coerente.
Per tutti i dettagli su tutte le modifiche apportate in questa versione, consultare le note di rilascio dettagliate riportate di seguito.
Nuove funzioni
-
Aggiunto un nuovo modulo di libreria di circuiti
qiskit.circuit.library. Questo sarà un luogo per i costruttori di circuiti di uso comune che possono essere utilizzati come blocchi di costruzione per circuiti o applicazioni più grandi. -
La classe
qiskit.providers.BaseJobha quattro nuovi metodi:done()running()cancelled()in_final_state()
Questi metodi vengono utilizzati per verificare se un lavoro si trova in un determinato stato.
-
Aggiungere la possibilità di specificare il controllo condizionato alla presenza di un qubit nello stato di massa. Lo stato dei qubit di controllo è rappresentato da un numero intero. Ad esempio:
from qiskit import QuantumCircuit from qiskit.extensions.standard import XGate qc = QuantumCircuit(4) cgate = XGate().control(3, ctrl_state=6) qc.append(cgate, [0, 1, 2, 3])Crea un gate a quattro qubit in cui il quarto qubit viene invertito se il primo qubit è allo stato terreno e il secondo e il terzo qubit sono allo stato eccitato. Se
ctrl_stateèNone, il valore predefinito, il controllo è condizionato all'eccitazione di tutti i qubit di controllo. -
Un nuovo widget di jupyter,
%circuit_library_info, è stato aggiunto aqiskit.tools.jupyter. Questo widget viene utilizzato per visualizzare i dettagli dei circuiti costruiti dalla libreria di circuiti. Per esempiofrom qiskit.circuit.library import XOR import qiskit.tools.jupyter circuit = XOR(5, seed=42) %circuit_library_info circuit -
Una nuova opzione kwarg,
formatted, è stata aggiunta aqiskit.circuit.QuantumCircuit.qasm(). Se impostato suTrue, il metodo stamperà una versione evidenziata dalla sintassi (usando pygments) su stdout e restituiràNone(che differisce dal comportamento normale di restituzione del codice QASM come stringa). -
Una nuova opzione kwarg,
filename, è stata aggiunta aqiskit.circuit.QuantumCircuit.qasm(). Se impostato su un percorso, il metodo scriverà il codice QASM in quel file. Continuerà quindi a produrre normalmente. -
Una nuova istruzione
SetFrequencyche consente agli utenti di modificare la frequenza diPulseChannel. Ciò avviene nel modo seguente:from qiskit.pulse import Schedule from qiskit.pulse import SetFrequency sched = pulse.Schedule() sched += SetFrequency(5.5e9, DriveChannel(0))In questo esempio, la frequenza di tutti gli impulsi prima del comando
SetFrequencysarà quella predefinita e tutti gli impulsi applicati al canale di azionamento zero dopo il comandoSetFrequencysaranno a 5.5 GHz. Gli utenti diSetFrequencydevono tenere conto di eventuali limitazioni hardware. -
Un nuovo metodo,
assign_parameters()è stato aggiunto alla classeqiskit.circuit.QuantumCircuitclasse. Questo metodo accetta un dizionario di parametri con oggetti float e Parameters in un unico dizionario. In altre parole, questo nuovo metodo consente di associare i float, i parametri o entrambi in un singolo dizionario.Inoltre, utilizzando il kwarg di
inplacesi può specificare che è possibile modificare il circuito originale in modo opzionale. L'impostazione predefinita èFalsee il metodo restituisce una copia del circuito originale. -
Un nuovo metodo
num_nonlocal_gates()è stato aggiunto alla classeqiskit.circuit.QuantumCircuitclasse. Questo metodo restituisce il numero di porte di un circuito che coinvolgono 2 o più qubit. Questi cancelli sono più costosi in termini di tempo ed errori da implementare. -
Il
qiskit.circuit.QuantumCircuitmetodoiso()per aggiungere una portaIsometryal circuito ha un nuovo alias. Ora è possibile chiamareqiskit.circuit.QuantumCircuit.isometry()oltre a chiamareiso. -
È stato aggiunto un attributo
descriptionalla classeCouplingMapper memorizzare una breve descrizione per le diverse mappe di accoppiamento (ad esempio, pieno, griglia, linea, ecc.). -
Un nuovo metodo
compose()è stato aggiunto alla classeDAGCircuitper comporre due circuiti attraverso i loro DAG.dag_left.compose(dag_right, edge_map={right_qubit0: self.left_qubit1, right_qubit1: self.left_qubit4, right_clbit0: self.left_clbit1, right_clbit1: self.left_clbit0})┌───┐ ┌─────┐┌─┐ lqr_1_0: ───┤ H ├─── rqr_0: ──■──┤ Tdg ├┤M├ ├───┤ ┌─┴─┐└─┬─┬─┘└╥┘ lqr_1_1: ───┤ X ├─── rqr_1: ┤ X ├──┤M├───╫─ ┌──┴───┴──┐ └───┘ └╥┘ ║ lqr_1_2: ┤ U1(0.1) ├ + rcr_0: ════════╬════╩═ = └─────────┘ ║ lqr_2_0: ─────■───── rcr_1: ════════╩══════ ┌─┴─┐ lqr_2_1: ───┤ X ├─── └───┘ lcr_0: ═══════════ lcr_1: ═══════════ ┌───┐ lqr_1_0: ───┤ H ├────────────────── ├───┤ ┌─────┐┌─┐ lqr_1_1: ───┤ X ├─────■──┤ Tdg ├┤M├ ┌──┴───┴──┐ │ └─────┘└╥┘ lqr_1_2: ┤ U1(0.1) ├──┼──────────╫─ └─────────┘ │ ║ lqr_2_0: ─────■───────┼──────────╫─ ┌─┴─┐ ┌─┴─┐ ┌─┐ ║ lqr_2_1: ───┤ X ├───┤ X ├──┤M├───╫─ └───┘ └───┘ └╥┘ ║ lcr_0: ═══════════════════╩════╬═ ║ lcr_1: ════════════════════════╩═ -
I mock backend in
qiskit.test.mockhanno ora un metodo funzionalerun()che restituisce risultati simili a quelli dei dispositivi reali. Seqiskit-aerè installato, verrà eseguita una simulazione con un modello di rumore costruito a partire dall'istantanea del dispositivo nel backend fasullo. Altrimenti,qiskit.providers.basicaer.QasmSimulatorPyverrà utilizzato per eseguire una simulazione ideale. Inoltre, se un esperimento a impulsi viene passato arune qiskit-aer è installato,PulseSimulatorverrà utilizzato per simulare gli orari degli impulsi. -
Il
qiskit.result.Result()restituirà un elenco di tutti i conteggi disponibili quando ci sono più circuiti nel lavoroget_counts()restituirà ora un elenco di tutti i conteggi disponibili quando ci sono più circuiti in un lavoro. Questo funziona quandoget_counts()viene chiamato senza argomenti.La considerazione principale per questa funzione è stata quella di disegnare tutti i risultati di più circuiti nello stesso istogramma. Ad esempio, è ora possibile fare qualcosa di simile:
from qiskit import execute from qiskit import QuantumCircuit from qiskit.providers.basicaer import BasicAer from qiskit.visualization import plot_histogram sim = BasicAer.get_backend('qasm_simulator') qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() result = execute([qc, qc, qc], sim).result() plot_histogram(result.get_counts()) -
Un nuovo kwarg,
initial_state, è stato aggiunto alla funzioneqiskit.visualization.circuit_drawer()e al metodoQuantumCircuitmetododraw(). Se impostato suTrue, lo stato iniziale sarà incluso nelle visualizzazioni dei circuiti per tutti i backend. Ad esempio:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', initial_state=True) -
È ora possibile inserire un callable in un oggetto
qiskit.pulse.InstructionScheduleMapche restituisce un nuovo oggettoqiskit.pulse.Schedulequando viene richiamato con dei parametri. Ad esempio:def test_func(x): sched = Schedule() sched += pulse_lib.constant(int(x), amp_test)(DriveChannel(0)) return sched inst_map = InstructionScheduleMap() inst_map.add('f', (0,), test_func) output_sched = inst_map.get('f', (0,), 10) assert output_sched.duration == 10 -
Due nuove classi di porte,
qiskit.extensions.iSwapGateeqiskit.extensions.DCXGate, e i loro metodiQuantumCircuitmetodiiswap()edcx()sono stati aggiunti alle estensioni standard. Queste porte, localmente equivalenti tra loro, possono essere utilizzate per realizzare particolari interazioni XY. Una breve motivazione di questi cancelli si trova in: arxiv.org/abs/quant-ph/0209035 -
La classe
qiskit.providers.BaseJobha ora un nuovo metodowait_for_final_state()che esegue il polling dello stato del lavoro fino a quando il lavoro non raggiunge uno stato finale (comeDONEoERROR). Questo metodo prende anche un kwarg opzionalecallbackche prende un callable Python che sarà chiamato durante ogni iterazione del ciclo di polling. -
Gli attributi
search_widthesearch_depthdel metodoqiskit.transpiler.passes.LookaheadSwapsono ora impostabili durante l'inizializzazione del passo. Uno spazio di ricerca più ampio può spesso portare a circuiti più ottimizzati, al costo di tempi di esecuzione più lunghi. -
Il numero di qubit in
BackendConfigurationè ora accessibile tramite la proprietànum_qubits. In precedenza era accessibile solo tramite l'attributon_qubits. -
Due nuovi metodi,
angles()eangles_and_phase()sono stati aggiunti alla classeqiskit.quantum_info.OneQubitEulerDecomposerdella classe. Questi metodi restituiranno i parametri pertinenti senza convalida, mentre chiamando l'oggettoOneQubitEulerDecomposersi eseguirà la sintesi completa con convalida. -
Una base di decomposizione
RRè stata aggiunta al programmaqiskit.quantum_info.OneQubitEulerDecomposerper decomporre un 2x2 unitario arbitrario in un circuito a dueRGate. -
Aggiunge la possibilità di impostare
qargsagli oggetti che sono sottoclassi della classe astrattaBaseOperator. Questo avviene chiamando l'oggettoop(qargs)(doveopè una classe di operatori) e restituirà una copia superficiale dell'oggetto originale con una proprietà qargs impostata. Quando un oggetto di questo tipo viene utilizzato con l'opzionecompose()odot()verrà utilizzato il valore interno di qargs quando il metodoqargskwarg non viene utilizzato. Ciò consente la composizione di sottosistemi utilizzando, ad esempio, operatori binari:from qiskit.quantum_info import Operator init = Operator.from_label('III') x = Operator.from_label('X') h = Operator.from_label('H') init @ x([0]) @ h([1]) -
Aggiunge
qiskit.quantum_info.Cliffordal modulo quantum_info. Questo operatore è una rappresentazione simplettica efficiente di un operatore unitario a N-qubit del gruppo di Clifford. Questa classe include unto_circuit()per la compilazione in un sitoQuantumCircuitdi porte Clifford con un numero minimo di porte CX per un massimo di 3 qubit. Fornisce anche una compilazione generale per N > 3 qubit, ma questo metodo non è ottimale per il numero di porte a due qubit. -
Aggiunge
qiskit.quantum_info.SparsePauliOpclasse di operatori. Si tratta di una rappresentazione efficiente di una matrice di N-qubit che è rada nella base di Pauli e utilizza unqiskit.quantum_info.PauliTablee un vettore di coefficienti complessi per la sua struttura dati.Questa classe supporta molte delle stesse funzionalità della classe
qiskit.quantum_info.Operatorclasse, per cuiSparsePauliOpgli oggetti possono essere decimati, composti, moltiplicati scalarmente, aggiunti e sottratti.Gli array o gli oggetti Numpy
Operatorpossono essere convertiti in oggettiSparsePauliOputilizzando il metodo :class:`~qiskit.quantum_info.SparsePauliOp.from_operator.SparsePauliOppuò essere convertito in una matrice csr sparse o in un array Numpy denso usando il metodoto_matrixo a un oggettoOperatorutilizzando il metodoto_operatormetodo.A
SparsePauliOppuò essere iterato in termini di componenti e coefficienti diPauliTable, di coefficienti e di etichette delle stringhe di Pauli utilizzando il metodolabel_iter()e le componenti (dense o rade) della matrice usando il metodomatrix_iter()metodo. -
Aggiungi
qiskit.quantum_info.diamond_norm()funzione per il calcolo della norma di diamante (norma di traccia completamente limitata) di un canale quantistico. Questo può essere utilizzato per calcolare la distanza tra due canali quantistici utilizzandodiamond_norm(chan1 - chan2). -
È stata aggiunta una nuova classe
qiskit.quantum_info.PauliTable. Si tratta di un'efficiente rappresentazione simplettica di una lista di operatori di Pauli a N-qubit. Alcune caratteristiche di questa classe sono:PauliTablegli oggetti possono essere composti e tensored che restituirà un oggettoPauliTablecon la combinazione delle operazioni (compose(),dot(),expand(),tensor()) tra ogni elemento della prima tabella, con ogni elemento della seconda tabella.- L'addizione di due tabelle agisce come una concatenazione di termini in ciascuna tabella (
+). - Le tabelle Pauli possono essere ordinate per ordine lessicografico (prodotto tensoriale) o per pesi Pauli (
sort()). - Gli elementi duplicati possono essere contati ed eliminati (
unique()). - PauliTable può essere iterato sia nella sua rappresentazione nativa di array booleano simplettico, come etichette di stringhe Pauli (
label_iter()), sia come array Numpy denso o matrici CSR rade (matrix_iter()). - Verifica della commutazione tra elementi della tabella Pauli e un'altra tabella Pauli (
commutes()) o Pauli (commutes_with_all())
Per ulteriori dettagli, consultare la documentazione dell'API della classe
qiskit.quantum_info.PauliTable. -
Aggiunge la classe
qiskit.quantum_info.StabilizerTable. Si tratta di una sottoclasse della classeqiskit.quantum_info.PauliTableche include un vettore di fase booleano insieme all'array di tabelle Pauli. Rappresenta una lista di operatori stabilizzatori che sono operatori reali-Pauli con coefficiente +1 o -1. Poiché le matrici stabilizzatrici sono reali, la matrice di etichetta"Y"è definita come[[0, 1], [-1, 0]]. Per ulteriori informazioni, consultare la documentazione dell'API. -
Aggiunge
qiskit.quantum_info.pauli_basis()che restituisce una base di Pauli a N-qubit come oggettoqiskit.quantum_info.PauliTable. L'ordinamento di questa base può essere di tipo lessicografico (prodotto tensoriale) o in base al numero di termini Pauli non identici (peso). -
Aggiunge
qiskit.quantum_info.ScalarOpche rappresenta un multiplo scalare di un operatore di identità. Può essere usato per inizializzare un'identità su sottosistemi di dimensione arbitraria e sarà implicitamente convertito in altre sottoclassi diBaseOperator(come un oggettoqiskit.quantum_info.Operatoroqiskit.quantum_info.SuperOp) quando viene composta o aggiunta ad esse.Esempio: Operatore di identità
from qiskit.quantum_info import ScalarOp, Operator X = Operator.from_label('X') Z = Operator.from_label('Z') init = ScalarOp(2 ** 3) # 3-qubit identity op = init @ X([0]) @ Z([1]) @ X([2]) # Op XZX -
Alla classe è stato aggiunto un nuovo metodo,
reshape()è stato aggiunto alla classeqiskit.quantum_innfo.Operatorche restituisce una copia superficiale di una sottoclasse di operatore con le dimensioni di ingresso o di uscita del sottosistema rimodellate. Le dimensioni combinate di tutti i sottosistemi devono essere uguali a quelle dell'operatore originale, altrimenti verrà sollevata un'eccezione. -
Aggiunge
qiskit.quantum_info.random_clifford()per generare un operatore casualeqiskit.quantum_info.Cliffordoperatore. -
Aggiungi
qiskit.quantum_info.random_quantum_channel()per generare un canale quantistico casuale con rango fissoChoi-rango nellaStinespringrappresentazione. -
Aggiungi
qiskit.quantum_info.random_hermitian()per la generazione di un'ermetica casualeOperator. -
Aggiungi
qiskit.quantum_info.random_statevector()per la generazione di un file casualeStatevector. -
Aggiunge
qiskit.quantum_info.random_pauli_table()per generare unqiskit.quantum_info.PauliTablecasuale. -
Aggiunge
qiskit.quantum_info.random_stabilizer_table()per generare unqiskit.quantum_info.StabilizerTablecasuale. -
Aggiungere un attributo
num_qubitsalle classiqiskit.quantum_info.StateVectoreqiskit.quantum_info.DensityMatrixclassi. Restituisce il numero di qubit per gli stati N-qubit e restituisceNoneper gli stati non-qubit. -
Aggiunge
to_dict()eto_dict()per convertireqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixnel dizionario della notazione Bra-Ket.Esempio
from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.to_dict())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.to_dict()) -
Aggiunge
probabilities()eprobabilities()aqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixche restituiscono una serie di probabilità di esito della misurazione nella base computazionale per i sottosistemi specificati.Esempio
from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.probabilities())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.probabilities()) -
Aggiunge
probabilities_dict()eprobabilities_dict()aqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixche restituiscono un array di dizionari in stile conteggio delle probabilità di esito delle misure nella base computazionale per i sottosistemi specificati.from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.probabilities_dict())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.probabilities_dict()) -
Aggiungi
sample_counts()esample_memory()ai metodiStatevectoreDensityMatrixper il campionamento dei risultati delle misure sui sottosistemi.Esempio:
Generare un dizionario di conteggi campionando da un vettore di stati
from qiskit.quantum_info import Statevector psi = Statevector.from_label('+0') shots = 1024 # Sample counts dictionary counts = psi.sample_counts(shots) print('Measure both:', counts) # Qubit-0 counts0 = psi.sample_counts(shots, [0]) print('Measure Qubit-0:', counts0) # Qubit-1 counts1 = psi.sample_counts(shots, [1]) print('Measure Qubit-1:', counts1)Restituisce l'array dei risultati delle misurazioni per ciascun campione
from qiskit.quantum_info import Statevector psi = Statevector.from_label('-1') shots = 10 # Sample memory mem = psi.sample_memory(shots) print('Measure both:', mem) # Qubit-0 mem0 = psi.sample_memory(shots, [0]) print('Measure Qubit-0:', mem0) # Qubit-1 mem1 = psi.sample_memory(shots, [1]) print('Measure Qubit-1:', mem1) -
Aggiunge un metodo
measure()al metodoqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixalle classi di stati quantici. Ciò consente di campionare un singolo risultato di misura dai sottosistemi specificati e di collassare lo statevector allo stato di base computazionale post-misura. Per esempiofrom qiskit.quantum_info import Statevector psi = Statevector.from_label('+1') # Measure both qubits outcome, psi_meas = psi.measure() print("measure([0, 1]) outcome:", outcome, "Post-measurement state:") print(psi_meas) # Measure qubit-1 only outcome, psi_meas = psi.measure([1]) print("measure([1]) outcome:", outcome, "Post-measurement state:") print(psi_meas) -
Aggiunge un metodo
reset()al metodoqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixalle classi di stati quantici. Ciò consente di ripristinare alcuni o tutti i sottosistemi allo stato . Per esempiofrom qiskit.quantum_info import Statevector psi = Statevector.from_label('+1') # Reset both qubits psi_reset = psi.reset() print("Post reset state: ") print(psi_reset) # Reset qubit-1 only psi_reset = psi.reset([1]) print("Post reset([1]) state: ") print(psi_reset) -
È stata aggiunta una nuova funzione di visualizzazione
qiskit.visualization.visualize_transition()per visualizzare le transizioni di gate di un singolo qubit. Il programma prende in considerazione un singolo circuito di qubit e restituisce un'animazione delle transizioni di stato dei qubit su una sfera di Bloch. Per utilizzare questa funzione è necessario aver installato le dipendenze e configurato globalmente uno scrittore di animazioni matplotlib. Per maggiori dettagli a riguardo, consultare la documentazione di matplotlib. Tuttavia, nel caso predefinito, è sufficiente assicurarsi che FFmpeg sia installato per utilizzare questa funzione.Supporta circuiti con le seguenti porte:
HGateXGateYGateZGateRXGateRYGateRZGateSGateSdgGateTGateTdgGateU1Gate
Ad esempio:
from qiskit.visualization import visualize_transition from qiskit import * qc = QuantumCircuit(1) qc.h(0) qc.ry(70,0) qc.rx(90,0) qc.rz(120,0) visualize_transition(qc, fpg=20, spg=1, trace=True) -
execute()ha un nuovo kwargschedule_circuit. L'impostazione dischedule_circuit=Trueconsente di programmare il circuito in unSchedule. Questo permette agli utenti che costruisconoqiskit.circuit.QuantumCircuitdi utilizzare metodi di programmazione personalizzati, come i metodias_late_as_possibleeas_soon_as_possible. Ad esempio:job = execute(qc, backend, schedule_circuit=True, scheduling_method="as_late_as_possible") -
Una nuova variabile d'ambiente
QISKIT_SUPPRESS_PACKAGING_WARNINGSpuò essere impostata aYoyche sopprimerà gli avvertimenti relativi aqiskit-aereqiskit-ibmq-providernon installati al momento dell'importazione. Questo è utile per gli utenti che eseguono solo qiskit-terra (o semplicemente non qiskit-aer e/o qiskit-ibmq-provider) e gli avvisi non sono un'indicazione di un potenziale problema di packaging. È possibile impostare la variabile d'ambiente aNonper assicurarsi che gli avvisi siano sempre abilitati, anche se il file di configurazione utente è impostato per disabilitarli. -
È stata aggiunta una nuova opzione per il file di configurazione utente,
suppress_packaging_warnings. Se impostato sutruenel file di configurazione dell'utente, come ad esempio:[default] suppress_packaging_warnings = truesopprimerà gli avvisi relativi alla mancata installazione di
qiskit-aereqiskit-ibmq-provideral momento dell'importazione. Questo è utile per gli utenti che eseguono solo qiskit-terra (o semplicemente non qiskit-aer e/o qiskit-ibmq-provider) e gli avvisi non sono un'indicazione di un potenziale problema di packaging. Se il file di configurazione dell'utente è impostato per disabilitare gli avvisi, questo può essere annullato impostandoQISKIT_SUPPRESS_PACKAGING_WARNINGSaNo an -
qiskit.compiler.transpile()ha due nuovi kwarg,layout_methoderouting_method. Queste consentono di selezionare un metodo particolare per il posizionamento e l'instradamento dei circuiti su architetture vincolate. Ad esempio:transpile(circ, backend, layout_method='dense', routing_method='lookahead')eseguirà
DenseLayoutpassaggio di layout eLookaheadSwappassaggio di instradamento. -
Lo stile di costruzione delle istruzioni Pulse è stato notevolmente semplificato.
Con lo stile precedente,
Commands veniva chiamato con i canali per fare unInstruction. L'uso di comandi e istruzioni è stato un punto di confusione. Questo era lo stile precedente:sched += Delay(5)(DriveChannel(0)) sched += ShiftPhase(np.pi)(DriveChannel(0)) sched += SamplePulse([1.0, ...])(DriveChannel(0)) sched += Acquire(100)(AcquireChannel(0), MemorySlot(0))o, in modo equivalente (anche se meno utilizzato):
sched += DelayInstruction(Delay(5), DriveChannel(0)) sched += ShiftPhaseInstruction(ShiftPhase(np.pi), DriveChannel(0)) sched += PulseInstruction(SamplePulse([1.0, ...]), DriveChannel(0)) sched += AcquireInstruction(Acquire(100), AcquireChannel(0), MemorySlot(0))Ora, invece di costruire un comando e un 'istruzione, ogni comando è stato migrato in un'istruzione:
sched += Delay(5, DriveChannel(0)) sched += ShiftPhase(np.pi, DriveChannel(0)) sched += Play(SamplePulse([1.0, ...]), DriveChannel(0)) sched += SetFrequency(5.5, DriveChannel(0)) # New instruction! sched += Acquire(100, AcquireChannel(0), MemorySlot(0)) -
Ora esiste un'istruzione
Playche accetta la descrizione di un inviluppo di impulsi e di un canale. C'è una nuova classePulseinpulse_libda cui la descrizione dell'inviluppo dell'impulso dovrebbe sottoclasse.Ad esempio:
Play(SamplePulse([0.1]*10), DriveChannel(0)) Play(ConstantPulse(duration=10, amp=0.1), DriveChannel(0))
Note sull'aggiornamento
-
Il metodo
qiskit.dagcircuit.DAGNodepop, deprecato nella versione 0.9.0, è stato rimosso.delSe si utilizza questo metodo, si può sfruttare l'istruzione Python 'o la funzionedelattr()per eseguire lo stesso compito. -
È stato aggiunto un nuovo requisito di visualizzazione opzionale, pygments. È usato per fornire l'evidenziazione della sintassi del codice di OpenQASM 2.0 nei widget Jupyter e, facoltativamente, per il metodo
qiskit.circuit.QuantumCircuit.qasm()metodo. Deve essere installato (conpip install pygmentsopip install qiskit-terra[visualization]) prima di utilizzare il widget%circuit_library_infoinqiskit.tools.jupytero il kwargformattednel metodoqasm()metodo. -
L'opzione pulse
buffer, presente inqiskit.pulse.Channele inqiskit.pulse.Scheduleè stata deprecata in Terra 0.11.0 e ora è stata rimossa. Per aggiungere un ritardo a un canale o a una pianificazione, specificarlo esplicitamente nella pianificazione con un ritardo:sched = Schedule() sched += Delay(5)(DriveChannel(0)) -
PulseChannelSpecche era deprecato in Terra 0.11.0, è stato rimosso. Utilizzare invece BackendConfiguration :config = backend.configuration() drive_chan_0 = config.drives(0) acq_chan_0 = config.acquires(0)oppure, semplicemente, fare riferimento al canale direttamente, come ad esempio
DriveChannel(index). -
Un percorso di importazione era deprecato in Terra 0.10.0 e ora è stato rimosso: per
PulseChannel,DriveChannel,MeasureChannel, eControlChannel, usarefrom qiskit.pulse.channels import Xal posto difrom qiskit.pulse.channels.pulse_channels import X. -
Il passaggio
qiskit.transpiler.passes.CSPLayout(introdotto nella versione 0.11.0 ) è stato aggiunto al gestore dei passaggi preimpostati per i livelli di ottimizzazione 2 e 3. Per il livello 2, il limite di chiamate è di 1.000 e il timeout di 10 secondi. Per il livello 3, il limite di chiamate è 10.000 e il timeout è di 1 minuto.Ora che il passaggio è incluso nei gestori dei passaggi preimpostati, il pacchetto python-constraint non è più una dipendenza opzionale ed è stato aggiunto all'elenco dei requisiti.
-
La classe
TranspileConfig, utilizzata in precedenza per impostare la configurazione in fase di esecuzione di un file di tipoqiskit.transpiler.PassManagerè stata rimossa e sostituita da una nuova classeqiskit.transpile.PassManagerConfig. Questa nuova classe è stata strutturata in modo da includere solo le informazioni necessarie per la costruzione di unPassManager. Gli attributi di questa classe sono:initial_layoutbasis_gatescoupling_mapbackend_propertiesseed_transpiler
-
La funzione
transpile_circuitinqiskit.transpilerè stata rimossa. Per transpilare un circuito con unPassManagersi deve utilizzare il metodorun()dell'oggetto :class:~qiskit.transpiler.PassManager`. -
Il
QuantumCircuitmetododraw()eqiskit.visualization.circuit_drawer()non includeranno più lo stato iniziale incluso nelle visualizzazioni per impostazione predefinita. Se si desidera mantenere lo stato iniziale nella visualizzazione di output, è necessario impostare il kwarginitial_statesuTrue. Ad esempio, la corsa:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='text')Questo non include più lo stato iniziale. Se volete conservarlo, potete candidarvi:
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='text', initial_state=True) -
qiskit.compiler.transpile()(eqiskit.execute.execute(), che usa internamentetranspile) ora solleverà un errore quando il kwargpass_managerviene impostato e viene impostato un valore per altri kwarg già impostati in un oggetto istanziatoPassManageristanziato. In precedenza, questi kwarg in conflitto venivano semplicemente ignorati e venivano utilizzati i valori dell'istanzaPassManager. Ad esempio:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.pass_manager_config import PassManagerConfig from qiskit.transpiler import preset_passmanagers from qiskit.compiler import transpile qc = QuantumCircuit(5) config = PassManagerConfig(basis_gates=['u3', 'cx']) pm = preset_passmanagers.level_0_pass_manager(config) transpile(qc, optimization_level=3, pass_manager=pm)solleverà ora un errore, mentre prima di questa versione il valore in
pmveniva usato silenziosamente e il valore del kwargoptimization_levelveniva ignorato. I kwarg ditranspilea cui si applica sono:optimization_levelbasis_gatescoupling_mapseed_transpilerbackend_propertiesinitial_layoutlayout_methodrouting_methodbackend
-
Il
Operator,Clifford,SparsePauliOp,PauliTable,StabilizerTable, le classi di operatori hanno aggiunto il metodocallche permette di assegnare un qargs all'operatore da utilizzare con il metodocompose(),dot(),evolve(), ```+``` e-. -
Il metodo di aggiunta della classe
qiskit.quantum_info.Operatoraccetta ora un kwargqargper consentire l'aggiunta di un operatore più piccolo a uno più grande, assumendo identità sugli altri sottosistemi (come perqargssucompose()edot()). Ciò consente di aggiungere un sottosistema utilizzando il metodo di chiamata come nel caso della composizione. Questo supporto viene aggiunto a tutte le sottoclassi di BaseOperator (ScalarOp,Operator,QuantumChannel).Ad esempio:
from qiskit.quantum_info import Operator, ScalarOp ZZ = Operator.from_label('ZZ') # Initialize empty Hamiltonian n_qubits = 10 ham = ScalarOp(2 ** n_qubits, coeff=0) # Add 2-body nearest neighbour terms for j in range(n_qubits - 1): ham = ham + ZZ([j, j+1]) -
La classe
BaseOperatorè stata aggiornata in modo che l'addizione, la sottrazione e la moltiplicazione scalare non siano più metodi astratti. Ciò significa che non è più necessario implementarli nelle sottoclassi se non sono supportati. La classe base solleverà unNotImplementedErrorquando i metodi non sono definiti. -
La funzione
qiskit.quantum_info.random_density_matrix()restituirà un oggetto casualeDensityMatrixcasuale. Nelle versioni precedenti restituiva un array numpy. -
Il
qiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixnon copiano più l'array di input se è già del tipo corretto. -
fastjsonschema è aggiunto come dipendenza. Questo viene utilizzato per una validazione molto più rapida dei dizionari qobj rispetto allo schema JSON, quando il metodo
to_dict()viene chiamato sugli oggetti qobj con l'argomento della parola chiavevalidateimpostato suTrue. -
Le classi di costruzione qobj in
qiskit.qobjnon saranno più validate rispetto al jsonschema di qobj per impostazione predefinita. Queste includono le seguenti classi:qiskit.qobj.QasmQobjInstructionqiskit.qobj.QobjExperimentHeaderqiskit.qobj.QasmQobjExperimentConfigqiskit.qobj.QasmQobjExperimentqiskit.qobj.QasmQobjConfigqiskit.qobj.QobjHeaderqiskit.qobj.PulseQobjInstructionqiskit.qobj.PulseQobjExperimentConfigqiskit.qobj.PulseQobjExperimentqiskit.qobj.PulseQobjConfigqiskit.qobj.QobjMeasurementOptionqiskit.qobj.PulseLibraryItemqiskit.qobj.QasmQobjInstructionqiskit.qobj.QasmQobjExperimentConfigqiskit.qobj.QasmQobjExperimentqiskit.qobj.QasmQobjConfigqiskit.qobj.QasmQobjqiskit.qobj.PulseQobj
Se ci si affida a questa validazione o si desidera validarli rispetto allo schema qobj, lo si può fare impostando il kwarg
validateaTruesuto_dict()da una delle classi Qobj di primo livelloQasmQobjoppurePulseQobj. Ad esempio:che convaliderà il dizionario di output rispetto al jsonschema di Qobj.
-
Il dizionario di uscita da
qiskit.qobj.QasmQobj.to_dict()eqiskit.qobj.PulseQobj.to_dict()non è più in un formato per la serializzazione json diretta, come previsto dall'API di IBMQ. Questi oggetti Qobj sono il formato attuale che usiamo per passare gli esperimenti ai provider/backend e, mentre avere un formato di dizionario che può essere passato direttamente all'API IBMQ è stato moderatamente utile perqiskit-ibmq-provider, ha reso le cose più difficili per altri provider. Soprattutto per i fornitori che avvolgono i simulatori locali. In futuro le definizioni di ciò che viene passato tra i provider e il formato di richiesta dell'API IBMQ saranno ulteriormente disaccoppiate (in modo retrocompatibile), il che dovrebbe alleggerire l'onere di scrivere provider e backend.In pratica, l'unica differenza funzionale tra l'output di questi metodi e le versioni precedenti è che i numeri complessi sono rappresentati con il tipo
complexe gli array di numpy non vengono più convertiti silenziosamente in liste. Se in precedenza si chiamavajson.dumps()direttamente sull'output dito_dict(), dopo questo rilascio sarà necessario un codificatore json personalizzato per gestire questi casi. Ad esempio:import json from qiskit.circuit import ParameterExpression from qiskit import qobj my_qasm = qobj.QasmQobj( qobj_id='12345', header=qobj.QobjHeader(), config=qobj.QasmQobjConfig(shots=1024, memory_slots=2, max_credits=10), experiments=[ qobj.QasmQobjExperiment(instructions=[ qobj.QasmQobjInstruction(name='u1', qubits=[1], params=[0.4]), qobj.QasmQobjInstruction(name='u2', qubits=[1], params=[0.4, 0.2]) ]) ] ) qasm_dict = my_qasm.to_dict() class QobjEncoder(json.JSONEncoder): """A json encoder for pulse qobj""" def default(self, obj): # Convert numpy arrays: if hasattr(obj, 'tolist'): return obj.tolist() # Use Qobj complex json format: if isinstance(obj, complex): return (obj.real, obj.imag) if isinstance(obj, ParameterExpression): return float(obj) return json.JSONEncoder.default(self, obj) json_str = json.dumps(qasm_dict, cls=QobjEncoder)genererà una stringa json esattamente come faceva
json.dumps(my_qasm.to_dict())nelle versioni precedenti. -
CmdDefè stato deprecato da Terra 0.11.0 ed è stato rimosso. Si prega di continuare a utilizzareInstructionScheduleMapal suo posto. -
I metodi
cmdsecmd_qubitsinInstructionScheduleMapsono stati deprecati da Terra 0.11.0 e sono stati rimossi. Utilizzare inveceinstructionsequbits_with_instruction. -
PulseDefaults hanno riportato
qubit_freq_estemeas_freq_estin Hz anziché in GHz dal rilascio di Terra 0.11.0. L'avviso che segnalava questa modifica è stato rimosso. -
Il supporto precedentemente deprecato (nella versione 0.11.0 ) per il passaggio di parametri di tipo
qiskit.circuit.Instructiondei tipisympy.Basic,sympy.Expr,qiskit.qasm.node.node.Node(nodo QASM AST) esympy.Matrixè stato rimosso. I tipi di parametri di istruzione supportati sono:intfloatcomplexstrlistnp.ndarrayqiskit.circuit.ParameterExpression
-
Le seguenti proprietà di
BackendConfiguration:dtdtmrep_time
hanno tutti unità di misura di secondi. Prima del rilascio 0.11.0,
dtedtmavevano unità di misura di nanosecondi. Prima della release 0.12.0,rep_timeaveva unità di misura in microsecondi. Le avvertenze che avvisavano gli utenti di queste modifiche sono state rimosse daBackendConfiguration. -
All'elenco dei requisiti è stato aggiunto un nuovo requisito, retworkx. Si tratta di una libreria di grafi con licenza Apache 2.0 che ha un'API simile a quella di networkx e viene utilizzata per accelerare in modo significativo le operazioni di transpiler
qiskit.dagcircuit.DAGCircuitoperazioni come parte del transpiler. Ci sono binari pubblicati su PyPI per tutte le piattaforme supportate da Qiskit Terra, ma se si utilizza una piattaforma per la quale non sono stati pubblicati binari precompilati, consultare la documentazione di retworkx per le istruzioni sull'installazione con pip da sdist.Se si riscontrano problemi con il transpiler o con la classe DAGCircuit durante la transizione, si può tornare alla precedente implementazione di networkx impostando la variabile d'ambiente
USE_RETWORKXsuN. Questa opzione sarà rimossa nella versione 0.14.0.
Note di deprecazione
-
Il passaggio dei dati al costruttore di
qiskit.dagcircuit.DAGNodecome arg dizionariodata_dictè deprecato e sarà rimosso in una prossima versione. Invece si devono passare i campi come kwarg al costruttore. Ad esempio il comportamento precedente di:from qiskit.dagcircuit import DAGNode data_dict = { 'type': 'in', 'name': 'q_0', } node = DAGNode(data_dict)dovrebbe ora essere:
from qiskit.dagcircuit import DAGNode node = DAGNode(type='in', name='q_0') -
La denominazione degli oggetti e dei metodi dei gate è stata aggiornata per essere più coerente. Sono state apportate le seguenti modifiche:
- Le porte di Pauli hanno tutte una sola lettera maiuscola (
I,X,Y,Z) - Le porte di Pauli parametrizzate (cioè le rotazioni) precedono la lettera maiuscola
R(RX,RY,RZ) - Una versione controllata antepone la lettera maiuscola
C(CX,CRX,CCX) - Le porte sono denominate in base alla loro azione, non ai loro nomi alternativi (
CCX, nonToffoli)
I vecchi nomi sono stati deprecati e saranno rimossi in una versione futura. Questo è un elenco delle modifiche che mostra la vecchia e la nuova classe, l'attributo del nome e i metodi. Se una nuova colonna è vuota, non viene modificata.
Vecchia classeNuova classeVecchio nome AttributoNuovo attributo NomeVecchioqiskit.circuit.QuantumCircuitmetodoNuovoqiskit.circuit.QuantumCircuitmetodoToffoliGateCCXGateccxccx()etoffoli()CrxGateCRXGatecrxcrx()CryGateCRYGatecrycry()CrzGateCRZGatecrzcrz()FredkinGateCSwapGatecswapcswap()efredkin()Cu1GateCU1Gatecu1cu1()Cu3GateCU3Gatecu3cu3()CnotGateCXGatecxcx()ecnot()CyGateCYGatecycy()CzGateCZGateczcz()DiagGateDiagonalGatediagdiagonaldiag_gatediagonal()IdGateIGateidideni()eid()Isometryisoisometryiso()isometry()eiso()UCGUCGatemultiplexerucguc()UCRotUCPauliRotGateUCXUCRXGateucrotXucrxucxucrx()UCYUCRYGateucrotyucryucyucry()UCZUCRZGateucrotzucrzuczucrz() - Le porte di Pauli hanno tutte una sola lettera maiuscola (
-
Il kwarg
periodper le funzionisquare(),sawtooth()etriangle()inqiskit.pulse.pulse_libè ora deprecato e sarà rimosso in una prossima versione. Per impostare la frequenza si deve invece utilizzare il kwarg difreq. -
I metodi
DAGCircuit.compose_back()eDAGCircuit.extend_back()sono deprecati e saranno rimossi in una versione futura. Si dovrebbe invece utilizzare il metodoqiskit.dagcircuit.DAGCircuit.compose()che è un metodo più generale e più flessibile che fornisce la stessa funzionalità. -
Il kwarg
callbackdel costruttore della classeqiskit.transpiler.PassManagerdel costruttore della classe è stato deprecato e sarà rimosso in una prossima versione. Invece di impostarlo a livello di oggetto durante la creazione, ora dovrebbe essere impostato come parametro kwarg sul metodoqiskit.transpiler.PassManager.run()del metodo. -
Le parole chiave
n_qubitsenumberofqubitssono deprecate in tutto Terra e sostituite danum_qubits. I vecchi nomi saranno rimossi in una versione futura. Gli oggetti interessati da questa modifica sono elencati di seguito:ClasseVecchio metodoNuovo metodoQuantumCircuitn_qubitsnum_qubits()Paulinumberofqubitsnum_qubits()FunzioneVecchio argomentoNuovo argomentorandom_circuit()n_qubitsnum_qubitsMSGaten_qubitnum_qubits -
La funzione
qiskit.quantum_info.synthesis.euler_angles_1qè ora deprecata. È stata sostituita dalla classeqiskit.quantum_info.OneQubitEulerDecomposerche fornisce la stessa funzionalità attraverso:OneQubitEulerDecomposer().angles(mat) -
Il kwarg
pass_managerper l'elementoqiskit.compiler.transpile()è stato deprecato e sarà rimosso in una prossima versione. In futuro, il modo preferito per transpilare un circuito con un oggetto personalizzatoPassManagerè utilizzare il metodorun()dell'oggettoPassManager. -
La funzione
qiskit.quantum_info.random_state()è stata deprecata e sarà rimossa in una versione futura. Si deve invece utilizzare la funzioneqiskit.quantum_info.random_statevector()funzione. -
I metodi
add,subtract, emultiplydelqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixsono deprecati e saranno rimossi in una prossima versione. Si dovrebbero invece utilizzare gli operatori binari+,-,*. -
Depreca
qiskit.quantum_info.Statevector.to_counts(),qiskit.quantum_info.DensityMatrix.to_counts()eqiskit.quantum_info.counts.state_to_counts(). Queste funzioni sono sostituite dai metodi della classeqiskit.quantum_info.Statevector.probabilities_dict()eqiskit.quantum_info.DensityMatrix.probabilities_dict(). -
SamplePulseeParametricPulses (ad esempioGaussian) ora sottoclasse diPulsee sono stati spostati inqiskit.pulse.pulse_lib. Il precedente percorso attraversopulse.commandsè deprecato e sarà rimosso in una prossima versione. -
DelayInstructionè stato deprecato e sostituito daDelay. Questa nuova istruzione è stata sostituita dalla precedenteCommandDelay. Il modello di migrazione è:Delay(<duration>)(<channel>) -> Delay(<duration>, <channel>) DelayInstruction(Delay(<duration>), <channel>) -> Delay(<duration>, <channel>)Fino al termine del periodo di deprecazione, sarà supportata anche la precedente sintassi
Delayper chiamare un comando su un canale:Delay(<phase>)(<channel>)La nuova istruzione
Delaynon supporta l'attributocommand. -
FrameChangeeFrameChangeInstructionsono stati deprecati e sostituiti daShiftPhase. Le modifiche sono:FrameChange(<phase>)(<channel>) -> ShiftPhase(<phase>, <channel>) FrameChangeInstruction(FrameChange(<phase>), <channel>) -> ShiftPhase(<phase>, <channel>)Fino a quando il periodo di deprecazione non sarà terminato, sarà supportata la precedente sintassi di FrameChange per chiamare un comando su un canale:
ShiftPhase(<phase>)(<channel>) -
Il metodo
calldiSamplePulseeParametricPulseè stato deprecato. La migrazione è la seguente:Pulse(<*args>)(<channel>) -> Play(Pulse(*args), <channel>) -
AcquireInstructionè stato deprecato e sostituito daAcquire. Le modifiche sono:Acquire(<duration>)(<**channels>) -> Acquire(<duration>, <**channels>) AcquireInstruction(Acquire(<duration>), <**channels>) -> Acquire(<duration>, <**channels>)Fino a quando il periodo di deprecazione non sarà terminato, sarà supportata la precedente sintassi di Acquire che prevede la chiamata del comando su un canale:
Acquire(<duration>)(<**channels>)
Correzioni di bug
-
Il
BarrierBeforeFinalMeasurementsincluso nei livelli di transpiler preimpostati quando si punta a un dispositivo fisico, in precedenza inseriva una barriera solo sui qubit misurati. In alcuni casi, ciò ha permesso al transpiler di inserire uno swap dopo un'operazione di misura, rendendo il circuito non valido per i dispositivi attuali. Il passaggio è stato aggiornato in modo che la barriera inserita comprenda tutti i qubit del dispositivo. Correzioni #3937 -
Quando si estende un'istanza
QuantumCircuitistanza (estensore) con un altro circuito (estensione), il circuito viene preso come riferimento. Se un circuito viene esteso con se stesso, si verifica un ciclo infinito, poiché l'estensore e l'estensione sono uguali. Questo bug è stato risolto copiando l'estensione se è lo stesso oggetto dell'estensore. Correzioni #3811 -
Corregge un caso in
qiskit.result.Result.get_counts()in cui non si poteva fare riferimento ai risultati di una scadenza se l'esperimento era inizializzato come Schedule senza nome. Correzioni #2753 -
In precedenza, sostituendo gli oggetti
Parameterdi un circuito con nuovi oggetti Parametro prima di decomporre un circuito, i valori sostituiti non venivano inseriti correttamente nelle porte decomposte. Questo problema è stato risolto in modo che il legame e la decomposizione possano avvenire in qualsiasi ordine. -
Il backend di output di matplotlib per la funzione
qiskit.visualization.circuit_drawer()funzione eqiskit.circuit.QuantumCircuit.draw()è stato corretto per rendere correttamente le porteCU1Gate. Correzioni #3684 -
Un bug in
qiskit.circuit.QuantumCircuit.from_qasm_str()eqiskit.circuit.QuantumCircuit.from_qasm_file()quando si carica QASM con porte personalizzate definite è stato risolto. Ora, caricando questo QASM:OPENQASM 2.0; include "qelib1.inc"; gate rinv q {sdg q; h q; sdg q; h q; } qreg q[1]; rinv q[0];è equivalente al seguente circuito:
rinv_q = QuantumRegister(1, name='q') rinv_gate = QuantumCircuit(rinv_q, name='rinv') rinv_gate.sdg(rinv_q) rinv_gate.h(rinv_q) rinv_gate.sdg(rinv_q) rinv_gate.h(rinv_q) rinv = rinv_gate.to_instruction() qr = QuantumRegister(1, name='q') expected = QuantumCircuit(qr, name='circuit') expected.append(rinv, [qr[0]])Correzioni #1566
-
Consentire alle Istruzioni di circuito quantistico di avere valori di parametri di elenco. Questo viene utilizzato in Aer per i parametri istantanei del valore di aspettativa, ad esempio
params = [[1.0, 'I'], [1.0, 'X']]]per . -
In precedenza, per i circuiti che contenevano porte composite (quelle create mediante
qiskit.circuit.QuantumCircuit.to_gate()oqiskit.circuit.QuantumCircuit.to_instruction()o i convertitori corrispondenti), se si tentava di vincolare il circuito più di una volta, al momento della trasposizione veniva applicato a tutti i circuiti solo il primo valore di vincolo. Questo problema è stato risolto in modo da rispettare correttamente i valori forniti per i successivi binding.
Altre note
-
Le classi qasm e pulse qobj:
QasmQobjInstructionQobjExperimentHeaderQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQobjHeaderPulseQobjInstructionPulseQobjExperimentConfigPulseQobjExperimentPulseQobjConfigQobjMeasurementOptionPulseLibraryItemQasmQobjInstructionQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQasmQobjPulseQobj
da
qiskit.qobjsono stati tutti reimplementati senza utilizzare la libreria marsmallow. Queste nuove implementazioni sono state progettate per essere sostituite (ad eccezione di quanto indicato nelle note di rilascio dell'aggiornamento), ma alcune specifiche ereditate da marshmallow potrebbero non funzionare. Si prega di presentare i problemi per qualsiasi incompatibilità riscontrata.
Aer 0.5.0
Aggiunto
- Aggiungere il supporto per il cancello diagonale terra
- Aggiungere il supporto per qobj parametrizzati
Fisso
- Aggiunto postfix per linux su Raspberry Pi
- Gestire gli input di array numpy da qobj
Ignis 0.3.0
Aggiunto
- documentazione API
- Analisi comparativa randomizzata CNOT-Dihedral
- Modulo di accreditamento per l'accreditamento in uscita di dispositivi rumorosi
- Calibrazioni di impulsi per qubit singoli
- Discriminatore di impulsi
- Circuiti di verifica dell'entanglement
- Tomografia di gateet per set di gate a singolo qubit
- Aggiunge le funzioni di utilità per il benchmarking randomizzato
calculate_1q_epg,calculate_2q_epgfunzioni per calcolare l'errore a 1 e 2 qubit per gate dall'errore per Clifford - Aggiunge le funzioni di utilità di benchmarking randomizzate
calculate_1q_epc,calculate_2q_epcper calcolare l'errore a 1 e 2 qubit per Clifford dall'errore per gate
Modificato
- Supporto delle etichette intere per i qubit nella tomografia
- Supporto delle etichette intere per la mitigazione degli errori di misura
Obsoleto
- Depreca la funzione
twoQ_clifford_error. Utilizzare invececalculate_2q_epc. - Python 3.5 in qiskit-ignis è deprecato. Il supporto sarà rimosso alla data di fine vita della versione da parte della comunità upstream di python, che è il 13/09/2020.
Acqua 0.6.5
Nessuna modifica
IBM Q Fornitore 0.6.0
Nessuna modifica