Note di rilascio di Qiskit 0.13
0.13.0
Terra 0.10.0
Preludio
La release 0.10.0 include diverse nuove funzionalità e correzioni di bug. Il cambiamento più importante di questa versione è l'aggiunta del supporto iniziale per l'utilizzo di Qiskit con i backend delle trappole ioniche intrappolate.
Nuove funzioni
-
Introdotti nuovi metodi in
QuantumCircuitche consentono di aggiungere o rimuovere senza problemi le misure alla fine di un circuito.measure_all()Aggiunge un
barrierseguito da un'operazionemeasurea tutti i qubit del circuito. Crea unClassicalRegisterdi dimensione pari al numero di qubit del circuito, che memorizza le misure.measure_active()Aggiunge un'operazione
barrierseguita da un'operazionemeasurea tutti i qubit attivi del circuito. Un qubit è attivo se ha almeno un'altra operazione che agisce su di esso. Crea unClassicalRegisterdi dimensione pari al numero di qubit attivi nel circuito, che memorizza le misure.remove_final_measurements()Rimuove tutte le misure finali e le precedenti
barrierda un circuito. Una misura è considerata "finale" se non è seguita da nessun'altra operazione, escluse le barriere e le altre misure. Dopo la rimozione delle misure, se tutti i bit classici diClassicalRegistersono inattivi (non hanno operazioni collegate), alloraClassicalRegisterviene rimosso.Esempi:
# Using measure_all() circuit = QuantumCircuit(2) circuit.h(0) circuit.measure_all() circuit.draw() # A ClassicalRegister with prefix measure was created. # It has 2 clbits because there are 2 qubits to measure ┌───┐ ░ ┌─┐ q_0: |0>┤ H ├─░─┤M├─── └───┘ ░ └╥┘┌─┐ q_1: |0>──────░──╫─┤M├ ░ ║ └╥┘ measure_0: 0 ═════════╩══╬═ ║ measure_1: 0 ════════════╩═ # Using measure_active() circuit = QuantumCircuit(2) circuit.h(0) circuit.measure_active() circuit.draw() # This ClassicalRegister only has 1 clbit because only 1 qubit is active ┌───┐ ░ ┌─┐ q_0: |0>┤ H ├─░─┤M├ └───┘ ░ └╥┘ q_1: |0>──────░──╫─ ░ ║ measure_0: 0 ═════════╩═ # Using remove_final_measurements() # Assuming circuit_all and circuit_active are the circuits from the measure_all and # measure_active examples above respectively circuit_all.remove_final_measurements() circuit_all.draw() # The ClassicalRegister is removed because, after the measurements were removed, # all of its clbits were idle ┌───┐ q_0: |0>┤ H ├ └───┘ q_1: |0>───── circuit_active.remove_final_measurements() circuit_active.draw() # This will result in the same circuit ┌───┐ q_0: |0>┤ H ├ └───┘ q_1: |0>───── -
È stato aggiunto il supporto iniziale per l'esecuzione di esperimenti su backend di trappole ioniche.
-
Al set di gate standard sono stati aggiunti un gate Rxx (rxx) e un gate globale Mølmer-Sørensen (ms).
-
Al modulo
quantum_info.synthesissono stati aggiunti un decompositore da Cnot a Rxx/Rx/Rycnot_rxx_decomposee un decompositore di angoli di Eulero a singolo qubitOneQubitEulerDecomposer. -
È stato aggiunto un passaggio di transpiler
MSBasisDecomposerper srotolare circuiti definiti su U3 e porte Cnot in un circuito definito su Rxx,Ry e Rx. Questo passaggio sarà incluso nei gestori di passaggi preimpostati per i backend che includono il gate 'rxx' tra i gate di base supportati. -
I backend di
qiskit.test.mockcontengono ora un'istantanea dei dati di calibrazione del dispositivo reale. È accessibile tramite il metodoproperties()per ogni backend. Questo può essere usato per testare qualsiasi codice che dipenda dalle proprietà del backend, come i passaggi del transpiler che adattano il rumore o i modelli di rumore del dispositivo per la simulazione. In questo modo il ciclo di test e sviluppo sarà più rapido, senza la necessità di passare ai backend live. -
Consente alla classe Result di restituire risultati parziali. Se viene caricato uno schema di risultati valido che contiene alcuni esperimenti che hanno avuto successo e altri che sono falliti, ciò consente di accedere ai dati degli esperimenti che hanno avuto successo, sollevando un'eccezione per gli esperimenti che non hanno avuto successo e visualizzando il messaggio di errore appropriato per i risultati falliti.
-
Alle seguenti funzioni di visualizzazione è stato aggiunto un kwarg
ax:qiskit.visualization.plot_histogramqiskit.visualization.plot_state_paulivecqiskit.visualization.plot_state_qsphereqiskit.visualization.circuit_drawer( Solomplbackend)qiskit.QuantumCircuit.draw( Solomplbackend)
Questo kwarg viene usato per passare un oggetto
matplotlib.axes.Axesalle funzioni di visualizzazione. Ciò consente di integrare queste funzioni di visualizzazione in un flusso di lavoro più ampio. Inoltre, se viene specificato un kwarg ax, le funzioni di visualizzazione non vengono restituite. -
Alle seguenti funzioni di visualizzazione è stato aggiunto un kwarg
ax_realeax_imag:qiskit.visualization.plot_state_hintonqiskit.visualization.plot_state_city
Questi nuovi karg funzionano come i kwarg di
axaggiunti di recente per altre funzioni di visualizzazione. Tuttavia, poiché questi grafici utilizzano due assi (uno per la componente reale, l'altro per la componente immaginaria). Avere due kwarg offre anche la flessibilità di generare una visualizzazione solo per uno dei componenti, invece di fare sempre entrambi. Ad esempio:from matplotlib import pyplot as plt from qiskit.visualization import plot_state_hinton ax = plt.gca() plot_state_hinton(psi, ax_real=ax)genererà solo un grafico della componente reale.
-
Un determinato gestore di passaggi può ora essere modificato con il nuovo metodo replace. Questo metodo consente di sostituire un particolare stadio in un gestore di passaggi, il che può essere utile quando si ha a che fare con gestori di passaggi preimpostati. Ad esempio, modifichiamo il selettore di layout del gestore di passaggi usato al livello di ottimizzazione 0:
from qiskit.transpiler.preset_passmanagers.level0 import level_0_pass_manager from qiskit.transpiler.transpile_config import TranspileConfig pass_manager = level_0_pass_manager(TranspileConfig(coupling_map=CouplingMap([[0,1]]))) pass_manager.draw()[0] FlowLinear: SetLayout [1] Conditional: TrivialLayout [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout [3] FlowLinear: UnrollerLa selezione del layout è impostata nella fase [1]. Sostituiamolo con DenseLayout:
from qiskit.transpiler.passes import DenseLayout pass_manager.replace(1, DenseLayout(coupling_map), condition=lambda property_set: not property_set['layout']) pass_manager.draw()[0] FlowLinear: SetLayout [1] Conditional: DenseLayout [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout [3] FlowLinear: UnrollerSe si desidera sostituirlo senza alcuna condizione, è possibile utilizzare la scorciatoia set-item:
pass_manager[1] = DenseLayout(coupling_map) pass_manager.draw()[0] FlowLinear: SetLayout [1] FlowLinear: DenseLayout [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout [3] FlowLinear: Unroller -
Introdotto un nuovo comando ad impulsi
Delayche può essere inserito in un impulsoSchedule. Questo comando accetta unduratione può essere aggiunto a qualsiasiChannel. Altri comandi non possono essere programmati su un canale durante un ritardo.Il ritardo può essere aggiunto come qualsiasi altro comando a impulsi. Ad esempio:
from qiskit import pulse from qiskit.pulse.utils import pad dc0 = pulse.DriveChannel(0) delay = pulse.Delay(1) test_pulse = pulse.SamplePulse([1.0]) sched = pulse.Schedule() sched += test_pulse(dc0).shift(1) # build padded schedule by hand ref_sched = delay(dc0) | sched # pad schedule padded_sched = pad(sched) assert padded_sched == ref_schedSi possono anche passare altri canali da imbottire e un tempo fino al quale imbottire, ad esempio:
from qiskit import pulse from qiskit.pulse.utils import pad dc0 = pulse.DriveChannel(0) dc1 = pulse.DriveChannel(1) delay = pulse.Delay(1) test_pulse = pulse.SamplePulse([1.0]) sched = pulse.Schedule() sched += test_pulse(dc0).shift(1) # build padded schedule by hand ref_sched = delay(dc0) | delay(dc1) | sched # pad schedule across both channels until up until the first time step padded_sched = pad(sched, channels=[dc0, dc1], until=1) assert padded_sched == ref_sched
Note sull'aggiornamento
-
Le assegnazioni e le modifiche all'attributo
datadegli oggettiqiskit.QuantumCircuitsono ora convalidate secondo le stesse regole utilizzate in tutta l'APIQuantumCircuit. Questo è stato fatto per migliorare le prestazioni dell'API dei circuiti, dato che ora si può assumere che l'attributodatasia in un formato noto. Se in precedenza si modificava manualmente l'attributodatadi un oggetto circuito, questo potrebbe non funzionare più se le modifiche apportate hanno dato luogo a una struttura di dati diversa dall'elenco di istruzioni con contesto nel formato[(instruction, qargs, cargs)] -
Il passmanager predefinito del transpiler per il livello di ottimizzazione 2 ora utilizza il meccanismo di selezione del layout di
DenseLayoutinvece diNoiseAdaptiveLayout. Anche il passaggioDenselayoutè stato modificato per renderlo consapevole del rumore. -
La classe deprecata
DeviceSpecificationè stata rimossa. Si dovrebbe invece utilizzare il sitoPulseChannelSpec. Ad esempio, è possibile eseguire qualcosa come:device = pulse.PulseChannelSpec.from_backend(backend) device.drives[0] # for DeviceSpecification, this was device.q[0].drive device.memoryslots # this was device.mem -
Il modulo deprecato
qiskit.pulse.opsè stato rimosso. Utilizzate direttamente i metodiScheduleeInstruction. Ad esempio, piuttosto che:ops.union(schedule_0, schedule_1) ops.union(instruction, schedule) # etcUtilizzare invece:
schedule_0.union(schedule_1) instruction.union(schedule)Lo stesso schema si applica ad altre funzioni di
ops:insert,shift,append, eflatten.
Note di deprecazione
- L'uso della proprietà
controldiqiskit.circuit.Instructionper il controllo classico è ora deprecato. In futuro questa proprietà sarà utilizzata per il controllo quantistico. Le operazioni condizionate classiche saranno invece gestite dalla proprietàconditiondiqiskit.circuit.Instruction. - Il supporto per l'impostazione dei parametri di
qiskit.circuit.Instructioncon un oggetto di tipoqiskit.qasm.node.Nodeè stato deprecato.Nodeche sono stati usati in precedenza come parametri, devono essere convertiti in un tipo supportato prima di inizializzare un nuovo oggettoInstructiono di chiamare il setterInstruction.params. I tipi supportati sonoint,float,complex,str,qiskit.circuit.ParameterExpression, onumpy.ndarray. - Nella release qiskit 0.9.0 la rappresentazione dei bit (sia dei qubit che dei bit classici) è passata da tuple della forma
(register, index)a istanze delle classiqiskit.circuit.Qubiteqiskit.circuit.Clbit. Per la retrocompatibilità è stato supportato il confronto dell'uguaglianza tra una tupla legacy e le classi di bit, quando tutto è passato dalle tuple agli oggetti. Questo supporto è ora deprecato e sarà rimosso in futuro. In futuro, tutto dovrebbe utilizzare le classi di bit invece delle tuple. - Quando l'output
mplè usato perqiskit.QuantumCircuit.draw()oqiskit.visualization.circuit_drawer()e viene usato il kwargstyle, il passaggio di chiavi di dizionario non supportate come parte del dizionariostyle`è ora deprecato. Se prima questi argomenti sconosciuti venivano ignorati silenziosamente, in futuro le chiavi non supportate solleveranno un'eccezione. - Il kwarg
line lengthper il metodoqiskit.QuantumCircuit.draw()e la funzioneqiskit.visualization.circuit_drawer()con la modalità di uscita testo è deprecato. È stato sostituito dafoldkwarg, che si comporta in modo identico per la modalità di output testo (ma ora supporta anche la modalità di output mpl).line_lengthsarà rimosso in una prossima versione, quindi le chiamate devono essere aggiornate per usarefold. - Il campo
foldnel kwarg dict distyleper il metodoqiskit.QuantumCircuit.draw()e la funzioneqiskit.visualization.circuit_drawer()è stato deprecato. È stato sostituito dafoldkwarg su entrambe le funzioni. Questo kwarg si comporta in modo identico al campo nel dict dello stile.
Correzioni di bug
- La stratificazione delle istruzioni alla base di tutti i tipi di disegno dei circuiti è cambiata per affrontare la giustificazione destra/sinistra. In alcuni casi, il risultato è un output topologicamente equivalente al rendering delle versioni precedenti, ma visivamente diverso rispetto a quello ottenuto in precedenza. Corregge il problema #2802
- Aggiungere
memory_slotsaQobjExperimentHeaderdi Qobj a impulsi. Questo risolve un errore nel formato dei dati dei risultati dimeas_level=2degli esperimenti ad impulsi. Gli stati quantici misurati vengono restituiti come stringa di bit con padding a zero in base al numero impostato permemory_slots. - Corretta la visualizzazione del gate rzz nel cassetto dei circuiti in lattice in modo che corrisponda al gate cu1 per riflettere la simmetria del gate rzz. La correzione si basa sul comando cds del pacchetto qcircuit latex. Corregge il problema #1957
Altre note
matplotlib.figure.Figuregli oggetti restituiti dalle funzioni di visualizzazione non sono più sempre chiusi per impostazione predefinita. Invece gli oggetti figura restituiti sono chiusi solo se il backend matplotlib configurato è un backend jupyter inline (impostato con%matplotlib inlineo%matplotlib notebook). Gli oggetti figura di output sono ancora chiusi con questi backend per evitare duplicazioni di output nei notebook di jupyter (motivo per cuiFigure.close()è stato aggiunto originariamente).
Aer 0.3
Nessuna modifica
Ignis 0.2
Nessuna modifica
Acqua 0.6
Nessuna modifica
IBM Q Fornitore 0.3
Nessuna modifica