Note di rilascio di Qiskit 0.20
0.20.1
Terra 0.15.2
Correzioni di bug
- Quando si accedeva all'attributo
definitiondi un'istanza parametrica diGate,QuantumCircuitera stato generato con unParameterTablenon valido, cosicché la lettura diQuantumCircuit.parameterso la chiamata aQuantumCircuit.bind_parametersriportavano in modo errato i parametri non vincolati. Questo problema è stato risolto. SXGate().inverse()aveva precedentemente restituito un gate 'sx_dg' con undefinitioncorretto ma unto_matrixerrato. È stato aggiornato in modo cheSXGate().inverse()restituisca unSXdgGate()e viceversa.Instruction.inverse()se non sovrascritto da una sottoclasse, in alcuni casi restituisce un'istanza diGatecon un metodoto_matrixnon corretto. Le istanze dei metodito_matrixnon corretti sono state rimosse.- Per
C3XGatecon unanglenon nullo, l'inversione del gate tramiteC3XGate.inverse()aveva precedentemente generato un gate inverso errato. Questo è stato corretto. - Le modalità di
MCXGatesono state aggiornate per restituire un gate della stessa modalità quando si chiama.inverse(). Questo risolve un problema a causa del quale, in alcuni casi, la trasposizione di un circuito contenente l'inverso di una portaMCXVChaingenerava un errore. - In precedenza, quando si creava un gate di fase a controllo multiplo tramite
PhaseGate.control, veniva restituito un gateMCU1Gate. Questo problema è stato corretto in modo che venga restituito unMCPhaseGate. - In precedenza, il tentativo di scomporre un circuito contenente un
MCPhaseGatesollevava un errore dovuto a un'incongruenza nella definizione diMCPhaseGate. Questo è stato corretto. QuantumCircuit.composeeDAGCircuit.composeavevano, in alcuni casi, tradotto in modo errato le porte condizionali se il circuito di ingresso conteneva più di unClassicalRegister. Questo problema è stato risolto.- È stato risolto un problema durante la creazione di un oggetto
qiskit.result.Countsda un dizionario dati vuoto. Ora questo creerà un oggettoCountsvuoto. Il metodomost_frequent()è stato aggiornato per sollevare un'eccezione più descrittiva quando l'oggetto è vuoto. Correzioni #5017 - L'estensione dei circuiti con registri diversi ha aggiornato di conseguenza le proprietà
qregsecregs, ma non le listequbitseclbits. Poiché questi non sono più generati dai registri, ma sono elenchi memorizzati nella cache, ciò comporta una discrepanza tra registri e bit. Questo problema è stato risolto e il metodoextendaggiorna esplicitamente gli elenchi di bit memorizzati nella cache. - Correggere i bug delle implementazioni concrete del metodo meth:~qiskit.circuit.ControlledGate.inverse che non conservano il parametro
ctrl_state. - È stato corretto un bug che causava un errore di ricorsione per le pianificazioni di impulsi lunghi.
Aer 0.6.1
Nessuna modifica
Ignis 0.4.0
Nessuna modifica
Acqua 0.7.5
Nessuna modifica
IBM Q Fornitore 0.8.0
Nessuna modifica
0.20.0
Terra 0.15.1
Preludio
La release 0.15.0 include diverse nuove funzionalità e correzioni di bug. Alcuni punti salienti di questa release sono:
Questa versione include l'introduzione della traduzione di basi arbitrarie nel transpiler. Ciò include il supporto per l'indirizzamento diretto a una gamma più ampia di set di basi di dispositivi, ad esempio backend che implementano porte RZ, RY, RZ, CZ o iSwap.
La QuantumCircuit tiene ora traccia della fase globale. Ciò significa che il controllo di un circuito che ha una fase globale ora aggiunge correttamente una fase relativa e le definizioni delle matrici dei gate sono ora esatte anziché uguali fino a una fase globale.
Nuove funzioni
-
Una nuova classe DAG
qiskit.dagcircuit.DAGDependencyper rappresentare la forma di dipendenza del circuito. In questo DAG, i nodi sono operazioni (porte, misure, barriere, ecc...) e gli spigoli corrispondono alla non commutazione tra due operazioni. -
Sono state aggiunte quattro nuove funzioni a
qiskit.convertersper convertire avanti e indietro inDAGDependency. Queste funzioni sono:circuit_to_dagdependency()per convertire da unQuantumCircuita un oggettoDAGDependencyoggetto.dagdependency_to_circuit()per convertire da unDAGDependencya un oggettoQuantumCircuitoggetto.dag_to_dagdependency()per convertire da unDAGCircuita un oggettoDAGDependencyoggetto.dagdependency_to_dag()per convertire da unDAGDependencya un oggettoDAGCircuitoggetto.
Ad esempio:
from qiskit.converters.dagdependency_to_circuit import dagdependency_to_circuit from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit circuit_in = QuantumCircuit(2) circuit_in.h(qr[0]) circuit_in.h(qr[1]) dag_dependency = circuit_to_dagdependency(circuit_in) circuit_out = dagdepency_to_circuit(dag_dependency) -
Sono stati aggiunti due nuovi passaggi di transpiler a
qiskit.transpiler.passesIl primo,UnrollCustomDefinitionssrotola tutte le istruzioni del circuito in base alle loro proprietàdefinitionfermandosi al raggiungimento del sitobasis_gateso di un insieme di porte nel campo fornitoEquivalenceLibrary. Il secondo,BasisTranslatorutilizza l'insieme delle traduzioni del file fornitoEquivalenceLibraryper riscrivere le istruzioni del circuito in una base specifica. -
È stato aggiunto un nuovo argomento della parola chiave
translation_methodatranspile()per consentire la selezione del metodo da utilizzare per la traduzione dei circuiti nelle porte dei dispositivi disponibili. Ad esempio,transpile(circ, backend, translation_method='translator'). Le scelte valide sono:'unroller': per utilizzare l'opzioneUnrollerpassare'translator': per utilizzare ilBasisTranslatorpassare.'synthesis': per utilizzare ilUnitarySynthesispassare.
Il valore predefinito è
'translator'. -
È stata aggiunta una nuova classe per la gestione dei dati dei risultati dei conteggi,
qiskit.result.Countsè stata aggiunta. Questa classe è una sottoclasse didicte può essere utilizzata come qualsiasi altro dizionario. Tuttavia, include metodi e attributi di aiuto per gestire i risultati dei conteggi degli esperimenti e gestisce anche la post-elaborazione e la formattazione delle stringhe binarie all'inizializzazione dell'oggetto. ACountspuò essere creato passando un dizionario di conteggi con le chiavi che possono essere numeri interi, stringhe esadecimali della forma'0x4a', stringhe binarie della forma'0b1101', una stringa di bit formattata attraverso i registri e gli slot di memoria (cioè'00 10'), o una stringa dit. Ad esempio:from qiskit.result import Counts counts = Counts({"0x0': 1, '0x1', 3, '0x2': 1020}) -
È stato aggiunto un nuovo metodo per costruire
qiskit.dagcircuit.DAGCircuitè stato aggiunto,from_networkx(). Questo metodo riceve un oggetto networkxMultiDiGraph(nel formato restituito dato_networkx()) e restituisce un nuovo oggettoDAGCircuitoggetto. L'intento di questa funzione è di consentire agli autori di passaggi di transpiler di sfruttare la libreria di algoritmi di grafi di networkx se una funzione non è presente nell' API di retworkx. Tuttavia, si spera che in questi casi venga aperto un problema con l' issue tracker di retworkx (o meglio ancora che venga inviata una richiesta di pull). -
Un nuovo kwarg per
init_qubitsè stato aggiunto aassemble()eexecute(). Per i backend che supportano questa funzione,init_qubitspuò essere utilizzato per controllare se il backend che esegue i circuiti inserisce sequenze di inizializzazione all'inizio di ogni ripresa. Per impostazione predefinita è impostato suTrue, il che significa che si può supporre che tutti i qubit si trovino nello stato ground all'inizio di ogni colpo. Tuttavia, quandoinit_qubitsè impostato suFalsei qubit saranno non inizializzati all'inizio di ogni esperimento e tra un colpo e l'altro. Si noti che il backend che esegue i circuiti deve supportare questa funzione perché questo flag abbia effetto. -
Un nuovo kwarg
rep_delayè stato aggiunto aqiskit.compiler.assemble(),qiskit.execute.execute(), e al costruttore diPulseQobjtConfig.qiskit Questo nuovo kwarg viene utilizzato per indicare il tempo tra le esecuzioni del programma. Deve essere scelto dall'elenco dei valori validi impostati comerep_delaysda un oggetto backendPulseBackendConfigurationa cui si può accedere comebackend.configuration().rep_delays).Il kwarg
rep_delayfunzionerà solo sui backend che consentono un tempo di ripetizione dinamico. Questo sarà indicato anche nell'oggettoPulseBackendConfigurationper un backend come attributodynamic_reprate_enabled. Sedynamic_reprate_enabledèFalse, verrà utilizzato il valorerep_timespecificato perqiskit.compiler.assemble(),qiskit.execute.execute(), o il costruttore diPulseQobjtConfigverrà utilizzato al posto direp_delay.rep_timeconsente di specificare solo la durata di un programma, piuttosto che il ritardo tra i programmi. -
Il file
qobj_schema.jsonJSON Schema inqiskit.schemasè stato aggiornato per includererep_delaycome proprietà di configurazione opzionale per i qobj di impulso. -
Il file
backend_configuration_schema.jsonJSON Schema in mod:qiskit.schemas è stato aggiornato per includererep_delay_rangeedefault_rep_delaycome proprietà opzionali per la configurazione del backend dell'impulso. -
Un nuovo attributo,
global_phaseutilizzato per tracciare la fase globale, è stato aggiunto alla classeqiskit.circuit.QuantumCircuitclasse. Ad esempio:import math from qiskit import QuantumCircuit circ = QuantumCircuit(1, global_phase=math.pi) circ.u1(0)Anche la fase globale può essere modificata o interrogata con
circ.global_phasenell'esempio precedente. In entrambi i casi l'impostazione è in radianti. Se il circuito viene convertito in un'istruzione o in un gate, la fase globale è rappresentata da due rotazioni di un singolo qubit sul primo qubit.Ciò consente ad altri metodi e funzioni che consumano un oggetto
QuantumCircuitdi prendere in considerazione la fase globale. Ad esempio. con l'attributoglobal_phaseil metodoto_matrix()per un cancello può ora corrispondere esattamente alle sue scomposizioni, anziché solo a una fase globale.Lo stesso attributo è stato aggiunto anche alla classe
DAGCircuitin modo che la fase globale possa essere tracciata durante la conversione tra i formatiQuantumCircuiteDAGCircuit. -
Due nuove classi,
AncillaRegistereAncillaQubitsono state aggiunte al moduloqiskit.circuitmodulo. Sono sottoclassi diQuantumRegistereQubitrispettivamente, e consentono di contrassegnare i qubit come ancillari. Ciò consentirà di riutilizzare questi qubit in circuiti e algoritmi più grandi. -
Un nuovo metodo,
control()è stato aggiunto al metodoQuantumCircuit. Questo metodo restituisce una versione controllata dell'oggettoQuantumCircuitcon controlli aperti e chiusi. In precedenza, questa funzionalità era accessibile solo tramite la classeGateclasse. -
Un nuovo metodo
repeat()è stato aggiunto alla classeQuantumCircuitclasse. Restituisce un nuovo oggetto circuito contenente un numero specifico di ripetizioni del circuito originale. Ad esempio:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) repeated_qc = qc.repeat(3) repeated_qc.decompose().draw(output='mpl')I parametri sono copiati per riferimento, il che significa che se si aggiornano i parametri in un'istanza del circuito, tutte le ripetizioni saranno aggiornate.
-
Un nuovo metodo
reverse_bits()è stato aggiunto alla classeQuantumCircuitclasse. Questo metodo inverte l'ordine dei bit in un circuito (sia quelli quantistici che quelli classici). Può essere utilizzato per commutare un circuito da little-endian a big-endian e viceversa. -
Un nuovo metodo,
combine_into_edge_map()è stato aggiunto alla classeqiskit.transpiler.Layoutclasse. Questo metodo consente di convertire dueLayoutoggetti in una mappa di qubit per comporre due circuiti. -
Una nuova classe,
ConfigurableFakeBackend, è stata aggiunta al moduloqiskit.test.mock.utils. Questa nuova classe consente di creare mock backend configurabili da utilizzare per i test. Ad esempio:from qiskit.test.mock.utils import ConfigurableFakeBackend backend = ConfigurableFakeBackend("Tashkent", n_qubits=100, version="0.0.1", basis_gates=['u1'], qubit_t1=99., qubit_t2=146., qubit_frequency=5., qubit_readout_error=0.01, single_qubit_gates=['u1'])creerà un oggetto backend con 100 qubit e tutti gli altri parametri specificati nel costruttore.
-
Un nuovo metodo
draw()è stato aggiunto alla classeqiskit.circuit.EquivalenceLibraryclasse. Questo metodo può essere utilizzato per disegnare il contenuto di una libreria di equivalenze, che può essere utile per il debug. Ad esempio:from numpy import pi from qiskit.circuit import EquivalenceLibrary from qiskit.circuit import QuantumCircuit from qiskit.circuit import QuantumRegister from qiskit.circuit import Parameter from qiskit.circuit.library import HGate from qiskit.circuit.library import U2Gate from qiskit.circuit.library import U3Gate my_equiv_library = EquivalenceLibrary() q = QuantumRegister(1, 'q') def_h = QuantumCircuit(q) def_h.append(U2Gate(0, pi), [q[0]], []) my_equiv_library.add_equivalence(HGate(), def_h) theta = Parameter('theta') phi = Parameter('phi') lam = Parameter('lam') def_u2 = QuantumCircuit(q) def_u2.append(U3Gate(pi / 2, phi, lam), [q[0]], []) my_equiv_library.add_equivalence(U2Gate(phi, lam), def_u2) my_equiv_library.draw() -
Una nuova istruzione di fase,
SetPhase, è stata aggiunta aqiskit.pulse. Questa istruzione imposta la fase degli impulsi successivi sulla fase specificata (in radianti). Ad esempio:import numpy as np from qiskit.pulse import DriveChannel from qiskit.pulse import Schedule from qiskit.pulse import SetPhase sched = Schedule() sched += SetPhase(np.pi, DriveChannel(0))In questo esempio, la fase degli impulsi applicati a
DriveChannel(0)dopo l'istruzioneSetPhasesarà impostata su radianti. -
È stata aggiunta una nuova istruzione per gli impulsi
ShiftFrequencyqiskit.pulse.instructions. Questa istruzione consente di spostare la frequenza di un canale dalla frequenza impostata. Ad esempio:from qiskit.pulse import DriveChannel from qiskit.pulse import Schedule from qiskit.pulse import ShiftFrequency sched = Schedule() sched += ShiftFrequency(-340e6, DriveChannel(0))In questo esempio, tutti gli impulsi applicati a
DriveChannel(0)dopo il comandoShiftFrequencyavranno l'inviluppo a frequenza decrementata da 340MHz. -
Un nuovo metodo
conjugate()è stato aggiunto alla classeParameterExpressionclasse. Ciò consente di chiamarenumpy.conj()senza sollevare un errore. Poiché unParameterExpressionè reale, restituirà se stesso. Questo comportamento è analogo a quello di Python floats/ints. -
Una nuova classe
PhaseEstimationè stata aggiunta aqiskit.circuit.library. Questa classe di libreria di circuiti è il circuito utilizzato nella formulazione originale dell'algoritmo di stima della fase in arXiv:quant-ph/9511026. La stima di fase è il compito di stimare la fase di un autovalore di un operatore unitario , fornito del corrispondente autostato . Ovvero
Questa stima (e quindi questo circuito) è una routine centrale di molti algoritmi noti, come l'algoritmo di Shor o la stima dell'ampiezza quantistica.
-
La
qiskit.visualizationha una nuova funzioneplot_state_qsphere()ha un nuovo kwargshow_state_labelsche viene utilizzato per controllare se ogni blob nella visualizzazione di qsphere è etichettato. Per impostazione predefinita, questo kwarg è impostato suTruee mostra gli stati base accanto a ciascun blob. Questa funzione può essere disattivata, tornando al comportamento precedente, impostando il kwargshow_state_labelssuFalse. -
La
qiskit.visualizationha un nuovo kwarg che viene impostato aplot_state_qsphere()ha un nuovo kwargshow_state_phases, impostato di default aFalse. Se impostato suTrue, visualizza la fase di ogni stato base. -
La
qiskit.visualizationha un nuovo kwarg che viene impostato aplot_state_qsphere()ha un nuovo kwarguse_degrees, impostato di default aFalse. Quando è impostato suTrue, visualizza la fase di ogni stato base in gradi, insieme al cerchio di fase in basso a destra. -
Una nuova classe,
QuadraticFormal moduloqiskit.circuit.libraryper implementare una forma quadratica su variabili binarie. L'elemento della libreria di circuiti implementa l'operazione
per la forma quadratica e qubit di uscita. Il risultato è nei qubit di uscita è codificato in complemento a due. Se non viene specificato, il circuito sceglierà il numero minimo di qubit necessario per rappresentare il risultato senza applicare un'operazione modulo. La forma quadratica viene specificata utilizzando una matrice per i termini quadratici, un vettore per i termini lineari e un offset costante. Se tutti i termini sono interi, il circuito implementa esattamente la forma quadratica, altrimenti è solo un'approssimazione.
Ad esempio:
import numpy as np
from qiskit.circuit.library import QuadraticForm
A = np.array([[1, 2], [-1, 0]])
b = np.array([3, -3])
c = -2
m = 4
quad_form_circuit = QuadraticForm(m, A, b, c)-
Aggiungi
qiskit.quantum_info.Statevector.expectation_value()eqiskit.quantum_info.DensityMatrix.expectation_value()metodi per il calcolo del valore di aspettativa di unqiskit.quantum_info.Operator. -
Per il kwarg
seednel costruttore per gli oggettiqiskit.circuit.library.QuantumVolumeè ora possibile utilizzare gli oggetti generatori casuali di numpy. In precedenza, solo i numeri interi erano un input valido. Questo è utile quando si integraQuantumVolumecome parte di una funzione più ampia con una propria generazione di numeri casuali, ad esempio la generazione di una sequenza di circuitiQuantumVolumecircuiti. -
Il
QuantumCircuitmetodocompose()ha un nuovo kwargfrontche può essere usato per anteporre l'altro circuito al circuito di origine invece di aggiungerlo. Ad esempio:from qiskit.circuit import QuantumCircuit circ1 = QuantumCircuit(2) circ2 = QuantumCircuit(2) circ2.h(0) circ1.cx(0, 1) circ1.compose(circ2, front=True).draw(output='mpl') -
Due nuovi passaggi,
SabreLayouteSabreSwapper il layout e il routing sono stati aggiunti aqiskit.transpiler.passes. Questi nuovi passaggi si basano sull'algoritmo presentato in Li et al..., "Affrontare il problema della mappatura dei Qubit per i dispositivi quantistici NISQ-Era", ASPLOS 2019. Possono essere selezionati anche quando si utilizza la funzionetranspile()impostando il kwarglayout_methodsu'sabre'e/o il kwargrouting_methodsu'sabre'per utilizzareSabreLayouteSabreSwaprispettivamente. -
Aggiunto il metodo
replace()alla classeqiskit.pulse.Scheduleche consente di sostituire un'istruzione di impulso con un'altra. Ad esempio:.. code-block:: pythonda qiskit import pulse
d0 = pulse.DriveChannel(0)
sched = pulse.Schedule ()
old = pulse.Play ( pulse.Constant (100, 1.0 ), d0 ) new = pulse.Play ( pulse.Constant (100, 0.1 ), d0 )
sched += vecchio
sched = sched.replace (vecchio, nuovo)
assert sched == pulse.Schedule (new)
-
Aggiunte nuove classi di porte a
qiskit.circuit.libraryper i gate , il suo adiacente e i gate controllati comeSXGate,SXdgGate, eCSXGate. Possono anche essere aggiunti a un oggettoQuantumCircuitutilizzando i tastisx(),sxdg(), ecsx()rispettivamente. -
Aggiungere il supporto per le istruzioni di
Resetaqiskit.quantum_info.Statevector.from_instruction(). Si noti che ciò comporta un campionamento RNG nella scelta della proiezione allo stato zero nel caso in cui il qubit sia in uno stato di sovrapposizione. Il seme per il campionamento può essere impostato con il metodoseed()metodo. -
I metodi
qiskit.circuit.ParameterExpression.subs()eqiskit.circuit.QuantumCircuit.assign_parameters()accettano oraParameterExpressioncome valore di destinazione da sostituire.Ad esempio:
from qiskit.circuit import QuantumCircuit, Parameter p = Parameter('p') source = QuantumCircuit(1) source.rz(p, 0) x = Parameter('x') source.assign_parameters({p: x*x})┌──────────┐ q_0: ┤ Rz(x**2) ├ └──────────┘ -
Il
QuantumCircuit()ha un nuovo kwarg che può essere utilizzato per impostare un'etichetta per l'uscitato_gate()ha un nuovo kwarglabelche può essere usato per impostare un'etichetta per l'oggetto di outputGateoggetto. Ad esempio:from qiskit.circuit import QuantumCircuit circuit_gate = QuantumCircuit(2) circuit_gate.h(0) circuit_gate.cx(0, 1) custom_gate = circuit_gate.to_gate(label='My Special Bell') new_circ = QuantumCircuit(2) new_circ.append(custom_gate, [0, 1], []) new_circ.draw(output='mpl') -
Aggiunto il
UGate,CUGate,PhaseGate, eCPhaseGatecon i corrispondenti metodiQuantumCircuitmetodiu(),cu(),p(), ecp(). IlUGateil gate è il generico gate di rotazione a singolo qubit con 3 angoli di Eulero e ilCUGateè la sua versione controllata.CUGateha 4 parametri per tenere conto di un'eventuale fase globale della porta U. IlPhaseGateeCPhaseGatesono la porta di fase generale ad angolo arbitrario e la sua versione controllata. -
Un nuovo kwarg,
cregbundle, è stato aggiunto alla funzioneqiskit.visualization.circuit_drawer()e al metodoQuantumCircuitmetododraw(). Quando è impostato suTrue, nelle visualizzazioni dei circuiti per i cassettitextemplle creme saranno raggruppate in un'unica linea. Il valore predefinito èTrue. Risolve il problema n. 4290.Ad esempio:
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', cregbundle=True) -
Un nuovo kwarg,
initial_state, è stato aggiunto alla funzioneqiskit.visualization.circuit_drawer()e al metodoQuantumCircuitmetododraw(). Se impostato suTrue, lo stato iniziale sarà ora incluso nelle visualizzazioni dei circuiti per tutti i cassetti. Risolve il problema n. 4293.Ad esempio:
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', initial_state=True) -
Le etichette vengono ora visualizzate quando si utilizza il cassetto 'mpl'. Esistono due tipi di etichette: le etichette per cancelli e le etichette di controllo. Le etichette dei cancelli sostituiscono il nome del cancello sul display. Le etichette di controllo vengono visualizzate sopra o sotto i controlli di un cancello. Risolve i problemi #3766, #4580 Risolve i problemi #3766 e #4580.
Ad esempio:
from qiskit import QuantumCircuit from qiskit.circuit.library.standard_gates import YGate circuit = QuantumCircuit(2) circuit.append(YGate(label='A Y Gate').control(label='Y Control'), [0, 1]) circuit.draw(output='mpl')
Note sull'aggiornamento
-
Implementazioni del gate X multicontrollato (
MCXGrayCode,MCXRecursive, eMCXVChain) hanno cambiato le proprietànameper descrivere più accuratamente la loro implementazione:mcx_gray,mcx_recursive, emcx_vchainrispettivamente. In precedenza, questi gate condividevano il nomemcxconMCXGate, il che causava un'errata trasposizione e simulazione di questi gate. -
Per impostazione predefinita, i passmanager preimpostati in
qiskit.transpiler.preset_passmanagersutilizzaUnrollCustomDefinitionseBasisTranslatorper gestire il cambio di base, invece del precedente valore predefinitoUnroller. Questo è stato fatto perché i nuovi passaggi sono più flessibili e consentono di puntare a qualsiasi set di basi, ma l'output può essere diverso. Per utilizzare il default precedente si può impostare il kwarg ditranslation_methodsutranspile()a'unroller'. -
Le funzioni di conversione
qiskit.converters.circuit_to_gate()e :func` qiskit.converters.circuit_to_instruction\avevano precedentemente incluso automaticamente il gate o l'istruzione generata nell'attivoSessionEquivalenceLibrary. Questi convertitori accettano ora un argomento opzionale, la parola chiaveequivalence_library` , per specificare se e dove le istanze convertite devono essere registrate. Il comportamento predefinito è stato modificato in modo da non registrare l'istanza convertita. -
Il valore predefinito del kwarg di
cregbundleper il metodo e il metodoqiskit.circuit.QuantumCircuit.draw()e per la funzioneqiskit.visualization.circuit_drawer()è stato modificato inTrue. Ciò significa che, per impostazione predefinita, i bit classici dello schema circuitale saranno ora raggruppati, ad esempio:from qiskit.circuit import QuantumCircuit circ = QuantumCircuit(4) circ.x(0) circ.h(1) circ.measure_all() circ.draw(output='mpl')Se si desidera che il disegno del circuito mantenga il comportamento precedente e mostri ogni bit classico nel diagramma, è possibile impostare il kwarg
cregbundlesuFalse. Ad esempio:from qiskit.circuit import QuantumCircuit circ = QuantumCircuit(4) circ.x(0) circ.h(1) circ.measure_all() circ.draw(output='mpl', cregbundle=False) -
Scheduletracciando conqiskit.pulse.Schedule.draw()eqiskit.visualization.pulse_drawer()non visualizzerà più la tabella degli eventi per impostazione predefinita. Questo può essere riattivato impostando il kwarg ditablesuTrue. -
Il passaggio
RemoveResetInZeroStateera precedentemente incluso nel gestore di pass preimpostatilevel_0_pass_manager()che veniva utilizzato con le funzionioptimization_level=0pertranspile()eexecute(). Tuttavia,RemoveResetInZeroStateè un passaggio di ottimizzazione e non avrebbe dovuto essere incluso nel livello di ottimizzazione 0, quindi è stato rimosso. Se è necessario eseguiretranspile()conRemoveResetInZeroStateutilizzare un gestore di pass personalizzato ooptimization_level1, 2 o 3. -
Il deprecato kwarg
line_lengthper la funzioneqiskit.visualization.circuit_drawer()e il metodoqiskit.circuit.QuantumCircuit.draw()è stato rimosso. È stato deprecato dalla versione 0.10.0. È invece possibile utilizzare il kwarg difoldper regolare l'ampiezza dello schema circuitale. -
La modalità di uscita
'mpl'per ilqiskit.circuit.QuantumCircuit.draw()ecircuit_drawer()richiede ora l'installazione della libreria pylatexenc. Questa era già una dipendenza opzionale per la visualizzazione, ma in precedenza era richiesta solo per la modalità di output'latex'. Ora è richiesto anche per il cassetto matplotlib, perché è necessario per gestire correttamente il dimensionamento delle porte con le etichette mathtext di matplotlib per le porte. -
I metodi deprecati
get_tokensper i fileqiskit.qasm.Qasmeqiskit.qasm.QasmParsersono stati rimossi. Questi metodi sono stati deprecati dalla versione 0.9.0. Si devono invece utilizzare i metodiqiskit.qasm.Qasm.generate_tokens()eqiskit.qasm.QasmParser.generate_tokens(). -
Il kwarg deprecato
channels_to_plotperqiskit.pulse.Schedule.draw(),qiskit.pulse.Instruction.draw(),qiskit.visualization.pulse.matplotlib.ScheduleDrawer.drawepulse_drawer()è stato rimosso. Il kwarg è stato deprecato dalla versione 0.11.0 ed è stato sostituito dal kwargchannels, che funziona in modo identico e dovrebbe essere usato al suo posto. -
L'attributo deprecato
circuit_instruction_mapdella classeqiskit.providers.models.PulseDefaultsè stato rimosso. Questo attributo è stato deprecato dalla versione 0.12.0 ed è stato sostituito dall'attributoinstruction_schedule_map, che può essere utilizzato al suo posto. -
Il metodo
uniondiScheduleeInstructionsono stati deprecati dalla versione 0.12.0 e ora sono stati rimossi. Utilizzare i metodiqiskit.pulse.Schedule.insert()eqiskit.pulse.Instruction.meth()con il metodo kwarg``time=0``. -
Il deprecato argomento
scalingdel metododrawdiScheduleeInstructionè stato sostituito conscaledal rilascio di 0.12.0 e ora è stato rimosso. Utilizzare invece il sitoscalekwarg. -
L'argomento deprecato
periodalle funzioniqiskit.pulse.librarysono stati sostituiti dafreqa partire dalla versione 0.13.0 e ora sono stati rimossi. Utilizzarefreqkwarg invece diperiod. -
Il modulo
qiskit.pulse.commands, contenente le classi diCommands, è stato deprecato nella versione 0.13.0 e ora è stato rimosso. Se si utilizzano ancora i comandi, è necessario aggiornare il codice Pulse. Ad esempio:PrecedenteNuovoCommand(args)(channel)Instruction(args, channel)\Pitone Acquisire(durata)( AcquireChannel(0 )) ``` \Pitone Acquisire(durata, AcquireChannel(0 )) | ```python Delay(duration)(channel) ``` | ```python Delay(duration, channel) ``` | | ```python FrameChange(angle)(DriveChannel(0)) ``` | ```python # FrameChange was also renamed ShiftPhase(angle, DriveChannel(0)) ``` | | ```python Gaussian(...)(DriveChannel(0)) ``` | ```python # Pulses need to be `Play`d Play(Gaussian(...), DriveChannel(0)) ``` | -
Tutte le classi e le funzioni del modulo
qiskit.tool.qisono state deprecate nella versione 0.12.0 e ora sono state rimosse. Utilizzate invece il moduloqiskit.quantum_infoe i nuovi metodi e classi che contiene per lavorare con gli stati e gli operatori quantistici. -
Le funzioni
qiskit.quantum_info.basis_stateeqiskit.quantum_info.projectorsono deprecate a partire da Qiskit Terra 0.12.0 e sono state rimosse. Utilizzareqiskit.quantum_info.QuantumStatee le sue derivateqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixper lavorare con gli stati. -
Le funzioni di plottaggio interattivo di
qiskit.visualization,iplot_bloch_multivector,iplot_state_city,iplot_state_qsphere,iplot_state_hinton,iplot_histogram,iplot_state_paulivecora sono solo alias deprecati per gli equivalenti basati su matplotlib e non sono più interattivi. Il codice JS statico ospitato su cui si basavano queste funzioni è stato rimosso e non possono più funzionare. Una normale deprecazione non era possibile perché il sito da cui dipendevano non esisteva più. -
I componenti di validazione che utilizzano marshmallow di
qiskit.validationsono stati rimossi da terra. Poiché non vengono più utilizzati per costruire oggetti in terra. -
Le classi dello schema marshmallow in
qiskit.resultsono state rimosse, poiché non sono più utilizzate dalla classeqiskit.result.Result. -
L'output del metodo
to_dict()per la classeqiskit.result.Resultnon è più in un formato per la serializzazione diretta di JSON. A seconda del contenuto delle istanze di queste classi, possono esserci tipi che il codificatore JSON predefinito non sa come gestire, ad esempio numeri complessi o array numpy. Se si serializza direttamente l'output del metodoto_dict(), occorre assicurarsi che il codificatore JSON sia in grado di gestire questi tipi. -
L'opzione di acquisire più qubit contemporaneamente è stata deprecata nella versione 0.12.0 e ora è stata rimossa. In particolare, gli argomenti di init
mem_slotsereg_slotssono stati rimossi daqiskit.pulse.instructions.Acquireechannel,mem_slotereg_slotdaranno luogo a un errore se viene fornito un elenco come input. -
È stato rimosso il supporto per l'uso della variabile d'ambiente
USE_RETWORKX, introdotta nella versione 0.13.0 per fornire un fallback opzionale all'implementazione legacy basata su networkxqiskit.dagcircuit.DAGCircuitè stato rimosso. Questo flag è stato pensato solo per fornire una valvola di sfogo agli utenti che hanno riscontrato un problema con la nuova implementazione per una release durante la transizione a retworkx. -
Il modulo all'interno di
qiskit.pulseresponsabile delle trasformazioni schedule->schedule è stato rinominato dareschedule.pyatransforms.py. Il precedente percorso di importazione è stato deprecato. Per aggiornare il codice:from qiskit.pulse.rescheduler import <X>dovrebbe essere sostituito da:
from qiskit.pulse.transforms import <X> -
Nelle versioni precedenti, una classe
PassManagernon consentiva alle classiTransformationPassdi modificare il filePropertySet. Questa restrizione è stata eliminata, per cui una classeTransformationPassha ora accesso in lettura e scrittura sia aPropertySetche aDAGCircuitduranterun(). Questa modifica è stata apportata per facilitare in modo più efficiente le classi diTransformationPassche hanno uno stato interno che può essere necessario per i passaggi successivi nel filePassManager. Senza questa modifica, sarebbe stato necessario un secondoAnalysisPassridondante per ricreare lo stato interno, con un notevole sovraccarico di lavoro.
Note di deprecazione
-
Il nome del primo parametro posizionale per la funzione
qiskit.visualizationfunzioniplot_state_hinton(),plot_bloch_multivector(),plot_state_city(),plot_state_paulivec(), eplot_state_qsphere()è stato rinominato darhoastate. Il passaggio del valore per nome arhoè deprecato e sarà rimosso in una versione futura. Si deve invece passare l'argomento in posizione o usare il nuovo nome del parametrostate. -
Il modulo
qiskit.pulse.pulse_libè stato deprecato e sarà rimosso in una prossima versione. È stato rinominato inqiskit.pulse.libraryche dovrebbe essere utilizzato al suo posto. -
Il metodo
qiskit.circuit.QuantumCircuitmirror()è stato deprecato e sarà rimosso in una prossima versione. Il metodoqiskit.circuit.QuantumCircuit.reverse_ops()dovrebbe essere usato al suo posto, poiché il mirroring potrebbe essere confuso con lo scambio dei qubit di uscita del circuito. Il metodoreverse_ops()inverte solo l'ordine delle porte applicate, invece di rispecchiare. -
I metodi
qubits()eclbits()diqiskit.dagcircuit.DAGCircuitsono stati deprecati e saranno rimossi in una prossima versione. Sono state sostituite da proprietà con lo stesso nome,qiskit.dagcircuit.DAGCircuit.qubitseqiskit.dagcircuit.DAGCircuit.clbits, e sono memorizzate nella cache, per cui l'accesso è molto più veloce. -
Il metodo
get_sample_pulseper le classi derivate daqiskit.pulse.library.ParametricPulse(per esempioGaussianSquare) è stato deprecato e sarà rimosso in una prossima versione. È stato sostituito dal metodoget_waveform(ad esempioget_waveform()) che dovrebbe comportarsi in modo identico. -
L'uso dell'argomento opzionale
conditionsuqiskit.dagcircuit.DAGNode,qiskit.dagcircuit.DAGCircuit.apply_operation_back(), eqiskit.dagcircuit.DAGCircuit.apply_operation_front()è stato deprecato e sarà rimosso in una prossima versione. Invece l'insieme dicontrolinqiskit.circuit.Instructionche viene aggiunto a un fileDAGCircuitdovrebbe essere utilizzato. -
I metodi delle classi
set_atoleset_rtoldelle classiqiskit.quantum_info.BaseOperatoreqiskit.quantum_info.QuantumState(e delle loro sottoclassi, come ad esempioOperatoreqiskit.quantum_info.DensityMatrix) sono deprecati e saranno rimossi in una prossima versione. Il valore degli attributi.atole.rtoldeve invece essere impostato sulla classe. Ad esempio:from qiskit.quantum_info import ScalarOp ScalarOp.atol = 3e-5 op = ScalarOp(2) -
Le funzioni di plottaggio interattivo di
qiskit.visualization,iplot_bloch_multivector,iplot_state_city,iplot_state_qsphere,iplot_state_hinton,iplot_histogram,iplot_state_paulivecsono state deprecate e saranno rimosse in una prossima versione. Le funzioni equivalenti basate su matplotlib daqiskit.visualization,plot_bloch_multivector(),plot_state_city(),plot_state_qsphere(),plot_state_hinton(),plot_state_histogram(), eplot_state_paulivec()dovrebbero essere utilizzati al loro posto. -
Le proprietà
acquires,mem_slotsereg_slotsdell'istruzioneqiskit.pulse.instructions.Acquiresono state deprecate e saranno rimosse in una prossima versione. Sono solo duplicati dichannel,mem_slot, ereg_slotrispettivamente, ora che è stato rimosso il supporto precedentemente deprecato per l'uso di più qubit in un'unicaAcquireè stato rimosso. -
La classe
SamplePulsediqiskit.pulseè stata rinominata inWaveform.SamplePulseè deprecato e sarà rimosso in una prossima versione. -
La chiave del dizionario di stile
cregbundleè stata deprecata e sarà rimossa in una prossima versione. Questo è stato sostituito dal kwargcregbundleaggiunto alla funzioneqiskit.visualization.circuit_drawer()e al metodoQuantumCircuitmetododraw().
Correzioni di bug
-
Il
qiskit.circuit.QuantumCircuitmetodonum_nonlocal_gatesprecedentemente includeva oggetti multi-qubitqiskit.circuit.Instruction(ad esempio,Barrier) nel conteggio delle porte non locali. Il problema è stato corretto in modo che vengano conteggiati solo gli oggettiGatevengono contati solo gli oggetti non locali. Correzioni #4500 -
ControlledGatele istanze con un setctrl_statein alcuni casi non venivano valutate come uguali, anche se le porte confrontate erano equivalenti. Questo problema è stato risolto in modo tale che le correzioni #4573 -
Quando si accede a un bit da un elemento
qiskit.circuit.QuantumRegisteroqiskit.circuit.ClassicalRegisterby index when using numpy integer types <https://numpy.org/doc/stable/user/basics.types.html> `__ would previously raise aCircuitErrorexception. Questo problema è stato risolto in modo che i tipi di numpy possano essere usati in aggiunta al tipo Python 'built-inint. Correzioni #3929. -
È stato risolto un bug per cui veniva utilizzato solo il primo
qiskit.pulse.configuration.Kerneloqiskit.pulse.configuration.Discriminatorper unqiskit.pulse.Acquirequando c'erano più acquisizioni contemporaneamente in unqiskit.pulse.Schedule. -
L'unità SI utilizzata per la costruzione degli oggetti
qiskit.pulse.SetFrequencyè in Hz, ma quando viene creato un oggetto da un'istanza è necessario convertirlo in GHzPulseQobjInstructionviene creato da un'istanza diSetFrequency, deve essere convertito in GHz. Questa conversione mancava nelle versioni precedenti ed è stata corretta. -
In precedenza era possibile impostare il numero di qubit di controllo a zero, nel qual caso veniva restituita l'operazione originale, potenzialmente non controllata. Questo potrebbe causare un
AttributeErrorse il chiamante tentasse di accedere a un attributo che solo l'oggettoControlledGatehanno. Questo problema è stato risolto aggiungendo un getter e un setter pernum_ctrl_qubitsper convalidare l'uso di un valore valido. Correzioni #4576 -
I controlli aperti sono stati implementati modificando un oggetto
Gateoggettidefinition. Tuttavia, quando il gate esiste già nell'insieme di basi, questa definizione non è stata utilizzata, con il risultato di inviare circuiti errati a un backend dopo la transpilazione. Il problema è stato risolto modificando il passaggioUnrollerin modo che utilizzi la definizione se incontra un cancello controllato con controlli aperti. Correzioni #4437 -
L'argomento della parola chiave
insert_barriersnella classeZZFeatureMapnon inserisce effettivamente delle barriere tra gli strati di Hadamard e gli strati di evoluzione. Il problema è stato risolto in modo che le barriere siano ora inserite correttamente. -
Corretto il problema per cui alcune porte con tre o più qubit non riuscivano a essere compilate in alcuni casi. Per maggiori dettagli, fare riferimento a #4577 <https://github.com/Qiskit/qiskit/issues/4577.
-
Il backend di output matplotlib (
'mpl') per il metodoqiskit.circuit.QuantumCircuitmetododraw()e la funzioneqiskit.visualization.circuit_drawer()non si ridimensionava correttamente quando era impostato il kwargscale. I caratteri e le larghezze delle linee non sono stati scalati con il resto dell'immagine. Il problema è stato risolto e ora tutti gli elementi dello schema circuitale sono in scala corretta. Ad esempio:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.draw(output='mpl', scale=0.5)Correzioni #4179.
-
Corregge il problema per cui l'inizializzazione o l'evoluzione di
qiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixper circuiti per circuiti contenenti istruzioniBarriersollevava un'eccezione. Correzioni #4461 -
In precedenza, quando un elemento
QuantumCircuitconteneva unGatecon una condizione classica il transpiler a volte falliva quando si usavaoptimization_level=3sutranspile()oexecute()che sollevava unUnboundLocalError. Questo problema è stato risolto aggiornando ilConsolidateBlocksper tenere conto della condizione classica. Correzioni #4672. -
In alcune situazioni i nomi di gate e registri lunghi traboccavano o lasciavano uno spazio vuoto eccessivo intorno ad essi quando si utilizzava il backend di output
'mpl'per il metodo e il registroqiskit.circuit.QuantumCircuit.draw()metodo eqiskit.visualization.circuit_drawer()funzione. Il problema è stato risolto utilizzando una larghezza di testo corretta per un carattere proporzionale. Correzioni di #4611, #4605, #4545, #4497, #4449 e #3641. -
Quando si utilizza il backend di output
style` kwarg on the :meth:`qiskit.circuit.QuantumCircuit.draw` or :func:`qiskit.visualization.circuit_drawer` with the ``'mpl'con la chiave del dizionario'showindex'impostata suTrue, i numeri di indice in cima alla colonna non si allineano correttamente. Il problema è stato risolto. -
Quando si usa
cregbunde=Truecon il backend di output'mpl'per il metodoqiskit.circuit.QuantumCircuit.draw()e la funzioneqiskit.visualization.circuit_drawer()e si misura su una seconda piega, la freccia di misura sovrascrive il conteggio di creg. Per evitare ciò, il conteggio è stato spostato a sinistra. Correzioni #4148. -
Quando si utilizza il backend di output
'mpl'per il metodoqiskit.circuit.QuantumCircuit.draw()e la funzioneqiskit.visualization.circuit_drawer()funzioneCSwapGatee una porta controllataRZZGatele porte vengono ora visualizzate con i loro simboli appropriati invece che in un riquadro. -
Quando si utilizza il backend di output
'mpl'per il metodoqiskit.circuit.QuantumCircuit.draw()metodo eqiskit.visualization.circuit_drawer()le porte controllate create con il metodoto_gate()non erano correttamente spaziate e potevano sovrapporsi ad altre porte nello schema circuitale. Il problema è stato risolto. -
Quando si utilizza il backend di output
'mpl'per il metodoqiskit.circuit.QuantumCircuit.draw()eqiskit.visualization.circuit_drawer()le porte di funzioni con array come parametri, comeHamiltonianGate, non vengono più visualizzate con uno spazio eccessivo intorno ad esse. Correzioni #4352. -
Quando si utilizza il backend di output
'mpl'per il metodoqiskit.circuit.QuantumCircuit.draw()metodo eqiskit.visualization.circuit_drawer()i gate generici creati istanziando direttamente il metodoqiskit.circuit.Gatevisualizzano ora il colore di sfondo corretto per il gate. Correzioni #4496. -
Quando si utilizza il backend di output
'mpl'per il metodoqiskit.circuit.QuantumCircuit.draw()eqiskit.visualization.circuit_drawer()è stato risolto un problema diAttributeErrorche si verificava quando si usavanoIsometryoInitialize. Correzioni #4439. -
Quando si utilizza il backend di output
'mpl'per il metodoqiskit.circuit.QuantumCircuit.draw()metodo eqiskit.visualization.circuit_drawer()alcuni varchi controllati dall'apertura non visualizzavano correttamente i controlli di apertura. Il problema è stato corretto in modo che i controlli aperti vengano visualizzati correttamente come cerchi aperti. Correzioni #4248. -
Quando si utilizza il backend di output
'mpl'per il metodoqiskit.circuit.QuantumCircuit.draw()e per la funzioneqiskit.visualization.circuit_drawer()impostando il kwarg difoldsu -1, il circuito verrà visualizzato correttamente senza pieghe. Correzioni #4506. -
Gli impulsi parametrici di
qiskit.pulse.library.discretehanno ora le estremità degli impulsi parametrici pari a zero per impostazione predefinita. Gli estremi sono definiti in modo tale che per una funzione allora . Correzioni #4317
Altre note
- La classe
qiskit.result.Resultche in precedenza era stata costruita utilizzando la libreria marshmallow, è stata riadattata per non dipendere più da marshmallow. Questa nuova implementazione dovrebbe essere una transizione senza soluzione di continuità, ma alcuni comportamenti specifici precedentemente ereditati da marshmallow potrebbero non funzionare. Si prega di presentare i problemi per qualsiasi incompatibilità riscontrata.
Aer 0.6.1
Preludio
Questa versione di 0.6.0 include numerosi miglioramenti delle prestazioni per tutti i simulatori del provider Aer e modifiche significative al sistema di compilazione quando si costruisce dai sorgenti. Le principali modifiche riguardano il supporto della vettorizzazione SIMD, l'approssimazione del metodo di stato del prodotto matriciale tramite il troncamento della dimensione dei legami, un calcolo più efficiente del valore di aspettativa di Pauli e un'efficienza notevolmente migliorata nella conversione in Python degli oggetti risultato in C++. Il sistema di compilazione è stato aggiornato per utilizzare Conan per gestire le dipendenze comuni del C++ durante la compilazione dai sorgenti.
Nuove funzioni
-
Aggiungere il supporto per l'istantanea della matrice di densità ai metodi "statevector" e "statevector_gpu" di QasmSimulator.
-
Consentire snapshot della matrice di densità su qubit specifici, non solo su tutti i qubit. Questo calcola la traccia parziale dello stato sui qubit rimanenti.
-
Aggiunge il supporto dell'istantanea del valore di aspettativa di Pauli al metodo di simulazione "densità_matrice" di
qiskit.providers.aer.QasmSimulator. Aggiungere istantanee ai circuiti utilizzando l'estensioneqiskit.providers.aer.extensions.SnapshotExpectationValue. -
Migliora notevolmente le prestazioni dell'algoritmo di istantanea del valore di aspettativa di Pauli per i metodi di simulazione "statevector", "statevector\gpu", "density_matrix" e "density_matrix_gpu" di
qiskit.providers.aer.QasmSimulator. -
Abilitare l'ottimizzazione del circuito gate-fusion da
qiskit.providers.aer.QasmSimulatorin entrambi i backendqiskit.providers.aer.StatevectorSimulatoreqiskit.providers.aer.UnitarySimulator. -
Migliorare le prestazioni dei dati medi delle istantanee nei risultati del simulatore. Questo ha effetti sulla probabilità, sul valore di aspettativa di Pauli e sulle istantanee della matrice di densità utilizzando le seguenti estensioni:
qiskit.providers.aer.extensions.SnapshotExpectationValueqiskit.providers.aer.extensions.SnapshotProbabilitiesqiskit.providers.aer.extensions.SnapshotDensityMatrix
-
Aggiungere il costruttore move e migliorare l'uso della memoria della classe matrix del C++ per ridurre al minimo le copie delle matrici quando si sposta l'output dei simulatori nei risultati.
-
Migliorare le prestazioni del simulatore unitario.
-
Aggiungere un'approssimazione al metodo di simulazione "matrix_product_state" di
QasmSimulatorper limitare la dimensione dei legami della MPS.Esistono due modalità di approssimazione. Entrambi scartano i coefficienti di Schmidt più piccoli seguendo l'algoritmo SVD. Esistono due parametri che controllano il grado di approssimazione:
"matrix_product_state_max_bond_dimension"(int): Imposta un limite al numero di coefficienti di Schmidt conservati alla fine dell'algoritmo svd. I coefficienti che superano questo limite vengono scartati. (predefinito: Nessuno, cioè nessun limite alla dimensione del legame)."matrix_product_state_truncation_threshold"(doppio): Scarta i coefficienti più piccoli per i quali la somma dei loro quadrati è inferiore a questa soglia. (Predefinito: 1e-16 ). -
Migliorare le prestazioni del campionamento delle misure quando si utilizza il metodo di simulazione "matrix_product_state"
QasmSimulator. -
Aggiungere il supporto per le istruzioni ad impulsi
Delay,PhaseeSetPhaseaqiskit.providers.aer.PulseSimulator. -
Migliorare le prestazioni di
qiskit.providers.aer.PulseSimulatormettendo in cache le chiamate alle funzioni RHS -
Introdurre metodi alternativi di risoluzione delle DE, specificabili attraverso
backend_optionsnel sitoqiskit.providers.aer.PulseSimulator. -
Migliorare le prestazioni delle classi di risultati del simulatore utilizzando la semantica del movimento e rimuovendo le copie non necessarie che si verificavano quando si combinavano i risultati di esperimenti separati nell'oggetto risultato finale.
-
Migliorare notevolmente le prestazioni della conversione pybind11 dei risultati del simulatore, utilizzando la semantica move dove possibile e spostando i risultati di vettori e matrici in array Numpy senza copie.
-
Modifica del motore RNG per i simulatori da Mersenne twister a 32 bit a Mersenne twister a 64 bit.
-
Migliora le prestazioni del metodo di simulazione "statevector" di
qiskit.providers.aer.QasmSimulatoreqiskit.providers.aer.StatevectorSimulatorutilizzando gli intrinseci SIMD sui sistemi che supportano il set di istruzioni AVX2. AVX2 viene rilevato e abilitato automaticamente in fase di esecuzione.
Note sull'aggiornamento
-
Cambia il sistema di compilazione per usare il gestore di pacchetti Conan. Questo strumento gestirà la maggior parte delle dipendenze necessarie al codice sorgente C++. La connessione a Internet potrebbe essere necessaria per la prima compilazione o quando vengono aggiunte o aggiornate le dipendenze, per scaricare i pacchetti necessari se non sono presenti nel repository locale di Conan.
Quando si costruisce la versione standalone di qiskit-aer è necessario installare prima conan con:
pip install conan -
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. -
Aggiunge un oggetto OpSet alla classe State del simulatore di base, per consentire una più facile convalida di istruzioni, porte e istantanee supportate dai simulatori.
-
Riformulare la classe OpSet. Spostare OpSet in un file di intestazione separato e aggiungere i metodi
containsedifferencebasati sustd::set::containsestd::algorithm::set_difference. Queste sostituiscono le istruzioni invalidate e validate rimosse da OpSet,, ma con l'ordine invertito. Restituisce un elenco di altre operazioni non presenti nell'opset corrente piuttosto che di istruzioni dell'opset non presenti nell'altro. -
Migliora il controllo dell'ottimizzazione del campionamento delle misure. La parte costosa di questa operazione viene ora eseguita una sola volta durante la costruzione del circuito, anziché più volte durante la simulazione per controllare i requisiti di memoria, il metodo di simulazione e l'esecuzione finale.
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 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".
-
Disabilita la fusione dei gate per il metodo di simulazione dello stato del prodotto matriciale, poiché in alcuni casi causava problemi con la restituzione di risultati errati.
-
Corregge un bug che causava un'errata valutazione dei canali nel sito
qiskit.providers.aer.PulseSimulator. -
Correzione di alcuni bug minori relativi a casi limite di parsing hamiltoniano nella classe
qiskit.providers.aer.pulse.system_models.hamiltonian_model.HamiltonianModel.
Ignis 0.4.0
Preludio
La principale modifica apportata in questa release è una rifattorizzazione del codice del Randomized Benchmarking per integrare la classe Clifford aggiornata da Terra e per migliorare la classe CNOT-Dihedral qiskit.quantum_info.Clifford di Terra e per migliorare la classe CNOT-Dihedral.
Nuove funzioni
- La funzione
qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()è stata riadattata in modo da utilizzare la classe Clifford aggiornataCliffordper consentire un efficiente Randomized Benchmarking (RB) su sequenze Clifford con più di 2 qubit. Inoltre, il codice della classe CNOT-Dihedralqiskit.ignis.verification.randomized_benchmarking.CNOTDihedralè stato rifattorizzato per renderlo più efficiente, utilizzando array numpy e non utilizzando file pickle pre-generati che memorizzano tutti gli elementi del gruppo 2-qubit. La funzioneqiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()ha un nuovo kwargrand_seedche può essere usato per specificare un seme per il generatore di numeri casuali usato per generare i circuiti RB. Questo può essere utile per avere un circuito riproducibile. - La funzione
qiskit.ignis.verification.qv_circuits()ha un nuovo kwargseedche può essere usato per specificare un seme per il generatore di numeri casuali usato per generare i circuiti Quantum Volume. Questo può essere utile per avere un circuito riproducibile.
Note sull'aggiornamento
- La funzione
qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()ora utilizza la classe Clifford aggiornataClifforde la classe CNOT-Dihedral aggiornataqiskit.ignis.verification.randomized_benchmarking.CNOTDihedralper costruire il suo output, invece di utilizzare tabelle di gruppi pre-generate per gli elementi dei gruppi Clifford e CNOT-Dihedral, che erano memorizzate in file pickle. Ciò può comportare differenze minime rispetto all'output della versione precedente. - Un nuovo requisito scikit-learn è stato aggiunto all'elenco dei requisiti. Questa dipendenza è stata aggiunta nella release 0.3.0, ma non era esposta correttamente come dipendenza in quella release. Questo porterebbe a un
ImportErrorse il moduloqiskit.ignis.measurement.discriminator.iq_discriminatorsfosse importato. Ora è correttamente elencato come dipendenza, in modo chescikit-learnvenga installato con qiskit-ignis. - La funzione
qiskit.ignis.verification.qv_circuits()ora utilizza la classe della libreria dei circuitiQuantumVolumeper costruire il suo output, invece di costruire il circuito da zero. Ciò può comportare differenze minime rispetto all'output della versione precedente. - Gli installatori di tomografie possono ora ottenere anche un elenco di oggetti Risultato invece di un singolo Risultato, come richiesto nel problema #320.
Note di deprecazione
-
Il kwarg
interleaved_gatesper la funzioneqiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()è stato deprecato e sarà rimosso in una prossima versione. È sostituito dainterleaved_elem. Le funzioni helperqiskit.ignis.verification.randomized_benchmarking.BasicUtils,qiskit.ignis.verification.randomized_benchmarking.CliffordUtilseqiskit.ignis.verification.randomized_benchmarking.DihedralUtilssono state deprecate. Queste classi sono sostituite daqiskit.ignis.verification.randomized_benchmarking.RBgroupche gestisce le operazioni di gruppo necessarie per RB. La classeqiskit.ignis.verification.randomized_benchmarking.Cliffordè sostituita daClifford. -
I kwarg
qrecrper la funzioneqiskit.ignis.verification.qv_circuits()sono stati deprecati e saranno rimossi in una prossima versione. Questi kwarg sono stati documentati per essere utilizzati per specificare un elementoqiskit.circuit.QuantumRegistereqiskit.circuit.ClassicalRegisterda usare nei circuiti di Quantum Volume generati, invece di crearne di nuovi. Tuttavia, i parametri non vengono mai rispettati e viene sempre creato un nuovo Registro, indipendentemente dal fatto che siano impostati o meno. Questo comportamento è invariato e questi kwarg non hanno ancora alcun effetto, ma vengono deprecati prima di essere rimossi per evitare un cambiamento di rottura per gli utenti che potrebbero aver impostato uno dei due. -
Il supporto per il passaggio di sottoinsiemi di qubit come elenco nel parametro
qubit_listsper la funzioneqiskit.ignis.verification.qv_circuits()è stato deprecato e sarà rimosso in una versione futura. In passato veniva utilizzato per specificare un layout per eseguire il circuito su un dispositivo. In altre parole, se si dispone di un dispositivo a 5 qubit e si vuole eseguire un circuito QV a 2 qubit sui qubit 1, 3 e 4 di quel dispositivo. Si passerebbe[1, 3, 4]come una delle liste inqubit_lists, che genererebbe un circuito virtuale a 5 qubit e avrebbe qv applicato ai qubit 1, 3 e 4 in quel circuito virtuale. Tuttavia, questa funzionalità non è necessaria e si sovrappone al concetto diinitial_layoutnel transpiler e se un circuito è stato incorporato con un set di layout. Per andare avanti, invece, si dovrebbe semplicemente eseguiretranspile()oexecute()con il layout iniziale impostato per farlo. Ad esempio, l'esecuzione dell'esempio precedente diventerebbe:from qiskit import execute from qiskit.ignis.verification import qv_circuits initial_layout = [1, 3, 4] qv_circs, _ = qv_circuits([list(range3)]) execute(qv_circuits, initial_layout=initial_layout)
Correzioni di bug
- Correzione di un bug relativo alla posizione degli impulsi di misura inseriti da py:func:qiskit.ignis.characterization.calibrations.pulse_schedules.drag_schedules. Correzioni #465
Acqua 0.7.5
Nuove funzioni
- Eliminata la dipendenza soft da CPLEX in ADMMOptimizer. Ora gli ottimizzatori predefiniti utilizzati da ADMMOptimizer sono MinimumEigenOptimizer per i problemi QUBO e SlsqpOptimizer come ottimizzatore continuo. È ancora possibile utilizzare CplexOptimizer come ottimizzatore per ADMMOptimizer, ma deve essere impostato esplicitamente.
- Il nuovo sito di Yahoo! creazione di un fornitore di finanziamenti.
- Introdotto
QuadraticProgramConverter, una classe astratta per i convertitori. Aggiunti i metodiconvert/interpretper i convertitori invece diencode/decode. Aggiuntito_isingefrom_isingalla classeQuadraticProgram. Spostati tutti i parametri daconvertal costruttore, trannename. Creato setter/getter per i parametri del convertitore. Aggiuntiauto_define_penaltyeinterpretfor``LinearEqualityToPenalty``. Ora i messaggi di errore dei convertitori sono più informativi. - Aggiunto un ottimizzatore SLSQP
qiskit.optimization.algorithms.SlsqpOptimizercome wrapper del corrispondente metodo di ottimizzazione SciPy. Si tratta di un ottimizzatore classico, che non dipende da algoritmi quantistici e può essere utilizzato in sostituzione diCobylaOptimizer. - L'ottimizzatore Cobyla è stato modificato per accogliere la funzione di avvio multiplo introdotta nell'ottimizzatore SLSQP. Per impostazione predefinita, l'ottimizzatore non viene eseguito in modalità di avvio multiplo.
SummedOpesegue un controllo matematicamente più corretto dell'uguaglianza, dove espressioni comeX + X == 2*XeX + Z == Z + Xsono valutate comeTrue.
Note di deprecazione
- La classe di ottimizzazione GSLS ha deprecato il parametro
__init__max_itera favore dimaxiter. La classe di ottimizzazione SPSA ha deprecato il parametro__init__max_trialsa favore dimaxiter. la funzione optimize_svm ha deprecato il parametromax_itersa favore dimaxiter. La classe ADMMParameters ha deprecato il parametro__init__max_itera favore dimaxiter. - Le classi di conversione ising
qiskit.optimization.converters.QuadraticProgramToIsingeqiskit.optimization.converters.IsingToQuadraticProgramsono state deprecate e saranno rimosse in una prossima versione. Si devono invece utilizzare i metodiqiskit.optimization.QuadraticProgramto_ising()efrom_ising(). - Il metodo
pprint_as_stringperqiskit.optimization.QuadraticProgramè stato deprecato e sarà rimosso in una prossima versione. Si dovrebbe invece eseguire.pprint_as_string()sull'output dito_docplex() - Il metodo
prettyprintperqiskit.optimization.QuadraticProgramè stato deprecato e sarà rimosso in una prossima versione. Si dovrebbe invece eseguire.prettyprint()sull'output dito_docplex()
Correzioni di bug
- Modificato nella versione python 3.8: Su macOS, il metodo di avvio dello spawn è ora quello predefinito. Il metodo di avvio della forchetta deve essere considerato non sicuro, in quanto può causare arresti anomali nei sottoprocessi. Tuttavia P_BFGS non supporta lo spawn, quindi torniamo al processo singolo. Per maggiori dettagli, consultare il documento #1109 <https://github.com/qiskit-community/qiskit-aqua/issues/1109>.
- I parametri di binding in
CircuitStateFnnon copiavano il valore diis_measuremente impostavano sempreis_measurement=False. Il problema è stato risolto. - In precedenza, SummedOp.to_matrix_op costruiva una lista MatrixOp’s (con matrici numpy) e poi le sommava, restituendo un singolo MatrixOp. Alcuni algoritmi (ad esempio vqe) richiedono la somma di migliaia di matrici, il che esaurisce la memoria durante la costruzione dell'elenco di matrici. Con questa modifica, non viene costruito alcun elenco. Piuttosto, ogni operando della somma viene convertito in una matrice, aggiunto a un accumulatore e scartato.
- La modifica dei backend in VQE da statevector a qasm_simulator o a un dispositivo reale causava un errore dovuto al riutilizzo incompatibile di CircuitSampler. Il VQE è stato modificato per creare sempre un nuovo CircuitSampler e creare una nuova aspettativa nel caso in cui non sia stata inserita dall'utente. Per maggiori dettagli, consultare il documento #1153 <https://github.com/qiskit-community/qiskit-aqua/issues/1153>.
- I fornitori di servizi finanziari di Exchange e Wikipedia sono stati corretti per gestire correttamente i dati di Quandl. Per maggiori dettagli, consultare il documento #775 <https://github.com/qiskit-community/qiskit-aqua/issues/775>. Corregge un errore di divisione per 0 nei calcoli del vettore medio e della matrice di covarianza dei fornitori di servizi finanziari. Per maggiori dettagli, consultare il documento #781 <https://github.com/qiskit-community/qiskit-aqua/issues/781>.
- La proprietà
ListOp.combo_fnè stata persa in diverse trasformazioni, come la conversione in un altro tipo di operatore, l'attraversamento, la riduzione o la moltiplicazione. Ora questo attributo viene propagato all'operatore risultante. - La valutazione di alcune espressioni di operatori, come quella di
SummedOp``s and evaluations with the ``CircuitSampler, non trattava correttamente i coefficienti o li ignorava completamente. E.g. valutando~StateFn(0 * (I + Z)) @ Plusnon si è ottenuto 0 o la normalizzazione di~StateFn(I) @ ((Plus + Minus) / sqrt(2))ha mancato un fattore disqrt(2). Il problema è stato risolto. OptimizationResultincludeva alcuni setter pubblici e le variabili di classe eranoOptional. Questa correzione rende tutte le variabili della classe di sola lettura, in modo che mypy e pylint possano controllare i tipi in modo più efficace.MinimumEigenOptimizer.solvebitstings generati in un risultato comestr. Questa correzione ha modificato il risultato inList[float]come fanno gli altri algoritmi. Alcune classi pubbliche relative agli algoritmi di ottimizzazione mancavano nella documentazione diqiskit.optimization.algorithms. Questa correzione ha aggiunto tutte le classi di questo tipo alla documentazione. #1131 <https://github.com/qiskit-community/qiskit-aqua/issues/1131> per maggiori dettagli.OptimizationResult.__init__non ha controllato se le dimensioni dixevariablescorrispondono o meno (dovrebbero corrispondere). Questa correzione ha aggiunto il controllo per sollevare un errore se non corrispondono e corregge i bug rilevati dal controllo. Questa correzione aggiunge anche i test unitari mancanti relativi aOptimizationResult.variable_nameseOptimizationResult.variables_dictintest_converters. #1167 <https://github.com/qiskit-community/qiskit-aqua/issues/1167> per maggiori dettagli.- Correggere il binding dei parametri in
OperatorStateFn, che non vincolava i parametri della primitiva sottostante ma solo i coefficienti. op.eval(other), doveopè di tipoOperatorBase, a volte restituisce silenziosamente un valore senza senso quando il numero di qubit inopeothernon sono uguali. Questa correzione comporta un comportamento corretto, che consiste nel lanciare un errore anziché restituire un valore, perché l'input in questo caso non è valido.- Il metodo
construct_circuitdiVQErestituiva in precedenza il valore di aspettativa da valutare come tipoOperatorBase. Questa funzionalità è stata spostata inconstruct_expectationeconstruct_circuitrestituisce un elenco dei circuiti che vengono valutati per calcolare il valore di aspettativa.
IBM Q Fornitore 0.8.0
Nuove funzioni
IBMQBackendha ora un nuovo metodoreservations()che restituisce le informazioni sulla prenotazione per il backend, con un filtro opzionale. Inoltre, ora è possibile utilizzareprovider.backends.my_reservations()per richiedere le proprie prenotazioni.qiskit.providers.ibmq.job.IBMQJob.result()solleva un'eccezioneIBMQJobFailureErrorse il lavoro è fallito. Il messaggio di eccezione ora contiene il motivo per cui il lavoro è fallito, se l'intero lavoro è fallito per un unico motivo.- Un nuovo attributo
client_versionè stato aggiunto aIBMQJobe aqiskit.result.Resultrecuperato tramiteqiskit.providers.ibmq.job.IBMQJob.result().client_versionè un dizionario in cui la chiave è il nome e il valore è la versione del client usato per inviare il lavoro, come Qiskit. - La funzione
least_busy()accetta ora un nuovo parametro opzionalereservation_lookahead. Se specificato o predefinito, un backend è considerato non disponibile se ha prenotazioni nei prossiminminuti, dovenè il valore direservation_lookahead. Ad esempio, se si utilizza il valore predefinito di 60, tutti i backend che hanno prenotazioni nei successivi 60 minuti sono considerati non disponibili. ManagedResultsdispone di un nuovo metodocombine_results()che combina i risultati di tutti i lavori gestiti e restituisce un singolo oggettoResultoggetto. Questo oggettoResultpuò essere utilizzato, ad esempio, nei metodi diqiskit-ignisadattamento.
Note sull'aggiornamento
-
I timestamp nei seguenti campi sono ora in ora locale anziché UTC:
- Proprietà di backend restituite da
qiskit.providers.ibmq.IBMQBackend.properties(). - Proprietà di backend restituite da
qiskit.providers.ibmq.job.IBMQJob.properties(). estimated_start_timeeestimated_complete_timeinQueueInfo, restituito daqiskit.providers.ibmq.job.IBMQJob.queue_info().dateinResult, restituito daqiskit.providers.ibmq.job.IBMQJob.result().
Inoltre, anche il parametro
datetimeperqiskit.providers.ibmq.IBMQBackend.properties()dovrebbe essere in ora locale, a meno che non contenga informazioni sul fuso orario UTC. - Proprietà di backend restituite da
-
websockets8.0 o superiore è ora richiesto se si usa Python 3.7 o superiore.websockets7.0 continuerà a essere utilizzato per Python 3.6 o inferiore. -
In Windows, il criterio del ciclo di eventi è impostato su
WindowsSelectorEventLoopPolicyinvece di utilizzare il valore predefinitoWindowsProactorEventLoopPolicy. Questo risolve il problema per cui il metodoqiskit.providers.ibmq.job.IBMQJob.result()poteva bloccarsi su Windows. Correzioni #691
Note di deprecazione
- L'uso di
Qconfig.pyper salvare le credenziali di IBM Quantum Experience è deprecato e sarà rimosso nella prossima versione. Si dovrebbe invece usareqiskitrc(l'impostazione predefinita).
Correzioni di bug
- Corregge un problema per cui una chiamata a
qiskit.providers.ibmq.IBMQBackend.jobs()può bloccarsi se il numero di lavori restituiti è elevato. Correzioni #674 - Corregge un problema che sollevava un
ValueErrorquando si costruivano mappe di errori in Jupyter per i backend non in linea. Correzioni #706 qiskit.providers.ibmq.IBMQBackend.jobs()restituirà ora l'elenco corretto degli oggettiIBMQJobquando il kwargstatusè impostato su'RUNNING'.- I metadati del pacchetto sono stati aggiornati per riflettere correttamente la dipendenza da
qiskit-terra>= 0.14.0. Questa dipendenza è stata implicitamente aggiunta come parte del rilascio di 0.7.0, ma non è stata riflessa nei requisiti del pacchetto, per cui in precedenza era possibile installareqiskit-ibmq-providercon una versione diqiskit-terratroppo vecchia. Correzioni #677