Note di rilascio di Qiskit 0.28
0.28.0
Terra 0.18.0
Preludio
Questa versione include molte nuove funzionalità e correzioni di bug. I punti salienti di questa release sono l'introduzione di due nuovi passaggi del transpiler, BIPMapping e DynamicalDecouplingche, combinati con il nuovo kwarg pulse_optimize sul passaggio UnitarySynthesis permette di ricreare i risultati del Quantum Volume 64 utilizzando le tecniche descritte in: https://arxiv.org/abs/2008.08571. Questi nuovi passaggi e opzioni del transpiler sono applicabili in generale all'ottimizzazione di qualsiasi circuito.
Nuove funzioni
-
Il kwarg
measurement_error_mitgationper il costruttoreQuantumInstancepuò ora essere impostato sulla classeTensoredMeasFitterdi qiskit-ignis, oltre aCompleteMeasFitterche era già supportata. Se si usaTensoredMeasFittersi potrà anche impostare il nuovo kwargmit_patternper specificare i qubit su cui usareTensoredMeasFitterSi può fare riferimento alla documentazione dimit_patternnella documentazione diTensoredMeasFitterper il formato previsto. -
I metodi di decomposizione per porte a singolo qubit, specificati tramite il kwarg
basis, inOneQubitEulerDecomposerè stata ampliata per includere anche la base'ZSXX', per fare uso della porta diretta e della porta . -
Aggiunti due nuovi passaggi
AlignMeasureseValidatePulseGatesal moduloqiskit.transpiler.passesmodulo. Questi passaggi sono un'ottimizzazione consapevole dell'hardware e una routine di convalida utilizzata per gestire le restrizioni di allineamento sull'allocazione temporale delle istruzioni per un backend.Se un backend ha una restrizione sull'allineamento delle istruzioni
Measure(in termini di quantizzazione nel tempo), il passaggio viene utilizzato per regolare i ritardi in un circuito programmato per garantire che tutte le istruzioni nel circuito siano allineate in base ai vincoli del backendAlignMeasuresviene utilizzato per regolare i ritardi in un circuito programmato, in modo da garantire l'allineamento delle istruzioniMeasurenel circuito, in base ai vincoli del backend. Il passaggioValidatePulseGatesè usato per verificare se ci sono gate a impulsi personalizzati (gate che hanno una definizione di impulso personalizzato nell'attributocalibrationsdell'attributoQuantumCircuit) sono validi, dato un vincolo di allineamento per il backend di destinazione.Nel built-in
preset_passmangersutilizzato dalla funzionetranspile()questi passaggi vengono automaticamente attivati se il vincolo di allineamento, tramite il kwarg dedicatotiming_constraintssutranspile()o ha un attributotiming_constraintsnell'oggettoBackendConfigurationdel backend a cui ci si rivolge.I backend di IBM Quantum Services (accessibili tramite il pacchetto qiskit-ibmq-provider ) forniranno le informazioni sull'allineamento nel prossimo futuro.
Ad esempio:
from qiskit import circuit, transpile from qiskit.test.mock import FakeArmonk backend = FakeArmonk() qc = circuit.QuantumCircuit(1, 1) qc.x(0) qc.delay(110, 0, unit="dt") qc.measure(0, 0) qc.draw('mpl')qct = transpile(qc, backend, scheduling_method='alap', timing_constraints={'acquire_alignment': 16}) qct.draw('mpl') -
È stato aggiunto un nuovo passaggio del transpiler
qiskit.transpiler.passes.BIPMappingche cerca di trovare il miglior layout e il miglior instradamento in una sola volta, risolvendo un problema di BIP (programmazione binaria degli interi) come descritto in arXiv:2106.06446 è stata aggiunta.Il passaggio
BIPMapping(denominato "mapping" per riferirsi a "layout e routing") rappresenta il problema del mapping come un problema BIP (programmazione binaria degli interi) e si affida a CPLEX (cplex) per risolvere il problema BIP. Le librerie dipendenti, tra cui CPLEX, possono essere installate insieme a qiskit-terra:pip install qiskit-terra[bip-mapper]Poiché la versione gratuita di CPLEX è in grado di risolvere solo piccoli problemi di BIP, cioè la mappatura di circuiti con meno di 5 qubit circa, per mappare circuiti più grandi potrebbe essere necessaria la versione a pagamento di CPLEX.
Il mappatore BIP scala male rispetto al numero di qubit o di porte. Ad esempio, non funzionerebbe con
coupling_mapoltre i 10 qubit perché il solutore BIP (CPLEX) non potrebbe trovare alcuna soluzione entro il limite di tempo predefinito.Si noti che, se si desidera fissare i qubit fisici da utilizzare nella mappatura (ad esempio per l'esecuzione di circuiti Quantum Volume (QV)), è necessario specificare
coupling_mapche contiene solo i qubit da utilizzare.Ecco un esempio minimo di codice per costruire un gestore di passaggi per transpilare un circuito QV:
num_qubits = 4 # QV16 circ = QuantumVolume(num_qubits=num_qubits) backend = ... basis_gates = backend.configuration().basis_gates coupling_map = CouplingMap.from_line(num_qubits) # supply your own coupling map def _not_mapped(property_set): return not property_set["is_swap_mapped"] def _opt_control(property_set): return not property_set["depth_fixed_point"] from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel pm = PassManager() # preparation pm.append([ Unroll3qOrMore(), TrivialLayout(coupling_map), FullAncillaAllocation(coupling_map), EnlargeWithAncilla(), BarrierBeforeFinalMeasurements() ]) # mapping pm.append(BIPMapping(coupling_map)) pm.append(CheckMap(coupling_map)) pm.append(Error(msg="BIP mapper failed to map", action="raise"), condition=_not_mapped) # post optimization pm.append([ Depth(), FixedPoint("depth"), Collect2qBlocks(), ConsolidateBlocks(basis_gates=basis_gates), UnitarySynthesis(basis_gates), Optimize1qGatesDecomposition(basis_gates), CommutativeCancellation(), UnrollCustomDefinitions(sel, basis_gates), BasisTranslator(sel, basis_gates) ], do_while=_opt_control) transpile_circ = pm.run(circ) -
Un nuovo metodo costruttore
initialize_from()è stato aggiunto agli elementiScheduleeScheduleBlocke alle classi. Questo metodo inizializza un nuovo programma vuoto che prende gli attributi da altri programmi. Ad esempio:sched = Schedule(name='my_sched') new_sched = Schedule.initialize_from(sched) assert sched.name == new_sched.name -
È stato aggiunto un nuovo kwarg,
line_discipline, alla funzionejob_monitor()alla funzione. Questa kwarg consente di modificare i caratteri di ritorno a capo usati nell'output dijob_monitor. Il kwargline_disciplineha come valore predefinito'\r', che è quello utilizzato in precedenza. -
La classe astratta
Pulse(che è la classe genitore di classi qualiWaveform,Constant, eGaussianha ora un nuovo kwarg sul costruttore,limit_amplitude, che può essere impostato suFalseper disabilitare il limite di ampiezza precedentemente codificato di1. Questo può anche essere impostato direttamente come attributo di classe, per modificare il valore predefinito globale di una classe Pulse. Ad esempio:from qiskit.pulse.library import Waveform # Change the default value of limit_amplitude to False Waveform.limit_amplitude = False wave = Waveform(2.0 * np.exp(1j * 2 * np.pi * np.linspace(0, 1, 1000))) -
Una nuova classe,
PauliListè stata aggiunta al moduloqiskit.quantum_infomodulo. Questa classe viene utilizzata per rappresentare in modo efficiente una lista diPaulioperatori. Questa nuova classe eredita dalla stessa classe madre dell'esistentePauliTable(e quindi può essere usata per lo più in modo intercambiabile), ma si differenzia daPauliTableperché la classe può gestire le fasi diqiskit.quantum_info.PauliListpuò gestire le fasi di Z4. -
Aggiunto un nuovo passaggio di transpiler,
RemoveBarriers, aqiskit.transpiler.passes. Questo passaggio viene utilizzato per rimuovere tutte le barriere in un circuito. -
Aggiungere una nuova classe di ottimizzatori,
SciPyOptimizeral moduloqiskit.algorithms.optimizersal modulo. Questa classe è una semplice classe wrapper della funzionescipy.optimize.minimize(documentazione ) che consente di utilizzare tutti i solutori di ottimizzazione e tutti i parametri (ad es. callback) supportati dascipy.optimize.minimize. Ad esempio:from qiskit.algorithms.optimizers import SciPyOptimizer values = [] def callback(x): values.append(x) optimizer = SciPyOptimizer("BFGS", options={"maxiter": 1000}, callback=callback) -
Il
HoareOptimizerè stato migliorato in modo tale da poter sostituire unControlledGatein un circuito con la porta di base se tutti i qubit di controllo sono nello stato . -
Aggiunti due nuovi metodi,
is_successor()eis_predecessor(), alla classeDAGCircuitalla classe. Queste funzioni sono utilizzate per verificare se un nodo è un successore o un predecessore di un altro nodo nella cartellaDAGCircuit. -
Un nuovo transpiler pass,
RZXCalibrationBuilderNoEchoè stato aggiunto al moduloqiskit.transpiler.passesal modulo. Questo passaggio è simile a quello esistenteRZXCalibrationBuilderin quanto crea le calibrazioni per unRZXGate(theta), tuttaviaRZXCalibrationBuilderNoEcholo fa senza inserire gli impulsi di eco nel programma degli impulsi. Ciò consente di esporre l'eco nella sequenza di risonanze incrociate come porte, in modo che il transpiler possa semplificarle. Il passaggioRZXCalibrationBuilderNoEchosupporta solo la direzione nativa dell'hardware dell'elementoCXGate. -
Un nuovo kwarg,
wrap, è stato aggiunto al metodocompose()diQuantumCircuit. Ciò consente di scegliere se i circuiti composti devono essere avvolti o meno in un'istruzione. L'impostazione predefinita èFalse, cioè senza avvolgimento. Ad esempio:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h([0, 1]) other = QuantumCircuit(2) other.x([0, 1]) print(circuit.compose(other, wrap=True)) # wrapped print(circuit.compose(other, wrap=False)) # not wrapped -
Un nuovo attributo,
control_channelsè stato aggiunto alla classePulseBackendConfigurationclasse. Questo attributo rappresenta i canali di controllo di un backend come una mappatura di qubit in un elenco di oggettiControlChanneloggetti. -
Un nuovo kwarg,
epsilon, è stato aggiunto al costruttore della classeIsometrye al corrispondente metodoQuantumCircuitmetodoisometry(). Questo kwarg consente di impostare facoltativamente la tolleranza epsilon utilizzata da un gateIsometry. Ad esempio:import numpy as np from qiskit import QuantumRegister, QuantumCircuit tolerance = 1e-8 iso = np.eye(2,2) num_q_output = int(np.log2(iso.shape[0])) num_q_input = int(np.log2(iso.shape[1])) q = QuantumRegister(num_q_output) qc = QuantumCircuit(q) qc.isometry(iso, q[:num_q_input], q[num_q_input:], epsilon=tolerance) -
Aggiunto un passaggio di transpiler,
DynamicalDecouplingperqiskit.transpiler.passesper inserire sequenze di disaccoppiamento dinamico nei periodi di inattività di un circuito (dopo la mappatura in qubit fisici e lo scheduling). Il passaggio consente di controllare la sequenza di porte DD, la distanza tra di esse e i qubit da applicare. Ad esempio:from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import XGate from qiskit.transpiler import PassManager, InstructionDurations from qiskit.transpiler.passes import ALAPSchedule, DynamicalDecoupling from qiskit.visualization import timeline_drawer circ = QuantumCircuit(4) circ.h(0) circ.cx(0, 1) circ.cx(1, 2) circ.cx(2, 3) circ.measure_all() durations = InstructionDurations( [("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10), ("cx", [1, 2], 200), ("cx", [2, 3], 300), ("x", None, 50), ("measure", None, 1000)] ) dd_sequence = [XGate(), XGate()] pm = PassManager([ALAPSchedule(durations), DynamicalDecoupling(durations, dd_sequence)]) circ_dd = pm.run(circ) timeline_drawer(circ_dd) -
Il
QuantumCircuitha un nuovo kwarg,, che può essere utilizzato per impostare facoltativamente la codifica dei caratteri del file QASM generato dalla funzioneqasm()ha un nuovo kwarg,encoding, che può essere usato per impostare facoltativamente la codifica dei caratteri di un file QASM di uscita generato dalla funzione. Può essere impostato su qualsiasi codec o stringa alias valida del modulo codec della libreria standard Python. -
Aggiunta di una nuova classe,
EvolvedOperatorAnsatz, al moduloqiskit.circuit.libraryal modulo. Questo circuito di libreria, che in precedenza si trovava in Qiskit Nature, può essere utilizzato per costruire circuiti di ansatz che consistono in operatori evoluti nel tempo, dove il tempo di evoluzione è un parametro variazionale. Esempi di circuiti ansatz di questo tipo sono la classeUCCSDnel modulochemistrydi Qiskit Nature o la classeQAOAAnsatzclasse. -
Sotto
qiskit.test.mockè disponibile una nuova classe di backend fittizio per il backendibmq_guadalupe. Come per gli altri backend fasulli, questo include un'istantanea dei dati di calibrazione (cioèbackend.defaults()) e i dati di errore (cioèbackend.properties()) presi dal sistema reale e possono essere utilizzati per test, compilazioni e simulazioni locali. -
Un nuovo metodo
children()per la classeScheduleè stato aggiunto. Questo metodo viene utilizzato per restituire i componenti del programma previsionale figlio dell'oggettoSchedulecome tupla. Restituisce i programmi annidati senza appiattimento. Questo metodo è equivalente al metodo privato_children(), ma ha un'interfaccia pubblica e stabile. -
Una nuova classe di ottimizzatori,
GradientDescentè stata aggiunta al moduloqiskit.algorithms.optimizersmodulo. Questa classe di ottimizzatori implementa un algoritmo di ottimizzazione a discesa di gradiente standard da utilizzare con algoritmi variazionali quantistici, come ad esempioVQE. Per una descrizione dettagliata e per esempi sull'uso di questa classe, si rimanda alla documentazione della classeGradientDescentdocumentazione della classe. -
Una nuova classe di ottimizzatori,
QNSPSAè stata aggiunta al moduloqiskit.algorithms.optimizersmodulo. Questa classe implementa l'algoritmo Quantum Natural SPSA (QN-SPSA), una generalizzazione dell'algoritmo 2-SPSA, e stima la matrice di informazione di Fisher quantistica al posto dell'Hessiano per ottenere una stima stocastica del gradiente naturale quantistico. Per esempi su come utilizzare questo nuovo ottimizzatore, consultare la documentazione della classeQNSPSAdocumentazione della classe. -
Un nuovo kwarg,
second_order, è stato aggiunto al costruttore della classeSPSAnel moduloqiskit.algorithms.optimizersmodulo. Se impostato suTrue, consente di utilizzare l' SPSA del secondo ordine. L'SPSA del secondo ordine, o 2-SPSA, è un'estensione dell'algoritmo SPSA ordinario che consente di stimare l'Hessiano insieme al gradiente, che viene utilizzato per precondizionare il gradiente prima della fase di aggiornamento dei parametri. Come metodo del secondo ordine, cerca di migliorare la convergenza dell'SPSA. Per esempi su come utilizzare questa opzione, consultare la documentazione della classeSPSAdella classe. -
Quando si utilizza la modalità di uscita
latexolatex_sourcedicircuit_drawer()o la modalitàdraw()diQuantumCircuitè possibile utilizzare il kwarg distylecome per la formattazione di output dimpl. Tuttavia, a differenza della modalità di uscitampl, quando si utilizzano le modalità di uscitalatexolatex_sourceviene utilizzato solo il campodisplaytext(perché nessuna delle due supporta il colore). -
Quando si utilizzano i metodi di uscita
mplolatexper la funzione o la funzionecircuit_drawer()o per la funzionedraw()diQuantumCircuitè ora possibile utilizzare la formattazione in modalità matematica per il testo e impostare la formattazione del colore (solompl) impostando il kwargstylecome un dict con un nome o un'etichetta generati dall'utente. Ad esempio, per aggiungere pedici e cambiare il colore di un cancello:from qiskit import QuantumCircuit from qiskit.circuit.library import HGate qc = QuantumCircuit(3) qc.append(HGate(label='h1'), [0]) qc.append(HGate(label='h2'), [1]) qc.append(HGate(label='h3'), [2]) qc.draw('mpl', style={'displaytext': {'h1': 'H_1', 'h2': 'H_2', 'h3': 'H_3'}, 'displaycolor': {'h2': ('#EEDD00', '#FF0000')}}) -
Aggiunte tre nuove classi,
CDKMRippleCarryAdder,ClassicalAddereDraperQFTAdder, al moduloqiskit.circuit.libraryal modulo. Queste nuove classi di circuiti vengono utilizzate per eseguire l'addizione classica di due registri di qubit di uguali dimensioni. Per due registri e su qubit, le tre nuove classi eseguono l'operazione:
Ad esempio:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import CDKMRippleCarryAdder
from qiskit.quantum_info import Statevector
# a encodes |01> = 1
a = QuantumCircuit(2)
a.x(0)
# b encodes |10> = 2
b = QuantumCircuit(2)
b.x(1)
# adder on 2-bit numbers
adder = CDKMRippleCarryAdder(2)
# add the state preparations to the front of the circuit
adder.compose(a, [0, 1], inplace=True, front=True)
adder.compose(b, [2, 3], inplace=True, front=True)
# simulate and get the state of all qubits
sv = Statevector(adder)
counts = sv.probabilities_dict()
state = list(counts.keys())[0] # we only have a single state
# skip the input carry (first bit) and the register |a> (last two bits)
result = state[1:-2]
print(result) # '011' = 3 = 1 + 2- Aggiunte due nuove classi,
RGQFTMultipliereHRSCumulativeMultiplier, al moduloqiskit.circuit.libraryal modulo. Queste classi vengono utilizzate per eseguire la moltiplicazione classica di due registri di qubit di uguali dimensioni. Per due registri e su qubit, le due nuove classi eseguono l'operazione
Ad esempio:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import RGQFTMultiplier
from qiskit.quantum_info import Statevector
num_state_qubits = 2
# a encodes |11> = 3
a = QuantumCircuit(num_state_qubits)
a.x(range(num_state_qubits))
# b encodes |11> = 3
b = QuantumCircuit(num_state_qubits)
b.x(range(num_state_qubits))
# multiplier on 2-bit numbers
multiplier = RGQFTMultiplier(num_state_qubits)
# add the state preparations to the front of the circuit
multiplier.compose(a, [0, 1], inplace=True, front=True)
multiplier.compose(b, [2, 3], inplace=True, front=True)
# simulate and get the state of all qubits
sv = Statevector(multiplier)
counts = sv.probabilities_dict(decimals=10)
state = list(counts.keys())[0] # we only have a single state
# skip both input registers
result = state[:-2*num_state_qubits]
print(result) # '1001' = 9 = 3 * 3-
La classe
Delaypuò ora accettare una classeParameterExpressionoParameterper il kwargdurationdel suo costruttore e per il suo attributodurationper il suo attributo.Ad esempio:
idle_dur = Parameter('t') qc = QuantumCircuit(1, 1) qc.x(0) qc.delay(idle_dur, 0, 'us') qc.measure(0, 0) print(qc) # parameterized delay in us (micro seconds) # assign before transpilation assigned = qc.assign_parameters({idle_dur: 0.1}) print(assigned) # delay in us transpiled = transpile(assigned, some_backend_with_dt) print(transpiled) # delay in dt # assign after transpilation transpiled = transpile(qc, some_backend_with_dt) print(transpiled) # parameterized delay in dt assigned = transpiled.assign_parameters({idle_dur: 0.1}) print(assigned) # delay in dt -
È stato introdotto un nuovo formato di serializzazione binaria, QPY. È stato progettato per essere un formato di serializzazione binaria veloce e retrocompatibile (i file QPY generati con versioni precedenti di Qiskit possono essere caricati da versioni più recenti di Qiskit) che è nativo di Qiskit. Il tool di serializzazione QPY è disponibile tramite il modulo
qiskit.circuit.qpy_serialization. Ad esempio, per generare un file QPY:from datetime import datetime from qiskit.circuit import QuantumCircuit from qiskit.circuit import qpy_serialization qc = QuantumCircuit( 2, metadata={'created_at': datetime.utcnow().isoformat()} ) qc.h(0) qc.cx(0, 1) qc.measure_all() circuits = [qc] * 5 with open('five_bells.qpy', 'wb') as qpy_file: qpy_serialization.dump(circuits, qpy_file)Quindi i cinque circuiti salvati nel file QPY possono essere caricati con:
from qiskit.circuit.qpy_serialization with open('five_bells.qpy', 'rb') as qpy_file: circuits = qpy_serialization.load(qpy_file)Le specifiche del formato dei file QPY sono disponibili nella documentazione del modulo.
-
La classe
TwoQubitBasisDecomposerè stata aggiornata per eseguire le decomposizioni ottimali del polso per una base con CX, √X e porte virtuali Rz, come descritto in https://arxiv.org/pdf/2008.08571. Per impulso ottimale si intende che la durata dei gate tra i gate CX della decomposizione è ridotta in cambio di un numero maggiore di gate locali prima o dopo tutti i gate CX, in modo che, quando si compone un circuito, vi sia la possibilità di una compressione a singolo qubit con gate vicini che riducono la durata complessiva della sequenza.Un nuovo argomento di parola chiave,
`pulse_optimize, è stato aggiunto al costruttore diTwoQubitBasisDecomposerper controllare questo aspetto:None: Tentativo di decomposizione ottimale dell'impulso. Se non si conosce una decomposizione ottimale dell'impulso per la base del decompositore, si torna alla decomposizione standard senza preavviso. Questa è l'impostazione predefinita.True: Tentativo di decomposizione ottimale dell'impulso. Se non si conosce una decomposizione ottimale dell'impulso per la base del decompositore, aumentare QiskitError.False: Non tentare la decomposizione ottimale dell'impulso.
Ad esempio:
from qiskit.quantum_info import TwoQubitBasisDecomposer from qiskit.circuit.library import CXGate from qiskit.quantum_info import random_unitary unitary_matrix = random_unitary(4) decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="ZSX", pulse_optimize=True) circuit = decomposer(unitary_matrix) -
Il passaggio del transpiler
UnitarySynthesissituato inqiskit.transpiler.passesè stato aggiornato per supportare l'esecuzione della decomposizione ottimale degli impulsi. Ciò avviene principalmente con l'argomento della parola chiavepulse_optimize, aggiunta al costruttore e utilizzata per controllare se viene eseguita la sintesi ottimale dell'impulso. Il comportamento di questo kwarg rispecchia il kwargpulse_optimizenel costruttore della classeTwoQubitBasisDecomposernel costruttore della classe. Inoltre, il costruttore ha un altro argomento chiave,synth_gates, utilizzato per specificare l'elenco dei nomi dei gate su cui tentare la sintesi. SeNoneepulse_optimizeèFalseoNone, utilizzare"unitary". Se None e pulse_optimize èTrue, utilizzare"unitary"e"swap". Dato che la direzione del gate CX nella sintesi è arbitraria, viene aggiunto un altro argomento chiave,natural_direction, per considerare prima una mappa di accoppiamento e poiCXGatenella scelta di quale direzione di CX generare la sintesi.from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager, CouplingMap from qiskit.transpiler.passes import TrivialLayout, UnitarySynthesis from qiskit.test.mock import FakeVigo from qiskit.quantum_info.random import random_unitary backend = FakeVigo() conf = backend.configuration() coupling_map = CouplingMap(conf.coupling_map) triv_layout_pass = TrivialLayout(coupling_map) circ = QuantumCircuit(2) circ.unitary(random_unitary(4), [0, 1]) unisynth_pass = UnitarySynthesis( basis_gates=conf.basis_gates, coupling_map=None, backend_props=backend.properties(), pulse_optimize=True, natural_direction=True, synth_gates=['unitary']) pm = PassManager([triv_layout_pass, unisynth_pass]) optimal_circ = pm.run(circ) -
È stata aggiunta una nuova opzione di base,
'XZX', per l'argomentobasisOneQubitEulerDecomposerclasse. -
Aggiunto un nuovo metodo,
get_instructions()è stato aggiunto alla classeQuantumCircuitclasse. Questo metodo viene utilizzato per restituire tutti gli oggettiInstructiondel circuito che hanno un valorenameche corrisponde all'argomentonamefornito, insieme alle liste associateqargsecargsdiQubiteClbitdi oggetti. -
Al pacchetto qiskit-terra è stato aggiunto un nuovo extra opzionale
all. Ciò consente di installare tutti i requisiti opzionali con un unico extra, ad esempio:pip install 'qiskit-terra[all]', In precedenza, era necessario elencare tutti gli extra singolarmente per installare contemporaneamente tutte le dipendenze opzionali. -
Aggiunte due nuove classi
ProbDistributioneQuasiDistributionper trattare rispettivamente le distribuzioni di probabilità e le distribuzioni di quasiprobabilità. Questi oggetti sono entrambi sottoclassi di dizionari che aggiungono metodi aggiuntivi per lavorare con le distribuzioni di probabilità e quasiprobabilità. -
Aggiunta di una nuova proprietà
settingsalla classe baseOptimizerclasse base astratta su cui si basano tutte le classi di ottimizzatori del moduloqiskit.algorithms.optimizersdel modulo sono basate. Questa proprietà restituisce un dizionario Python delle impostazioni dell'ottimizzatore, che può essere usato per istanziare un'altra istanza della stessa classe di ottimizzatore. Ad esempio:from qiskit.algorithms.optimizers import GradientDescent optimizer = GradientDescent(maxiter=10, learning_rate=0.01) settings = optimizer.settings new_optimizer = GradientDescent(**settings)Il dizionario
settingsè potenzialmente utile anche per serializzare gli oggetti dell'ottimizzatore usando JSON o un altro formato di serializzazione. -
Una nuova funzione,
set_config(), è stata aggiunta al moduloqiskit.user_config. Questa funzione consente di impostare i valori di una configurazione utente dall'API di Qiskit. Ad esempio:from qiskit.user_config import set_config set_config("circuit_drawer", "mpl", section="default", file="settings.conf")che aggiungerà un valore di
circuit_drawer = mplalla sezionedefaultdel filesettings.conf.Se non viene specificato alcun argomento
file_path, verrà aggiornato il percorso attualmente utilizzato per il file di configurazione utente (il valore della variabile d'ambienteQISKIT_SETTINGS, se impostata, o il percorso predefinito~/.qiskit/settings.conf). Tuttavia, le modifiche al file di configurazione esistente non si rifletteranno nella sessione corrente, poiché il file di configurazione viene analizzato al momento dell'importazione. -
Aggiunta di una nuova classe di stato,
StabilizerState, al moduloqiskit.quantum_infoal modulo. Questa classe rappresenta lo stato di un simulatore di stabilizzatore secondo la convenzione di Aaronson e Gottesman (2004). -
Sono state aggiunte due nuove opzioni,
'value'e'value_desc', al kwargsortdella funzioneqiskit.visualization.plot_histogram()della funzione. Quandosortè impostato su una di queste opzioni, la visualizzazione di output ordinerà l'asse x in base alla probabilità massima per ciascuna stringa di bit. Ad esempio:from qiskit.visualization import plot_histogram counts = { '000': 5, '001': 25, '010': 125, '011': 625, '100': 3125, '101': 15625, '110': 78125, '111': 390625, } plot_histogram(counts, sort='value')
Problemi noti
- Quando si esegue
parallel_map()(e le funzioni che chiamano internamenteparallel_map()come ad esempiotranspile()eassemble()) su Python 3.9 conQISKIT_PARALLELimpostato su True, in alcuni scenari è possibile che il programma si blocchi e non finisca mai di funzionare. Per evitare che ciò accada, l'impostazione predefinita di Python 3.9 è stata modificata in modo che non venga eseguito in parallelo, ma seQISKIT_PARALLELè esplicitamente abilitato, il problema può ancora verificarsi.
Note sull'aggiornamento
-
La versione minima della dipendenza da retworkx è stata aumentata alla versione 0.9.0. Questo è stato fatto per utilizzare le nuove API introdotte in quella versione, che hanno migliorato le prestazioni di alcuni passaggi del transpiler.
-
Il valore predefinito per
QISKIT_PARALLELnegli ambienti Python 3.9 è cambiato inFalse, questo significa che quando viene eseguito su Python 3.9 per impostazione predefinita non viene utilizzato il multiprocessing. Questo è stato fatto per evitare un potenziale problema di deadlock/hanging che può verificarsi quando si esegue il multiprocessing su Python 3.9 (vedere la sezione Problemi noti per maggiori dettagli). È ancora possibile abilitarla manualmente impostando esplicitamente la variabile d'ambienteQISKIT_PARALLELaTRUE. -
Le classi di backend false esistenti in
qiskit.test.mockora implementano rigorosamente l'interfacciaBackendV1interfaccia. Questo significa che se si sta costruendo manualmente il fileQasmQobjoPulseQobjda utilizzare con il metodorun()non funzionerà più. Il metodorun()accetta soloQuantumCircuitoScheduleora. Ciò si è reso necessario per consentire il test di nuovi backend implementati senza qobj, che in precedenza non avevano alcun test all'interno di qiskit terra. Se si ha bisogno di sfruttare i falsi backend conQasmQobjoPulseQobjsono stati aggiunti nuovi oggetti backend legacy falsi per testare esplicitamente l'interfaccia dei provider legacy. Verrà rimosso dopo che l'interfaccia legacy sarà deprecata e rimossa. In futuro, i nuovi backend fasulli implementeranno solo l'interfacciaBackendV1e non aggiungeranno nuove classi di backend legacy per i nuovi backend fasulli. -
Quando si crea un oggetto
Paulicon un'etichetta stringa non valida, viene sollevato un problemaQiskitErrorviene ora sollevato. Questo è un cambiamento rispetto alle versioni precedenti, che sollevavano unAttributeErrorsu un'etichetta di stringa non valida. Questa modifica è stata apportata per garantire che il messaggio di errore sia più informativo e distinto da un genericoAttributeError. -
La rappresentazione del programma di uscita dal costruttore di impulsi (
qiskit.pulse.builder.build()) è cambiata da unSchedulea aScheduleBlock. Questa nuova rappresentazione disabilita alcune operazioni di temporizzazione come lo spostamento e l'inserimento. Tuttavia, ciò consente di parametrare la durata delle istruzioni nel contesto del costruttore. Ad esempio:from qiskit import pulse from qiskit.circuit import Parameter dur = Parameter('duration') with pulse.build() as sched: with pulse.align_sequential(): pulse.delay(dur, pulse.DriveChannel(1)) pulse.play(pulse.Gaussian(dur, 0.1, dur/4), pulse.DriveChannel(0)) assigned0 = sched.assign_parameters({dur: 100}) assigned1 = sched.assign_parameters({dur: 200})È possibile passare direttamente i programmi assegnati alla durata all'assemblatore (o al backend), oppure collegarli al circuito quantistico come porte a impulsi.
-
La libreria tweedledum, che in precedenza era una dipendenza opzionale, è diventata un requisito. Questo è stato fatto a causa dell'ampio uso del programma
PhaseOracle(che dipende dall'installazione di tweedledum) con diversi algoritmi diqiskit.algorithms. -
L'extra opzionale
full-featured-simulators, che in precedenza poteva essere utilizzato per installareqiskit-aercon qualcosa di simile apip install qiskit-terra[full-featured-simulators], è stato rimosso dal pacchetto qiskit-terra. Se invece si usa questo per installareqiskit-aerconqiskit-terra, si dovrebbe fare affidamento sul metapacchetto qiskit o installare semplicemente qiskit-terra e qiskit-aer insieme apip install qiskit-terra qiskit-aer. -
È stato aggiunto un nuovo requisito symengine per gli utenti di Linux (su x86_64, aarch64 e ppc64le ) e macOS ( x86_64 e arm64 ). È una dipendenza opzionale su Windows (e disponibile su PyPi come pacchetto precompilato per 64bit Windows) e su altre architetture. Se installato, fornisce prestazioni significativamente migliori per la valutazione di
ParametereParameterExpressionoggetti. -
Tutte le classi del circuito della libreria, cioè tutte le classi
QuantumCircuitderivate inqiskit.circuit.librarysono ora racchiuse in una classeInstruction(oGatese sono unitarie). Ad esempio, importando e disegnando ilQFTcircuito:prima sembrava
┌───┐ q_0: ────────────────────■────────■───────┤ H ├─X─ ┌───┐ │ │P(π/2) └───┘ │ q_1: ──────■───────┤ H ├─┼────────■─────────────┼─ ┌───┐ │P(π/2) └───┘ │P(π/4) │ q_2: ┤ H ├─■─────────────■──────────────────────X─ └───┘e ora si presenta come
┌──────┐ q_0: ┤0 ├ │ │ q_1: ┤1 QFT ├ │ │ q_2: ┤2 ├ └──────┘Per ottenere il vecchio circuito, si può chiamare il metodo
decompose()sul circuitoQuesta modifica è stata fatta principalmente per coerenza, poiché prima di questo rilascio alcune classi di circuiti in
qiskit.circuit.libraryerano precedentemente avvolte in un elementoInstructionoGatema non tutte.
Note di deprecazione
- La classe
qiskit.exceptions.QiskitIndexErrorè deprecata e sarà rimossa in una prossima versione. Questa eccezione non è stata utilizzata attivamente da nulla in Qiskit; se la si utilizzava, è possibile creare una classe di eccezione personalizzata per sostituirla. - I kwarg
epsilonefactrper il costruttore e il kwargqiskit.algorithms.optimizers.L_BFGS_Bper il costruttore e i kwargfactrdella classeP_BFGSsono deprecati e saranno rimossi in una prossima versione. Si prega invece di utilizzareepskarg invece diepsilon.factrkwarg è sostituito daftol. Il rapporto tra i due èftol = factr * numpy.finfo(float).eps. Questa modifica è stata apportata per essere coerente con l'uso del metodo delle funzioniscipy.optimize.minimize'L-BFGS-B'. Per ulteriori informazioni sull'uso di questi nuovi parametri, consultare la documentazione di:scipy.optimize.minimize(method='L-BFGS-B'). - L'interfaccia legacy dei provider, che consisteva nelle classi astratte
qiskit.providers.BaseBackend,qiskit.providers.BaseJobeqiskit.providers.BaseProvider, è stata deprecata e sarà rimossa in una prossima versione. Si dovrebbe invece utilizzare l'interfaccia versionata, le cui versioni attuali delle classi astratte sonoqiskit.providers.BackendV1,qiskit.providers.JobV1, eqiskit.providers.ProviderV1. Gli oggetti di V1 sono per lo più retrocompatibili per facilitare la migrazione dall'interfaccia legacy a quella versionata. Tuttavia, ci si aspetta che le future versioni delle interfacce astratte divergano maggiormente. È possibile fare riferimento allaqiskit.providersper ulteriori dettagli di alto livello sull'interfaccia versionata. - Il kwarg
conditional costruttoreDAGDepNodee il corrispondente attributoconditiondell'oggettoDAGDepNodesono stati deprecati e saranno rimossi in una prossima versione. Si può invece accedere aconditiondi un nodoDAGDepNode, se il nodo è di tipoop, utilizzandoDAGDepNode.op.condition. - L'attributo
conditiondella classeDAGNodeè stato deprecato e sarà rimosso in una prossima versione. Invece, si può accedere aconditiondi un oggettoDAGNodese il nodo è di tipoop, usandoDAGNode.op.condition. - Il costruttore di impulsi (
qiskit.pulse.builder.build())qiskit.pulse.builder.inline()è deprecata e sarà rimossa in una prossima versione. Invece di usare questo contesto, è possibile rimuovere i contesti di allineamento all'interno del contesto in linea. - Il costruttore di impulsi (
qiskit.pulse.builder.build())qiskit.pulse.builder.pad()è deprecata e sarà rimossa in una prossima versione. Questo è stato fatto perché il fileScheduleBlockrestituito dal costruttore di impulsi non supporta il metodo.insert(e non esiste una sintassi di inserimento nel costruttore). L'uso dei segnaposto per i timeslot per bloccare l'inserimento di altre istruzioni non è più necessario.
Correzioni di bug
-
Il
OneQubitEulerDecomposereTwoQubitBasisDecomposerper la sintesi di gate a uno e due qubit sono state migliorate per restringere le tolleranze, migliorare la ripetibilità e la semplificazione e correggere diversi bug di tracciamento della fase globale. -
Corretto un problema nell'assegnazione dell'attributo
nameaGategenerato da più chiamate al metodoinverse`(). Prima di questa correzione, quando si chiamavainverse`()si aggiungeva incondizionatamente_dga ogni chiamata a inverse. Il problema è stato corretto, quindi alla seconda chiamata diinverse`()il suffisso_dgviene rimosso. -
Fissa le condizioni di verifica della banalità di
CZGate,CRZGate,CU1GateeMCU1GatenelHoareOptimizerpass. In precedenza, in alcuni casi l'ottimizzatore rimuoveva queste porte, interrompendo l'equivalenza semantica della trasformazione. -
Corretto un problema durante la conversione di un oggetto
ListOpdi oggettiPauliSumOputilizzandoPauliExpectationoAerPauliExpectation. In precedenza, la conversione in una rappresentazione di Pauli, potenzialmente costosa, sollevava un'avvertenza. Questo problema è stato risolto convertendo internamente l'elementoListOpin un elementoSummedOpdiPauliOpora crea un oggettoPauliSumOpche è più efficiente. Corretto #6159 -
Corretto un problema con la classe
NLocalnel moduloqiskit.circuit.libraryche non sollevava correttamente un'eccezione all'inizializzazione dell'oggetto se veniva usato un tipo non valido per il kwargreps, causando un errore di runtime inatteso. UnTypeErrorviene ora sollevato correttamente se il kwargrepsnon è un valoreint. Corretto #6515 -
È stato risolto un problema per cui la classe
TwoLocalnel moduloqiskit.circuit.librarynon accettava i tipi interi di numpy (ad esempionumpy.int32,numpy.int64, ecc.) come input valido per il kwargentanglement. Corretto #6455 -
Quando si carica un file o una stringa OpenQASM2 con i costruttori
from_qasm_file()ofrom_qasm_str()per la classeQuantumCircuitse il circuito OpenQASM2 contiene un'istruzione con il nomedelayquesta verrà mappata su un'istruzioneqiskit.circuit.Delayistruzione. Ad esempio:from qiskit import QuantumCircuit qasm = """OPENQASM 2.0; include "qelib1.inc"; opaque delay(time) q; qreg q[1]; delay(172) q[0]; u3(0.1,0.2,0.3) q[0]; """ circuit = QuantumCircuit.from_qasm_str(qasm) circuit.draw()Corretto #6510
-
È stato risolto un problema con l'aggiunta tra
PauliSumOpche avevanoParameterExpressioncoefficienti. In precedenza questo comportava la generazione di un'eccezioneQiskitError, perché l'aggiunta dell'elementoParameterExpressionnon era gestita correttamente. Questo problema è stato risolto in modo che l'addizione possa essere eseguita tra oggettiPauliSumOpoggetti conParameterExpressioncoefficienti. -
Corretto un problema con l'inizializzazione della classe
AmplificationProblemdella classe. Il kwarg diis_good_stateera un campo obbligatorio ma veniva erroneamente trattato come facoltativo (e documentato come tale). Questo problema è stato risolto e anche aggiornato, in modo che, a meno che l'inputoraclenon sia un oggettoPhaseOracle(che fornisce il suo metodo di valutazione) il campo è obbligatorio e solleverà unTypeErrorse costruito senzais_good_state. -
È stato risolto un problema per cui l'aggiunta di un controllo a un file
ControlledGatecon controlli aperti, i controlli aperti interni venivano disattivati. Correzioni #5857 -
Corretto un problema con il metodo
convert()della classePauliExpectationche, se chiamato su un operatore non ermetico, restituiva un risultato errato. Corretto #6307 -
È stato risolto un problema con la funzione
qiskit.pulse.transforms.inline_subroutines()che in precedenza non rimuoveva erroneamente tutti i componenti annidati quando veniva richiamata su pianificazioni annidate. Corretto #6321 -
Corretto un problema quando si passava un callable parzialmente vincolato creato con la funzione
functools.partial()della libreria standard Python come kwargscheduleal metodoadd()della classeInstructionScheduleMapdella classe, che in precedenza dava luogo a un errore. Corretto #6278 -
Corretto un problema con l'opzione
PiecewiseChebyshevquando l'impostazione del parametrobreakpointsaNonesu un oggetto esistente veniva erroneamente trattato come un punto di interruzione. È stato corretto in modo che, quando è impostato suNone, venga ripristinato il comportamento predefinito di approssimazione sull'intero intervallo. Corretto #6198 -
Corretto un problema con il metodo
num_connected_components()diQuantumCircuitche restituiva un numero errato di componenti quando il circuito contiene due o più porte condizionate su registri classici. Corretto #6477 -
Corretto un problema con il modulo
qiskit.opflow.expectationsin cui i coefficienti di una funzione di stato non venivano moltiplicati correttamente. Questo sistema corregge anche i calcoli dei gradienti e dei QFI quando si usa l'opzionePauliExpectationoAerPauliExpectation. Ad esempio, in precedenza:from qiskit.opflow import StateFn, I, One exp = ~StateFn(I) @ (2 * One)valutato a
2perAerPauliExpectatione a4per altri convertitori di aspettative. Poiché~StateFn(I) @ (2 * One)è una notazione abbreviata per~(2 * One) @ I @ (2 * One), il coefficiente ora corretto di4viene restituito per tutti i convertitori di aspettative. Corretto #6497 -
Corretto il bug che causava il fallimento di
to_circuit()quandoPauliOpaveva una fase. Allo stesso tempo, è stato reso più efficiente l'utilizzo diPauliGate. -
È stato risolto un problema a causa del quale l'output QASM generato dal metodo
qasm()del metodoQuantumCircuitper porte composite comeMCXGatee le sue varianti (MCXGrayCode,MCXRecursive, eMCXVChain) non sarebbe corretto. Se un elemento del circuito non è presente in, la sua definizione viene aggiunta alla stringa QASM di uscitaGatenel circuito non è presente inqelib1.inc, la sua definizione viene aggiunta alla stringa QASM di uscita. Corretto #4943 e #3945 -
Corretto un problema con la funzione
circuit_drawer()e il metododraw()diQuantumCircuit. Quando si utilizzano le modalità di uscitamplolatex, con il kwargcregbundleimpostato suFalsee il kwargreverse_bitsimpostato suTrue, i bit dei registri classici vengono visualizzati nello stesso ordine di quandoreverse_bitsè impostato suFalse. -
È stato risolto un problema relativo all'utilizzo dell'istruzione
qiskit.extensions.Initializeche non impostava correttamente la fase globale della definizione sintetizzata quando veniva costruita. Corretto #5320 -
È stato risolto un problema per cui l'ordine dei bit in
qiskit.circuit.library.PhaseOracle.evaluate_bitstring()non corrispondeva all'ordine della stringa di bit misurata. Questa correzione influisce anche sull'esecuzione della classeGroverse l'oracolo è specificato come un elemento di tipoPhaseOracleche ora identificherà correttamente la stringa di bit corretta. Corretto #6314 -
Corregge un bug in
Optimize1qGatesDecomposition()che in precedenza faceva sì che alcune brevi sequenze di porte non venissero erroneamente riscritte. -
Corretto un problema nel metodo
qiskit.opflow.gradients.Gradient.gradient_wrapper()con il calcolo del gradiente. In precedenza, se l'operatore non era diagonale, in alcune situazioni veniva restituito un risultato errato. Il problema è stato risolto utilizzando un convertitore di aspettative per garantire che il risultato sia sempre corretto. -
Corretto un problema con la funzione
circuit_drawer()e il metododraw()diQuantumCircuitcon tutte le modalità di uscita, che in alcune circostanze rendeva erroneamente un'istruzione personalizzata che includeva bit classici. Corretti #3201, #3202 e #6178 -
Corretto un problema in
circuit_drawer()e il metododraw()della classeQuantumCircuitquando si utilizza la modalità di uscitampl, le porte controllate-Z venivano disegnate erroneamente come asimmetriche. Corretto #5981 -
È stato risolto un problema con il passaggio del transpiler di
OptimizeSwapBeforeMeasure, a causa del quale in alcune situazioni veniva rimossa una condizione di tipoSwapGateche conteneva una condizione classica veniva rimosso. Corretto #6192 -
Corretto un problema con la fase della classe
qiskit.opflow.gradients.QFIquandoqfi_methodè impostato sulin_comb_full, che causava la valutazione di un osservabile errato. -
È stato risolto un problema con la classe
VQEquando viene eseguito con l'opzioneL_BFGS_BoP_BFGSe vengono utilizzati i gradienti, il gradiente veniva erroneamente passato come array numpy invece che come elenco di float, con conseguente errore. Questo problema è stato risolto in modo che sia possibile utilizzare i gradienti conVQEe l'opzioneL_BFGS_BoP_BFGSottimizzatori.
Altre note
- La deprecazione del metodo
parameters()per la classeInstructionè stata invertita. Questo metodo è stato originariamente deprecato nel sito 0.17.0, ma è ancora necessario per diverse applicazioni, tra cui l'esecuzione di esperimenti di calibrazione. Questo metodo continuerà a essere supportato e non verrà rimosso.
Aer 0.8.2
Nessuna modifica
Ignis 0.6.0
Nessuna modifica
Acqua 0.9.4
Nessuna modifica
IBM Q Fornitore 0.15.0
Nuove funzioni
-
Aggiungere il supporto per il nuovo metodo
qiskit.providers.ibmq.runtime.RuntimeJob.error_message()che restituirà una stringa che rappresenta il motivo del fallimento del lavoro. -
Il parametro di input del metodo
qiskit.providers.ibmq.runtime.IBMRuntimeService.run()può ora essere specificato come istanza diqiskit.providers.ibmq.runtime.ParameterNamespaceche supporta le funzioni di completamento automatico. È possibile utilizzareqiskit.providers.ibmq.runtime.RuntimeProgram.parameters()per recuperare un'istanza diParameterNamespace.Ad esempio:
from qiskit import IBMQ provider = IBMQ.load_account() # Set the "sample-program" program parameters. params = provider.runtime.program(program_id="sample-program").parameters() params.iterations = 2 # Configure backend options options = {'backend_name': 'ibmq_qasm_simulator'} # Execute the circuit using the "circuit-runner" program. job = provider.runtime.run(program_id="sample-program", options=options, inputs=params) -
L'utente può ora impostare la visibilità (privata/pubblica) di un programma di Qiskit Runtime utilizzando
qiskit.providers.ibmq.runtime.IBMRuntimeService.set_program_visibility(). -
A
qiskit.providers.ibmq.runtime.IBMRuntimeService.jobs()è stato aggiunto un parametro booleano opzionale pending che consente di filtrare i lavori in base al loro stato. Se pending non è specificato, tutti i lavori vengono restituiti. Se pending è impostato su True, vengono restituiti i lavori "QUEUED" e "RUNNING". Se pending è impostato su False, vengono restituiti i lavori 'DONE', 'ERROR' e 'CANCELLED'. -
Aggiungere il supporto per il flag
use_measure_espnel metodoqiskit.providers.ibmq.IBMQBackend.run(). SeTrue, il backend utilizzerà la lettura ESP per tutte le misure che costituiscono l'istruzione terminale su quel qubit. Se viene utilizzato e il backend non supporta la lettura dell'ESP, viene generato un errore.
Note sull'aggiornamento
qiskit.providers.ibmq.runtime.RuntimeProgram.parameters()è ora un metodo che restituisce un'istanza diqiskit.providers.ibmq.runtime.ParameterNamespace, che può essere utilizzata per inserire i valori dei parametri del programma in fase di esecuzione e passare aqiskit.providers.ibmq.runtime.IBMRuntimeService.run().- Il flag
open_pulsenella configurazione del backend non indica più se un backend supporta il controllo a livello di impulsi. Di conseguenza,qiskit.providers.ibmq.IBMQBackend.configuration()può restituire un'istanzaPulseBackendConfigurationanche se il suo flagopen_pulseèFalse. - Il livello di condivisione dei lavori non è più supportato a causa della scarsa adozione e l'interfaccia corrispondente sarà rimossa in una release futura. Ciò significa che non si deve più passare share_level quando si crea un lavoro o usare il metodo
qiskit.providers.ibmq.job.IBMQJob.share_level()per ottenere il livello di condivisione di un lavoro.
Note di deprecazione
- L'istruzione
idè stata deprecata sui backend hardware IBM. Si può invece utilizzare l'istruzionedelayche implementa ritardi di lunghezza variabile, specificati in unità didt. Quando si esegue un circuito contenente un'istruzioneid, all'invio del lavoro verrà emesso un avviso e tutte le istruzioniidpresenti nel lavoro verranno automaticamente sostituite con l'istruzionedelayequivalente.