Modifiche alle funzionalità di Qiskit 1.0
Questa guida descrive i percorsi di migrazione per i cambiamenti più importanti nelle funzionalità di Qiskit 1.0, organizzati per modulo. Usa il sommario sul lato destro per navigare al modulo che ti interessa.
Strumento di migrazione Qiskit 1.0
Per semplificare il processo di migrazione, puoi usare lo strumento
flake8-qiskit-migration
per rilevare i percorsi di importazione rimossi nel tuo codice e suggerire alternative.
- Esegui con pipx
- Esegui con venv
Se hai pipx installato, esegui semplicemente
il seguente comando.
pipx run flake8-qiskit-migration <path-to-source-directory>
Questo installerà il pacchetto in un ambiente virtuale temporaneo ed eseguirà il controllo sul tuo codice.
Se non vuoi usare pipx, puoi creare manualmente un nuovo
ambiente per lo strumento. Questo approccio ti consente anche di usare
nbqa per controllare esempi di codice nei
Jupyter notebook. Elimina l'ambiente quando hai finito.
# Make new environment and install
python -m venv .flake8-qiskit-migration-venv
source .flake8-qiskit-migration-venv/bin/activate
pip install flake8-qiskit-migration
# Run plugin on Python code
flake8 --select QKT100 <path-to-source-directory> # e.g. `src/`
# (Optional) run plugin on notebooks
pip install nbqa
nbqa flake8 ./**/*.ipynb --select QKT100
# Deactivate and delete environment
deactivate
rm -r .flake8-qiskit-migration-venv
Questo strumento rileva solo i percorsi di importazione rimossi. Non rileva l'uso di
metodi rimossi (come QuantumCircuit.qasm) né di argomenti. Non è in grado di tenere traccia
di assegnazioni come qk = qiskit, anche se gestisce alias come
import qiskit as qk.
Per ulteriori informazioni, consulta il repository del progetto.
Istanze e funzioni globali
Aer
L'oggetto qiskit.Aer non è disponibile in Qiskit 1.0. Usa invece lo
stesso oggetto dal namespace qiskit_aer, che è un sostituto diretto.
Per installare qiskit_aer, esegui:
pip install qiskit-aer
BasicAer
L'oggetto qiskit.BasicAer non è disponibile in Qiskit 1.0. Consulta la
sezione di migrazione basicaer per le
opzioni di migrazione.
execute
La funzione qiskit.execute non è disponibile in Qiskit 1.0. Questa
funzione era un wrapper di alto livello attorno alle funzioni
transpile e
run di Qiskit.
Al posto di qiskit.execute, usa la funzione
transpile seguita da
backend.run().
# Legacy path
from qiskit import execute
job = execute(circuit, backend)
# New path
from qiskit import transpile
new_circuit = transpile(circuit, backend)
job = backend.run(new_circuit)
In alternativa, la primitiva Sampler
è semanticamente equivalente alla funzione qiskit.execute rimossa. La classe
BackendSampler è un
wrapper generico per i backend che non supportano le primitive:
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend)
job = sampler.run(circuit)
qiskit.circuit
QuantumCircuit.qasm
Il metodo QuantumCircuit.qasm è stato rimosso. Usa invece
qasm2.dump o
qasm2.dumps.
Per l'output formattato con Pygments, consulta il pacchetto standalone
openqasm-pygments,
poiché qasm2.dump e qasm2.dumps non forniscono output colorato con Pygments.
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
# Old
qasm_str = qc.qasm()
# Alternative
from qiskit.qasm2 import dumps
qasm_str = dumps(qc)
# Alternative: Write to file
from qiskit.qasm2 import dump
with open("my_file.qasm", "w") as f:
dump(qc, f)
gate di QuantumCircuit
I seguenti metodi gate sono stati rimossi a favore di metodi più consolidati che aggiungono gli stessi gate:
| Rimosso | Alternativa |
|---|---|
QuantumCircuit.cnot | QuantumCircuit.cx |
QuantumCircuit.toffoli | QuantumCircuit.ccx |
QuantumCircuit.fredkin | QuantumCircuit.cswap |
QuantumCircuit.mct | QuantumCircuit.mcx |
QuantumCircuit.i | QuantumCircuit.id |
QuantumCircuit.squ | QuantumCircuit.unitary |
I seguenti metodi del circuito sono stati rimossi. Questi gate possono invece essere
applicati a un circuito con QuantumCircuit.append.
| Rimosso | Alternativa (append) |
|---|---|
QuantumCircuit.diagonal | DiagonalGate |
QuantumCircuit.hamiltonian | HamiltonianGate |
QuantumCircuit.isometry | Isometry |
QuantumCircuit.iso | Isometry |
QuantumCircuit.uc | UCGate |
QuantumCircuit.ucrx | UCRXGate |
QuantumCircuit.ucry | UCRYGate |
QuantumCircuit.ucrz | UCRZGate |
Ad esempio, per un DiagonalGate:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import DiagonalGate # new location in the circuit library
circuit = QuantumCircuit(2)
circuit.h([0, 1]) # some initial state
gate = DiagonalGate([1, -1, -1, 1])
qubits = [0, 1] # qubit indices on which to apply the gate
circuit.append(gate, qubits) # apply the gate
Sono stati rimossi anche i seguenti metodi di QuantumCircuit:
| Rimosso | Alternativa |
|---|---|
QuantumCircuit.bind_parameters | QuantumCircuit.assign_parameters |
QuantumCircuit.snapshot | Le istruzioni di salvataggio di qiskit-aer |
qiskit.converters
La funzione qiskit.converters.ast_to_dag è stata rimossa da Qiskit. Essa convertiva
l'albero sintattico astratto generato dal vecchio parser OpenQASM 2 in un
DAGCircuit. Poiché il vecchio
parser OpenQASM 2 è stato rimosso (vedi qiskit.qasm), questa
funzione non ha più uno scopo. Invece, analizza i tuoi file OpenQASM 2 in un
QuantumCircuit usando i metodi costruttori
QuantumCircuit.from_qasm_file
o
QuantumCircuit.from_qasm_str
(o il modulo qiskit.qasm2), quindi
converti quel QuantumCircuit in un
DAGCircuit con
circuit_to_dag.
# Previous
from qiskit.converters import ast_to_dag
from qiskit.qasm import Qasm
dag = ast_to_dag(Qasm(filename="myfile.qasm").parse())
# Current alternative
import qiskit.qasm2
from qiskit.converters import circuit_to_dag
dag = circuit_to_dag(qiskit.qasm2.load("myfile.qasm"))
qiskit.extensions
Il modulo qiskit.extensions non è più disponibile. La maggior parte dei suoi oggetti è stata
integrata nella libreria dei circuiti
(qiskit.circuit.library). Per migrare alla
nuova posizione, sostituisci semplicemente qiskit.extensions con qiskit.circuit.library
nel percorso di importazione dell'oggetto. È un sostituto diretto.
# Previous
from qiskit.extensions import DiagonalGate
# Current alternative
from qiskit.circuit.library import DiagonalGate
Le classi spostate in qiskit.circuit.library sono:
DiagonalGateHamiltonianGateInitializeIsometryqiskit.circuit.library.generalized_gates.mcg_up_diag.MCGupDiagUCGateUCPauliRotGateUCRXGateUCRYGateUCRZGateUnitaryGate
Le seguenti classi sono state rimosse dal codice sorgente, poiché le loro
funzioni erano ridondanti o legate al modulo extensions:
| Rimosso | Alternativa |
|---|---|
SingleQubitUnitary | qiskit.circuit.library.UnitaryGate |
Snapshot | Usa le istruzioni di salvataggio di qiskit-aer |
ExtensionError | Una classe di errore pertinente |
qiskit.primitives
Il cambiamento più rilevante nel modulo qiskit.primitives è l'
introduzione della nuova interfaccia primitive V2. Questa sezione mostra come migrare il tuo
flusso di lavoro dalle primitive V1 alle primitive V2, nonché i pochi cambiamenti avvenuti
negli input accettati dall'interfaccia V1.
A partire dalla versione 1.0, ci riferiremo all'interfaccia primitive precedente alla 1.0 come "primitive V1".
Migrazione da V1 a V2
La distinzione formale tra le API delle primitive V1 e V2 è rappresentata dalle classi base da cui
ereditano le implementazioni delle primitive. Per passare alle nuove classi base, puoi mantenere
il percorso di importazione originale da qiskit.primitives:
| Migra da | Sostituisci con |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
I nomi delle implementazioni core di Qiskit delle primitive V2 (quelle importabili da qiskit.primitives),
sono stati modificati per chiarire il loro scopo come implementazioni eseguibili localmente
con un Backend simulatore a vettore di stato. I nuovi nomi non includono il suffisso -V2.
| Migra da | Sostituisci con |
|---|---|
qiskit.primitives.Estimator | qiskit.primitives.StatevectorEstimator |
qiskit.primitives.Sampler | qiskit.primitives.StatevectorSampler |
Ci sono alcune differenze concettuali da considerare quando si migra da V1 a V2.
Queste differenze sono dettate dalla classe base, ma vengono illustrate negli esempi seguenti usando le implementazioni
a vettore di stato presenti in qiskit.primitives:
Per gli esempi seguenti, assume le seguenti importazioni e inizializzazioni delle primitive:
from qiskit.primitives import (
Sampler,
StatevectorSampler,
Estimator,
StatevectorEstimator,
)
estimator_v1 = Estimator()
sampler_v1 = Sampler()
estimator_v2 = StatevectorEstimator()
sampler_v2 = StatevectorSampler()
# define circuits, observables and parameter values
Sampler e Estimator: Le nuove primitive V2 sono progettate per accettare input vettorizzati, dove singoli circuito possono essere raggruppati con specifiche a forma di array. Ovvero, un circuito può essere eseguito per array dinset di parametri,nosservabili, o entrambi (nel caso dell'estimator). Ogni gruppo è chiamato primitive unified bloc (pub) e può essere rappresentato come una tupla:(1 x circuit, [n x observables], [n x parameters]). L'interfaccia V1 non consentiva la stessa flessibilità. Il numero di circuito in input doveva invece corrispondere al numero di osservabili e set di parametri, come mostrato negli esempi seguenti (seleziona una scheda per vedere ogni esempio):
- Estimator, 1 circuit, 4 osservabili
- Sampler, 1 circuit, 3 set di parametri
- Estimator, 1 circuit, 4 osservabili, 2 set di parametri
# executing 1 circuit with 4 observables using Estimator V1
job = estimator_v1.run([circuit] * 4, [obs1, obs2, obs3, obs4])
evs = job.result().values
# executing 1 circuit with 4 observables using Estimator V2
job = estimator_v2.run([(circuit, [obs1, obs2, obs3, obs4])])
evs = job.result()[0].data.evs
# executing 1 circuit with 3 parameter sets using Sampler V1
job = sampler_v1.run([circuit] * 3, [vals1, vals2, vals3])
dists = job.result().quasi_dists
# executing 1 circuit with 3 parameter sets using Sampler V2
job = sampler_v2.run([(circuit, [vals1, vals2, vals3])])
counts = job.result()[0].data.meas.get_counts()
# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V1
job = estimator_v1.run([circuit] * 8, [obs1, obs2, obs3, obs4] * 2, [vals1, vals2] * 4)
evs = job.result().values
# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V2
job = estimator_v2.run([(circuit, [[obs1, obs2, obs3, obs4]], [[vals1], [vals2]])])
evs = job.result()[0].data.evs
Le primitive V2 accettano più PUB come input, e ogni PUB ottiene il proprio risultato. Questo ti permette di eseguire circuito diversi con varie combinazioni di parametri/osservabili, il che non era sempre possibile nell'interfaccia V1:
- Sampler, 2 circuit, 1 set di parametri
- Estimator, 2 circuit, 2 osservabili diversi
# executing 2 circuits with 1 parameter set using Sampler V1
job = sampler_v1.run([circuit1, circuit2], [vals1] * 2)
dists = job.result().quasi_dists
# executing 2 circuits with 1 parameter set using Sampler V2
job = sampler_v2.run([(circuit1, vals1), (circuit2, vals1)])
counts1 = job.result()[0].data.meas.get_counts() # result for pub 1 (circuit 1)
counts2 = job.result()[1].data.meas.get_counts() # result for pub 2 (circuit 2)
# executing 2 circuits with 2 different observables using Estimator V1
job = estimator_v1.run([circuit1, circuit2] , [obs1, obs2])
evs = job.result().values
# executing 2 circuits with 2 different observables using Estimator V2
job = estimator_v2.run([(circuit1, obs1), (circuit2, obs2)])
evs1 = job.result()[0].data.evs # result for pub 1 (circuit 1)
evs2 = job.result()[1].data.evs # result for pub 2 (circuit 2)
-
Sampler: Il Sampler V2 ora restituisce campioni di esiti di misura sotto forma di bitstring o conteggi, invece delle distribuzioni di quasi-probabilità dell'interfaccia V1. Le bitstring mostrano gli esiti delle misure, preservando l'ordine dei shot in cui sono stati misurati. Gli oggetti risultato del Sampler V2 organizzano i dati in termini dei nomi dei registri classici dei circuiti in input, per compatibilità con i circuiti dinamici.
# Define quantum circuit with 2 qubits
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.measure_all()
circuit.draw()┌───┐ ░ ┌─┐
q_0: ┤ H ├──■───░─┤M├───
└───┘┌─┴─┐ ░ └╥┘┌─┐
q_1: ─────┤ X ├─░──╫─┤M├
└───┘ ░ ║ └╥┘
meas: 2/══════════════╩══╩═
0 1Nome predefinito del registro classicoNel circuito sopra, nota che il nome del registro classico è
"meas"per impostazione predefinita. Questo nome verrà usato in seguito per accedere alle bitstring di misura.# Run using V1 sampler
result = sampler_v1.run(circuit).result()
quasi_dist = result.quasi_dists[0]
print(f"The quasi-probability distribution is: {quasi_dist}")The quasi-probability distribution is: {0: 0.5, 3: 0.5}# Run using V2 sampler
result = sampler_v2.run([circuit]).result()
# Access result data for pub 0
data_pub = result[0].data
# Access bitstrings for the classical register "meas"
bitstrings = data_pub.meas.get_bitstrings()
print(f"The number of bitstrings is: {len(bitstrings)}")
# Get counts for the classical register "meas"
counts = data_pub.meas.get_counts()
print(f"The counts are: {counts}")The number of bitstrings is: 1024
The counts are: {'00': 523, '11': 501} -
Sampler e Estimator: Il sovraccarico di campionamento, comunemente esposto dalle implementazioni V1 tramite l'opzione di esecuzioneshots, è ora un argomento del metodorun()delle primitive che può essere specificato a livello di PUB. Le classi base V2 espongono gli argomenti in formati diversi rispetto all'API V1:-
BaseSamplerV2.runespone un argomentoshots(simile al flusso di lavoro precedente):# Sample two circuits at 128 shots each.
sampler_v2.run([circuit1, circuit2], shots=128)
# Sample two circuits at different amounts of shots. The "None"s are necessary
# as placeholders
# for the lack of parameter values in this example.
sampler_v2.run([(circuit1, None, 123), (circuit2, None, 456)]) -
EstimatorV2.runintroduce un argomentoprecisionche specifica le barre di errore che l'implementazione della primitiva dovrebbe raggiungere per le stime dei valori attesi:# Estimate expectation values for two PUBs, both with 0.05 precision.
estimator_v2.run([(circuit1, obs_array1), (circuit2, obs_array_2)], precision=0.05)
-
Aggiornamenti nell'interfaccia V1
-
La conversione implicita da un
BaseOperatordenso a unoSparsePauliOpnegli argomenti osservabili diEstimatornon è più consentita. Devi convertire esplicitamente inSparsePauliOpusandoSparsePauliOp.from_operator(operator). -
L'uso di una
PauliListnegli argomenti osservabili di Estimator non è più consentito. Devi invece convertire esplicitamente l'argomento usando primaSparsePauliOp(pauli_list).
qiskit.providers
basicaer
La maggior parte delle funzionalità nel modulo qiskit.providers.basicaer è stata
sostituita con il nuovo modulo
qiskit.providers.basic_provider,
eccetto le classi UnitarySimulatorPy e StatevectorSimulatorPy
che sono state rimosse; la loro funzionalità era già contenuta nel
modulo quantum_info.
La migrazione ai nuovi percorsi è semplice. Puoi sostituire la maggior parte delle
classi in qiskit.providers.basicaer con la loro controparte in
qiskit.providers.basic_provider
(sostituto diretto). Nota che le seguenti classi hanno
nuovi percorsi e nomi:
| Rimosso | Alternativa |
|---|---|
qiskit.providers.basicaer | qiskit.providers.basic_provider |
BasicAerProvider | BasicProvider |
BasicAerJob | BasicProviderJob |
QasmSimulatorPy | BasicSimulator |
Fai attenzione alle istanze globali quando migri al nuovo modulo. Non esiste un sostituto per
l'istanza globale BasicAer che poteva essere importata direttamente come qiskit.BasicAer. Ciò significa che
from qiskit import BasicProvider non è più un import valido.
Invece, la classe provider deve essere importata dal suo sottomodulo e istanziata dall'utente:
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("backend_name")
# Current
from qiskit.providers.basic_provider import BasicProvider
backend = BasicProvider().get_backend("backend_name")
I simulatori unitario e a vettore di stato possono essere sostituiti con
diverse classi di quantum_info. Non si tratta di un
sostituto diretto, ma i cambiamenti sono minimi. Consulta i seguenti esempi di
migrazione:
| Rimosso | Alternativa |
|---|---|
UnitarySimulatorPy | quantum_info.Operator |
StatevectorSimulatorPy | quantum_info.Statevector |
Gli esempi seguenti mostrano i percorsi di migrazione dei simulatori basicaer.
- Simulatore a vettore di stato
- Simulatore unitario
- Simulatore QASM
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("statevector_simulator")
statevector = backend.run(qc).result().get_statevector()
# Current
qc.remove_final_measurements() # no measurements allowed
from qiskit.quantum_info import Statevector
statevector = Statevector(qc)
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("unitary_simulator")
result = backend.run(qc).result()
# Current
qc.remove_final_measurements() # no measurements allowed
from qiskit.quantum_info import Operator
result = Operator(qc).data
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("qasm_simulator")
result = backend.run(qc).result()
# One current option
from qiskit.providers.basic_provider import BasicProvider
backend = BasicProvider().get_backend("basic_simulator")
result = backend.run(qc).result()
# Another current option is to specify it directly
from qiskit.providers.basic_provider import BasicSimulator
backend = BasicSimulator()
result = backend.run(qc).result()
fake_provider
La maggior parte dei componenti rivolti agli utenti in
qiskit.providers.fake_provider è stata
migrata al pacchetto Python qiskit-ibm-runtime. Ciò include le
classi fake provider, tutti i fake backend specifici per dispositivo (come
FakeVigo, FakeNairobiV2 e FakeSherbrooke), e le classi
base dei fake backend. Fai clic sulle schede seguenti per vedere le classi coinvolte.
- Fake Backend
- Fake Provider
- Qualsiasi classe in
qiskit.providers.fake_provider.backends fake_provider.fake_backend.FakeBackendfake_provider.fake_backend.FakeBackendV2
fake_provider.FakeProviderfake_provider.FakeProviderForBackendV2fake_provider.FakeProviderFactory
Per migrare al nuovo percorso:
-
Installa
qiskit-ibm-runtimeversione0.17.1o successiva:pip install 'qiskit-ibm-runtime>=0.17.1' -
Sostituisci le occorrenze di
qiskit.providers.fake_providernel tuo codice conqiskit_ibm_runtime.fake_provider. Ad esempio:# Old
from qiskit.providers.fake_provider import FakeProvider
backend1 = FakeProvider().get_backend("fake_ourense")
from qiskit.providers.fake_provider import FakeSherbrooke
backend2 = FakeSherbrooke()
# Alternative
from qiskit_ibm_runtime.fake_provider import FakeProvider
backend1 = FakeProvider().get_backend("fake_ourense")
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend2 = FakeSherbrooke()
Anche le classi base dei fake backend sono state migrate, ma presentano alcune differenze nel percorso di importazione:
| Rimosso | Alternativa |
|---|---|
qiskit.providers.fake_provider.FakeQasmBackend | qiskit_ibm_runtime.fake_provider.fake_qasm_backend.FakeQasmBackend |
qiskit.providers.fake_provider.FakePulseBackend | qiskit_ibm_runtime.fake_provider.fake_pulse_backend.FakePulseBackend |
Se dipendi dai fake backend per il testing unitario di una libreria downstream e hai conflitti con la
dipendenza qiskit-ibm-runtime, puoi trovare anche nuove alternative di fake backend generici nativi di Qiskit.
Queste includono le seguenti classi BackendV1 (sostituti diretti):
qiskit.providers.fake_provider.Fake5QV1qiskit.providers.fake_provider.Fake20QV1qiskit.providers.fake_provider.Fake7QPulseV1qiskit.providers.fake_provider.Fake27QPulseV1qiskit.providers.fake_provider.Fake127QPulseV1
Questa è una classe configurabile che restituisce istanze BackendV2:
fake_provider (backend di testing speciali)
Le classi fake backend per scopi di testing speciali in
qiskit.providers.fake_provider non sono state
migrate a qiskit_ibm_runtime.fake_provider. Il percorso di migrazione consigliato
è usare la nuova classe
GenericBackendV2
per configurare un backend con proprietà simili o per costruire un target personalizzato.
| Rimosso | Alternativa |
|---|---|
fake_provider.FakeBackendV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackend5QV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendV2LegacyQubitProps | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendSimple | fake_provider.GenericBackendV2 |
fake_provider.ConfigurableFakeBackend | fake_provider.GenericBackendV2 |
Esempio: Migra alla nuova classe
GenericBackendV2:
# Legacy path
from qiskit.providers.fake_provider import FakeBackend5QV2
backend = FakeBackend5QV2()
# New path
from qiskit.providers.fake_provider import GenericBackendV2
backend = GenericBackendV2(num_qubits=5)
# Note that this class generates a 5q backend with generic
# properties that serves the same purpose as FakeBackend5QV2
# but will not be identical.
Altri suggerimenti per la migrazione
-
Non è più possibile importare da
qiskit.providers.aer. Importa invece daqiskit_aer, che è un sostituto diretto. Per installareqiskit_aer, esegui:pip install qiskit-aer -
Il supporto per l'esecuzione di job pulse sui backend di
qiskit.providers.fake_providerè stato rimosso in Qiskit 1.0. Ciò è dovuto al fatto che Qiskit Aer ha rimosso la sua funzionalità di simulazione per tali job. Per carichi di lavoro di simulazione Hamiltoniana di basso livello, considera l'uso di una libreria specializzata come Qiskit Dynamics.
qiskit.pulse
ParametricPulse
La classe base qiskit.pulse.library.parametric_pulses.ParametricPulse e
la libreria di pulse sono state sostituite da
qiskit.pulse.SymbolicPulse
e dalla corrispondente libreria di pulse. SymbolicPulse supporta la
serializzazione QPY:
from qiskit import pulse, qpy
with pulse.build() as schedule:
pulse.play(pulse.Gaussian(100, 0.1, 25), pulse.DriveChannel(0))
with open('schedule.qpy', 'wb') as fd:
qpy.dump(schedule, fd)
| Rimosso | Alternativa |
|---|---|
pulse.library.parametric_pulses.ParametricPulse | qiskit.pulse.SymbolicPulse |
pulse.library.parametric_pulses.Constant | pulse.library.symbolic_pulses.Constant |
pulse.library.parametric_pulses.Drag | pulse.library.symbolic_pulses.Drag |
pulse.library.parametric_pulses.Gaussian | pulse.library.symbolic_pulses.Gaussian |
qiskit.pulse.library.parametric_pulses.GaussianSquare | pulse.library.symbolic_pulses.GaussianSquare |
Ampiezza a valore complesso
L'ampiezza del pulse a valore complesso (amp) è stata sostituita da una coppia (amp,
angle). Questa rappresentazione è più intuitiva, specialmente per alcune
attività di calibrazione come la calibrazione dell'angolo:
from qiskit import pulse
from qiskit.circuit import Parameter
from math import pi
with pulse.build() as schedule:
angle = Parameter("θ")
pulse.play(pulse.Gaussian(100, 0.1, 25, angle=angle), pulse.DriveChannel(0))
schedule.assign_parameters({angle: pi})
Iniezione di operazioni gate del circuito
Non è più possibile iniettare operazioni gate del circuito nel contesto del pulse builder tramite
qiskit.pulse.builder.call.
Questa rimozione riguarda gli argomenti in input di tipo QuantumCircuit, nonché le
seguenti funzioni:
qiskit.pulse.builder.call_gateqiskit.pulse.builder.cxqiskit.pulse.builder.u1qiskit.pulse.builder.u2qiskit.pulse.builder.u3qiskit.pulse.builder.x
Se vuoi ancora iniettare schedule calibrate dal backend, usa il seguente schema invece di chiamare i comandi gate.
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit import pulse
backend = GenericBackendV2(num_qubits=5)
sched = backend.target["x"][(qubit,)].calibration
with pulse.build() as only_pulse_scheds:
pulse.call(sched)
Analogamente, un QuantumCircuit può
essere iniettato nel contesto del builder transpilando e schedulando manualmente
l'oggetto.
from math import pi
from qiskit.compiler import schedule, transpile
qc = QuantumCircuit(2)
qc.rz(pi / 2, 0)
qc.sx(0)
qc.rz(pi / 2, 0)
qc.cx(0, 1)
qc_t = transpile(qc, backend)
sched = schedule(qc_t, backend)
with pulse.build() as only_pulse_scheds:
pulse.call(sched)
Ti consigliamo di scrivere un programma pulse minimo con il builder e allegarlo a
QuantumCircuit tramite il metodo
QuantumCircuit.add_calibration
come microcodice di un'istruzione gate, invece di scrivere l'intero
programma con il modello pulse.
builder.build
I seguenti argomenti in qiskit.pulse.builder.build sono stati rimossi senza
alternativa.
default_transpiler_settingsdefault_circuit_scheduler_settings
Sono state rimosse anche queste funzioni:
qiskit.pulse.builder.active_transpiler_settingsqiskit.pulse.builder.active_circuit_scheduler_settingsqiskit.pulse.builder.transpiler_settingsqiskit.pulse.builder.circuit_scheduler_settings
Ciò è dovuto al fatto che non è più possibile iniettare oggetti circuito nel contesto del builder (vedi Iniezione di operazioni gate del circuito); queste impostazioni servivano per convertire gli oggetti iniettati in rappresentazioni pulse.
library
La libreria di pulse discreta è stata rimossa dal codice sorgente. Ciò include:
qiskit.pulse.library.constantqiskit.pulse.library.zeroqiskit.pulse.library.squareqiskit.pulse.library.sawtoothqiskit.pulse.library.triangleqiskit.pulse.library.cosqiskit.pulse.library.sinqiskit.pulse.library.gaussianqiskit.pulse.library.gaussian_derivqiskit.pulse.library.sechqiskit.pulse.library.sech_derivqiskit.pulse.library.gaussian_squareqiskit.pulse.library.drag
Usa invece il corrispondente
qiskit.pulse.SymbolicPulse,
con
SymbolicPulse.get_waveform().
Ad esempio, invece di pulse.gaussian(100,0.5,10), usa
pulse.Gaussian(100,0.5,10).get_waveform(). Nota che la fase sia di
Sawtooth che di
Square è definita in modo tale
che una fase di 2\\pi corrisponde a uno spostamento di un ciclo completo, contrariamente alla
controparte discreta. Nota anche che le ampiezze complesse non sono più supportate nella
libreria di pulse simbolica; usa invece float, amp e angle.
ScalableSymbolicPulse
Non è più possibile caricare oggetti qiskit.pulse.ScalableSymbolicPulse dalla libreria
con un parametro amp complesso da file qpy versione 5 o precedente
(Qiskit Terra < 0.23.0). Non è necessaria alcuna azione di migrazione, poiché amp complesso viene
automaticamente convertito in float (amp, angle).
Questa modifica riguarda questi pulse:
qiskit.qasm
Il vecchio modulo parser OpenQASM 2 precedentemente in qiskit.qasm è stato
sostituito dal modulo qiskit.qasm2, che
fornisce un parser più veloce e accurato per OpenQASM 2. I metodi di alto livello di
QuantumCircuit
from_qasm_file()
e
from_qasm_str()
rimangono invariati, ma useranno internamente il nuovo parser. Tuttavia, l'interfaccia
pubblica del modulo qasm2 non è la stessa. Mentre il modulo qiskit.qasm
forniva un'interfaccia a un albero sintattico astratto restituito dalla libreria di parser ply,
qiskit.qasm2 non espone l'AST né alcun dettaglio di implementazione di livello inferiore
sul parser. Prende invece l'input OpenQASM 2 e
produce un oggetto QuantumCircuit.
Ad esempio, se in precedenza eseguivi qualcosa del genere:
import qiskit.qasm
from qiskit.converters import ast_to_dag, dag_to_circuit
ast = qiskit.qasm.Qasm(filename="myfile.qasm").parse()
dag = ast_to_dag(ast)
qasm_circ = dag_to_circuit(dag)
Sostituiscilo con il seguente:
import qiskit.qasm2
qasm_circ = qiskit.qasm2.load("myfile.qasm")
qiskit.quantum_info
Il modulo qiskit.quantum_info.synthesis è stato migrato in varie
posizioni nel codice sorgente, principalmente in qiskit.synthesis.
| Rimosso | Alternativa |
|---|---|
OneQubitEulerDecomposer | qiskit.synthesis.one_qubit.OneQubitEulerDecomposer |
TwoQubitBasisDecomposer | qiskit.synthesis.two_qubits.TwoQubitBasisDecomposer |
XXDecomposer | qiskit.synthesis.two_qubits.XXDecomposer |
two_qubit_cnot_decompose | qiskit.synthesis.two_qubits.two_qubit_cnot_decompose |
Quaternion | qiskit.quantum_info.Quaternion |
Questo spostamento non ha influito sul percorso di importazione usuale di Quaternion, ma non puoi più accedervi
tramite qiskit.quantum_info.synthesis.
Infine, cnot_rxx_decompose è stato rimosso.
qiskit.test
Il modulo qiskit.test non è più un modulo pubblico. Non era mai stato pensato come pubblico,
né per essere usato al di fuori della suite di test di Qiskit. Tutte le funzionalità erano specifiche di Qiskit e non
viene fornita alcuna alternativa; se hai bisogno di funzionalità simili, devi includerle nel tuo
harness di test.
qiskit.tools
Il modulo qiskit.tools è stato rimosso in Qiskit 1.0. La maggior parte di questa funzionalità è stata
sostituita da funzionalità simili in altri pacchetti o rimossa senza alternativa.
L'eccezione principale è la funzione qiskit.tools.parallel_map(), che è stata spostata nel
modulo qiskit.utils. Può essere usata
da questa nuova posizione. Ad esempio:
Se in precedenza eseguivi:
# Previous
from qiskit.tools import parallel_map
parallel_map(func, input)
# Current
from qiskit.utils import parallel_map
parallel_map(func, input)
jupyter
Il sottomodulo qiskit.tools.jupyter è stato rimosso perché la funzionalità
in questo modulo era legata al vecchio pacchetto qiskit-ibmq-provider, che non è più
supportato. Supportava inoltre solo BackendV1 e non la più recente
interfaccia BackendV2.
monitor
Il sottomodulo qiskit.tools.monitor è stato rimosso perché era legato al
vecchio pacchetto qiskit-ibmq-provider, che non è più supportato (supportava anche
solo l'interfaccia BackendV1 e non la più recente
BackendV2). Non
viene fornita alcuna alternativa per questa funzionalità.
visualization
Il sottomodulo qiskit.tools.visualization è stato rimosso. Questo modulo era un
redirect legacy dalla posizione originale del modulo di visualizzazione di Qiskit ed
era stato spostato in qiskit.visualization in Qiskit
0.8.0. Se stai ancora usando questo percorso, aggiorna i tuoi import da
qiskit.tools.visualization a
qiskit.visualization.
# Previous
from qiskit.tools.visualization import plot_histogram
plot_histogram(counts)
# Current
from qiskit.visualization import plot_histogram
plot_histogram(counts)
events
Il modulo qiskit.tools.events e l'utilità progressbar() che esponeva
sono stati rimossi. La funzionalità di questo modulo non era ampiamente usata ed è
meglio coperta da pacchetti dedicati come
tqdm.
qiskit.transpiler
synthesis
Gli elementi nel modulo qiskit.transpiler.synthesis sono stati migrati in nuove posizioni:
| Rimosso | Alternativa |
|---|---|
qiskit.transpiler.synthesis.aqc (eccetto AQCSynthesisPlugin) | qiskit.synthesis.unitary.aqc |
qiskit.transpiler.synthesis.graysynth | qiskit.synthesis.synth_cnot_phase_aam |
qiskit.transpiler.synthesis.cnot_synth | qiskit.synthesis.synth_cnot_count_full_pmh |
passes
Il pass del Transpiler NoiseAdaptiveLayout è stato sostituito da
VF2Layout e
VF2PostLayout,
che impostano un layout in base alle caratteristiche di rumore riportate da un
backend. Sia il pass che il plugin dello stage di layout "noise_adaptive" corrispondente
sono stati rimossi da Qiskit.
Il pass del Transpiler CrosstalkAdaptiveSchedule è stato rimosso dal
codice sorgente. Questo pass non era più utilizzabile perché il suo funzionamento interno
dipendeva da proprietà personalizzate impostate nel payload BackendProperties
di un'istanza BackendV1. Poiché nessun backend imposta questi campi, il pass è stato
rimosso.
passmanager
I metodi append delle classi
ConditionalController,
FlowControllerLinear e
DoWhileController
sono stati rimossi. Invece, tutte le operazioni devono essere fornite quando
gli oggetti controller vengono costruiti.
qiskit.utils
I seguenti strumenti in qiskit.utils sono stati rimossi senza sostituzione:
qiskit.utils.arithmeticqiskit.utils.circuit_utilsqiskit.utils.entangler_mapqiskit.utils.name_unnamed_args
Queste funzioni erano usate esclusivamente nei moduli qiskit.algorithms e
qiskit.opflow, che sono stati anch'essi rimossi.
qiskit.visualization
Il modulo qiskit.visualization.qcstyle è stato rimosso. Usa
qiskit.visualization.circuit.qcstyle come sostituto diretto.