Note di rilascio di Qiskit 0.25
0.25.4
Terra 0.17.2
Preludio
Si tratta di una versione con correzione di bug che risolve diversi problemi della versione 0.17.1. La cosa più importante è che questo rilascio risolve la compatibilità della classe QuantumInstance quando viene eseguita su backend che si basano sulla classe BackendV1 classe astratta. Questo risolve tutti gli algoritmi e le applicazioni costruite su qiskit.algorithms o qiskit.opflow quando vengono eseguite su backend più recenti.
Correzioni di bug
- È stato risolto un problema con il passaggio
BasisTranslatorche in alcuni casi traduceva le porte già presenti nella base di destinazione. Ciò comporterebbe potenzialmente tempi di esecuzione più lunghi e risultati meno ottimali. Corretto #6085 - Corretto un problema in
SPSAquando l'ottimizzatore veniva inizializzato con una funzione di callback tramite il kwargcallback, che poteva causare un errore. - Corretto un problema in cui i kwarg
qiskit.quantum_info.Statevector.expectation_value()eqiskit.quantum_info.DensityMatrix.expectation_value`methods where the ``qargs`()kwarg veniva ignorato se l'operatore era unPaulioSparsePauliOpun oggetto operatore. Corretto #6303 - È stato risolto un problema nel metodo
qiskit.quantum_info.Pauli.evolve()che poteva causare la restituzione di un Pauli errato quando si evolveva con un metodoCZGate,CYGate, o unSwapGatecancello. - Corretto un problema nel metodo
qiskit.opflow.SparseVectorStateFn.to_dict_fn(), che in precedenza aveva al massimo una voce per lo stato tutto zero a causa di un errore di indice. - Corretto un problema nel metodo
qiskit.opflow.SparseVectorStateFn.equals()in modo che restituisca correttamenteTrueoFalseinvece di un confronto tra vettori sparsi dei singoli elementi. - Corregge un problema nel file
StatevectoreDensityMatrixmetodi di probabilitàqiskit.quantum_info.Statevector.probabilities(),qiskit.quantum_info.Statevector.probabilities_dict(),qiskit.quantum_info.DensityMatrix.probabilities(),qiskit.quantum_info.DensityMatrix.probabilities_dict()dove le probabilità restituite potrebbero avere un ordinamento errato per alcuni valori diqargskwarg. Corretto #6320 - È stato risolto un problema per cui la classe
TaperedPauliSumOpnon supportava la moltiplicazione conParameterExpressione inoltre non disponeva di un metodoassign_parameters()necessario per lavorare con gli oggettiParameterExpressionoggetti. Corretto #6127 - Corretta la compatibilità della classe
QuantumInstancequando viene eseguita su backend che si basano sulla classeBackendV1classe astratta. Corretto #6280
Aer 0.8.2
Nessuna modifica
Ignis 0.6.0
Nessuna modifica
Acqua 0.9.1
Nessuna modifica
IBM Q Fornitore 0.12.3
Nessuna modifica
0.25.3
Terra 0.17.1
Nessuna modifica
Aer 0.8.2
Problemi noti
SaveExpectationValueeSaveExpectationValueVariancesono stati disabilitati per il metodo extended_stabilizer diQasmSimulatoreAerSimulatora causa della restituzione di un valore errato per alcune componenti dell'operatore di Pauli. Per ulteriori informazioni ed esempi, consultare il documento #1227 <https://github.com/Qiskit/qiskit-aer/issues/1227>.
Correzioni di bug
- Corregge un problema di prestazioni legato all'impostazione dell'attributo di configurazione
basis_gates. In precedenza si verificavano effetti collaterali indesiderati per la classe backend che potevano causare un aumento del tempo di esecuzione della simulazione ripetuta. Per ulteriori informazioni ed esempi, consultare il documento #1229 <https://github.com/Qiskit/qiskit-aer/issues/1229>. - Corregge un bug con l'istruzione del simulatore
"multiplexer"in cui l'ordine dei qubit di destinazione e di controllo era invertito rispetto all'ordine dell'istruzione Qiskit. - Corregge un bug introdotto in 0.8.0 per cui le simulazioni su GPU allocavano memoria host non necessaria in aggiunta alla memoria della GPU.
- Corregge un errore nel metodo di simulazione
stabilizerdiQasmSimulatoreAerSimulatorper cui il valore di aspettativa persave_expectation_valueesnapshot_expectation_valuepoteva avere un segno errato per alcuniYPauli.
Ignis 0.6.0
Nessuna modifica
Acqua 0.9.1
Nessuna modifica
IBM Q Fornitore 0.12.3
Nessuna modifica
0.25.2
Terra 0.17.1
Nessuna modifica
Aer 0.8.1
Nessuna modifica
Ignis 0.6.0
Nessuna modifica
Acqua 0.9.1
Nessuna modifica
IBM Q Fornitore 0.12.3
Altre note
- L'attributo
qiskit.providers.ibmq.experiment.analysis_result.AnalysisResultfitè ora facoltativo.
0.25.1
Terra 0.17.1
Preludio
Si tratta di una versione con correzione di bug che risolve diversi problemi della versione 0.17.0. Soprattutto questo rilascio corregge il pacchetto sdist costruito in modo errato per il rilascio 0.17.0, che non era effettivamente compilabile e bloccava l'installazione su piattaforme senza binari precompilati disponibili.
Correzioni di bug
-
Corretto un problema per cui l'attributo
global_phasenon veniva conservato nell'oggetto di outputQuantumCircuitquando il metodoqiskit.circuit.QuantumCircuit.reverse_bits()è stato richiamato. Ad esempio:import math from qiskit import QuantumCircuit qc = QuantumCircuit(3, 2, global_phase=math.pi) qc.h(0) qc.s(1) qc.cx(0, 1) qc.measure(0, 1) qc.x(0) qc.y(1) reversed = qc.reverse_bits() print(reversed.global_phase)ora stamperà correttamente .
-
Corretto un problema per cui il passaggio del transpiler
Unrollernon preservava la fase globale nel caso di istruzioni annidate con una regola nella loro definizione. Corretto #6134 -
È stato risolto un problema a causa del quale l'attributo
parameterdi un oggettoControlledGatecostruito da un oggettoUnitaryGatenon veniva impostato sulla matrice unitaria dell'oggettoUnitaryGate. In precedenza,control()costruiva una matriceControlledGatecon l'attributoparameterimpostato sulla versione controllata della matriceUnitaryGate. Questo porterebbe a una modifica diparameterdell'oggetto di baseUnitaryGatee le successive chiamate ainverse()creava l'inverso di un oggettoUnitaryGatea doppio controllo. Corretto #5750 -
Corretto un problema con i gestori dei passaggi preimpostati
level_0_pass_managerelevel_1_pass_manager(che corrispondono aoptimization_level0 e 1 pertranspile()) che in alcuni casi producevano circuiti che non rientravano nella base richiesta. -
Correzione di un bug a causa del quale l'utilizzo di
SPSAcon la calibrazione automatica del tasso di apprendimento e della perturbazione (ad es.learning_rateeperturbationsonoNonenell'inizializzatore), memorizza la calibrazione per tutte le ottimizzazioni future. La calibrazione deve invece essere effettuata per ogni nuova funzione obiettivo.
Aer 0.8.1
Correzioni di bug
- È stato risolto un problema relativo all'uso del metodo
matrix_product_statedei simulatoriAerSimulatoreQasmSimulatorquando si esegue una simulazione rumorosa con errori di Kraus. In precedenza, il metodo di simulazione di stato del prodotto matriciale non propaga le modifiche ai qubit vicini dopo l'applicazione della matrice di Kraus. Il problema è stato risolto in modo che l'output della simulazione sia corretto. Corretti #1184 e #1205 - È stato risolto un problema per cui l'istruzione
qiskit.extensions.Initializedisabilitava l'ottimizzazione del campionamento delle misure per i metodi di simulazionestatevectorematrix_product_statedei simulatoriAerSimulatoreQasmSimulator, anche quando era la prima istruzione del circuito o veniva applicata a tutti i qubit e quindi era deterministica. Corretto #1210 - Risolvere un problema con le istruzioni
SaveStatevectoreSnapshotStatevectorquando vengono utilizzate con il metodo di simulazioneextended_stabilizerdei simulatoriAerSimulatoreQasmSimulator, che restituisce un vettore di stato non normalizzato. Corretto #1196 - Il metodo di simulazione
matrix_product_statesupporta ora l'istruzione set state, precedentemente mancante,qiskit.providers.aer.library.SetMatrixProductState, che consente di impostare lo stato di una simulazione in un circuito.
Ignis 0.6.0
Nessuna modifica
Acqua 0.9.1
IBM Q Fornitore 0.12.2
Nessuna modifica
0.25.0
Questa versione elimina ufficialmente il progetto Qiskit Aqua. Di conseguenza, in una futura release il pacchetto qiskit-aqua sarà rimosso dal metapacchetto Qiskit, il che significa che in quella futura release pip install qiskit non includerà più qiskit-aqua. I moduli applicativi forniti da qiskit-aqua sono stati suddivisi in diversi nuovi pacchetti: qiskit-optimization, qiskit-nature, qiskit-machine-learning, e qiskit-finance. Questi pacchetti possono essere installati da soli (tramite il comando standard pip install, ad esempio pip install qiskit-nature) o con il resto del metapacchetto Qiskit come extra opzionali (ad es. pip install 'qiskit[finance,optimization]' o pip install 'qiskit[all]' Gli algoritmi di base e il flusso di operatori sono ora disponibili come parte di qiskit-terra all'indirizzo qiskit.algorithms e qiskit.opflow. A seconda dell'uso che si fa di Aqua, si possono utilizzare i pacchetti applicativi o i nuovi moduli di Qiskit Terra. Per maggiori dettagli su come migrare da Qiskit Aqua, potete consultare la guida alla migrazione.
Terra 0.17.0
Preludio
Qiskit Terra 0.17.0 include molte nuove funzionalità e correzioni di bug. La novità principale di questa versione è l'introduzione degli elementi qiskit.algorithms e qiskit.opflow che sono stati migrati e adattati dal progetto qiskit.aqua .
Nuove funzioni
-
La funzione
qiskit.pulse.call()può ora accettare unParameterinsieme a una subroutine parametrizzata. Questo permette di assegnare valori diversi agliParameteroggetti per ogni chiamata di subroutine.Ad esempio:
from qiskit.circuit import Parameter from qiskit import pulse amp = Parameter('amp') with pulse.build() as subroutine: pulse.play(pulse.Gaussian(160, amp, 40), DriveChannel(0)) with pulse.build() as main_prog: pulse.call(subroutine, amp=0.1) pulse.call(subroutine, amp=0.3) -
Il campo
qiskit.providers.models.QasmBackendConfigurationha un nuovo campoprocessor_typeche può essere usato facoltativamente per fornire informazioni sul processore di un backend nella forma:{"family": <str>, "revision": <str>, segment: <str>}. Ad esempio:{"family": "Canary", "revision": "1.0", segment: "A"}. -
Le classi
qiskit.pulse.Schedule,qiskit.pulse.Instructioneqiskit.pulse.Channelhanno ora una proprietàparameterche restituisce tutti gli oggettiParameterutilizzati nell'oggetto e un metodois_parameterized()che restituisceTruese nell'oggetto sono utilizzati dei parametri.Ad esempio:
from qiskit.circuit import Parameter from qiskit import pulse shift = Parameter('alpha') schedule = pulse.Schedule() schedule += pulse.SetFrequency(shift, pulse.DriveChannel(0)) assert schedule.is_parameterized() == True print(schedule.parameters) -
Aggiunto un
PiecewiseChebyshevall'opzioneqiskit.circuit.libraryper l'implementazione di un'approssimazione di Chebyshev a tratti di una funzione di ingresso. Per una data funzione e grado , questa classe implementa un'approssimazione polinomiale piecewise Chebyshev su qubit a sugli intervalli dati. Tutti i polinomi dell'approssimazione sono di grado .Ad esempio:
import numpy as np from qiskit import QuantumCircuit from qiskit.circuit.library.arithmetic.piecewise_chebyshev import PiecewiseChebyshev f_x, degree, breakpoints, num_state_qubits = lambda x: np.arcsin(1 / x), 2, [2, 4], 2 pw_approximation = PiecewiseChebyshev(f_x, degree, breakpoints, num_state_qubits) pw_approximation._build() qc = QuantumCircuit(pw_approximation.num_qubits) qc.h(list(range(num_state_qubits))) qc.append(pw_approximation.to_instruction(), qc.qubits) qc.draw(output='mpl') -
La
BackendPropertiesha ora un metodoreadout_length()che restituisce la lunghezza di lettura [sec] del qubit dato. -
Una nuova classe,
ScheduleBlockè stata aggiunta al moduloqiskit.pulsemodulo. Questa classe fornisce una nuova rappresentazione di un programma a impulsi. Questa rappresentazione è più adatta alla sintassi del costruttore di impulsi e si basa sull'ordinamento relativo delle istruzioni.Questa rappresentazione prende
alignment_contextinvece di specificare il tempo di iniziot0per ogni istruzione. Il tempo di inizio dell'istruzione è implicitamente assegnato con la trasformazione specificata e la posizione relativa delle istruzioni.Il
ScheduleBlockpermette di programmare le istruzioni in modo pigro, cioè di assegnare parametri arbitrari alla durata delle istruzioni.Ad esempio:
from qiskit.pulse import ScheduleBlock, DriveChannel, Gaussian from qiskit.pulse.instructions import Play, Call from qiskit.pulse.transforms import AlignRight from qiskit.circuit import Parameter dur = Parameter('rabi_duration') block = ScheduleBlock(alignment_context=AlignRight()) block += Play(Gaussian(dur, 0.1, dur/4), DriveChannel(0)) block += Call(measure_sched) # subroutine defined elsewherequesto codice definisce un esperimento di scansione della durata di un impulso gaussiano seguito da una misura
measure_sched, cioè un esperimento Rabi. È possibile riutilizzare l'oggettoblockper ogni durata scansionata, assegnando un valore di durata target. -
Aggiunta di una nuova funzione
array_to_latex()al moduloqiskit.visualizationche può essere utilizzata per rappresentare e visualizzare vettori e matrici con LaTeX.from qiskit.visualization import array_to_latex from numpy import sqrt, exp, pi mat = [[0, exp(pi*.75j)], [1/sqrt(8), 0.875]] array_to_latex(mat) -
Il
StatevectoreDensityMatrixhanno ora i metodidraw()che consentono di disegnare gli oggetti come matrici di testo, oggetti IPython Latex, sorgenti Latex, sfere Q, sfere Bloch e grafici Hinton. Per impostazione predefinita, il tipo di output è l'output equivalente di__repr__, ma questo valore predefinito può essere modificato in un file di configurazione utente impostando l'opzionestate_drawer. Ad esempio:from qiskit.quantum_info import DensityMatrix dm = DensityMatrix.from_label('r0') dm.draw('latex')from qiskit.quantum_info import Statevector sv = Statevector.from_label('+r') sv.draw('qsphere')Inoltre, il metodo
draw()è ora usato per la visualizzazione ipython di queste classi, quindi se si cambia il tipo di output predefinito in un file di configurazione utente, quando un oggettoStatevectoro un oggettoDensityMatrixvengono visualizzati in un blocco note di jupyter, verrà utilizzato quel tipo di output per l'oggetto. -
Oggetti
qiskit.pulse.Instructione oggetti parametrici a impulsi (ad esGaussiansupporta ora l'uso diParametereParameterExpressionper il parametroduration. Ad esempio:from qiskit.circuit import Parameter from qiskit.pulse import Gaussian dur = Parameter('x_pulse_duration') double_dur = dur * 2 rx_pulse = Gaussian(dur, 0.1, dur/4) double_rx_pulse = Gaussian(double_dir, 0.1, dur/4)Si noti che, mentre è possibile creare un'istruzione con un parametro
duration, l'aggiunta di un'istruzione con un parametro non vincolatodurationa un programma è supportata solo dalla rappresentazione recentemente introdottaScheduleBlock. Per maggiori dettagli, consultare la sezione delle note di rilascio sui problemi noti. -
Il
run()metodo per ilQasmSimulatorPy,StatevectorSimulatorPy, eUnitarySimulatorPyaccetta ora un elementoQuantumCircuit(o un elenco di oggettiQuantumCircuit) come input. L'oggetto precedenteQasmQobjè ancora supportato per ora, ma sarà deprecato in una versione futura.Per un esempio di utilizzo si veda:
from qiskit import transpile, QuantumCircuit from qiskit.providers.basicaer import BasicAer backend = BasicAer.get_backend('qasm_simulator') circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() tqc = transpile(circuit, backend) result = backend.run(tqc, shots=4096).result() -
Il passo del transpiler
CommutativeCancellationha un nuovo kwarg opzionale sul costruttorebasis_gates, che prende un elenco di nomi di porte di base per il backend di destinazione. Se specificato, il passaggio utilizzerà solo i cancelli del kwargbasis_gates. In precedenza, il passaggio sostituiva automaticamente i cancelli consecutivi che si incrociavano conZGatecon la portaU1Gateincondizionatamente. Il kwargbasis_gatesconsente di specificare quali porte di rotazione z sono presenti nella base di destinazione per evitare questo problema. -
I costruttori della
Bite delle sottoclassi,Qubit,Clbit, eAncillaQubitsono stati aggiornati in modo che i loro due parametri,registereindex, siano ora opzionali. Ciò consente di creare oggetti bit indipendenti da un registro. -
Una nuova classe,
BooleanExpressionè stata aggiunta al moduloqiskit.circuit.classicalfunctionmodulo. Questa classe consente di creare un oracolo a partire da un'espressione booleana Python. Ad esempio:from qiskit.circuit import BooleanExpression, QuantumCircuit expression = BooleanExpression('~x & (y | z)') circuit = QuantumCircuit(4) circuit.append(expression, [0, 1, 2, 3]) circuit.draw('mpl')circuit.decompose().draw('mpl')Il
BooleanExpressioninclude anche un metodo,from_dimacs_file()che consente di caricare formule descritte nel formato DIMACS-CNF. Ad esempio:from qiskit.circuit import BooleanExpression, QuantumCircuit boolean_exp = BooleanExpression.from_dimacs_file("simple_v3_c2.cnf") circuit = QuantumCircuit(boolean_exp.num_qubits) circuit.append(boolean_exp, range(boolean_exp.num_qubits)) circuit.draw('text')┌───────────────────┐ q_0: ┤0 ├ │ │ q_1: ┤1 ├ │ SIMPLE_V3_C2.CNF │ q_2: ┤2 ├ │ │ q_3: ┤3 ├ └───────────────────┘circuit.decompose().draw('text')q_0: ──o────o──────────── │ │ q_1: ──■────o────■─────── │ │ │ q_2: ──■────┼────o────■── ┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐ q_3: ┤ X ├┤ X ├┤ X ├┤ X ├ └───┘└───┘└───┘└───┘ -
Aggiunta di una nuova classe,
PhaseOracleè stata aggiunta al moduloqiskit.circuit.librarymodulo. Questa classe consente di costruire circuiti di oracoli di fase a partire da espressioni booleane di Python.from qiskit.circuit.library.phase_oracle import PhaseOracle oracle = PhaseOracle('x1 & x2 & (not x3)') oracle.draw('mpl')Questi oracoli di fase possono essere utilizzati come parte di un algoritmo più ampio, ad esempio con
qiskit.algorithms.AmplificationProblem:from qiskit.algorithms import AmplificationProblem, Grover from qiskit import BasicAer backend = BasicAer.get_backend('qasm_simulator') problem = AmplificationProblem(oracle, is_good_state=oracle.evaluate_bitstring) grover = Grover(quantum_instance=backend) result = grover.amplify(problem) result.top_measurementLa
PhaseOracleinclude anche un metodofrom_dimacs_file()che consente di costruire un oracolo di fase a partire da un file che descrive una formula nel formato DIMACS-CNF.from qiskit.circuit.library.phase_oracle import PhaseOracle oracle = PhaseOracle.from_dimacs_file("simple_v3_c2.cnf") oracle.draw('text')state_0: ─o───────o────────────── │ ┌───┐ │ ┌───┐ state_1: ─■─┤ X ├─■─┤ X ├─■────── │ └───┘ └───┘ │ ┌───┐ state_2: ─■───────────────o─┤ Z ├ └───┘ -
Tutti i passaggi del transpiler (cioè tutte le istanze di
BasePass) sono ora direttamente richiamabili. La chiamata di un passaggio fornisce una comoda interfaccia per l'esecuzione del passaggio su un oggettoQuantumCircuitoggetto.Ad esempio, l'esecuzione di un singolo passaggio di trasformazione, come ad esempio
BasisTranslatorpuò essere eseguita con:from qiskit import QuantumCircuit from qiskit.transpiler.passes import BasisTranslator from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel circuit = QuantumCircuit(1) circuit.h(0) pass_instance = BasisTranslator(sel, ['rx', 'rz', 'cx']) result = pass_instance(circuit) result.draw(output='mpl')Quando si esegue un passaggio di analisi, un set di proprietà (come
dicto comePropertySet) deve essere aggiunto come parametro e può essere modificato "in-place". Ad esempio:from qiskit import QuantumCircuit from qiskit.transpiler.passes import Depth circuit = QuantumCircuit(1) circuit.h(0) property_set = {} pass_instance = Depth() pass_instance(circuit, property_set) print(property_set) -
La classe
QasmQobjConfigha ora un kwarg opzionale permeas_levelemeas_return. Questi campi possono essere utilizzati per generareQasmQobjdi lavori che supportanomeas_level=1(dati kerneled) per i lavori di circuito (in precedenza questo era esposto solo per gliPulseQobjoggetti). La funzioneassemble()è stata aggiornata per impostare questo campo per gli oggettiQasmQobjoggetti che genera. -
Un nuovo
tensor()è stato aggiunto alla classeQuantumCircuitclasse. Questo metodo consente di tensorizzare un altro circuito con un circuito esistente. Questo metodo funziona in modo analogo aqiskit.quantum_info.Operator.tensor()ed è coerente con la convenzione little-endian di Qiskit.Ad esempio:
from qiskit import QuantumCircuit top = QuantumCircuit(1) top.x(0); bottom = QuantumCircuit(2) bottom.cry(0.2, 0, 1); bottom.tensor(top).draw(output='mpl') -
La classe
qiskit.circuit.QuantumCircuitsupporta ora metadati liberi arbitrari con l'attributometadatacon l'attributo. Un utente (o un programma costruito sopraQuantumCircuit) può allegare metadati a un circuito per poterlo rintracciare. Ad esempio:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, user_metadata_field_1='my_metadata', user_metadata_field_2='my_other_value')oppure:
from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2) qc.metadata = {'user_metadata_field_1': 'my_metadata', 'user_metadata_field_2': 'my_other_value'}Questi metadati non vengono utilizzati per influenzare l'esecuzione del circuito, ma solo per tracciare il circuito per tutta la durata dell'oggetto. L'attributo
metadatapersisterà tra le trasformazioni del circuito, comprese quelle ditranspile()eassemble(). L'aspettativa è che i provider associno i metadati ai risultati che restituiscono, in modo che gli utenti possano filtrare i risultati in base ai metadati del circuito, come possono fare attualmente conQuantumCircuit.name. -
Aggiungere una nuova classe di operatori
CNOTDihedralè stata aggiunta al moduloqiskit.quantum_infoal modulo. Questa classe è utilizzata per rappresentare il gruppo CNOT-Diedrale, che è generato dalle porte quanticheCXGate,TGate, eXGate. -
Aggiunge un operatore binario
&(__and__) alle sottoclassi diBaseOperator(esqiskit.quantum_info.Operator) nel moduloqiskit.quantum_infomodulo. Si tratta di un'abbreviazione per chiamare il metodo delle classicompose()(cioèA & B == A.compose(B)).Ad esempio:
import qiskit.quantum_info as qi qi.Pauli('X') & qi.Pauli('Y') -
Aggiunge un operatore binario
&(__and__) aqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixclassi. Si tratta di un'abbreviazione per chiamare il metodo delle classievolve()(cioèpsi & U == psi.evolve(U)).Ad esempio:
import qiskit.quantum_info as qi qi.Statevector.from_label('0') & qi.Pauli('X') -
Un nuovo gate a 2 qubit,
ECRGate, la risonanza incrociata dell'eco (ECR), è stato aggiunto al moduloqiskit.circuit.librarymodulo, insieme a un metodo corrispondente,ecr()per laQuantumCircuitclasse. Il gate ECR è costituito da due impulsi con un intervallo di tempo tra di essi per l'ecoXGatetra di loro per l'eco. Questo gate è localmente equivalente a unCXGate(può essere convertito in un CNOT con pre- o post-rotazione locale). È il gate nativo sull'hardware attuale di IBM e la compilazione su di esso consente di unire le pre/post-rotazioni al resto del circuito. -
È stato aggiunto un nuovo kwarg
approximation_degreealla funzionetranspile()per abilitare la compilazione approssimativa. I valori validi vanno da 0 a 1, e un valore più alto indica una minore approssimazione. Si tratta di un quadrante euristico per sperimentare le approssimazioni dei circuiti. L'interpretazione concreta di questo numero è lasciata a ciascun passaggio, che può utilizzarlo per eseguire una versione approssimata del passaggio. Esempi specifici sono ilUnitarySynthesiso i traduttori di gate discreti. Se un passaggio non supporta questa opzione, implica una trasformazione esatta. -
Due nuovi transpiler passess,
GateDirectioneqiskit.transpiler.passes.CheckGateDirectionsono stati aggiunti al moduloqiskit.transpiler.passesal modulo. Questi nuovi passaggi sono intesi come sostituzioni più generali diCXDirectioneCheckCXDirection(che sono entrambi deprecati, si vedano le note di deprecazione per maggiori dettagli) che svolgono la stessa funzione, ma funzionano con altri gate oltre al sempliceCXGate. -
Quando si esegue su Windows, l'esecuzione parallela con la funzione
parallel_map()può essere abilitata (per impostazione predefinita è ancora disabilitata). Per fare ciò, si può impostareparallel = Truein un file di configurazione utente, oppure impostare la variabile d'ambienteQISKIT_PARALLELsuTRUE(questo avrà effetto anche sutranspile()eassemble()che utilizzano entrambiparallel_map()internamente). È importante notare che quando si abilita il parallelismo su Windows ci sono limitazioni sul modo in cui Python lancia i processi per Windows; per ulteriori dettagli sulle limitazioni dell'esecuzione parallela su Windows, consultare la sezione Problemi noti. -
È stata aggiunta una nuova funzione,
hellinger_distance()per il calcolo della distanza di Hellinger tra due distribuzioni di conteggi è stata aggiunta al moduloqiskit.quantum_infomodulo. -
La funzione
decompose_clifford()del moduloqiskit.quantum_info(che viene utilizzata internamente dal metodoqiskit.quantum_info.Clifford.to_circuit()) ha un nuovo kwargmethodche consente di selezionare il metodo di sintesi utilizzato impostandolo su'AG'o'greedy'. Per impostazione predefinita, per più di tre qubit è impostato su'greedy', che utilizza una routine di compilazione greedy non ottimale per la sintesi di elementi Clifford, di Bravyi et al. al, che in genere produce un costo CX migliore rispetto al metodo Aaronson-Gottesman usato in precedenza (per più di due qubit). È possibile utilizzare il kwargmethodper tornare al precedente metodo predefinito di Aaronson-Gottesman impostandomethod='AG'. -
La classe
Initializedel moduloqiskit.extensionspuò ora essere costruita utilizzando un intero. I bit '1' dell'intero inseriranno unResete unXGatenel circuito del qubit corrispondente. Questo verrà fatto utilizzando la convenzione standard little-endian di qiskit, ovvero il bit più a destra dell'intero imposterà il qubit 0. Ad esempio, impostando il parametro inInitializeuguale a5, i qubit 0 e 2 assumono il valore 1.from qiskit.extensions import Initialize initialize = Initialize(13) initialize.definition.draw('mpl') -
La classe
Initializedel moduloqiskit.extensionssupporta ora la costruzione direttamente da un'etichetta di Pauli (analogamente al metodoqiskit.quantum_info.Statevector.from_label()). L'etichetta Pauli si riferisce agli stati base degli autostati di Pauli Z, X e Y. Queste etichette utilizzano la notazione little-endian standard di Qiskit, ad esempio un'etichetta di'01'inizializzerebbe il qubit 0 a e il qubit 1 a .from qiskit.extensions import Initialize initialize = Initialize("10+-lr") initialize.definition.draw('mpl') -
Il kwarg,
template_list, per il costruttore del passaggio di transpilerqiskit.transpiler.passes.TemplateOptimizationsupporta ora l'inserimento di un elenco di elementi sia di tipoQuantumCircuiteDAGDependencye di oggetti. In precedenza, venivano accettati solo gli elementiQuantumCircuit(che venivano internamente convertiti in oggettiDAGDependency) nell'elenco di input. -
È stato introdotto un nuovo transpiler pass,
qiskit.transpiler.passes.RZXCalibrationBuilderin grado di generare calibrazioni e di aggiungerle a un circuito quantistico. Questo passaggio prende gli oggetti calibratiCXGatee crea le calibrazioni perqiskit.circuit.library.RZXGateoggetti con un angolo di rotazione arbitrario. I programmi vengono creati allungando e comprimendo gli impulsiGaussianSquaredelle porte a risonanza incrociata con eco. -
Nuovi circuiti di template per l'utilizzo di
qiskit.circuit.library.RZXGatevengono aggiunti al moduloqiskit.circuit.library(ad esempiorzx_yz). Questo permette di associare ilTemplateOptimizationcon il passoqiskit.transpiler.passes.RZXCalibrationBuilderper trovare e sostituire automaticamente sequenze di porte, comeCNOT - P(theta) - CNOT, con circuiti più efficienti basati su una calibrazioneqiskit.circuit.library.RZXGatecon una calibrazione. -
Il tipo di output di matplotlib per gli elementi
circuit_drawer()e il metododraw()per la classeQuantumCircuitsupportano ora i file di configurazione per impostare lo stile di visualizzazione. Nelle versioni precedenti, esisteva una funzionalità di base che consentiva agli utenti di passare un kwargstyleche prendeva in considerazione undictper personalizzare i colori e altre caratteristiche di visualizzazione del cassettompl. Questo è stato ampliato in modo che questi dizionari possano essere caricati direttamente da file JSON senza dover passare un dizionario. Ciò consente agli utenti di creare nuovi file di stile e di usare quello stile per le visualizzazioni, passando il nome del file di stile come stringa al kwargstyle.Per sfruttare questa funzione è necessario impostare l'opzione
circuit_mpl_style_pathin un file di configurazione utente. Questa opzione deve essere impostata sul percorso in cui si desidera che qiskit cerchi i file JSON di stile. Se si specificano più voci di percorso, queste devono essere separate da:. Ad esempio, impostandocircuit_mpl_style_path = ~/.qiskit:~/user_stylesin un file di configurazione utente, si cercheranno i file JSON sia in~/.qiskitche in~/user_styles. -
Alla funzione
marginal_counts()è stato aggiunto un nuovo kwarg,format_marginal, che, se impostato suTrue, formatta l'output dei conteggi in base acregsnel circuito e gli indici mancanti sono rappresentati con un_. Ad esempio:from qiskit import QuantumCircuit, execute, BasicAer, result from qiskit.result.utils import marginal_counts qc = QuantumCircuit(5, 5) qc.x(0) qc.measure(0, 0) result = execute(qc, BasicAer.get_backend('qasm_simulator')).result() print(marginal_counts(result.get_counts(), [0, 2, 4], format_marginal=True)) -
Miglioramento delle prestazioni di
qiskit.quantum_info.Statevector.expectation_value()eqiskit.quantum_info.DensityMatrix.expectation_value()quando l'operatore argomento è un operatorePaulioSparsePauliOp. -
Il file di configurazione utente ha 2 nuove opzioni di configurazione,
num_processeseparallel, che servono a controllare il comportamento predefinito diparallel_map(). L'opzioneparallelè un booleano che viene utilizzato per stabilire se il programmaparallel_map()verrà eseguito in più processi o meno. Se è impostato suFalse, le chiamate aparallel_map()saranno eseguite in modo seriale, mentre impostandoTruesi abilita l'esecuzione parallela. L'opzionenum_processesaccetta un numero intero che imposta il numero di CPU da utilizzare per l'esecuzione in parallelo. Per impostazione predefinita, utilizza il numero di core della CPU di un sistema. -
Ci sono due nuove variabili d'ambiente,
QISKIT_PARALLELeQISKIT_NUM_PROCS, che possono essere usate per controllare il comportamento predefinito diparallel_map(). L'opzioneQISKIT_PARALLELpuò essere impostata all'indirizzoTRUE(qualsiasi capitalizzazione) per impostare l'esecuzione predefinita in più processi quando viene richiamato il comandoparallel_map()viene chiamato. Se è impostato su qualsiasi altro valoreparallel_map()verrà eseguito in modo seriale.QISKIT_NUM_PROCSprende un numero intero (per esempioQISKIT_NUM_PROCS=5) che sarà usato come numero predefinito di processi da eseguire. Entrambi avranno la precedenza sull'opzione equivalente impostata nel file di configurazione dell'utente. -
Un nuovo metodo,
gradient()è stato aggiunto alla classeParameterExpressionclasse. Questo metodo viene utilizzato per valutare il gradiente di un oggettoParameterExpressionoggetto. -
Il metodo
__eq__(ovvero quello che viene chiamato quando si utilizza l'operatore==) per il parametroParameterExpressionconsente ora il confronto con un valore numerico. In precedenza era possibile confrontare solo due istanze diParameterExpressioncon==. Ad esempio:from qiskit.circuit import Parameter x = Parameter("x") y = x + 2 y = y.assign(x, -1) assert y == 1 -
La
PauliFeatureMapnel moduloqiskit.circuit.librarysupporta ora la regolazione del fattore di rotazione, , sia impostando il kwargalphasul costruttore, sia impostando l'attributoalphadopo la creazione. In precedenza questo valore era fissato a2.0. La regolazione di questo attributo consente un migliore controllo dei confini decisionali e fornisce un'ulteriore flessibilità nella gestione delle caratteristiche di input senza la necessità di scalarle esplicitamente nel set di dati. -
Una nuova
Gateclasse,PauliGateè stato aggiunto il moduloqiskit.circuit.librarye il metodo corrispondente,pauli()è stato aggiunto alla classeQuantumCircuitclasse. Questa nuova classe di gate consente di applicare contemporaneamente più gate pauli individuali a diversi qubit. Ciò è utile soprattutto per i simulatori che possono utilizzare questa nuova porta per implementare in modo più efficiente più porte Pauli simultanee. -
Migliorare il
qiskit.quantum_info.Paulioperatore. Questa classe rappresenta ora un elemento dell'intero gruppo di Pauli a N-qubit, compresi i coefficienti complessi. Ora supporta i metodi API dell'operatore, tra cuicompose(),dot(),tensor()eccetera, dove i termini "compose" e "dot" sono definiti rispetto all'intero gruppo di Pauli.Questa classe consente anche la conversione da e verso la rappresentazione a stringa di Pauli per comodità.
Per esempio
from qiskit.quantum_info import Pauli P1 = Pauli('XYZ') P2 = Pauli('YZX') P1.dot(P2)I Pauli possono anche essere aggiunti direttamente agli oggetti
QuantumCircuitoggettifrom qiskit import QuantumCircuit from qiskit.quantum_info import Pauli circ = QuantumCircuit(3) circ.append(Pauli('XYZ'), [0, 1, 2]) circ.draw(output='mpl')Ulteriori metodi permettono di calcolare quando due Pauli si scambiano (con il metodo
commutes()) o anticommutanti (con il metodoanticommutes()e di calcolare il Pauli risultante dalla coniugazione di Clifford utilizzando il metodoevolve()metodo.Per ulteriori informazioni, consultare la documentazione API della classe
Pauliper ulteriori informazioni. -
Una nuova funzione,
random_pauli()per la generazione di un elemento casuale del gruppo di Pauli a N-qubit è stata aggiunta al moduloqiskit.quantum_infomodulo. -
Una nuova classe,
PiecewisePolynomialPauliRotationsè stata aggiunta al moduloqiskit.circuit.librarymodulo. Questo elemento della libreria di circuiti viene utilizzato per mappare una funzione polinomiale piecewise, , definita attraverso punti di interruzione e coefficienti, sulle ampiezze dei qubit. I breakpoint sono un sottoinsieme di , dove è il numero di qubit di stato. I coefficienti corrispondenti , dove è il grado più alto tra tutti i polinomi. Allora è definito come:
dove assumiamo implicitamente . E la mappatura applicata alle ampiezze è data da
Questa mappatura si basa su rotazioni Y di Pauli controllate e costruite con la formula PolynomialPauliRotations.
-
È stato introdotto un nuovo modulo
qiskit.algorithmsè stato introdotto. Questo modulo contiene funzionalità equivalenti a quelle fornite in precedenza dal moduloqiskit.aqua.algorithms(ora deprecato) e fornisce gli elementi costitutivi per la costruzione di algoritmi quantistici. Per informazioni dettagliate sulla migrazione daqiskit-aquaa questo nuovo modulo, consultare la guida alla migrazione. -
È stato introdotto un nuovo modulo
qiskit.opflowè stato introdotto. Questo modulo contiene funzionalità equivalenti a quelle precedentemente fornite dal moduloqiskit.aqua.operators(ora deprecato) e fornisce gli operatori e le funzioni di stato utilizzati per costruire algoritmi quantistici. Per informazioni dettagliate sulla migrazione daqiskit-aquaa questo nuovo modulo, consultare la guida alla migrazione. -
Questo è il primo rilascio che include ruote binarie precompilate per i sistemi Linux aarch64. Se si utilizza un sistema manylinux2014 compatibile con aarch64 Linux sono ora disponibili ruote precompilate su PyPI, non è più necessario compilare dai sorgenti per installare qiskit-terra.
-
La funzione
qiskit.quantum_info.process_fidelity()può ora essere utilizzata con un canale di destinazione non unitario. In questo caso il valore restituito è equivalente al valoreqiskit.quantum_info.state_fidelity()delle matrici normalizzateqiskit.quantum_info.Choiper i canali.Si noti che gli elementi
qiskit.quantum_info.average_gate_fidelity()eqiskit.quantum_info.gate_error()richiedono che il canale di destinazione sia unitario e sollevano un'eccezione in caso contrario. -
È stata aggiunta una nuova funzione di creazione di impulsi,
qiskit.pulse.macro(). Ciò consente di decorare come macro le normali funzioni di Python. Ciò consente di utilizzare le funzioni di costruttore di impulsi all'interno della funzione decorata. La macro del costruttore può quindi essere richiamata da un contesto di costruzione di impulsi, consentendo il riutilizzo del codice.Ad esempio:
from qiskit import pulse @pulse.macro def measure(qubit: int): pulse.play(pulse.GaussianSquare(16384, 256, 15872), pulse.MeasureChannel(qubit)) mem_slot = pulse.MemorySlot(0) pulse.acquire(16384, pulse.AcquireChannel(0), mem_slot) return mem_slot with pulse.build(backend=backend) as sched: mem_slot = measure(0) print(f"Qubit measured into {mem_slot}") sched.draw() -
Una nuova classe,
PauliTwoDesignè stata aggiunta al fileqiskit.circuit.libraryche implementa una forma particolare di circuito a 2 disegni da https://arxiv.org/pdf/1803.11173.pdf Ad esempio, questo circuito può avere l'aspetto difrom qiskit.circuit.library import PauliTwoDesign circuit = PauliTwoDesign(4, reps=2, seed=5, insert_barriers=True) circuit.decompose().draw(output='mpl') -
È ora disponibile un nuovo cassetto di impulsi
qiskit.visualization.pulse_v2.draw()(aliasqiskit.visualization.pulse_drawer_v2). Questo nuovo cassetto per impulsi supporta diverse nuove funzioni non presenti nel cassetto per impulsi originale (pulse_drawer()).- Troncamento delle istruzioni a impulsi lunghi.
- Visualizzazione di impulsi parametrici.
- Nuovi fogli di stile
IQXStandard,IQXSimple,IQXDebugging. - Visualizzazione delle informazioni sul sistema (frequenza dei canali, ecc.) specificando
qiskit.providers.Backendoggetti per la visualizzazione. - Specificare gli oggetti
axisper il plottaggio per consentire un'ulteriore estensione dei plot generati, ad esempio per le manipolazioni di pubblicazione.
I nuovi fogli di stile possono accettare funzioni di callback che modificano dinamicamente l'aspetto dell'immagine di output, ad esempio riassemblando un insieme di canali, mostrando i dettagli delle istruzioni, aggiornando l'aspetto degli inviluppi degli impulsi, ecc. È possibile creare funzioni di callback personalizzate e inserirle in un'istanza del foglio di stile per modificare l'aspetto della figura senza modificare il codice del cassetto. Per maggiori dettagli, consultare la documentazione del modulo cassetto degli impulsi.
Si noti che il salvataggio dei file è ora delegato a Matplotlib. Per salvare i file immagine, è necessario chiamare il metodo
savefigcon l'oggettoFigurerestituito. -
Aggiunge un metodo
reverse_qargs()al metodoqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixalle classi. Questo metodo inverte l'ordine dei sottosistemi negli stati ed è equivalente al metodo per gli stati a N-qubitqiskit.circuit.QuantumCircuit.reverse_bits()metodo per gli stati a N-qubit. Ad esempio:from qiskit.circuit.library import QFT from qiskit.quantum_info import Statevector circ = QFT(3) state1 = Statevector.from_instruction(circ) state2 = Statevector.from_instruction(circ.reverse_bits()) state1.reverse_qargs() == state2 -
Aggiunge un metodo
reverse_qargs()alla classeqiskit.quantum_info.Operatorclasse. Questo metodo inverte l'ordine dei sottosistemi nell'operatore ed è equivalente al metodo per gli operatori a N-qubitqiskit.circuit.QuantumCircuit.reverse_bits()per gli operatori a N-qubit. Ad esempio:from qiskit.circuit.library import QFT from qiskit.quantum_info import Operator circ = QFT(3) op1 = Operator(circ) op2 = Operator(circ.reverse_bits()) op1.reverse_qargs() == op2 -
Il metodo di uscita
latexper la funzioneqiskit.visualization.circuit_drawer()e il metododraw()ora utilizzerà un'etichetta definita dall'utente sulle porte nella visualizzazione dell'output. Ad esempio:import math from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2) qc.h(0) qc.rx(math.pi/2, 0, label='My Special Rotation') qc.draw(output='latex') -
Il kwarg
routing_methodper la funzionetranspile()accetta ora una nuova opzione,'none'. All'indirizzorouting_method='none'non verrà eseguito alcun passaggio di instradamento come parte della transpilazione. Se il circuito non si adatta alla mappa di accoppiamento, verrà sollevata un'eccezioneTranspilerErrorverrà sollevata un'eccezione. -
Una nuova classe di cancelli,
RVGateè stata aggiunta al moduloqiskit.circuit.libraryinsieme al corrispondente metodoQuantumCircuitmetodorv(). IlRVGateè un gate di rotazione generale, simile al gateUGatema invece di specificare gli angoli di Eulero, vengono specificate le tre componenti di un vettore di rotazione, dove la direzione del vettore specifica l'asse di rotazione e la grandezza specifica l'angolo di rotazione intorno all'asse in radianti. Ad esempio:import math import np from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) theta = math.pi / 5 phi = math.pi / 3 # RGate axis: axis = np.array([math.cos(phi), math.sin(phi)]) rotation_vector = theta * axis qc.rv(*rotation_vector, 0) -
Non vincolati
Parameterutilizzati in un oggettoQuantumCircuitsaranno ora ordinati per nome. Questo avrà effetto per i parametri restituiti dall'attributoparameters. Inoltre, ilqiskit.circuit.QuantumCircuit.bind_parameters()eqiskit.circuit.QuantumCircuit.assign_parameters()possono ora accettare un elenco di valori a che li legherà/assegnerà ai parametri in ordine di nome. In precedenza, questi metodi accettavano solo un dizionario di parametri e valori. Ad esempio:from qiskit.circuit import QuantumCircuit, Parameter circuit = QuantumCircuit(1) circuit.rx(Parameter('x'), 0) circuit.ry(Parameter('y'), 0) print(circuit.parameters) bound = circuit.bind_parameters([1, 2]) bound.draw(output='mpl') -
I costruttori per le classi
qiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixpossono ora accettare un oggettoQuantumCircuitper costruire un oggettoStatevectoreDensityMatrixda quel circuito, assumendo che i qubit siano inizializzati in . Per esempio:from qiskit import QuantumCircuit from qiskit.quantum_info import Statevector qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) statevector = Statevector(qc) statevector.draw(output='latex') -
Le nuove classi di backend fasulle sono disponibili all'indirizzo
qiskit.test.mock. Questi includono versioni simulate diibmq_casablanca,ibmq_sydney,ibmq_mumbai,ibmq_lima,ibmq_belem,ibmq_quito. Come per gli altri backend fasulli, questi includono istantanee dei dati di calibrazione (ad esempiobackend.defaults()) e i dati relativi all'errore (cioèbackend.properties()) presi dal sistema reale e possono essere utilizzati per test, compilazioni e simulazioni locali.
Problemi noti
-
Si tenta di aggiungere un oggetto
qiskit.pulse.Instructioncon un oggettodurationparametrizzato (cioè il valore didurationè un oggetto non vincolato o un oggettoParameteroParameterExpression) a un oggettoqiskit.pulse.Schedulenon è supportato. Il tentativo di farlo comporterà l'apertura del sitoUnassignedDurationErrorPulseErrorviene sollevato. Questa è una limitazione del modo in cui vengono valutati attualmente i vincoli di sovrapposizione diInstruction. Questo è supportato daScheduleBlockin cui i vincoli di sovrapposizione vengono valutati appena prima dell'esecuzione. -
Nei sistemi Windows, quando l'esecuzione parallela è abilitata per
parallel_map()il parallelismo potrebbe non funzionare quando viene richiamato da uno script in esecuzione al di fuori di un bloccoif __name__ == '__main__':. Ciò è dovuto al modo in cui Python lancia i processi paralleli su Windows. Se unRuntimeErroro unAttributeErrorvengono sollevati da script che chiamanoparallel_map()(compreso l'uso di funzioni che utilizzanoparallel_map()internamente, come ad esempiotranspile()) con Windows e il parallelismo abilitato, si può provare a incorporare le chiamate agli script all'interno diif __name__ == '__main__':per risolvere il problema. Ad esempio:from qiskit import QuantumCircuit, QiskitError from qiskit import execute, Aer qc1 = QuantumCircuit(2, 2) qc1.h(0) qc1.cx(0, 1) qc1.measure([0,1], [0,1]) # making another circuit: superpositions qc2 = QuantumCircuit(2, 2) qc2.h([0,1]) qc2.measure([0,1], [0,1]) execute([qc1, qc2], Aer.get_backend('qasm_simulator'))Dovrebbe essere modificata in:
from qiskit import QuantumCircuit, QiskitError from qiskit import execute, Aer def main(): qc1 = QuantumCircuit(2, 2) qc1.h(0) qc1.cx(0, 1) qc1.measure([0,1], [0,1]) # making another circuit: superpositions qc2 = QuantumCircuit(2, 2) qc2.h([0,1]) qc2.measure([0,1], [0,1]) execute([qc1, qc2], Aer.get_backend('qasm_simulator')) if __name__ == '__main__': main()se si verificano errori con il parallelismo in Windows.
Note sull'aggiornamento
-
I gestori dei passaggi preimpostati
level_1_pass_manager,level_2_pass_manager, elevel_3_pass_manager(che vengono utilizzati peroptimization_level1, 2 e 3 nei modellitranspile()eexecute()) ora utilizzano incondizionatamente il passaggioOptimize1qGatesDecompositionper l'ottimizzazione del gate a 1 qubit. In precedenza, questi gestori di passaggi utilizzavano il passaggioOptimize1qGatesse le porte di base contenevanou1,u2, ou3. Se si vuole continuare a utilizzare il vecchioOptimize1qGatesè necessario costruire un filePassManagercon il pass. -
In seguito alla transpilazione di un parametro
QuantumCircuitl'attributoglobal_phasedi un circuito di uscita non può più essere restituito in forma semplificata, se la fase globale è una faseParameterExpression.Ad esempio:
qc = QuantumCircuit(1) theta = Parameter('theta') qc.rz(theta, 0) qc.rz(-theta, 0) print(transpile(qc, basis_gates=['p']).global_phase)precedentemente restituiva
0, ma ora restituirà-0.5*theta + 0.5*theta. Questa modifica si è resa necessaria per evitare una forte penalizzazione delle prestazioni in fase di esecuzione, poiché la semplificazione delle espressioni simboliche può essere piuttosto lenta, soprattutto se ci sono molti oggetti in un circuitoParameterExpressionoggetti in un circuito. -
Gli oggetti
BasicAerJobrestituiti dai backend di BasicAer sono ora istanze sincrone diJobV1. Ciò significa che le chiamate al metodorun()si bloccheranno fino al termine dell'esecuzione della simulazione. Se si vuole ripristinare il precedente comportamento asincrono, è necessario avvolgere il filerun()con qualcosa che venga eseguito in un thread o processo separato, comefutures.ThreadPoolExecutorofutures.ProcessPoolExecutor. -
L'opzione
allow_sample_measuringper il simulatore BasicAerQasmSimulatorPyè passata da un valore predefinito diFalseaTrue. Questo è stato fatto per riflettere meglio l'effettivo comportamento predefinito del simulatore, che utilizza la misurazione dei campioni se il circuito di ingresso la supporta (anche se non è abilitata). Se si sta eseguendo un circuito che non supporta la misurazione di campioni (cioè ha operazioniReseto se ci sono operazioni dopo una misurazione su un qubit) bisogna assicurarsi di impostare esplicitamente questa opzione suFalsequando si chiamarun(). -
Il passaggio
CommutativeCancellationè ora consapevole delle porte della base di destinazione, il che significa che userà solo le porte della base specificata. In precedenza, il passaggio sostituiva incondizionatamente le porte consecutive che commutano conZGatecon la portaU1Gate. Tuttavia, ora che il passaggio è consapevole della base e ha un kwarg,basis_gates, per specificare la base di destinazione, c'è un potenziale cambiamento di comportamento se il kwarg non viene impostato. Quando il kwargbasis_gatesnon viene utilizzato e non ci sono porte a rotazione z variabile nel circuito, non si verifica alcuna cancellazione commutativa. -
Register(che è la classe madre diQuantumRegistereClassicalRegistereBit(che è la classe genitore diQubiteClbit) sono ora immutabili. Nelle versioni precedenti era possibile regolare il valore di asizeonamedi un oggettoRegistere l'opzioneindexoregisterdi un oggettoBitdopo la sua creazione iniziale. Tuttavia, questo porterebbe a un comportamento scorretto che corromperebbe le strutture di contenitori che si basano su un hash (come un dict), poiché questi attributi sono trattati come proprietà immutabili di un registro o di un bit (vedere #4705 per maggiori dettagli). Per evitare questo comportamento scorretto, gli attributi di aRegistereBitnon sono più impostabili dopo la creazione iniziale. Se in precedenza si regolavano gli oggetti in fase di esecuzione, ora è necessario creare un nuovo oggettoRegisteroBitcon i nuovi valori. -
Il metodo
DAGCircuit.__eq__(utilizzato dall'operatore==), che viene utilizzato per verificare l'uguaglianza strutturale diDAGCircuiteQuantumCircuitincluderà ora il metodoglobal_phaseecalibrationsnei campi controllati per l'uguaglianza. Ciò significa che i circuiti che sarebbero stati valutati come uguali nelle versioni precedenti potrebbero non esserlo più seglobal_phaseocalibrationsdifferiscono tra i circuiti. Ad esempio, nelle versioni precedenti questo restituivaTrue:import math from qiskit import QuantumCircuit qc1 = QuantumCircuit(1) qc1.x(0) qc2 = QuantumCircuit(1, global_phase=math.pi) qc2.x(0) print(qc2 == qc1)Tuttavia, poiché l'attributo
global_phasedei circuiti è diverso, ora restituiràFalse. -
I metodi
qubits()eclbits()della classeDAGCircuitche erano stati deprecati nella release 0.15.0 Terra, sono stati rimossi. Si devono invece usare gli attributiqubitseclbitsdella classeDAGCircuitdella classe. Ad esempio, se si sta eseguendo:from qiskit.dagcircuit import DAGCircuit dag = DAGCircuit() qubits = dag.qubits()Che verrebbe sostituito da:
from qiskit.dagcircuit import DAGCircuit dag = DAGCircuit() qubits = dag.qubits -
I dati
PulseDefaultsrestituiti dai backend dei falsi impulsiqiskit.test.mock.FakeOpenPulse2Qeqiskit.test.mock.FakeOpenPulse3Qsono stati aggiornati per avere definizioni di sequenze di impulsi più realistiche. Se si utilizzano queste classi backend false, potrebbe essere necessario aggiornare l'utilizzo a causa di queste modifiche. -
Il metodo di sintesi predefinito utilizzato dalla funzione
decompose_clifford()del moduloquantum_info(che viene utilizzato internamente dal metodoqiskit.quantum_info.Clifford.to_circuit()) per più di 3 qubit utilizza ora una routine di compilazione greedy non ottimale per la sintesi degli elementi di Clifford, di Bravyi et al. al, che in genere produce un costo CX migliore rispetto al vecchio default. Se è necessario tornare al precedente metodo Aaronson-Gottesman, è possibile farlo impostandomethod='AG'. -
Il modulo
qiskit.visualization.interactive, precedentemente deprecato nella versione 0.15.0, è stato rimosso. Si dovrebbero invece utilizzare le visualizzazioni basate su matplotlib:Rimossa la funzione InterattivaFunzione matplotlib equivalenteiplot_bloch_multivectorqiskit.visualization.plot_bloch_multivector()iplot_state_cityqiskit.visualization.plot_state_city()iplot_state_qsphereqiskit.visualization.plot_state_qsphere()iplot_state_hintonqiskit.visualization.plot_state_hinton()iplot_histogramqiskit.visualization.plot_histogram()iplot_state_paulivecqiskit.visualization.plot_state_paulivec() -
Gli attributi di primo livello
qiskit.Aereqiskit.IBMQsono ora caricati in modo pigro. Ciò significa che gli oggetti esisteranno sempre e che non verranno più sollevati avvisi all'importazione seqiskit-aeroqiskit-ibmq-providernon sono installati (o non possono essere trovati da Python ). Se si controllava la presenza diqiskit-aeroqiskit-ibmq-providerusando questi attributi del modulo e si confrontava esplicitamente conNoneo si cercava l'assenza dell'attributo, questo non funzionerà più perché ora sono sempre definiti come un oggetto. In altre parole, eseguire qualcosa come:try: from qiskit import Aer except ImportError: print("Aer not available") or:: try: from qiskit import IBMQ except ImportError: print("IBMQ not available")non funzionerà più. Invece, per determinare se questi provider sono presenti, si può usare esplicitamente
qiskit.providers.aer.Aereqiskit.providers.ibmq.IBMQ:try: from qiskit.providers.aer import Aer except ImportError: print("Aer not available") try: from qiskit.providers.ibmq import IBMQ except ImportError: print("IBMQ not available")o controllare invece
bool(qiskit.Aer)ebool(qiskit.IBMQ), ad esempio:import qiskit if not qiskit.Aer: print("Aer not available") if not qiskit.IBMQ: print("IBMQ not available")Questa modifica si è resa necessaria per evitare potenziali problemi di ciclo di importazione tra i pacchetti qiskit e anche per migliorare i tempi di importazione quando non si utilizzano Aer o IBMQ.
-
L'opzione
suppress_packaging_warningsnel file di configurazione utente e la variabile d'ambienteQISKIT_SUPPRESS_PACKAGING_WARNINGSnon hanno più alcun effetto e vengono ignorate. Gli avvisi che questa opzione controllava sono stati rimossi e non saranno più emessi al momento dell'importazione dal moduloqiskit. -
Il kwarg
condition, precedentemente deprecato, per il costruttoreqiskit.dagcircuit.DAGNodeè stato rimosso. È stato deprecato nella versione 0.15.0. Si dovrebbe invece impostare la condizione classica sull'oggettoInstructionpassato nel costruttoreDAGNodequando si crea un nuovo nodoop. -
Quando si crea una nuova classe
Register(che è la classe madre perQuantumRegistereClassicalRegister) oQuantumCircuitcon un numero di bit (ad esempioQuantumCircuit(2)), è ora richiesto che il numero di bit sia specificato come un intero o un altro tipo che sia castabile in numeri interi non ambigui (ad esempio2.0). I valori non interi sollevano ora un errore, poiché in questi casi l'intento non era chiaro (non si possono avere bit frazionari). Per ulteriori informazioni sul motivo di questa modifica, consultare: #4855 -
networkx non è più un requisito per qiskit-terra. Tutto l'uso di networkx all'interno di qiskit-terra è stato rimosso ad eccezione di 3 metodi:
qiskit.dagcircuit.DAGCircuit.to_networkxqiskit.dagcircuit.DAGCircuit.from_networkxqiskit.dagcircuit.DAGDependency.to_networkx
Se si utilizza uno di questi metodi, è necessario installare manualmente networkx nel proprio ambiente per continuare a utilizzarli.
-
Per impostazione predefinita su macOS con Python >= 3.8
parallel_map()non verrà più eseguito in processi multipli. Si tratta di una modifica rispetto alle versioni precedenti, in cui il comportamento predefinito era cheparallel_map()avrebbe avviato più processi. Questa modifica è stata apportata perché con le nuove versioni di macOS con Python 3.8 e 3.9 la multielaborazione è inaffidabile o aggiunge un overhead significativo a causa del cambiamento in Python 3.8 per lanciare nuovi processi conspawninvece che confork. Per riattivare l'esecuzione parallela su macOS con Python >= 3.8 si può usare l'opzione del file di configurazione utenteparallelo impostare la variabile d'ambienteQISKIT_PARALLELsuTrue. -
Il deprecato kwarg
callbacksul costruttore della classePassManagerè stato rimosso. Questo kwarg è stato deprecato dalla versione 0.13.0 (9 aprile 2020). Si può invece passare il kwargcallbackal metodoqiskit.transpiler.PassManager.run()direttamente. Ad esempio, se si utilizzava:from qiskit.circuit.random import random_circuit from qiskit.transpiler import PassManager qc = random_circuit(2, 2) def callback(**kwargs) print(kwargs['pass_']) pm = PassManager(callback=callback) pm.run(qc)può essere sostituito con:
from qiskit.circuit.random import random_circuit from qiskit.transpiler import PassManager qc = random_circuit(2, 2) def callback(**kwargs) print(kwargs['pass_']) pm = PassManager() pm.run(qc, callback=callback) -
Non è più possibile istanziare un canale di base senza prefisso, come
qiskit.pulse.Channeloqiskit.pulse.PulseChannel. Queste classi sono progettate per classificare i tipi di canali diversi rivolti all'utente, comeqiskit.pulse.DriveChannel, ma non hanno una definizione di risorsa di destinazione. Se in precedenza si istanziava direttamenteqiskit.pulse.Channeloqiskit.pulse.PulseChannel, questo non è più consentito. Utilizzare la sottoclasse appropriata. -
Quando i kwarg
require_cpe/orequire_tpdiqiskit.quantum_info.process_fidelity(),qiskit.quantum_info.average_gate_fidelity(),qiskit.quantum_info.gate_error()sonoTrue, ora registreranno solo un avviso, invece del comportamento precedente che sollevava un'eccezione se il canale di ingresso è rispettivamente non-CP o non-TPQiskitErrorse il canale di ingresso è rispettivamente non-CP o non-TP. -
La
QFTdel moduloqiskit.circuit.librarycalcola ora la trasformata di Fourier usando una rappresentazione little-endian dei tensori, cioè lo stato mappa a assumendo che le basi di calcolo corrispondano all'ordinamento bit little-endian degli interi. ecc. Questo è stato fatto per renderlo più coerente con il resto di Qiskit, che utilizza una convenzione little-endian per l'ordine dei bit. Se l'ordine dei bit dipendeva da quello precedente, è possibile utilizzare il metodoreverse_bits()per ripristinare il comportamento precedente. Ad esempio:from qiskit.circuit.library import QFT qft = QFT(5).reverse_bits() -
L'attributo del modulo
qiskit.__qiskit_version__, che in precedenza era undict, ora restituisce un oggettoMappingpersonalizzato di sola lettura che controlla la versione degli elementi di qiskit in fase di esecuzione invece che di importazione. Questo è stato fatto per velocizzare il percorso di importazione di qiskit ed eliminare un possibile ciclo di importazione, importando i pacchetti degli elementi solo in fase di esecuzione, se la versione è necessaria dal pacchetto. Dovrebbe essere pienamente compatibile con il ritorno didicte per la maggior parte dei casi di utilizzo normale non ci saranno differenze. Tuttavia, se alcune applicazioni si basano sulla mutazione dei contenuti o sul controllo esplicito del tipo, potrebbero essere necessari aggiornamenti per adattarsi a questo cambiamento. -
Il modulo
qiskit.executeè stato rinominato inqiskit.execute_function. Questo è stato necessario per evitare un conflitto di nomi potente tra la funzioneexecute()che viene riesportata comeqiskit.execute.qiskit.executela funzione in alcune situazioni potrebbe entrare in conflitto con il moduloqiskit.execute, il che porterebbe a un errore criptico perché Python trattavaqiskit.executecome modulo quando l'intento era la funzione o viceversa. La rinominazione del modulo è stata necessaria per evitare questo conflitto. Se si importaqiskit.executeper ottenere il modulo (l'uso tipico erafrom qiskit.execute import execute), è necessario aggiornare questo modulo per usareqiskit.execute_function.qiskit.executesi risolverà sempre nella funzione. -
I moduli
qiskit.compiler.transpile,qiskit.compiler.assemble,qiskit.compiler.scheduleeqiskit.compiler.sequencesono stati rinominati rispettivamente inqiskit.compiler.transpiler,qiskit.compiler.assembler,qiskit.compiler.schedulereqiskit.compiler.sequence. Questo è stato necessario per evitare un conflitto di nomi tra i moduli e i percorsi delle funzioni riesportateqiskit.compiler.transpile(),qiskit.compiler.assemble(),qiskit.compiler.schedule(), eqiskit.compiler.sequence(). In alcune situazioni questo conflitto di nomi tra il percorso del modulo e quello della funzione riesportata portava a un errore criptico, perché Python trattava un'importazione come se fosse il modulo, mentre l'intento era di usare la funzione o viceversa. La rinominazione del modulo è stata necessaria per evitare questo conflitto. Se prima si usavano le importazioni per ottenere i moduli (l'uso tipico sarebbe stato come "from qiskit.compiler.transpile import transpile"), sarà necessario aggiornarlo per usare i nuovi percorsi dei moduli.qiskit.compiler.transpile(),qiskit.compiler.assemble(),qiskit.compiler.schedule(), eqiskit.compiler.sequence()ora si risolveranno sempre alle funzioni. -
La classe
qiskit.quantum_info.Quaternionè stata spostata dal sottomoduloqiskit.quantum_info.operatoral sottomoduloqiskit.quantum_info.synthesisper riflettere meglio il suo scopo. Non è necessaria alcuna modifica se lo si importava dal modulo rootqiskit.quantum_infoma se lo si importava daqiskit.quantum_info.operator, sarà necessario aggiornare il percorso di importazione. -
Rimosso il metodo
QuantumCircuit.mcmt, deprecato dal rilascio di Qiskit Terra 0.14.0 nell'aprile 2020. Invece di utilizzare il metodo, utilizzare la classeMCMTper costruire un gate multi-controllo multi-target e utilizzare il metodoqiskit.circuit.QuantumCircuit.append()oqiskit.circuit.QuantumCircuit.compose()per aggiungerlo a un circuito.Ad esempio, è possibile sostituire:
circuit.mcmt(ZGate(), [0, 1, 2], [3, 4])con:
from qiskit.circuit.library import MCMT mcmt = MCMT(ZGate(), 3, 2) circuit.compose(mcmt, range(5)) -
Rimosso il metodo
QuantumCircuit.diag_gateche è stato deprecato dal rilascio di Qiskit Terra 0.14.0 nell'aprile 2020. Utilizzare invece il metododiagonal()diQuantumCircuit. -
Rimosso il metodo
QuantumCircuit.ucyche è stato deprecato dal rilascio di Qiskit Terra 0.14.0 nell'aprile 2020. Utilizzare invece il metodoucry()diQuantumCircuit. -
Il metodo
mirror(), precedentemente deprecato, per il metodoqiskit.circuit.QuantumCircuitè stato rimosso. È stato deprecato nella versione 0.15.0. Il metodoqiskit.circuit.QuantumCircuit.reverse_ops()poiché il mirroring potrebbe essere confuso con lo scambio dei qubit di uscita del circuito. Il metodoreverse_ops()si limita a invertire l'ordine delle porte applicate, invece di rispecchiarle. -
Il supporto precedentemente deprecato che prevedeva il passaggio di un float (per il kwarg di
scale) come primo argomento posizionale del metodoqiskit.circuit.QuantumCircuit.draw()è stato rimosso. È stato deprecato nella versione 0.12.0. Il primo argomento posizionale del metodoqiskit.circuit.QuantumCircuit.draw()è ora il metodooutputkwarg, che non accetta un float. Si dovrebbe invece usarescalecome un kwarg con nome, invece di usarlo in modo posizionale.Ad esempio, se prima si chiamava
drawcon:from qiskit import QuantumCircuit qc = QuantumCircuit(2) qc.draw(0.75, output='mpl')questo dovrebbe ora essere:
from qiskit import QuantumCircuit qc = QuantumCircuit(2) qc.draw(output='mpl', scale=0.75)oppure:
qc.draw('mpl', scale=0.75) -
Le funzionalità di Qiskit Pulse (
qiskit.pulse) che sono state deprecate nella release 0.15.0 (agosto 2020) sono state rimosse. La serie completa di modifiche è la seguente:ModuloPrecedenteNuovoqiskit.pulse.librarySamplePulseWaveformqiskit.pulse.libraryConstantPulseConstant(rinominare il modulo) pulse.pulse_libModuloqiskit.pulse.libraryClasseVecchio metodoNuovo metodoParametricPulseget_sample_pulseget_waveformInstructioncommandN/D. I comandi e le istruzioni sono stati unificati. Utilizzare operands()per ottenere informazioni sui dati delle istruzioni.Acquireacquires,mem_slots,reg_slotsacquire(),mem_slot(),reg_slot(). (L'istruzioneAcquirenon trasmette più su più qubit) -
Il dizionario precedentemente tenuto sui
DAGCircuitè stato rimosso. Invece, i bordi ora contengono l'istanzaBitche era stata precedentemente inclusa nel dizionario come campo'wire'. Si noti che il grafo NetworkX restituito dato_networkx()avrà ancora un dizionario per gli attributi dei bordi, ma il campo'name'non sarà più popolato. -
L'attributo
parametersdella classeQuantumCircuitnon restituisce più unset. Restituisce invece un oggettoParameterViewche implementa tutti i metodi offerti daset(anche se deprecati). Questo è stato fatto per supportare un modello che conserva i parametri ordinati per nome. Dovrebbe essere pienamente compatibile con qualsiasi uso precedente disetrestituito dall'attributoparametersad eccezione dei casi in cui è stato fatto un controllo esplicito del tipo di un insieme. -
Quando si esegue
transpile()su un dispositivoQuantumCircuitcondelay()le unità saranno convertite in dt se il valore di dt (tempo di campionamento) è noto atranspile(), sia esplicitamente tramite il kwargdtsia tramite il kwargBackendConfigurationper un oggettoBackendpassato tramite il kwargbackend. -
L'interpretazione di
meas_map(che è un attributo di un oggetto o come corrispondente kwarg di ) è molto semplicePulseBackendConfigurationo come il corrispondente kwarg dimeas_mapsull'oggettoschedule(),assemble(),sequence(), oexecute()) è stata aggiornata per corrispondere meglio ai vincoli reali dell'hardware. Il formato di questi dati è un elenco di liste, dove gli elementi della lista interna sono numeri interi che specificano le etichette dei qubit. Per esempio:[[A, B, C], [D, E, F, G]]In precedenza, il vincolo
meas_mapera interpretato in modo tale che se veniva acquisito un qubit (ad esempio A), tutti gli altri qubit che condividevano un sottogruppo con quel qubit (B e C) dovevano essere acquisiti nello stesso momento e per la stessa durata. Questo vincolo è stato allentato. Un'acquisizione non richiede altre acquisizioni. (Se A viene acquisito, B e C non devono essere acquisiti) Invece, i qubit dello stesso gruppo di misura non possono essere acquisiti in modo parzialmente sovrapposto - si pensi ameas_mapcome se specificasse una risorsa di acquisizione condivisa (se acquisiamo A dat=1000at=2000, non possiamo acquisire B a partire da1000<t<2000). Ad esempio:# Good meas_map = [[0, 1]] # Acquire a subset of [0, 1] sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) # Acquire 0 and 1 together (same start time, same duration) sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) # Acquire 0 and 1 disjointly sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) << 10 # Acquisitions overlap, but 0 and 1 aren't in the same measurement # grouping meas_map = [[0], [1]] sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) << 1 # Bad: 0 and 1 are in the same grouping, but acquisitions # partially overlap meas_map = [[0, 1]] sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) << 1
Note di deprecazione
-
Sono stati aggiunti due nuovi argomenti
qiskit.dagcircuit.DAGNode.semantic_eq()bit_indices1ebit_indices2, che dovrebbero mappare le istanze diBitin ciascuno dei due argomentiDAGNodeal loro indice nell'elencoqubitsoclbitsdelle rispettive listeDAGCircuit. Durante il periodo di deprecazione, questi argomenti sono facoltativi e quando non sono specificati le mappature saranno costruite automaticamente in base alle proprietàregistereindexdi ogni istanzaBitistanza. Tuttavia, in una versione futura, saranno argomenti obbligatori e la mappatura dovrà essere fornita dall'utente. -
Le
pulsefunzioni del costruttore:qiskit.pulse.call_circuit()qiskit.pulse.call_schedule()
sono deprecati e saranno rimossi in una prossima versione. Queste funzioni sono unificate in
qiskit.pulse.call(), che dovrebbe essere utilizzato al loro posto. -
Il metodo
qiskit.pulse.Scheduleqiskit.pulse.Schedule.flatten()è deprecato e sarà rimosso in una prossima versione. Si può invece utilizzare la funzioneqiskit.pulse.transforms.flatten()che eseguirà la stessa operazione. -
Il sito
assign_parameters()per le seguenti classi:qiskit.pulse.channels.Channel,qiskit.pulse.library.Pulse,qiskit.pulse.instructions.Instruction,
e tutte le sue sottoclassi è ora deprecato e sarà rimosso in una prossima versione. Questa funzionalità è stata sostituita
ScheduleBlockche è la direzione futura per la costruzione di programmi a impulsi parametrizzati. -
L'attributo
parametersper le seguenti classi:è deprecato e sarà rimosso in una prossima versione. Questa funzionalità è stata sostituita
ScheduleBlockche è la direzione futura per la costruzione di programmi a impulsi parametrizzati. -
Python 3.6 è stato deprecato e sarà rimosso in una prossima versione. Quando il supporto verrà rimosso, sarà necessario aggiornare la versione Python in uso a Python 3.7 o superiore.
-
Due metodi
QuantumCircuitcombine()eextend()e i corrispondenti operatori Python+e+=sono deprecati e saranno rimossi in una prossima versione. Invece il metodoQuantumCircuitmetodocompose()dovrebbe essere utilizzato. Il metodocompose()consente una maggiore flessibilità nella composizione di due circuiti che non hanno registri corrispondenti. Tuttavia, non aggiunge automaticamente qubit/clbit, a differenza dei metodi deprecati. Per aggiungere un circuito su nuovi qubit/clbit, si può utilizzare il metodoqiskit.circuit.QuantumCircuit.tensor()può essere utilizzato. Ad esempio:from qiskit.circuit import QuantumRegister, QuantumCircuit a = QuantumRegister(2, 'a') circuit_a = QuantumCircuit(a) circuit_a.cx(0, 1) b = QuantumRegister(2, 'b') circuit_b = QuantumCircuit(b) circuit_b.cz(0, 1) # same as circuit_a + circuit_b (or combine) added_with_different_regs = circuit_b.tensor(circuit_a) # same as circuit_a + circuit_a (or combine) added_with_same_regs = circuit_a.compose(circuit_a) # same as circuit_a += circuit_b (or extend) circuit_a = circuit_b.tensor(circuit_a) # same as circuit_a += circuit_a (or extend) circuit_a.compose(circuit_a, inplace=True) -
Supporto per il passaggio di
Qubital kwargqubitsdel metodoqiskit.transpiler.InstructionDurations.get()è stato deprecato e sarà rimosso in una prossima versione. Si deve invece chiamare il metodoget()con gli indici interi dei qubit desiderati. -
L'uso di
@(__matmul__) per invocare il metodocomposedelle sottoclassi diBaseOperator(esOperator) è deprecato e sarà rimosso in una prossima versione. Il metodoqiskit.quantum_info.Operator.compose()può essere usato direttamente o anche invocato con l'operatore&(__and__). -
Usare
*(__mul__) per richiamare il metododot()delle sottoclassi diBaseOperator(ad esempioqiskit.quantum_info.Operator) è deprecato e sarà rimosso in una prossima versione. Si può invece chiamare il metododot()direttamente. -
Utilizzare
@(__matmul__) per invocare il metodoevolve()del metodoqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixè deprecato e sarà rimosso in una prossima versione. Il metodoevolvepuò essere utilizzato direttamente o anche invocato con l'operatore&(__and__). -
La classe
qiskit.pulse.schedule.ParameterizedScheduleè stata deprecata e sarà rimossa in una prossima versione. Si possono invece parametrizzare direttamente gli oggetti pulseSchedulecon un oggettoParameterad esempio:from qiskit.circuit import Parameter from qiskit.pulse import Schedule from qiskit.pulse import ShiftPhase, DriveChannel theta = Parameter('theta') target_schedule = Schedule() target_schedule.insert(0, ShiftPhase(theta, DriveChannel(0)), inplace=True) -
La classe
qiskit.pulse.ScheduleComponentdel moduloqiskit.pulseè stata deprecata e sarà rimossa in una prossima versione. Il suo utilizzo deve essere sostituito con unqiskit.pulse.Scheduleo direttamenteqiskit.pulse.Instruction. Inoltre, lo scopo principale della classeScheduleComponentera quello di essere una classe base comune per entrambi i tipi di input e per qualsiasi luogo che fosse esplicitamente controllato o documentato per accettare un input oScheduleeInstruction, per qualsiasi posto che fosse esplicitamente in grado di controllare il tipo o di documentare l'accettazione di un inputScheduleComponentdovrebbe essere aggiornata per accettareInstructionoSchedule. -
I file JSON Schema e l'uso dei payload dell'API IBMQ sono deprecati e saranno rimossi in una versione futura. Questo include tutto ciò che si trova sotto il modulo
qiskit.schemase il moduloqiskit.validation. Questo include anche i kwarg divalidateperqiskit.qobj.QasmQobj.to_dict()eqiskit.qobj.QasmQobj.to_dict()insieme ai validatori fastjsonschema a livello di modulo inqiskit.qobj(che non sollevano un avviso di deprecazione). I file dello schema sono stati spostati nel repository Qiskit/ibmq-schemas e devono essere considerati come le versioni canoniche degli schemi API. In futuro solo questi schemi riceveranno gli aggiornamenti e saranno utilizzati come fonte di verità per gli schemi. Se ci si affidava agli schemi forniti da qiskit-terra, si dovrebbe aggiornare per utilizzare questo repository. -
Il modulo
qiskit.utilè stato deprecato e sarà rimosso in una prossima versione. È stato sostituito daqiskit.utilsche offre le stesse funzionalità e sarà ampliato in futuro. Si noti che non verrà emessoDeprecationWarningin merito a questa deprecazione, poiché non era possibile su Python 3.6. -
Il passaggio del transpiler
CXDirectionnel moduloqiskit.transpiler.passesè stato deprecato e sarà rimosso in una prossima versione. Si dovrebbe invece utilizzare il sitoGateDirection. Si comporta in modo identico aCXDirection, tranne per il fatto che ora supporta anche la trasformazione di un circuito conECRGateoltre aCXGateporte. -
Il passaggio del transpiler
CheckCXDirectionnel moduloqiskit.transpiler.passesè stato deprecato e sarà rimosso in una prossima versione. Si dovrebbe invece utilizzare il passaggioCheckGateDirection. Si comporta in modo identico aCheckCXDirection, tranne per il fatto che ora supporta anche il controllo della direzione di tutte le porte a 2 qubit, non solo di quelle a 2 qubitCXGateporte. -
Il metodo
WeightedAddernum_ancilla_qubits()è deprecato e sarà rimosso in una prossima versione. È stato sostituito con l'attributoqiskit.circuit.library.WeightedAdder.num_ancillasche è coerente con le API di altre librerie di circuiti. -
I seguenti metodi legacy della classe
qiskit.quantum_info.Paulisono stati deprecati. Vedere la documentazione del metodo per l'uso sostitutivo nella classe Pauli aggiornata.from_label()sgn_prod()to_spmatrix()kron()update_z()update_x()insert_paulis()append_paulis()delete_qubits()pauli_single()random()
-
Utilizzando un
listo unnumpy.ndarraycome argomentochannelotargetper il metodoqiskit.quantum_info.process_fidelity(),qiskit.quantum_info.average_gate_fidelity(),qiskit.quantum_info.gate_error(), eqiskit.quantum_info.diamond_norm()è stato deprecato e non sarà più supportato nelle prossime versioni. Gli input dovrebbero invece essere un oggettoGateo un oggetto della sottoclasseBaseOperator(ad esempio.Operator,Choi, ecc.) -
Accedere ai riferimenti da
QubiteClbitai registri che li contengono tramite l'opzioneregisteroindexè stato deprecato e sarà rimosso in una prossima versione. Invece,Registerpossono essere interrogati per trovare gli oggettiBitoggetti che contengono. -
L'attuale funzionalità della funzione
qiskit.visualization.pulse_drawer()è deprecata e sarà sostituita daqiskit.visualization.pulse_drawer_v2()(che non è retrocompatibile) in una versione futura. -
L'uso dei metodi ereditati dal tipo
setsull'uscita dell'attributoparameters(che prima era unset) della classeQuantumCircuitsono deprecati e saranno rimossi in una prossima versione. Questo include i metodi dei sitiadd(),difference(),difference_update(),discard(),intersection(),intersection_update(),issubset(),issuperset(),symmetric_difference(),symmetric_difference_update(),union(),update(),__isub__()(che è l'operatore-=) e__ixor__()(che è l'operatore^=). -
Il nome del primo (e unico) argomento posizionale del metodo
qiskit.circuit.QuantumCircuit.bind_parameters()è cambiato davalue_dictavalues. Il passaggio di un argomento con il nomevalues_dictè deprecato e sarà rimosso nelle prossime versioni. Per esempio, se in precedenza si chiamavabind_parameters()con una chiamata del tipo:bind_parameters(values_dict={})questa è deprecata e dovrebbe essere sostituita dabind_parameters(values={})o meglio ancora passare l'argomento in posizionebind_parameters({}). -
Il nome del primo (e unico) argomento posizionale del metodo
qiskit.circuit.QuantumCircuit.assign_parameters()è cambiato daparam_dictaparameters. Il passaggio di un argomento con il nomeparam_dictè deprecato e sarà rimosso nelle prossime versioni. Per esempio, se in precedenza si chiamavaassign_parameters()con una chiamata del tipo:assign_parameters(param_dict={})questa è deprecata e dovrebbe essere sostituita daassign_parameters(values={})o meglio ancora passare l'argomento in posizioneassign_parameters({}).
Correzioni di bug
-
Corretto un problema per cui la funzione
execute()sollevava un'eccezioneQiskitErrorquando veniva passato un oggettoParameterVectorveniva passato per il kwargparameter_bind. parametro. Ad esempio, è ora possibile chiamare qualcosa come:execute(circuit, backend, parameter_binds=[{pv1: [...], pv2: [...]}])dove
pv1epv2sonoParameterVectoroggetti. Corretto #5467 -
È stato risolto un problema a causa del quale le etichette degli impulsi parametrici nella classe
PulseQobjInstructionnon venivano impostate correttamente come nel caso degli impulsi campionati. Questo significa anche che i nomi degli impulsi importati dal filePulseDefaultsrestituiti da un fileBackend, comex90,x90m, ecc. Corretto #5363 -
Corretto un problema per cui i parametri non vincolati si verificavano solo nell'attributo
global_phasedi un oggettoQuantumCircuitnon venivano visualizzati nell'attributoparameterse non potevano essere vincolati. Corretto #5806 -
L'attributo
calibrationsdegli oggettiQuantumCircuitsono ora conservati quando si usano i metodi+=(cioè il metodoextend()) e+(cioè il metodocombine()). Corretto #5930 e #5908 -
Il metodo
namedella classeRegister(che è la classe madre diQuantumRegistereClassicalRegister) in precedenza non controllava se la stringa assegnata fosse un nome di registro valido, come previsto dalla specifica OpenQASM. Questo controllo veniva eseguito in precedenza solo quando il nome era specificato nel costruttore; ora è stato corretto in modo che l'impostazione diretta dell'attributonamecon un valore non valido sollevi un'eccezione. Corretto #5461 -
Corretto un problema con la funzione
qiskit.visualization.circuit_drawer()e il metodoqiskit.circuit.QuantumCircuit.draw()quando si visualizza un oggettoQuantumCircuitcon un elementoGateche ha una condizione classica dopo unMeasureche ha usato lo stesso metodoClassicalRegisterera possibile che la condizioneGatesia visualizzato a sinistra diMeasure. Corretto #5387 -
Nel passaggio del transpiler
qiskit.transpiler.passes.CSPLayoutsi è osservata una polarizzazione verso i qubit di numero inferiore. Questa indesiderata distorsione è stata risolta rimescolando i candidati per randomizzare i risultati. Inoltre, l'uso delCSPLayoutnel campopreset_passmanagers(per i livelli 2 e 3) è stato regolato in modo da utilizzare un seme configurato se il kwargseed_transpilerè impostato quando viene richiamato il parametrotranspile()viene chiamato. Corretto #5990 -
Corregge un bug per cui il campo
channelsper un oggettoPulseBackendConfigurationnon veniva incluso nell'output del metodoqiskit.providers.models.PulseBackendConfiguration.to_dictdel metodo. Corretto #5579 -
Corretto l'entanglement di
'circular'nella classe dei circuitiqiskit.circuit.library.NLocalper il caso limite in cui il circuito ha la stessa dimensione del blocco di entanglement (ad esempio, un circuito a due qubit e porte di entanglement CZ). In questo caso dovrebbe esserci un solo gate di entanglement, ma ne è stato aggiunto accidentalmente un secondo nella direzione inversa al primo. Fisso qiskit-community/qiskit-aqua#1452 -
Corretta la gestione dei punti di interruzione nella classe
PiecewisePolynomialPauliRotationsnella classeqiskit.circuit.library. Ora per gli intervallinsono consentiti i breakpointn+1. Ciò consente di specificare un altro intervallo finale diverso da . Questo è importante perché dalla fine dell'ultimo intervallo a la funzione è l'identità. -
Corretto un problema nella classe
qiskit.circuit.library.Permutationin cui alcune permutazioni non venivano generate correttamente. Questo problema potrebbe avere effetto anche suqiskit.circuit.library.QuantumVolumese fosse stato chiamato con classic_permutation=False`. Corretto #5812 -
È stato risolto un problema per cui la generazione dell'output QASM con il metodo
qasm()per un oggettoQuantumCircuitche ha un controlloControlledGatecon un controllo aperto, l'output sarebbe stato come se tutti i controlli fossero chiusi, indipendentemente dallo stato del controllo specificato. In questo modo si creerebbe un circuito diverso dafrom_qasm_str()se si analizza il QASM generato.Questo problema è stato risolto aggiornando l'uscita QASM da
qasm()definendo un gate composito che utilizzaXGateper implementare i controlli di apertura. Il gate composito è denominato<original_gate_name>_o<ctrl_state>, doveosta per controllo aperto ectrl_stateè il valore intero dello stato di controllo. Corretto #5443 -
È stato risolto un problema per cui gli oggetti
Parameterin un oggettoQuantumCircuitcon la funzioneparameter_bindsnella funzioneexecutefaceva sì che tutti gli oggetti vincolatiQuantumCircuitlegati avrebbero avuto lo stessoname, il che significava che anche i nomi dei risultati non erano univoci. Questa correzione fa sì che i campibind_parameters()eassign_parameters()assegnino un nome di circuito univoco quandoinplace=Falsecome:<base name>-<class instance no.>[-<pid name>]dove
<base name>è il nome fornito dal kwarg "nome", altrimenti il valore predefinito è "circuito". Il numero di istanza della classe viene incrementato ogni volta che viene generata un'istanza della classe.<pid name>viene aggiunto se viene chiamato al di fuori del processo principale. Corretto #5185 -
È stato risolto un problema con la funzione
scheduler()che sollevava un'eccezione se un circuito di ingresso conteneva un oggetto non vincolatoQuantumCircuitnon vincolato. Corretto #5304 -
È stato risolto un problema nei passaggi del
qiskit.transpiler.passes.TemplateOptimizationin cui i circuiti di template che contenevano oggetti non vincolati si bloccavano in alcuni scenariParametersi bloccavano in alcuni scenari se i parametri non potevano essere legati durante la corrispondenza dei modelli. Ora, se gliParameternon possono essere vincolati, i modelli con unboundParametervengono scartati e ignorati dal metodoTemplateOptimizationpass. Corretto #5533 -
Corretto un problema con la funzione
qiskit.visualization.timeline_drawer()in cui i bit classici non venivano gestiti correttamente. Corretto #5361 -
Corretto un problema nella funzione
qiskit.visualization.circuit_drawer()e nel metodoqiskit.circuit.QuantumCircuit.draw()in cui leDelayin un oggettoQuantumCircuitnon venivano trattate correttamente come tempo di inattività. Quindi, quando il kwarg diidle_wiresè stato impostato suFalse, i fili con gli oggetti sarebbero stati visualizzatiDelayverrebbero comunque mostrati. Questo problema è stato risolto in modo che i fili inattivi vengano rimossi dalla visualizzazione se ci sono solo oggetti su un filoDelayoggetti su un filo. -
In precedenza, quando l'opzione
layout_methodkwarg veniva fornita alla funzionetranspile()e il kwargoptimization_levelera impostato a >= 2, in modo che il passaggioqiskit.transpiler.passes.CSPLayoutvenisse eseguito, seCSPLayouttrovava una soluzione, il metodo inlayout_methodnon veniva eseguito. È stato corretto in modo che, se specificato,layout_methodvenga sempre rispettato. Corretto #5409 -
Quando l'argomento
coupling_map=None(impostato esplicitamente, impostato implicitamente come valore predefinito o tramite il kwargbackend), il processo di transpiling non "incorporava" il circuito. Cioè, anche quando è stato specificato uninitial_layout, i qubit virtuali non sono stati assegnati a qubit fisici. Questo problema è stato risolto in modo che ora la funzioneqiskit.compiler.transpile()rispetta l'argomentoinitial_layoutincorporando il circuito:from qiskit import QuantumCircuit, QuantumRegister from qiskit.compiler import transpile qr = QuantumRegister(2, name='qr') circ = QuantumCircuit(qr) circ.h(qr[0]) circ.cx(qr[0], qr[1]) transpile(circ, initial_layout=[1, 0]).draw(output='mpl')Se
initial_layoutsi riferisce a un numero di qubit superiore a quello del circuito, il processo di transpiling estenderà il circuito con gli ancillas.from qiskit import QuantumCircuit, QuantumRegister from qiskit.compiler import transpile qr = QuantumRegister(2, name='qr') circ = QuantumCircuit(qr) circ.h(qr[0]) circ.cx(qr[0], qr[1]) transpile(circ, initial_layout=[4, 2], coupling_map=None).draw()Corretto #5345
-
Un nuovo kwarg,
user_cost_dict, è stato aggiunto al costruttore per il passaggio delqiskit.transpiler.passes.TemplateOptimizationper il passaggio del transpiler. Ciò consente agli utenti di fornire un dizionario dei costi personalizzato per le porte dell'algoritmo di corrispondenza dei modelli sottostante. Ad esempio:from qiskit.transpiler.passes import TemplateOptimization cost_dict = {'id': 0, 'x': 1, 'y': 1, 'z': 1, 'h': 1, 't': 1} pass = TemplateOptimization(user_cost_dict=cost_dict) -
C'è un problema quando si passa l'oggetto
Countsrestituito daget_counts()amarginal_counts()produceva un oggettoCountscon determinati input è stato risolto. Correzioni #5424 -
Migliorata l'allocazione dei qubit helper in
PolynomialPauliRotationsePiecewiseLinearPauliRotationsche rende più efficiente l'implementazione di questi circuiti. Corretto #5320 e #5322 -
Correggere l'utilizzo dei qubit helper allocati nel
MCXGatenella classeWeightedAdderclasse. Prima di questa correzione erano stati assegnati ma non utilizzati. Corretto #5321 -
In un certo numero di casi, il metodo di uscita
latexper la funzioneqiskit.visualization.circuit_drawer()e il metododraw()non mostravano correttamente il nome del gate e, in altri casi, non includevano i parametri del gate dove avrebbero dovuto essere. Ora i nomi dei gate saranno visualizzati nello stesso modo in cui sono visualizzati con il metodo di uscitample i parametri saranno visualizzati per tutti i gate che li hanno. Inoltre, alcuni cancelli non venivano visualizzati nella forma corretta e sono stati corretti. Correzioni #5605, #4938 e #3765 -
È stato risolto un problema a causa del quale, se il metodo
qiskit.circuit.Instruction.to_instruction()veniva utilizzato su un sottocircuito che conteneva registri classici e quell'oggetto veniva poi aggiunto a una classe di registriInstructionveniva poi aggiunto a un oggettoQuantumCircuitl'uscita della funzioneqiskit.visualization.circuit_drawer()e del metodoqiskit.circuit.QuantumCircuit.draw()in alcuni casi visualizzava il sottocircuito a sinistra di una misura, mentre avrebbe dovuto essere visualizzato a destra. Corretto #5947 -
Corretto un problema con gli
Delayin un oggettoQuantumCircuitdoveqiskit.compiler.transpile()non convertivano le unità dell'oggettoDelayalle unità dell'oggettoBackendse il kwarg dibackendè impostato sutranspile(). Ciò potrebbe comportare un comportamento errato a causa di una mancata corrispondenza delle unità, ad esempio l'esecuzione:from qiskit import transpile, execute from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) qc.delay(100, [0], unit='us') qc = transpile(qc, backend) job = execute(qc, backend)in precedenza avrebbe comportato il ritardo del backend per 100 timestep (ciascuno di durata dt) anziché per i timestep previsti ( 100e-6 / dt). Il problema è stato corretto in modo che la
qiskit.compiler.transpile()converta correttamente le unità di misura.
Altre note
- Le istantanee di tutti i backend falsi/mock in
qiskit.test.mocksono state aggiornate per riflettere le recenti modifiche ai dispositivi. Questo include una modifica dell'attributobasis_gatesper l'attributoBackendConfigurationa['cx', 'rz', 'sx', 'x', 'id'], l'aggiunta di una proprietàreadout_lengthalle proprietà dei qubit nella classeBackendPropertiese l'aggiornamento del filePulseDefaultsin modo che tutti i backend di mock supportino istanze parametriche basate su impulsiInstructionScheduleMapistanze.
Aer 0.8.0
Preludio
La release 0.8 include diverse nuove funzionalità e correzioni di bug. I punti salienti di questa versione sono: l'introduzione di un backend unificato AerSimulator per l'esecuzione di simulazioni di circuiti utilizzando uno qualsiasi dei metodi di simulazione supportati; una libreria di istruzioni per il simulatore (qiskit.providers.aer.library) che include istruzioni personalizzate per il salvataggio di vari tipi di dati del simulatore; il supporto MPI per l'esecuzione di simulazioni di grandi dimensioni su un ambiente di calcolo distribuito.
Nuove funzioni
-
Python 3.9 è stato aggiunto in questa versione. È ora possibile eseguire Qiskit Aer utilizzando Python 3.9 senza compilare i sorgenti.
-
Aggiungere il flag CMake
DISABLE_CONAN(default=```OFF``). Quando si installa dai sorgenti, impostareONconsente di bypassare il gestore di pacchetti Conan per trovare le librerie già installate sul sistema. È disponibile anche come variabile d'ambienteDISABLE_CONAN, che ha la precedenza sul flag di CMake. Questa non è la procedura ufficiale per costruire AER. Pertanto, l'utente è responsabile di fornire tutte le librerie necessarie e i file corrispondenti per renderli reperibili a CMake. -
Questa versione include il supporto per la creazione di qiskit-aer con supporto MPI per l'esecuzione di simulazioni di grandi dimensioni su un ambiente di calcolo distribuito. Consultare la guida per i contributi per istruzioni sulla compilazione e l'esecuzione in un ambiente MPI.
-
È ora possibile costruire qiskit-aer con CUDA abilitato in Windows. Si veda la guida alla contribuzione per le istruzioni sulla compilazione dai sorgenti con il supporto per le GPU.
-
Quando si costruisce l'estensione qiskit-aer Python dai sorgenti, è necessario preinstallare alcune dipendenze di compilazione per consentire la compilazione del C++. Per comodità dell'utente, quando si costruisce l'estensione, le dipendenze mancanti vengono installate automaticamente con
pipprima dei normali passaggi di installazione disetuptools, ma in precedenza non era possibile evitare questa installazione automatica. Per risolvere questo problema è stata aggiunta una nuova variabile d'ambienteDISABLE_DEPENDENCY_INSTALL. Se è impostato su1oONquando si costruisce l'estensione python dai sorgenti, si disabilita l'installazione automatica di queste dipendenze mancanti. -
Aggiunge il supporto per la porta di Pauli a N-qubit ottimizzata (
qiskit.circuit.library.PauliGate) ai metodiStatevectorSimulator,UnitarySimulator, e ai metodi dei vettori di stato e delle matrici di densità diQasmSimulatoreAerSimulator. -
Il metodo
run()per i backendAerSimulator,QasmSimulator,StatevectorSimulatoreUnitarySimulatorora accetta un parametroQuantumCircuit(o un elenco di oggettiQuantumCircuitcome input. L'oggetto precedenteQasmQobjè ancora supportato per ora, ma sarà deprecato in una versione futura.Per un esempio di utilizzo si veda:
from qiskit import transpile, QuantumCircuit from qiskit.providers.aer import Aer backend = Aer.get_backend('aer_simulator') circuit = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() tqc = transpile(circuit, backend) result = backend.run(tqc, shots=4096).result() -
Il metodo
run()per il backendPulseSimulatorora accetta un parametroSchedule(o un elenco di oggettiSchedule) come input. L'oggetto precedentePulseQobjè ancora supportato per ora, ma sarà deprecato in una versione futura. -
Aggiunge il nuovo backend del simulatore
AerSimulatorche supporta i seguenti metodi di simulazioneautomaticstatevectorstabilizerdensity_matrixmatrix_product_stateunitarysuperop
Il metodo automatico predefinito sceglierà automaticamente un metodo di simulazione separatamente per ciascun circuito eseguito, in base alle istruzioni del circuito e al modello di rumore (se presente). L'inizializzazione di un simulatore con un metodo specifico può essere effettuata utilizzando l'opzione metodo.
La simulazione su GPU per i metodi statevector, density matrix e unitary può essere abilitata impostando l'opzione
device='GPU'backend.Si noti che i metodi
unitaryesuperopnon supportano la misurazione in quanto simulano la matrice unitaria o la matrice dei superoperatori del circuito di esecuzione, pertanto è necessario utilizzare una delle nuove istruzionisave_unitary(),save_superop(), osave_state()per salvare lo stato del simulatore nei risultati restituiti. Allo stesso modo, lo stato degli altri metodi di simulazione può essere salvato utilizzando le istruzioni appropriate. Per maggiori dettagli, consultare i documenti dell'APIqiskit.providers.aer.library.Si noti che il simulatore
AerSimulatorsostituisce i backendQasmSimulator,StatevectorSimulatoreUnitarySimulator, che saranno deprecati in una versione futura. -
Aggiorna la classe
AerProviderper includere più backendAerSimulatorpreconfigurati per tutti i metodi di simulazione e i dispositivi di simulazione disponibili. Si può accedere ai nuovi backend attraverso l'interfaccia del provider utilizzando i nomi"aer_simulator""aer_simulator_statevector""aer_simulator_stabilizer""aer_simulator_density_matrix""aer_simulator_matrix_product_state""aer_simulator_extended_stabilizer""aer_simulator_unitary""aer_simulator_superop"
Se Aer è stato installato con il supporto per le GPU su un sistema compatibile, saranno disponibili anche i seguenti backend per le GPU
"aer_simulator_statevector_gpu""aer_simulator_density_matrix_gpu""aer_simulator_unitary_gpu"
Ad esempio:
from qiskit import Aer # Get the GPU statevector simulator backend backend = Aer.get_backend('aer_simulator_statevector_gpu') -
Aggiunto un nuovo metodo
norm estimationper l'esecuzione delle misure quando si utilizza il metodo di simulazione"extended_stabilizer". Questo metodo di stima della norma può essere utilizzato passando le seguenti opzioni ai backendAerSimulatoreQasmSimulatorsimulator = QasmSimulator( method='extended_stabilizer', extended_stabilizer_sampling_method='norm_estimation')Il metodo di stima della norma è più lento delle opzioni alternative
metropolisoresampled_metropolis, ma offre prestazioni migliori su circuiti con distribuzioni di uscita rade. Per ulteriori informazioni, consultare la documentazione diQasmSimulator. -
Aggiunge istruzioni per salvare lo stato del simulatore in vari formati. Queste istruzioni sono
qiskit.providers.aer.library.SaveDensityMatrixqiskit.providers.aer.library.SaveMatrixProductStateqiskit.providers.aer.library.SaveStabilizerqiskit.providers.aer.library.SaveStateqiskit.providers.aer.library.SaveStatevectorqiskit.providers.aer.library.SaveStatevectorDictqiskit.providers.aer.library.SaveUnitary
Queste istruzioni possono essere aggiunte a un circuito quantistico utilizzando i metodi di circuito
save_density_matrix,save_matrix_product_state,save_stabilizer,save_state,save_statevector,save_statevector_dict,save_unitaryche vengono aggiunti aQuantumCircuitquando si importa Aer.Per i dettagli sulla compatibilità dei metodi per ciascuna istruzione, consultare la documentazione dell'API
qiskit.providers.aer.library.Si noti che le istruzioni snapshot
SnapshotStatevector,SnapshotDensityMatrix,SnapshotStabilizersono ancora supportate, ma saranno deprecate in una versione futura. -
Aggiunge le istruzioni dei circuiti quantistici
qiskit.providers.aer.library.SaveExpectationValueeqiskit.providers.aer.library.SaveExpectationValueVarianceper salvare il valore di aspettativa , o il valore di aspettativa e la varianza , di un operatore hermitiano per lo stato del simulatore . Queste istruzioni possono essere aggiunte a un circuito quantistico utilizzando i metodi di circuitosave_expectation_valueesave_expectation_value_varianceche vengono aggiunti aQuantumCircuitquando si importa Aer.Si noti che l'istruzione snapshot
SnapshotExpectationValueè ancora supportata, ma sarà deprecata in una release futura. -
Aggiunge
qiskit.providers.aer.library.SaveProbabilitieseqiskit.providers.aer.library.SaveProbabilitiesDictistruzioni di circuito quantistico per il salvataggio di tutte le probabilità di esito della misurazione per le misure Z-basis dello stato del simulatore. Queste istruzioni possono essere aggiunte a un circuito quantistico utilizzando i metodi di circuitosave_probabilitiesesave_probabilities_dict, che viene aggiunto aQuantumCircuitquando si importa Aer.Si noti che l'istruzione snapshot
SnapshotProbabilitiesè ancora supportata, ma sarà deprecata in una release futura. -
Aggiunge le istruzioni dei circuiti
qiskit.providers.aer.library.SaveAmplitudeseqiskit.providers.aer.library.SaveAmplitudesSquaredper salvare le ampiezze dei vettori di stato complessi selezionati o le probabilità selezionate (ampiezze al quadrato) per i metodi di simulazione supportati. Queste istruzioni possono essere aggiunte a un circuito quantistico utilizzando i metodi di circuitosave_amplitudesesave_amplitudes_squaredche viene aggiunto aQuantumCircuitquando si importa Aer. -
Aggiunge istruzioni per impostare lo stato dei simulatori. Queste istruzioni devono essere definite sull'intero numero di qubit del circuito. Possono essere applicati in qualsiasi punto di un circuito e sostituiscono lo stato del simulatore con quello specificato. Le istruzioni aggiunte sono
qiskit.providers.aer.library.SetDensityMatrixqiskit.providers.aer.library.SetStabilizerqiskit.providers.aer.library.SetStatevectorqiskit.providers.aer.library.SetUnitary
Queste istruzioni possono essere aggiunte a un circuito quantistico utilizzando i metodi di circuito
set_density_matrix,set_stabilizer,set_statevector,set_unitaryche vengono aggiunti aQuantumCircuitquando si importa Aer.Per i dettagli sulla compatibilità dei metodi per ciascuna istruzione, consultare la documentazione dell'API
qiskit.providers.aer.library. -
Aggiunto il supporto per le porte diagonali al metodo di simulazione
"matrix_product_state". -
Aggiunto il supporto dell'istruzione
initializeal metodo di simulazione"matrix_product_state".
Problemi noti
- È noto un problema per cui la simulazione di alcuni circuiti con un modello di rumore Kraus utilizzando il metodo di simulazione
"matrix_product_state"può causare un arresto anomalo del simulatore. Per ulteriori informazioni, consultare la sezione #306.
Note sull'aggiornamento
-
La versione minima di Conan è stata aumentata a 1.31.2. Questa operazione si è resa necessaria per risolvere un problema di compatibilità con le versioni più recenti del software urllib3 (che è una dipendenza di Conan). Aggiunge inoltre il supporto nativo per AppleClang 12, utile per gli utenti con i nuovi computer Apple.
-
pybind11la versione minima richiesta è 2.6 invece di 2.4. Questo è necessario per supportare la compilazione con CUDA in Windows. -
Cython è stato rimosso come dipendenza di compilazione.
-
Rimossa la decomposizione del gate di x90 dai modelli di rumore, deprecata in qiskit-aer 0.7. Questa decomposizione viene ora effettuata utilizzando le porte di base del modello di rumore regolare e il transpiler qiskit.
-
Le seguenti opzioni per il metodo di simulazione
"extended_stabilizer"sono state modificate.extended_stabilizer_measure_sampling: Questa opzione è stata sostituita dall'opzioneextended_stabilizer_sampling_method, che controlla il modo in cui simuliamo la misurazione dei qubit.extended_stabilizer_mixing_time: Questa opzione è stata rinominataextended_stabilizer_metropolis_mixing_timeper chiarire che si applica solo ai metodi di campionamentometropoliseresampled_metropolis.extended_stabilizer_norm_estimation_samples: Questa opzione è stata rinominata inextended_stabilizer_norm_estimation_default_samples.
È stata aggiunta l'opzione
extended_stabilizer_norm_estimation_repetitions, che controlla parte del comportamento del metodo di campionamento della stima della norma.
Note di deprecazione
- Python 3.6 è stato deprecato e sarà rimosso in una prossima versione. Quando il supporto verrà rimosso, sarà necessario aggiornare la versione Python in uso a Python 3.7 o superiore.
Correzioni di bug
- Corregge il bug di
AerProviderper cui le opzioni impostate sui backend restituiti usandoset_options()venivano memorizzate nel provider e persistevano per le successive chiamate aget_backend()per lo stesso backend denominato. Ora ogni chiamata abackends()restituisce una nuova istanza del backend del simulatore, che può essere configurato. - Corregge un errore nel messaggio di errore restituito quando un circuito contiene istruzioni del simulatore non supportate. In precedenza, alcune istruzioni supportate venivano elencate nel messaggio di errore insieme a quelle non supportate.
- Corregge il problema dell'impostazione delle porte di base di
QasmSimulatorquando si usano le opzioni"method"e"noise_model"insieme e quando le si usa con un simulatore costruito confrom_backend(). Ora le porte di base elencate saranno l'intersezione delle porte supportate dalla configurazione del backend, dal metodo di simulazione e dalle porte di base del modello di rumore. Se l'intersezione delle porte di base del modello di rumore e delle porte di base del simulatore è vuota, viene registrato un avviso. - Correzione del bug per cui il gate
"sx"`SXGatenon era elencato come gate supportato nel codice C++, inStateOpSetdimatrix_product_state.hp. - Correggere il bug per cui
"csx","cu2","cu3"erano erroneamente elencati come porte di base supportate per il metodo"density_matrix"diQasmSimulator. - Correzione del bug per cui i parametri venivano passati in modo errato tra le funzioni di
matrix_product_state_internal.cpp, causando una simulazione errata e il raggiungimento di stati non validi, che a loro volta causavano un loop infinito. - Corregge un bug che causava il mancato funzionamento di
c_ifquando la larghezza del registro condizionale era superiore a 64. Vedere il numero 1077. - Corregge il bug #1153 ) per cui il rumore sulle porte condizionali veniva sempre applicato indipendentemente dal fatto che la porta condizionale fosse effettivamente applicata in base al valore del registro classico. Ora il rumore su un gate condizionale verrà applicato solo nel caso in cui il gate condizionale sia applicato.
- Corregge un bug con il flag OpenMP annidato che veniva impostato su true quando non doveva esserlo.
- Corregge un bug quando si applica il troncamento nel metodo del prodotto matriciale di stato di QasmSimulator.
- Corretto il problema #1126 : bug nel riportare la misura di un singolo qubit. L'errore si è verificato durante la copia del valore misurato nella struttura dati di uscita.
- In MPS, apply\kraus operava direttamente sui bit di ingresso nei qubit dei parametri, invece che sui qubit interni. Nell'algoritmo MPS, i qubit si muovono continuamente, quindi tutte le operazioni devono essere applicate ai qubit interni.
- Quando si invoca MPS::sample_measure, occorre prima ordinare i qubit secondo l'ordinamento predefinito, perché questo è il presupposto di qasm_controller.This, invocando il metodo move_all_qubits_to_sorted_ordering. Era corretto nel campione misura_utilizzo_applicazione_misura, ma mancava nel campione misura_utilizzo_probabilità.
- Corregge un bug con il metodo
from_backend()diQasmSimulatorche impostava l'attributolocaldella configurazione al valore del backend invece di essere sempre impostato suTrue. - Corregge il bug di
from_backend()efrom_backend()per cuibasis_gatesveniva impostato in modo errato per i dispositivi IBMQ con gate di base impostato su['id', 'rz', 'sx', 'x', 'cx']. Ora il modello di rumore avrà sempre le stesse porte di base delle porte di base del backend, indipendentemente dal fatto che le istruzioni abbiano o meno errori nel modello di rumore. - Corregge un problema per cui il metodo di simulazione esteso "extended_stabilizer" forniva risultati errati su circuiti quantistici con distribuzioni di uscita rade. Per ulteriori informazioni ed esempi, consultare il documento #306.
Ignis 0.6.0
Nuove funzioni
- La funzione
qiskit.ignis.mitigation.expval_meas_mitigator_circuits()è stata migliorata in modo da ridurre il numero di circuiti generati dalla funzione utilizzata per la calibrazione con il metodo CTMP da a (dove è il numero di qubit).
Note sull'aggiornamento
- La funzione
qiskit.ignis.verification.randomized_benchmarking_seq()utilizza ora la classe CNOTDihedral aggiornata,qiskit.ignis.verification.CNOTDihedral, che consente di eseguire il CNOT-Dihedral Randomized Benchmarking su più di due qubit. - Il pacchetto python
retworkxè ora un requisito per l'installazione di qiskit-ignis. Sostituisce il precedente utilizzo dinetworkx(che non è più un requisito) per ottenere prestazioni migliori. - La dipendenza da
scikit-learnnon è più necessaria e ora è un requisito opzionale. Se si utilizzano i discriminatori di misura IQ (IQDiscriminationFitter,LinearIQDiscriminationFitter,QuadraticIQDiscriminationFitter, oSklearnIQDiscriminator) è necessario installare manualmente scikit-learn, eseguendopip install scikit-learno installando anche qiskit-ignis conpip install qiskit-ignis[iq].
Correzioni di bug
- Corretto un problema nel metodo del valore di aspettativa
expectation_value(), per le classi di attenuazione degli erroriTensoredExpvalMeasMitigatoreCTMPExpvalMeasMitigatorse il kwargqubitsnon era specificato, si utilizzava erroneamente il numero totale di qubit del mitigatore, anziché il numero di bit classici nel dizionario dei conteggi, con conseguente riduzione delle prestazioni. Corretto #561 - Correggere il metodo
"auto"dei metodiTomographyFitter,StateTomographyFittereProcessTomographyFitterin modo da utilizzare"cvx"solo se CVXPY è installato e se è disponibile un solutore SDP di terze parti diverso da SCS. Questo perché il solutore SCS ha un'accuratezza inferiore rispetto ad altri metodi di risoluzione e spesso restituisce una matrice di densità o una matrice di Choi che non è completamente positiva e fallisce la convalida quando viene utilizzata con il metodoqiskit.quantum_info.state_fidelity()oqiskit.quantum_info.process_fidelity().
Acqua 0.9.0
Con questa release il progetto Qiskit Aqua viene ufficialmente deprecato; in futuro (non prima di 3 mesi da questa release) il progetto Aqua avrà il suo rilascio finale e sarà archiviato. Tutte le funzionalità fornite da qiskit-aqua sono state migrate in nuovi pacchetti o in altri pacchetti qiskit. I moduli applicativi forniti da qiskit-aqua sono stati suddivisi in diversi nuovi pacchetti: qiskit-optimization, qiskit-nature, qiskit-machine-learning, e qiskit-finance. Questi pacchetti possono essere installati da soli (tramite il comando standard pip install, cioè pip install qiskit-nature) o con il resto del metapacchetto Qiskit come extra opzionali (cioè pip install 'qiskit[finance,optimization]' o pip install 'qiskit[all]'. I blocchi di base per gli algoritmi e il flusso degli operatori sono ora disponibili come parte di qiskit-terra all'indirizzo qiskit.algorithms e qiskit.opflow. A seconda dell'uso che si fa di Aqua, si possono utilizzare i pacchetti applicativi o i nuovi moduli di Qiskit Terra.
Per maggiori dettagli su come migrare dall'utilizzo di Qiskit Aqua, è possibile consultare la guida alla migrazione.
IBM Q Fornitore 0.12.2
Nessuna modifica