Note di rilascio di Qiskit 0.33
0.33.1
Terra 0.19.1
Preludio
Qiskit Terra 0.19.1 è una release che risolve alcuni problemi di 0.19.0 riguardanti i circuiti costruiti dall'interfaccia del costruttore di flussi di controllo, le porte condizionali e la serializzazione QPY degli oggetti Terra più recenti.
Note di deprecazione
-
Le funzioni
qiskit.circuit.measure.measure()eqiskit.circuit.reset.reset()sono deprecate e saranno rimosse in una prossima versione. Si dovrebbe invece accedere a questi metodi come metodi suQuantumCircuit:from qiskit import QuantumCircuit circuit = QuantumCircuit(1, 1) # Replace this deprecated form ... from qiskit.circuit.measure import measure measure(circuit, 0, 0) # ... with either of the next two lines: circuit.measure(0, 0) QuantumCircuit.measure(circuit, 0, 0)
Correzioni di bug
-
Corretto un errore nelle funzioni di conversione dei circuiti
circuit_to_gate()ecircuit_to_instruction()(e i loro metodi di circuito associatiQuantumCircuit.to_gate()eQuantumCircuit.to_instruction()) quando si agisce su un circuito con bit senza registro o con bit in più di un registro. In precedenza, il numero di bit necessari per il gate o l'istruzione creata veniva calcolato in modo errato, causando spesso un'eccezione durante la conversione. -
È stato risolto un problema per cui la chiamata
QuantumCircuit.copy()sui circuiti "body" di un'operazione di flusso di controllo creata con l'interfaccia del costruttore generava un errore. Ad esempio, questo era in precedenza un errore, ma ora viene restituito con successo:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.if_test((creg, 0)): circ.h(0) if_else_instruction, _, _ = circ.data[0] true_body = if_else_instruction.params[0] true_body.copy() -
L'interfaccia del costruttore di flussi di controllo ora supporta l'uso di
ClassicalRegistercome condizioni in ambiti di flusso di controllo annidati. In precedenza, questa operazione non sollevava immediatamente un errore, ma i blocchi interni del circuito non avevano definito i registri corretti e quindi la logica successiva che lavorava con i blocchi interni falliva.Ad esempio, prima i disegnatori fallivano quando cercavano di disegnare un blocco interno condizionato a un registro classico, mentre ora riescono a farlo, come in questo esempio:
from qiskit import QuantumCircuit from qiskit.circuit import QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.for_loop(range(10)) as a: circ.ry(a, 0) with circ.if_test((creg, 1)): circ.break_loop() print(circ.draw(cregbundle=False)) print(circ.data[0][0].blocks[0].draw(cregbundle=False)) -
Corretto il supporto di
qpy_serializationper la serializzazione di oggettiQuantumCircuitche utilizzanoParameterVectoroParameterVectorElementcome parametri. In precedenza, un parametro diParameterVectorElementveniva trattato come un parametroParameterper la serializzazione QPY, il che significava che il contestoParameterVectorveniva perso in QPY e l'ordine di uscita diparameterspotrebbe essere errato.Per risolvere questo problema è stata necessaria una nuova versione del formato QPY, la 3. Questa nuova versione del formato include una rappresentazione della classe
ParameterVectorElement, descritta nella documentazione diqpy_serializationalla voce PARAMETER_VECTOR_ELEMENT. -
Corretto il supporto di
qpy_serializationper la serializzazione di un oggettoPauliEvolutionGateoggetto. In precedenza, l'elementoPauliEvolutionGateveniva trattato come un gate personalizzato per la serializzazione e veniva deserializzato come un oggettoGateche aveva la stessa definizione e lo stesso nome dell'oggetto originalePauliEvolutionGate. Tuttavia, in questo modo si perderebbe lo stato originale dell'elementoPauliEvolutionGate. Questo problema è stato risolto in modo che a partire da questa versione un elemento del circuitoPauliEvolutionGatenel circuito sarà conservato 1:1 attraverso la serializzazione QPY. L'unica limitazione è che non supporta le classi personalizzateEvolutionSynthesispersonalizzate. Solo le classi disponibili inqiskit.synthesispossono essere utilizzate con una classePauliEvolutionGateper la serializzazione di qpy.Per risolvere questo problema è stata necessaria una nuova versione del formato QPY, la 3. Questa nuova versione del formato include una rappresentazione della classe
PauliEvolutionGatedescritta nella documentazione diqpy_serializationalla voce PAULI_EVOLUTION. -
Due funzioni non utilizzate
qiskit.circuit.measure.measure()eqiskit.circuit.reset.reset()sono state accidentalmente rimosse senza un periodo di deprecazione. Sono stati ripristinati, ma sono contrassegnati come deprecati a favore dei metodiQuantumCircuit.measure()eQuantumCircuit.reset(), rispettivamente, e saranno rimossi in una prossima versione.
Altre note
-
La nuova interfaccia del costruttore di flussi di controllo utilizza vari gestori di contesto e oggetti ausiliari per svolgere il suo lavoro. Questi non devono essere considerati parte dell'API pubblica e possono essere modificati e rimossi senza preavviso. L' uso dell'interfaccia del costruttore ha garanzie di stabilità, nel senso che il comportamento descritto da
QuantumCircuit.for_loop(),while_loop()eif_test()per l'interfaccia del costruttore sono soggetti alle politiche di deprezzamento standard, ma gli oggetti effettivi utilizzati per realizzarli non lo sono. Non si deve fare affidamento sul fatto che gli oggetti (comeIfContextoControlFlowBuilderBlock) esistano nella loro posizione attuale o che abbiano metodi o attributi ad essi collegati.Questo non era chiaro in precedenza nella release 0.19.0. Tutti gli oggetti di questo tipo hanno ora un'avvertenza nelle stringhe di documentazione che lo rende esplicito. È probabile che in futuro le loro sedi e le loro implementazioni di supporto diventino molto diverse.
Aer 0.9.1
Nessuna modifica
Ignis 0.7.0
Nessuna modifica
IBM Q Fornitore 0.18.2
Correzioni di bug
- Correzione fornita in #1065 per il problema per cui il lavoro continuava a bloccarsi quando
Parameterveniva passato nei metadati del circuito. - Correzione fornita in #1094 per il problema per cui
qiskit.providers.ibmq.runtime.RuntimeEncoderesegue un ulteriore decompose() se il circuito da serializzare è unBlueprintCircuit.
0.33.0
Questo rilascio segna ufficialmente la fine del supporto per il progetto Qiskit Aqua in Qiskit. Era originariamente deprecato nella release 0.25.0 e, come documentato in quella release, il pacchetto qiskit-aqua è stato rimosso dal metapacchetto Qiskit, il che significa che pip install qiskit non includerà più qiskit-aqua. Tuttavia, a causa di limitazioni nel packaging di python, non possiamo rimuovere automaticamente un'installazione preesistente di qiskit-aqua quando aggiorniamo una versione precedente di Qiskit a questa release (o a una release futura) con pip install -U qiskit. Se si esegue l'aggiornamento da una versione precedente, si consiglia di disinstallare manualmente Qiskit Aqua con pip uninstall qiskit-aqua o di installarlo in un nuovo ambiente python.
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 dell'operatore esistono ora 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 è possibile consultare la Guida alla migrazione di Aqua.
Con questa release viene anche ufficialmente deprecato il progetto Qiskit Ignis. Di conseguenza, in una futura release il pacchetto qiskit-ignis sarà rimosso dal metapacchetto Qiskit, il che significa che in quella futura release pip install qiskit non includerà più qiskit-ignis. Qiskit Ignis è stato sostituito dal progetto Qiskit Experiments e lo sviluppo attivo è cessato. Anche se deprecato, le correzioni di bug critici e di compatibilità continueranno a essere effettuate per dare agli utenti una sufficiente opportunità di migrare da Ignis. Dopo il periodo di deprezzamento (che non sarà inferiore a 3 mesi da questo rilascio) il progetto sarà ritirato e archiviato. Per i dettagli su come passare da Qiskit Ignis a Qiskit Experiments, puoi fare riferimento alla guida alla migrazione.
Terra 0.19.0
Preludio
I punti salienti della release Qiskit Terra 0.19 sono:
- Una nuova versione dell'interfaccia astratta Qiskit/hardware, sotto forma di
BackendV2con una nuova struttura di datiTargetper consentire ai backend di modellare meglio i propri vincoli per il transpiler. - Un' interfaccia plugin estensibile per il
UnitarySynthesische consente agli utenti o ad altri pacchetti di estendere le routine di sintesi di Qiskit Terra con nuovi metodi. - Istruzioni di flusso di controllo, per rappresentare i cicli di
forewhilee le istruzioni diif/elseinQuantumCircuit. I simulatori di Qiskit Aer saranno presto in grado di lavorare con queste nuove istruzioni, consentendo di scrivere programmi quantistici più dinamici. - Supporto preliminare per la specifica OpenQASM 3 in evoluzione. È possibile utilizzare il nuovo modulo
qiskit.qasm3per serializzare i propri fileQuantumCircuitin OpenQASM 3, compresi i nuovi costrutti di flusso di controllo.
Questa versione segna la fine del supporto per Python 3.6 in Qiskit. Questa versione di Qiskit Terra, e tutte le successive release di bugfix della serie 0.19.x, saranno le ultime a funzionare con Python 3.6. A partire dalla prossima minor release ( 0.20.0 ) di Qiskit Terra, la versione minima richiesta Python sarà 3.7.
Come sempre, anche in questa release sono presenti molte altre funzionalità e correzioni, che potete leggere di seguito.
Nuove funzioni
-
QuantumCircuit.decompose()e il corrispondente passaggio di transpilerDecomposeaccettano ora facoltativamente un parametro contenente un insieme di nomi di porte. Se viene fornito questo parametro, verranno decomposte solo le porte con nomi corrispondenti. Supporta le corrispondenze con i caratteri jolly in stile Unix-shell. Ad esempio:qc.decompose(["h", "r[xz]"])decomporrà qualsiasi porta
h,rxorz, ma lascerà intatte (per esempio) le portex. -
Aggiunto l'argomento
termination_checkerall'ottimizzatoreSPSAottimizzatore. Ciò consente all'utente di implementare un criterio di terminazione personalizzato.import numpy as np from qiskit.algorithms.optimizers import SPSA def objective(x): return np.linalg.norm(x) + .04*np.random.rand(1) class TerminationChecker: def __init__(self, N : int): """ Callback to terminate optimization when the average decrease over the last N data points is smaller than the specified tolerance. """ self.N = N self.values = [] def __call__(self, nfev, parameters, value, stepsize, accepted) -> bool: """ Returns: True if the optimization loop should be terminated. """ self.values.append(value) if len(self.values) > self.N: last_values = self.values[-self.N:] pp = np.polyfit(range(self.N), last_values, 1) slope = pp[0] / self.N if slope > 0: return True return False maxiter = 400 spsa = SPSA(maxiter=maxiter, termination_checker=TerminationChecker(10)) parameters, value, niter = spsa.optimize(2, objective, initial_point=np.array([0.5, 0.5])) -
Aggiunta una nuova versione dell'interfaccia
Backenddell'interfaccia,BackendV2. Questa nuova versione rappresenta un grande cambiamento rispetto alla versione precedente,BackendV1e cambia sia lo schema di accesso dell'utente alle proprietà del backend (come il numero di qubit, ecc.) sia il modo in cui il backend rappresenta i suoi vincoli al transpiler. L'esecuzione dei circuiti (tramite il metodorun()metodo) rimane invariata. Con unBackendV2invece di avere un file separatoconfiguration(),properties(), edefaults()metodi che costruisconoBackendConfiguration,BackendProperties, ePulseDefaultsrispettivamente, come nell'interfacciaBackendV1gli attributi contenuti in questi oggetti di output sono accessibili direttamente come attributi dell'oggettoBackendV2dell'oggetto. Ad esempio, per ottenere il numero di qubit per un backend conBackendV1si dovrebbe fare:num_qubits = backend.configuration().n_qubitsmentre con
BackendV2è:num_qubits = backend.num_qubitsL'altro cambiamento è che il numero di attributi esposti nella classe astratta è stato progettato per essere un insieme di campi obbligatori o opzionali che il resto di Qiskit può utilizzare oggi con qualsiasi backend
BackendV2è stato progettato per essere un insieme di campi obbligatori o opzionali, indipendenti dall'hardware e dal fornitore, che il resto di Qiskit può utilizzare oggi con qualsiasi backend. Le sottoclassi della classe astrattaBackendV2possono aggiungere il supporto per ulteriori attributi e metodi oltre a quelli definiti inBackendV2ma questi non saranno supportati universalmente in tutto Qiskit.L'altro cambiamento critico, importante soprattutto per gli autori dei provider, è il modo in cui un fornitore
BackendV2espone le proprietà di un particolare backend al transpiler. ConBackendV2questo avviene tramite un oggettoTargetoggetto. IlTarget, esposto tramite l'attributotargetè usato per rappresentare l'insieme dei vincoli per l'esecuzione dei circuiti su un particolare backend. Contiene il sottoinsieme di informazioni precedentemente esposte dal fileBackendConfiguration,BackendProperties, ePulseDefaultsche il transpiler può utilizzare attivamente. Quando si migra un provider per utilizzareBackendV2(o quando si crea un nuovo pacchetto di provider) la costruzione degli oggetti del backend avverrà principalmente con la creazione di un oggettoTargetper il backend. -
Aggiunta di una nuova classe
Targetal modulotranspileral modulo. La classeTargetè progettata per rappresentare i vincoli del backend al compilatore. La classeTargetè destinata a essere usata con unBackendV2ed è il modo in cui i backend modelleranno i loro vincoli per il transpiler in futuro. Unisce in un'unica struttura dati i campi precedentemente distinti utilizzati per il controllo del dispositivo ditranspile()(ad esempiobasis_gates,coupling_map,instruction_durations, ecc.) in un'unica struttura dati. Aggiunge inoltre ulteriori funzionalità rispetto a quelle disponibili in precedenza, come la rappresentazione di set di gate eterogenei, la connettività di gate multi-qubit e le varianti sintonizzate degli stessi gate. Attualmente il transpiler non tiene conto di tutti questi vincoli, ma col tempo crescerà per sfruttare le funzionalità aggiuntive. -
La classe
Optionsha ora un supporto opzionale per specificare i validatori. Questo permetteBackenddi specificare una validazione di base sui valori forniti dall'utente per i campi dell'oggettoOptionsdell'oggetto. Ad esempio, se si ha un oggettoOptionsdefinito con:from qiskit.providers.Options options = Options(shots=1024)è possibile impostare un validatore sugli scatti affinché siano compresi tra 1 e 4096 con:
options.set_validator('shots', (1, 4096))Con il validatore impostato, qualsiasi chiamata al metodo
update_options()verificherà che seshotsviene aggiornato, il nuovo valore proposto rientri nell'intervallo valido. -
Aggiunto un nuovo passaggio di analisi del transpiler,
ContainsInstructional moduloqiskit.transpiler.passesal modulo. Questo passaggio viene utilizzato per determinare se un circuito contiene un'istruzione specifica. Prende un singolo parametro all'inizializzazione, il nome dell'istruzione da controllare e imposta un booleano nell'insieme di proprietà se il circuito contiene o meno quell'istruzione. Ad esempio:from qiskit.transpiler.passes import ContainsInstruction from qiskit.circuit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() property_set = {} # Contains Hadamard contains_h = ContainsInstruction("h") contains_h(circuit, property_set) assert property_set["contains_h"] == True # Not contains SX contains_sx = ContainsInstruction("sx") contains_sx(circuit, property_set) assert property_set["contains_sx"] == False -
Aggiunta una funzione di utilità
qiskit.utils.detach_prefix()che è una controparte diapply_prefix(). La nuova funzione restituisce una tupla di valore scalare e prefisso da un valore float dato. Ad esempio, il valore1.3e8viene convertito in(130, "M"), che può essere utilizzato per visualizzare un valore nel formato user friendly, come130 MHz. -
I valori
"gate_error"e"balanced"sono ora disponibili per l'opzioneobjectivenella costruzione dell'oggettoBIPMappinge"balanced"è ora il valore predefinito.L'obiettivo
"gate_error"richiede il passaggio di unBackendPropertiesistanza nel kwargbackend_prop, che contiene gli errori della porta 2q-gate utilizzati nel calcolo degli obiettivi. L'obiettivo"balanced"utilizzerà l'istanzaBackendPropertiesse viene fornito, ma altrimenti assumerà un tasso di errore CX come indicato nel nuovo parametrodefault_cx_error_rate. I pesi relativi delle componenti gate-error e depth dell'obiettivo bilanciato possono essere controllati con il nuovo parametrodepth_obj_weight. -
Ogni attributo della classe
VQEimpostato all'inizializzazione è ora accessibile con getter e setter. Inoltre, i valori predefiniti degli attributi VQEansatzeoptimizerpossono essere ripristinati assegnando loroNone:vqe = VQE(my_ansatz, my_optimizer) vqe.ansatz = None # reset to default: RealAmplitudes ansatz vqe.optimizer = None # reset to default: SLSQP optimizer -
Aggiunto un nuovo metodo
PauliList.group_qubit_wise_commuting()che suddivide aPauliListin insiemi di operatori commutativi reciprocamente qubit-wisePaulioperatori. Ad esempio:from qiskit.quantum_info import PauliList, Pauli pauli_list = PauliList([Pauli("IY"), Pauli("XX"), Pauli("YY"), Pauli("YX")]) pauli_list.group_qubit_wise_commuting() -
Aggiunto un nuovo metodo costruttore di mappe di accoppiamento
CouplingMap.from_hexagonal_lattice()per costruire una mappa di accoppiamento del reticolo esagonale. Ad esempio, per costruire una mappa di accoppiamento del reticolo esagonale 2x2 :from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_hexagonal_lattice(2, 2) cmap.draw() -
Le nuove classi di backend fasulle sono disponibili all'indirizzo
qiskit.test.mock. Questi includono le versioni simulate diibmq_brooklyn,ibmq_manila,ibmq_jakartaeibmq_lagos. Come per gli altri backend fasulli, questi includono le istantanee dei dati di calibrazione (cioèbackend.defaults()) e i dati relativi all'errore (cioèbackend.properties()) presi dal sistema reale e possono essere utilizzati per test, compilazioni e simulazioni locali. -
È stato aggiunto il metodo
OperatorBase.is_hermitian()per verificare se l'operatore è hermitiano o meno.NumPyEigensolvereNumPyMinimumEigensolverutilizzareeighoeigshper risolvere il problema degli autovalori quando l'operatore è hermitiano. -
Aggiunto un nuovo metodo costruttore
PassManagerConfig.from_backend(). Costruisce unPassManagerConfigcon le opzioni dell'utente e la configurazione di un backend. Grazie a questa funzione, è possibile creare facilmente un passmanager preimpostato. Ad esempio:from qiskit.transpiler.passmanager_config import PassManagerConfig from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.test.mock import FakeMelbourne pass_manager = level_1_pass_manager( PassManagerConfig.from_backend(FakeMelbourne(), seed_transpiler=42) ) -
È stato aggiunto un nuovo passaggio transpiler,
PulseGatesche estrae automaticamente le calibrazioni fornite dall'utente dalla mappa del programma di istruzioni e collega il programma del gate al circuito quantistico dato (transpilato) come gate a impulsi.Il passaggio
PulseGatesviene applicato a tutti i livelli di ottimizzazione da 0 a 3. Nessuna implementazione del gate viene aggiornata, a meno che l'utente finale non sovrascriva esplicitamente il sitobackend.defaults().instruction_schedule_map. Questo passaggio evita agli utenti di chiamare individualmenteQuantumCircuit.add_calibration()per ogni circuito eseguito sull'hardware.Per integrare questo nuovo passaggio, è stato aggiunto un calendario a
InstructionScheduleMape viene implicitamente aggiornato con un campo di metadati"publisher". I programmi dei gate calibrati dal backend hanno un tipo di editore speciale per evitare di sovrascrivere i circuiti con calibrazioni di programmi già noti. Di solito, gli utenti finali non devono occuparsi di questi metadati, perché vengono applicati automaticamente. È possibile chiamareInstructionScheduleMap.has_custom_gate()per verificare se la mappa ha una calibrazione personalizzata del cancello.Vedere il seguente esempio di codice per imparare ad applicare l'implementazione di gate personalizzati per tutti i circuiti in esecuzione.
from qiskit.test.mock import FakeGuadalupe from qiskit import pulse, circuit, transpile backend = FakeGuadalupe() with pulse.build(backend, name="x") as x_q0: pulse.play(pulse.Constant(160, 0.1), pulse.drive_channel(0)) backend.defaults().instruction_schedule_map.add("x", (0,), x_q0) circs = [] for _ in range(100): circ = circuit.QuantumCircuit(1) circ.sx(0) circ.rz(1.57, 0) circ.x(0) circ.measure_active() circs.append(circ) circs = transpile(circs, backend) circs[0].calibrations # This returns calibration only for x gateSi noti che la mappa del programma di istruzioni è un oggetto mutabile. Se si sovrascrive una delle voci e si usa quel backend per altri esperimenti, si può accidentalmente aggiornare la definizione del gate.
backend = FakeGuadalupe() instmap = backend.defaults().instruction_schedule_map instmap.add("x", (0, ), my_x_gate_schedule) qc = QuantumCircuit(1, 1) qc.x(0) qc.measure(0, 0) qc = transpile(qc, backend) # This backend uses custom X gateSe si desidera aggiornare le definizioni dei gate di un esperimento specifico, è necessario prima copiare in profondità la mappa del programma di istruzioni e passarla direttamente al transpiler.
-
Introdotta una nuova opzione
qubit_subsetnel costruttore diBIPMapping. L'opzione consente di specificare in una riga i qubit fisici da utilizzare (incoupling_mapdel dispositivo) durante la mappatura:mapped_circ = BIPMapping( coupling_map=CouplingMap([[0, 1], [1, 2], [1, 3], [3, 4]]), qubit_subset=[1, 3, 4] )(circ)In precedenza, per fare la stessa cosa, bisognava fornire un
coupling_mapridotto che contenesse solo i qubit da utilizzare, incorporare il circuito risultante nelcoupling_maporiginale e aggiornare ilQuantumCircuit._layoutdi conseguenza:reduced_coupling = coupling_map.reduce(qubit_to_use) mapped = BIPMapping(reduced_coupling)(circ) # skip the definition of fill_with_ancilla() # recover circuit on original coupling map layout = Layout({q: qubit_to_use[i] for i, q in enumerate(mapped.qubits)}) for reg in mapped.qregs: layout.add_register(reg) property_set = {"layout": fill_with_ancilla(layout)} recovered = ApplyLayout()(mapped, property_set) # recover layout overall_layout = Layout({v: qubit_to_use[q] for v, q in mapped._layout.get_virtual_bits().items()}) for reg in mapped.qregs: overall_layout.add_register(reg) recovered._layout = fill_with_ancilla(overall_layout) -
Aggiunti gli argomenti
ignore_pauli_phaseecopyal costruttore diSparsePauliOp.ignore_pauli_phaseimpedisce la lettura dell'attributophasedi un inputPauliListdi essere letto, il che è più performante se l'elementoPauliListè già noto per avere tutte le fasi come zero nella convenzione interna ZX.copypermette di evitare la copia dei dati di input quando si imposta esplicitamentecopy=False. -
Miglioramento delle prestazioni delle seguenti
SparsePauliOpoperazioni:simplify()(vedi #7122 )compose()(vedi #7126 )_add()(vedi #7138 )from_list()e__init__()(vedere altra discussione in #7138 ).
-
È stato aggiunto il metodo
SparsePauliOp.sum()per sommare molti metodiSparsePauliOps. Questo metodo offre prestazioni nettamente migliori rispetto alla somma delle istanze in un ciclo. Ad esempio, il modo precedente per sommare piùSparsePauliOpinsieme sarebbe quello di fare:from qiskit.quantum_info import SparsePauliOp, random_pauli_list sparse_ops = [SparsePauliOp(random_pauli_list(10, 10)) for _ in [None]*1000] total = sparse_ops[0] for op in sparse_ops[1:]: total += opOra è possibile eseguire questa operazione in modo molto più efficiente (sia in termini di velocità che di digitazione) Come:
SparsePauliOp.sum(sparse_ops) -
Aggiunto un argomento
limit_amplitudeal costruttore diParametricPulse, che è la classe base diGaussian,GaussianSquare,DrageConstantper consentire la disabilitazione del limite di ampiezza di 1 su base impulsiva. Conlimit_amplitude=False, i singoli impulsi possono avere un'ampiezza superiore all'unità senza sollevare unaPulseError. Vedere il numero 6544 per maggiori dettagli. -
Utilizzo
QuantumCircuit.draw()ocircuit_drawer()con il cassettolatexgenererà un file in un formato immagine dedotto dall'estensione del nome del file, ad esempio:import qiskit circuit = qiskit.QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.draw('latex', filename='./file.jpg')In questo modo si salverà il disegno del circuito in formato JPEG. In precedenza, l'immagine era sempre in formato PNG. Per maggiori dettagli, consultare il numero 6448.
Ora, se incontra un'estensione del nome del file non supportata, ad esempio:
circuit.draw('latex', filename='./file.spooky')solleverà un
ValueErrorper cambiare l'estensione del nome del file in un formato immagine supportato. -
Aggiunto il parametro
filenameaplot_gate_map()eplot_coupling_map()che consente di salvare le immagini risultanti in un file. -
Introdotto un compilatore quantistico approssimativo e una corrispondente implementazione del plugin di sintesi unitaria. La classe principale di AQC è
AQCper una versione autonoma che compila una matrice unitaria in un circuito approssimato. Il plugin può essere invocato datranspile()quando l'argomentounitary_synthesis_methodè impostato su'aqc'. Vedereqiskit.transpiler.synthesis.aqcper tutti i dettagli. -
Aggiunto un argomento
filter_functionaQuantumCircuit.depth()eQuantumCircuit.size()per analizzare le operazioni dei circuiti secondo alcuni criteri.Ad esempio, per ottenere il numero di porte a due qubit, si può fare:
circuit.size(lambda x: x[0].num_qubits == 2)Oppure per ottenere la profondità delle porte T che agiscono sullo zeroth qubit:
circuit.depth(lambda x: x[0].name == 't' and circuit.qubits[0] in x[1]) -
Aggiunto un nuovo passaggio di transpiler,
CollectMultiQBlocksal moduloqiskit.transpiler.passesal modulo. Questo passaggio viene utilizzato per raccogliere sequenze di porte ininterrotte che agiscono su gruppi di qubit. Fornisce una funzione simile a quella del passaggioCollect2qBlocksma mentre quest'ultimo è stato progettato e ottimizzato per trovare blocchi di 2 qubit, questo nuovo passaggio funziona per trovare blocchi di qualsiasi dimensione. -
Esiste un'interfaccia costruttore per le nuove operazioni di flusso di controllo su
QuantumCircuit, come il nuovoForLoopOp,IfElseOp, eWhileLoopOp. L'interfaccia utilizza gli stessi metodi di circuito, vale a direQuantumCircuit.for_loop(),QuantumCircuit.if_test()eQuantumCircuit.while_loop()che sono sovraccaricati in modo che se il parametrobodynon viene fornito, restituiscono un gestore di contesto. L'ingresso in uno di questi gestori di contesto spinge uno scope nel circuito e cattura tutte le chiamate al gate (e agli altri scope) e le risorse che queste utilizzano, costruendo alla fine la relativa operazione. Ad esempio, ora è possibile farlo:qc = QuantumCircuit(2, 2) with qc.for_loop(range(5)) as i: qc.rx(i * math.pi / 4, 0)Questo produrrà un
ForLoopOpsuqc, che sa che il qubit 0 è l'unica risorsa utilizzata nel corpo del ciclo. Questi gestori di contesto possono essere annidati e determinano correttamente la loro larghezza. È possibile utilizzareQuantumCircuit.break_loop()eQuantumCircuit.continue_loop()all'interno di un contesto, e si espanderà in modo da avere la larghezza corretta per il ciclo che lo contiene, anche se è annidato in ulteriori blocchiQuantumCircuit.if_test()blocchi.Il gestore del contesto
if_test()fornisce un gestore concatenato che, se lo si desidera, può essere utilizzato per creare un bloccoelse, come ad esempio da:qreg = QuantumRegister(2) creg = ClassicalRegister(2) qc = QuantumCircuit(qreg, creg) qc.h(0) qc.cx(0, 1) qc.measure(0, 0) with qc.if_test((creg, 0)) as else_: qc.x(1) with else_: qc.z(1)Il gestore si assicurerà che i corpi
ifeelsesiano definiti sullo stesso insieme di risorse. -
Introdotto un nuovo passo di transpiler
InverseCancellationche generalizza il passaggioCXCancellationper annullare qualsiasi porta auto-inversa o coppia gate-inversa. Può essere utilizzato inizializzandoInverseCancellatione passando un gate da annullare, ad esempio:from qiskit.transpiler.passes import InverseCancellation from qiskit import QuantumCircuit from qiskit.circuit.library import HGate from qiskit.transpiler import PassManager qc = QuantumCircuit(2, 2) qc.h(0) qc.h(0) pass_ = InverseCancellation([HGate()]) pm = PassManager(pass_) new_circ = pm.run(qc) -
Il costruttore di
RZXCalibrationBuilderha due nuovi kwarginstruction_schedule_mapequbit_channel_mappingche prendono rispettivamente una lista di nomi di canali e una lista di nomi di canali per ogni qubitInstructionScheduleMape un elenco di nomi di canali per ogni qubit, rispettivamente. Questi nuovi argomenti sono usati per specificare direttamente le informazioni necessarie da un target di backend. Devono essere usati al posto di passare unBaseBackendo unBackendV1direttamente al passaggio con l'argomentobackend. -
I
Statevectors di stati composti solo da qubit possono ora essere disegnati in LaTeX in notazione ket. Nella notazione ket le voci del vettore di stato vengono elaborate in modo tale che i fattori esatti, come le frazioni o le radici quadrate di due, vengano disegnati come tali. La convenzione particolare può essere scelta passando l'argomento della parola chiaveconventioncome"ket"o"vector", a seconda dei casi:import math from qiskit.quantum_info import Statevector sv = Statevector([math.sqrt(0.5), 0, 0, -math.sqrt(0.5)]) sv.draw("latex", convention="ket") sv.draw("latex", convention="vector") -
Aggiunto un nuovo passaggio di transpiler
EchoRZXWeylDecompositionche consente agli utenti di decomporre un gate arbitrario a due-qubit in termini di gate RZX riecheggiati, sfruttando la decomposizione di Cartan. In combinazione con altri passaggi del transpiler, questo può essere usato per transpilare circuiti arbitrari in circuiti basati su porte RZX ed efficienti dal punto di vista degli impulsi che implementano lo stesso unitario. -
Il
SPSAeQNSPSAsono ora in grado di raggruppare il maggior numero possibile di valutazioni dei circuiti sia per le iterazioni che per le calibrazioni iniziali. Questo può essere sfruttato impostando il kwargmax_evals_groupedsul costruttore diVQEquando si usaSPSAoQNSPSAcome parametrooptimizer. Ad esempio:from qiskit.circuit.library import TwoLocal from qiskit.algorithms import VQE from qiskit.algorithms.optimizers import QNSPSA from qiskit.test.mock import FakeMontreal backend = FakeMontreal() ansatz = TwoLocal(2, rotation_blocks=["ry", "rz"], entanglement_blocks="cz") qnspsa = QNSPSA(fidelity, maxiter=5) vqe = VQE( ansatz=ansatz, optimizer=qnspsa, max_evals_grouped=100, quantum_instance=backend, ) -
Questa versione introduce un metodo di decomposizione per porte a due qubit che si rivolge a insiemi di porte RZX definiti dall'utente. Gli utenti del transpiler possono abilitare la decomposizione per {
RZX(pi/2),RZX(pi/4), andRZX(pi/6)} includendo'rzx'nell'elenco dibasis_gatesquando si chiamatranspile(). Gli utenti del pacchetto informazioni Quantum possono trovare il metodo stesso sotto la voceXXDecomposerclasse. -
Aggiunto un transpiler pass
Optimize1qGatesSimpleCommutationche ottimizza un circuito secondo una strategia di commutazione di porte a singolo qubit per scoprire opportunità di risintesi. -
Aggiunto un parametro
max_job_triesaQuantumInstanceper limitare il numero di volte in cui un lavoro tenterà di essere eseguito su un backend. In precedenza, l'invio e il recupero dei risultati venivano tentati all'infinito, anche se il lavoro veniva annullato o veniva interrotto dal backend. Il valore predefinito è ora 50 e il comportamento precedente può essere ottenuto impostandomax_job_tries=-1. Correzioni #6872 e #6821. -
Il metodo di uscita
latexper la funzionecircuit_drawer()e il metodoQuantumCircuit.draw()possono ora disegnare circuiti che contengono porte con condizioni a singolo bit. Questo è stato aggiunto per la compatibilità del cassetto Latex con la nuova caratteristica di supportare il condizionamento classico delle porte su singoli bit classici. -
Il metodo di uscita
"mpl"per la funzionecircuit_drawer()e il metodoQuantumCircuit.draw()possono ora disegnare circuiti che contengono porte con condizioni a singolo bit. Questo è stato aggiunto per la compatibilità del cassetto"mpl"con la nuova caratteristica di supportare il condizionamento classico delle porte su singoli bit classici. -
Il metodo di uscita
textper la funzionecircuit_drawer()e il metodoQuantumCircuit.draw()possono ora disegnare circuiti che contengono porte con condizioni a singolo bit. Questo è stato aggiunto per la compatibilità del cassetto di testo con la nuova funzione di supporto del condizionamento classico delle porte su singoli bit classici. -
È stato aggiunto un nuovo passaggio del transpiler di analisi,
GatesInBasisè stato aggiunto aqiskit.transpiler.passes. Questo passaggio viene utilizzato per verificare se l'oggettoDAGCircuitin fase di trasposizione abbia o meno tutte le porte dell'insieme di basi configurato. L'attributo"all_gates_in_basis"del set di proprietà verrà impostato suTruese tutti i cancelli del set di base configurato sono presenti nel set di base configurato, oppure su in caso contrarioDAGCircuitsono nell'insieme di base configurato oFalsese non lo sono. Ad esempio:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import GatesInBasis # Instatiate Pass basis_gates = ["cx", "h"] basis_check_pass = GatesInBasis(basis_gates) # Build circuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() # Run pass on circuit property_set = {} basis_check_pass(circuit, property_set=property_set) assert property_set["all_gates_in_basis"] -
Aggiunti due nuovi metodi costruttori,
from_heavy_hex()efrom_heavy_square()alla classeCouplingMapalla classe. Questi metodi del costruttore vengono utilizzati per creare un grafoCouplingMapche sono un grafo esagonale pesante o un grafo quadrato pesante come descritto in Chamberland et al., 2020.Ad esempio:
from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_hex(5) cmap.draw()from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_square(5) cmap.draw() -
L'algoritmo
HHLpuò ora trovare soluzioni quando la matrice ha autovalori negativi. Per consentire ciò, l'algoritmo aggiunge un qubit in più per rappresentare il segno del valore e l'algoritmo helper è stato aggiornato per elaborare questa nuova informazioneExactReciprocalè stato aggiornato per elaborare questa nuova informazione. Per maggiori dettagli, vedere il numero #6971. -
Aggiunte due nuove classi,
CompleteMeasFittereTensoredMeasFitteral moduloqiskit.utils.mitigationmodulo. Queste classi possono essere utilizzate solo come valori per il kwargmeasurement_error_mitigation_clsdella classeQuantumInstancedella classe. L'istanziazione e l'uso di queste classi (o di qualsiasi altra cosa inqiskit.utils.mitigation) al di fuori del kwargmeasurement_error_mitigation_clsdevono essere considerati come un'API privata interna e non devono essere utilizzati. -
La
ListOpinqiskit.opflowha ora un attributocoeffsche restituisce un elenco dei coefficienti della lista di operatori, con il coefficiente complessivo (ListOp.coeff) distribuito in modo moltiplicativo nell'elenco. Si noti cheListOppossono essere annidati (contenuti inoplistdi un oggettoListOp) e in questi casi viene sollevata un'eccezione se viene richiamato il metodo coeffs. Il metodoListOp.coeffssi confronta opportunamente con il metodo di proprietàcoeffsdella classe non nidificataPauliSumOpnon nidificante. -
La classe
Statevectorè ora sottoscrivibile. L'utente può ora recuperare l'ennesimo coefficiente in un fileStatevectorper indice comestatevec[n]. -
Aggiunto il metodo
Statevector.innerper calcolare i prodotti interni diStatevectoristanze. Ad esempio:statevec_inner_other = statevec.inner(other)restituirà il prodotto interno di
statevecconother. Mentrestatevecdeve essere unStatevector,otherpuò essere qualsiasi cosa che possa essere costruita in un oggettoStatevectorcome ad esempio un array Numpy. -
È stato aggiunto un nuovo parametro,
add_bits, aQuantumCircuit.measure_all(). Per impostazione predefinita è impostato suTrueper mantenere il comportamento precedente che prevedeva l'aggiunta di un nuovoClassicalRegisterdella stessa dimensione del numero di qubit per memorizzare le misure. Se impostato suFalse, le misure saranno memorizzate nei bit classici già esistenti. Ad esempio, se si crea un circuito con bit classici esistenti come:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(2) cr = ClassicalRegister(2, "meas") circuit = QuantumCircuit(qr, cr)la chiamata a
circuit.measure_all(add_bits=False)utilizzerà il registro classico esistentecrcome target di uscita degli oggettiMeasurementaggiunti al circuito. -
ParameterExpressionora delega le conversioni numeriche alla libreria simbolica sottostante, anche se ci sono parametri potenzialmente non vincolati. Ciò consente di convertire espressioni come:>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> float(x - x + 2.3) 2.3dove l'espressione sottostante ha un valore fisso, ma il parametro
xnon è ancora vincolato. -
Aggiunto un metodo
Optimizer.minimize()a tutti gli ottimizzatori:Optimizere alle classi derivate. Questo metodo imita la firma della funzione SciPy’sminimize()e restituisce un oggettoOptimizerResult.Per esempio
import numpy as np from qiskit.algorithms.optimizers import COBYLA def loss(x): return -(x[0] - 1) ** 2 - (x[1] + 1) ** 3 initial_point = np.array([0, 0]) optimizer = COBYLA() result = optimizer.minimize(loss, initial_point) optimal_parameters = result.x minimum_value = result.fun num_function_evals = result.nfev -
Aggiunto un
PauliEvolutionGatealla libreria dei circuiti (qiskit.circuit.library) che definisce un gate che esegue l'evoluzione temporale di (somme o somme di)Paulis. La sintesi di questo gate viene eseguita daEvolutionSynthesised è disaccoppiata dal gate stesso. I metodi di sintesi attualmente disponibili sono:LieTrotter: Trotterizzazione del primo ordineSuzukiTrotter: Trotterizzazione di ordine superioreMatrixExponential: evoluzione esatta e matriciale
Ad esempio:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparsePauliOp from qiskit.synthesis import SuzukiTrotter operator = SparsePauliOp.from_list([ ("XIZ", 0.5), ("ZZX", 0.5), ("IYY", -1) ]) time = 0.12 # evolution time synth = SuzukiTrotter(order=4, reps=2) evo = PauliEvolutionGate(operator, time=time, synthesis=synth) circuit = QuantumCircuit(3) circuit.append(evo, range(3)) -
È stata introdotta una nuova funzione
plot_coupling_map()è stata introdotta, che estende la funzionalità della funzione esistenteplot_gate_map()accettando tre parametri:num_qubit,qubit_coordinates, ecoupling_map(invece dibackend), per consentire di tracciare una mappa di accoppiamento di qubit arbitraria. -
Qiskit Terra ha ora il supporto iniziale per la serializzazione di
QuantumCircuita OpenQASM 3 :from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) print(qasm3.dumps(qc))Questa versione iniziale ha un supporto limitato per i registri denominati, le istruzioni incorporate di base (come misura, barriera e reset), le porte definite dall'utente, le istruzioni definite dall'utente (come subroutine) e i nuovi costrutti di flusso di controllo introdotti in questa versione:
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 import math composite_circ_qreg = QuantumRegister(2) composite_circ = QuantumCircuit(composite_circ_qreg, name="composite_circ") composite_circ.h(0) composite_circ.x(1) composite_circ.cx(0, 1) composite_circ_gate = composite_circ.to_gate() qr = QuantumRegister(2, "qr") cr = ClassicalRegister(2, "cr") qc = QuantumCircuit(qr, cr) with qc.for_loop(range(4)) as i: qc.rx(i * math.pi / 4, 0) qc.cx(0, 1) qc.barrier() qc.append(composite_circ_gate, [0, 1]) qc.measure([0, 1], [0, 1]) print(qasm3.dumps(qc)) -
La
QDriftè stata riformulata come un metodo di sintesi perPauliEvolutionGatederivante daTrotterizationBase.from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.synthesis import QDrift from qiskit.opflow import X, Y, Z qdrift = QDrift(reps=2) operator = (X ^ 3) + (Y ^ 3) + (Z ^ 3) time = 2.345 # evolution time evolution_gate = PauliEvolutionGate(operator, time, synthesis=qdrift) circuit = QuantumCircuit(3) circuit.append(evolution_gate, range(3)) -
La serializzazione QPY è ora in grado di rappresentare
global_phaseattributi di unQuantumCircuitche sono un oggettoint,Parameteroggetto oParameterExpressionoggetto. Le versioni precedenti di QPY accettavano solo un fileglobal_phaseche fosse unfloat.Ciò richiede il formato QPY versione 2, introdotto in questa versione per rappresentare i tipi aggiuntivi.
-
Un nuovo
find_bit()è stato aggiunto alla classeQuantumCircuitche consente di ricercare l'indice e i registri di un dato circuitoBitsul circuito dato. Il metodo restituisce unnamedtuplea due elementi che contiene 0) l'indice diBitin una delle due sezioni diqubits(per un elementoQubit) oclbits(per aClbit) e 1) un elenco di tuple length-2 contenenti ogni circuitoRegisterche contiene il circuitoBite l'indice di quelRegisterin cui si trova il circuitoBit.Ad esempio:
from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit reg1 = QuantumRegister(3, 'foo') qubit = Qubit() reg2 = QuantumRegister(2, 'bar') qc = QuantumCircuit(reg1, [qubit], reg2) print(qc.find_bit(reg1[2])) print(qc.find_bit(qubit))genererebbe:
BitLocations(index=2, registers=[(QuantumRegister(3, 'foo'), 2)]) BitLocations(index=3, registers=[]) -
Tre nuove
Instructionsono state aggiunte per supportare le operazioni di flusso di controllo nei circuiti dinamici:WhileLoopOp,ForLoopOp, eIfElseOp. Inoltre, due sottoclassi,BreakLoopOpeContinueLoopOpsono state aggiunte per supportare rispettivamente l'interruzione e la continuazione dell'iterazione successiva di un contesto di ciclo.Questi possono essere creati come elementi a sé stanti o
Instructiono aggiungere a un'istanzaQuantumCircuittramite i rispettivi metodi,QuantumCircuit.while_loop(),for_loop(),if_test(),if_else(),break_loop(), econtinue_loop(). -
Aggiunta la
BaseReadoutMitigatorclasse base astratta per l'implementazione di attenuatori di errori di misura classici. Questi oggetti sono destinati alla mitigazione degli errori di misura inCountsoggetti restituiti dall'esecuzione di circuiti su backend con errori di misura.Le classi di mitigatori di lettura hanno due metodi principali:
expectation_value()che calcola un valore di aspettativa attenuato e l'errore standard di un operatore diagonale da un oggetto rumorosoCountsoggetto.quasi_probabilities()che calcola un errore attenuatoQuasiDistribution, compreso l'errore standard, da un oggetto di conteggio rumoroso.
Si noti che attualmente il modulo
qiskit.algorithmse la classeQuantumInstanceutilizzano ancora i mitigatori legacy migrati da Qiskit Ignis inqiskit.utils.mitigation. Si prevede di aggiornare il modulo per utilizzare le nuove classi di mitigazione e di deprecare il codice di mitigazione precedente in una versione futura. -
È stata aggiunta la classe
LocalReadoutMitigatorper eseguire la mitigazione degli errori di lettura degli errori di misura locali. Gli errori di misura locali sono quelli descritti da un prodotto tensoriale di errori di misura a singolo qubit.Questa classe può essere inizializzata con un elenco di single-qubit di matrici di assegnazione dell'errore di misura o da un backend utilizzando le informazioni sull'errore di lettura nelle proprietà del backend.
La mitigazione è implementata utilizzando l'inversione della matrice di assegnazione locale che ha una complessità di per -qubit mitigazione di
QuasiDistributione valori di aspettativa. -
Aggiunta la classe
CorrelatedReadoutMitigatorper eseguire la mitigazione degli errori di lettura delle misure correlate. Questa classe può essere inizializzata con una singola matrice di assegnazione degli errori di misura che descrive le probabilità di errore. La mitigazione è implementata tramite l'inversione della matrice di assegnazione che ha una complessità di mitigazione pari a diQuasiDistributione valori di aspettativa. -
Aggiunto un attributo
QuasiDistribution.stddev_upper_bounde un kwarg al costruttore della classeQuasiDistributionutilizzata per memorizzare gli errori standard nelle stime di quasi-probabilità. Viene utilizzato dalleBaseReadoutMitigatorper memorizzare l'errore standard nelle quasi-probabilità attenuate. -
Aggiunto un metodo
shots()aqiskit.result.Countsper restituire la somma di tutti i risultati nei conteggi. -
Durante l'esecuzione dell'algoritmo
Groverse la potenza ottimale è nota e viene eseguito un solo circuito, non è più necessario impostare la funzione di callback e la ricerca di Grover restituirà la stringa di bit più probabileAmplificationProblem.is_good_statenon deve più essere impostata e la ricerca di Grover restituirà la stringa di bit più probabile. In genere, se la potenza ottimale dell'operatore di Grover non è nota, l'algoritmo verifica diverse potenze (cioè iterazioni) e applica la potenza ottimale dell'operatore di GroverGroveralgoritmo controlla diverse potenze (cioè iterazioni) e applica la funzione diis_good_stateper verificare se è stata misurata una buona stringa di bit. Ad esempio, ora è possibile eseguire qualcosa come:from qiskit.algorithms import Grover, AmplificationProblem from qiskit.providers.aer import AerSimulator from qiskit.quantum_info import Statevector # Fixed Grover power: 2. grover = Grover(iterations=2, quantum_instance=AerSimulator()) # The ``is_good_state`` argument not required here since Grover search # will be run only once, with a power of 2. problem = AmplificationProblem(Statevector.from_label("111")) # Run Grover search and print the best measurement result = grover.amplify(problem) print(result.top_measurement) # should print 111 -
Aggiunto il metodo
remove_cregs()alla classeDAGCircuitper supportare la rimozione del registro classico. -
Aggiunto il metodo
remove_clbits()alla classeDAGCircuitper supportare la rimozione dei bit classici inattivi. Vengono rimossi anche tutti i registri classici che fanno riferimento a un bit rimosso. -
Aggiunto un nuovo metodo,
replace_block_with_op()alla classeDAGCircuitalla classe. Questo metodo viene utilizzato per sostituire un blocco di nodi nel DAG con una singola operazione. L'esempio canonico è quello del passaggioConsolidateBlocksche sostituisce blocchi di nodi con nodi equivalentiUnitaryGate. -
Aggiunto un nuovo passaggio del transpiler di analisi,
Collect1qRunsal moduloqiskit.transpiler.passesal modulo. Questo passaggio viene utilizzato per trovare sequenze di porte ininterrotte che agiscono su un singolo qubit. È simile a quello diCollect2qBlockseCollectMultiQBlocksma è ottimizzato per le corse a singolo qubit invece che per i blocchi a qubit multipli. -
Diverse funzioni interne di transpilazione utilizzano ora le nuove caratteristiche di retworkx 0.10 quando operano sulla rappresentazione del circuito interno. Questo può spesso portare a una velocizzazione delle chiamate a
transpiledi circa il 10-40%, con effetti maggiori a livelli di ottimizzazione più elevati. Per maggiori dettagli, vedere il numero 6302. -
Il
UnitarySynthesistranspiler pass inqiskit.transpiler.passesha un nuovo kwarg nel costruttore,min_qubits. Se specificato, può essere impostato su un valoreintche rappresenta la dimensione minima dell'oggettoUnitaryGatesu cui eseguire la sintesi unitaria. Se unUnitaryGatein unQuantumCircuitutilizza un numero inferiore di qubit, verrà saltato da quell'istanza del passaggio. -
Le interfacce
EigensolvereMinimumEigensolversupportano ora il tipoDict[str, Optional[OperatorBase]]per il parametroaux_operatorsnei rispettivi metodicompute_eigenvalues()ecompute_minimum_eigenvalue(). In questo caso, anche gli autovalori ausiliari sono memorizzati in un dizionario con le stesse chiavi fornite dal dizionarioaux_operators. I tasti che corrispondono a un operatore che non commuta con l'operatore principale vengono eliminati. -
Il
BasisTranslator,GateDirection, eCheckGateDirectionhanno un nuovo kwargtargetnei loro costruttori, che può essere usato per impostare un oggettoTargetcome destinazione del passaggio. Se è impostata, verrà utilizzata al posto ditarget_basis(nel caso delBasisTranslatorocoupling_map(nel caso dei passaggiGateDirectioneCheckGateDirection). -
Consentire due stadi di transpiler nel
QuantumInstanceuno per i circuiti parametrizzati e un secondo per i circuiti vincolati (cioè senza parametri liberi). Se un'istanza quantistica con passaggi per circuiti non vincolati e vincolati viene passata in una classe di campionamentoCircuitSampleril campionatore cercherà di applicare il passaggio non vincolato una sola volta al circuito parametrizzato, lo memorizzerà e applicherà solo il passaggio vincolato per tutte le valutazioni future.Ciò consente agli algoritmi variazionali come il
VQEdi eseguire una volta un gestore di passaggi personalizzato per i circuiti parametrizzati e, in aggiunta, di eseguire nuovamente il transpiler con un gestore di passaggi personalizzato diverso sui circuiti vincolati in ogni iterazione. La possibilità di eseguire diversi gestori di passaggi è importante perché non tutti i passaggi supportano circuiti parametrizzati (per esempioOptimize1qGatesDecompositionfunziona solo con i parametri dei circuiti vincolati).Ad esempio, questa caratteristica consente di utilizzare la decomposizione CX a efficienza di impulso nella VQE, come
from qiskit.algorithms import VQE from qiskit.opflow import Z from qiskit.circuit.library.standard_gates.equivalence_library import StandardEquivalenceLibrary as std_eqlib from qiskit.transpiler import PassManager, PassManagerConfig, CouplingMap from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.transpiler.passes import ( Collect2qBlocks, ConsolidateBlocks, Optimize1qGatesDecomposition, RZXCalibrationBuilderNoEcho, UnrollCustomDefinitions, BasisTranslator ) from qiskit.transpiler.passes.optimization.echo_rzx_weyl_decomposition import EchoRZXWeylDecomposition from qiskit.test.mock import FakeBelem from qiskit.utils import QuantumInstance # Replace by a real backend! If not ensure qiskit-aer is installed to simulate the backend backend = FakeBelem() # Build the pass manager for the parameterized circuit rzx_basis = ['rzx', 'rz', 'x', 'sx'] coupling_map = CouplingMap(backend.configuration().coupling_map) config = PassManagerConfig(basis_gates=rzx_basis, coupling_map=coupling_map) pre = level_1_pass_manager(config) # Build a pass manager for the CX decomposition (works only on bound circuits) post = PassManager([ # Consolidate consecutive two-qubit operations. Collect2qBlocks(), ConsolidateBlocks(basis_gates=['rz', 'sx', 'x', 'rxx']), # Rewrite circuit in terms of Weyl-decomposed echoed RZX gates. EchoRZXWeylDecomposition(backend), # Attach scaled CR pulse schedules to the RZX gates. RZXCalibrationBuilderNoEcho(backend), # Simplify single-qubit gates. UnrollCustomDefinitions(std_eqlib, rzx_basis), BasisTranslator(std_eqlib, rzx_basis), Optimize1qGatesDecomposition(rzx_basis), ]) quantum_instance = QuantumInstance(backend, pass_manager=pre, bound_pass_manager=post) vqe = VQE(quantum_instance=quantum_instance) result = vqe.compute_minimum_eigenvalue(Z ^ Z) -
È stata introdotta una nuova interfaccia per i plugin di sintesi unitaria, utilizzata per consentire l'utilizzo di tecniche di sintesi alternative incluse in pacchetti esterni senza soluzione di continuità con il passaggio di
UnitarySynthesistranspiler. Gli utenti possono selezionare un plugin da utilizzare quando chiamanotranspile()impostando il kwargunitary_synthesis_methodsul nome del plugin. L'elenco completo dei plugin installati può essere consultato utilizzando la funzioneqiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names()funzione. Ad esempio, se si installa un pacchetto che include un plugin di sintesi chiamatospecial_synth, lo si può utilizzare con:from qiskit import transpile transpile(qc, unitary_synthesis_method='special_synth', optimization_level=3)Questo sostituirà tutti gli usi del metodo
UnitarySynthesiscon il metodo incluso nel pacchetto esterno che esporta il pluginspecial_synth.L'interfaccia dei plugin è costruita intorno a punti di ingresso setuptools che consentono ai pacchetti esterni a Qiskit di pubblicizzare l'inclusione di un plugin di sintesi. Per i dettagli sulla scrittura di un nuovo plugin, consultare la documentazione del modulo
qiskit.transpiler.passes.synthesis.plugindel modulo. -
Aggiunto un nuovo passaggio di transpiler,
VF2Layout. Questo passaggio modella il problema dell'allocazione del layout come un problema di isomorfismo dei sottografi e utilizza l'implementazione dell' algoritmo VF2 in rustworkx per trovare un layout perfetto (un layout che non richieda instradamenti aggiuntivi), se ne esiste uno. La funzionalità esposta da questo nuovo pass è molto simile a quella esistenteCSPLayoutmaVF2Layoutè significativamente più veloce.
Problemi noti
-
La convenzione
"ket"nel cassetto"latex"diStatevector.draw()è valida solo per gli stati composti esclusivamente da qubit. Se si utilizzano stati con spazi di dimensione superiore a due, è necessario passareconvention="vector", oppure utilizzare un cassetto diverso. -
Le funzionalità di esportazione di OpenQASM 3 sono in fase beta e alcune caratteristiche di Qiskit Terra non sono ancora supportate
QuantumCircuitnon sono ancora supportate. In particolare, si possono verificare errori se si cerca di esportare subroutine personalizzate con parametri classici, e non è ancora prevista l'esportazione di operazioni calibrate a impulsi in OpenPulse. -
Quando si esegue il programma
BasisTranslatorin isolamento con l'argomentotargetimpostato su un oggettoTargetin cui alcune porte a singolo qubit possono essere applicate solo a insiemi non sovrapposti di qubit, il circuito di uscita potrebbe includere erroneamente operazioni su un qubit non consentite dall'oggettoTarget. Ad esempio, se si è eseguito:from qiskit.circuit import QuantumCircuit, Parameter from qiskit.circuit.library import UGate, RZGate, XGate, SXGate, CXGate from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel from qiskit.transpiler import PassManager, Target, InstructionProperties from qiskit.transpiler.passes import BasisTranslator gmap = Target() # U gate in qubit 0. theta = Parameter('theta') phi = Parameter('phi') lam = Parameter('lambda') u_props = { (0,): InstructionProperties(duration=5.23e-8, error=0.00038115), } gmap.add_instruction(UGate(theta, phi, lam), u_props) # Rz gate in qubit 1. phi = Parameter("phi") rz_props = { (1,): InstructionProperties(duration=0.0, error=0), } gmap.add_instruction(RZGate(phi), rz_props) # X gate in qubit 1. x_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(XGate(), x_props) # SX gate in qubit 1. sx_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(SXGate(), sx_props) cx_props = { (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115), (1, 0): InstructionProperties(duration=4.52e-7, error=0.00132115), } gmap.add_instruction(CXGate(), cx_props) bt_pass = BasisTranslator(sel, target_basis=None, target=gmap) qc = QuantumCircuit(2) qc.iswap(0, 1) output = bt_pass(qc)outputavràRZGateeSXGatesul qubit 0, anche se ciò è proibito. Per correggere questo problema si può normalmente eseguire il traduttore di basi una seconda volta (ad es.output = bt_pass(output)nell'esempio precedente) per correggere questo problema. Questo non dovrebbe influire sull'output dell'esecuzione della funzionetranspile()ed è un problema solo se si esegue il passaggio da solo.
Note sull'aggiornamento
-
A partire da questa versione,
from qiskit import *non importerà i sottomoduli, ma solo un elenco selezionato di oggetti. Questo potrebbe interrompere il codice esistente che utilizzafrom qiskit import *e fa riferimento a oggetti che non fanno parte dello spazio dei nomi corrente. Come promemoria,import *è considerato una cattiva pratica e non dovrebbe essere usato nel codice di produzione. Qiskit imposta__all__suqiskit/__init__.pycome un modo per mitigare gli effetti di queste cattive pratiche. Se il codice sollevaname '<something>' is not defined, aggiungerefrom qiskit import <something>e riprovare. -
I gestori dei passaggi preimpostati per i livelli di ottimizzazione 0, 1, 2 e 3, generati da
level_0_pass_manager(),level_1_pass_manager(),level_2_pass_manager(), elevel_3_pass_manager()rispettivamente, non eseguiranno più incondizionatamente l'opzioneTimeUnitConversion. In precedenza, i gestori dei passaggi preimpostati eseguivano sempre questo passaggio, indipendentemente dagli ingressi del transpiler e del circuito. Ora questo passaggio verrà eseguito solo se è impostato il parametroscheduling_methodo se il circuito contiene un'istruzione e il parametro è impostatoDelaye il parametroinstruction_durationsè impostato. Questa modifica è stata apportata nell'interesse delle prestazioni di runtime, in quanto in alcuni casi l'esecuzione su circuiti con un gran numero di gate e senza l'utilizzo di ritardi o schedulazionitranspile()su circuiti con un gran numero di porte e senza l'utilizzo di ritardi, temporizzazioni o schedulazioniTimeUnitConversionpotrebbe essere il più grande collo di bottiglia nella trasposizione. -
Il metodo predefinito per
BIPMappingè orabalancedanzichédepth. Questo nuovo obiettivo ottiene generalmente un risultato migliore, in quanto tiene conto sia della profondità del circuito che dell'errore del gate. -
Il sito
sort_parameters_by_namedella classeVQEè stata rimossa, in seguito alla sua deprecazione in Qiskit Terra 0.18. Non ci sono alternative, poiché il nuovo ordine dei parametri è l'ordine più naturale. -
I cassetti del circuito
QuantumCircuit.draw()ecircuit_drawer()con l'opzionelatexsalveranno ora le loro immagini in un formato che determina l'estensione del file (se viene fornito un nome di file). In precedenza, venivano sempre salvati in formato PNG. Ora sollevanoValueErrorse il formato dell'immagine non è noto. Ciò è stato fatto per facilitare il salvataggio dell'immagine in diversi formati. -
La dipendenza del nucleo
retworkxha avuto il suo requisito di versione spostato a 0.10.1, da 0.9. Ciò consente di migliorare le prestazioni in diversi passaggi di transpilazione. -
Il kwarg
condition, precedentemente deprecato con la release 0.15.0, è stato rimosso daDAGCircuit.apply_operation_back()eDAGCircuit.apply_operation_front(). Impostare invece l'attributoconditionsulle istanzeInstructionche viene aggiunto al fileDAGCircuitutilizzandoInstruction.c_if(). -
Il metodo
DAGCircuit.extend_back()è stato rimosso. È stato originariamente deprecato nella versione 0.13.0. Si può invece utilizzare il metodoDAGCircuit.compose()che è più generale e fornisce la stessa funzionalità. -
Il metodo
DAGCircuit.compose_back()è stato rimosso. È stato originariamente deprecato nella versione 0.13.0. Si può invece utilizzare il metodoDAGCircuit.compose()che è più generale e fornisce la stessa funzionalità. -
Il kwarg
edge_mapdel metodoDAGCircuitdel metodocompose()è stato rimosso. È stato originariamente deprecato nella versione 0.14.0. Il metodo prende unqubitseclbitskwargs per specificare l'ordine posizionale dei bit da comporre, invece di usare una mappatura del dizionario cheedge_mapforniva in precedenza. -
Il metodo
DAGCircuit.twoQ_gates()è stato rimosso. È stato originariamente deprecato nella versione 0.13.0. Invece,DAGCircuit.two_qubit_ops()dovrebbe essere utilizzato. -
Il metodo
DAGCircuit.threeQ_or_more_gates()è stato rimosso. È stato originariamente deprecato nella versione 0.13.0. Invece,DAGCircuit.multi_qubit_ops()deve essere utilizzato il metodo -
L'accesso con nome per il primo argomento posizionale del costruttore della classe
SingleQubitUnitaryconuè stato rimosso. È stato originariamente deprecato nella versione 0.14.0. Invece, il primo argomento posizionale può essere impostato usando il nomeunitary_matrix(o semplicemente impostandolo in modo posizionale invece che per nome). -
Accesso con nome per il primo argomento posizionale del metodo
QuantumCircuitmetodosquconuè stato rimosso. È stato originariamente deprecato nella versione 0.14.0. Invece il primo argomento posizionale può essere impostato usando il nomeunitary_matrix(o semplicemente impostandolo in modo posizionale invece che per nome). -
Sono stati rimossi i kwarg non utilizzati di
procenested_scopeper il metodoqasm()delle classi di nodi QASM nel moduloqiskit.qasm.node. Sono stati originariamente deprecati nella versione 0.15.0. -
Sono stati rimossi i kwarg non utilizzati di
procenested_scopeper il metodolatex()delle classi di nodi QASM nel moduloqiskit.qasm.node. Sono stati originariamente deprecati nella versione 0.15.0. -
Sono stati rimossi i kwarg non utilizzati di
procenested_scopeper il metodoreal()delle classi di nodi QASM nel moduloqiskit.qasm.node. Sono stati originariamente deprecati nella versione 0.15.0. -
L'output di
Statevector.draw()quando si usa l'uscita"latex"è ora la nuova convenzione"ket"se si traccia uno stato composto esclusivamente da qubit. Questa modifica è stata apportata per rendere più chiara la lettura dell'output, soprattutto in contesti educativi, perché mostra le etichette dei ket e visualizza solo gli elementi non nulli. -
Quando si corre
execute()con unBackendV1i valori predefiniti per i kwargshots,max_credits,meas_level,meas_returnememory_slot_sizesaranno ora quelli impostati nell'attributo del backend di destinazioneoptionsdel backend di destinazione. In precedenza questi valori predefiniti erano impostati in modo da corrispondere ai valori predefiniti quando si chiamavaexecute()con un backend legacyBaseBackend. Ad esempio:from qiskit.test.mock import FakeMumbai from qiskit import QuantumCircuit, execute circuit = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() backend = FakeMumbai() backend.set_options(shots=4096) execute(qc, backend)funzionerà ora con gli scatti di
4096. Mentre nelle versioni precedenti veniva eseguito con1024. -
La versione minima supportata di Matplotlib è stata aumentata da 2.1.0 a 3.3.0. A questo punto è necessario che sia installato Matplotlib 3.3.0 se si utilizzano funzioni di visualizzazione basate su Matplotlib, come il backend
'mpl'per la funzionecircuit_drawer()o per la funzioneplot_bloch_vector()funzione. Questo è stato fatto per due motivi: il primo è che le versioni recenti di Matplotlib hanno deprecato l'uso delle API per le visualizzazioni di 3D che erano compatibili con le versioni precedenti e, in secondo luogo, l'installazione di versioni precedenti di Matplotlib stava diventando sempre più difficile, dato che le dipendenze upstream di matplotlib hanno causato incompatibilità che hanno reso più difficili i test. -
L'uso interno del generatore di numeri casuali in
random_circuit()è stato modificato, il che cambierà l'output rispetto alle versioni precedenti, anche con un seme fisso. Ciò è stato fatto per migliorare notevolmente la scalabilità del tempo di esecuzione con il numero di qubit utilizzati. Se si dipendeva da un risultato identico di una versione precedente, si raccomanda di usareqpy_serialization.dump()per salvare il circuito casuale generato con una versione precedente e invece di rigenerarlo con la nuova versione, e di usareqpy_serialization.load()per caricare il circuito salvato. -
L'uso di
*(__mul__) per il metododot()e@(__matmul__) per il metodocompose()diBaseOperator(che è il genitore di tutte le classi di operatori inqiskit.quantum_infocomprese le classi comeOperatorePauli) non è più supportato. L'uso di questi operatori è stato precedentemente deprecato nella versione 0.17.0. Si devono invece usare i simbolidot()ecompose()oppure si può usare l'operatore&(__and__) per i metodicompose(). Ad esempio, se in precedenza si utilizzava un operatore come:from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a @ op_bquesto dovrebbe essere cambiato in:
from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a.compose(op_b)oppure:
new_op = op_a & op_b -
Diversi metodi di assegnazione dei parametri agli operandi delle istruzioni del programma di impulsi sono stati eliminati, essendo stati deprecati in Qiskit Terra 0.17. Queste release includono:
- il metodo
assign()dipulse.Instruction. - il metodo
assign()diChannel, che è alla base diAcquireChannel,SnapshotChannel,MemorySloteRegisterSlot. - i metodi
assign()eassign_parameters()diParametricPulse, che è alla base dipulse.Gaussian,pulse.GaussianSquare,pulse.Dragepulse.Constant.
Questi parametri devono essere assegnati dal programma di impulsi (
pulse.Scheduleepulse.ScheduleBlock) piuttosto che operandi dell'istruzione del programma d'impulso. - il metodo
-
Il metodo
flatten()dipulse.Instructioneqiskit.pulse.Scheduleè stato rimosso e non esiste più come da avviso di deprecazione di Qiskit Terra 0.17. Questa trasformazione è definita come una funzione indipendente inqiskit.pulse.transforms.canonicalization.flatten(). -
qiskit.pulse.interfaces.ScheduleComponentè stato rimosso e non esiste più, come da avviso di deprecazione di Qiskit Terra 0.15. Non è prevista alcuna classe alternativa. -
Gli argomenti del cassetto degli impulsi sono stati rimossi da
pulse.Waveform.draw(),Schedule.draw()eScheduleBlock.draw()e non esistono più come da avviso di deprecazione di Qiskit Terra 0.16. Ora questi metodi di disegno supportano solo gli argomenti del cassetto a impulsi V2. Per maggiori dettagli, consultare la documentazione dei metodi. -
Il modulo
qiskit.pulse.rescheduleè stato rimosso e questo percorso di importazione non esiste più, come da avviso di deprecazione di Qiskit Terra 0.14. Utilizzareqiskit.pulse.transformsinvece. -
Un metodo protetto
Schedule._children()è stato rimosso e sostituito da una variabile di istanza protetta, come da avviso di deprecazione di Qiskit Terra 0.17. Questo è ora fornito come attributo pubblicoSchedule.children. -
I metodi e le proprietà relativi ai timeslot sono stati rimossi e non esistono più in
ScheduleBlockcome da avviso di deprezzamento di Qiskit Terra 0.17. Dal momento che questa rappresentazione non ha la nozione di tempo di istruzionet0, le informazioni sui timeslot saranno disponibili dopo la trasformazione in un file di tipo "a"Schedule. Gli attributi corrispondenti sono stati forniti dopo questa conversione, ma non sono più supportati. I seguenti attributi sono stati rimossi:timeslotsstart_timestop_timech_start_timech_stop_timeshiftinsert
-
Le trasformazioni della pianificazione degli impulsi di allineamento sono state rimosse e non esistono più, come da avviso di deprecazione di Qiskit Terra 0.17. Queste trasformazioni sono integrate e implementate nel contesto
AlignmentKinddel blocco di pianificazione. Le seguenti funzioni di trasformazione esplicite vengono eliminate:qiskit.pulse.transforms.align_equispacedqiskit.pulse.transforms.align_funcqiskit.pulse.transforms.align_leftqiskit.pulse.transforms.align_rightqiskit.pulse.transforms.align_sequential
-
I comandi ridondanti del costruttore di impulsi sono stati rimossi e non esistono più, come da avviso di deprecazione di Qiskit Terra 0.17.
pulse.builder.call_scheduleepulse.builder.call_circuitsono stati integrati inpulse.builder.call(). -
È stato rimosso un filtro interno che causava la visualizzazione di tutti gli avvisi di deprezzamento di Qiskit. Ciò significa che il comportamento tornerà a quello standard di Python per le deprecazioni; si dovrebbe vedere un
DeprecationWarningsolo se è stato attivato da codice nel file di script principale, nella sessione dell'interprete o nel taccuino Jupyter. L'utente non verrà più rimproverato con un avviso se le funzioni interne di Qiskit richiamano un comportamento deprecato. Se si scrivono librerie, di tanto in tanto si dovrebbe eseguire con i filtri di avviso predefiniti disabilitati, oppure avere dei test che vengono eseguiti sempre con essi disabilitati. Si veda la documentazione di Python sugli avvertimenti e in particolare la sezione sui test per le deprecazioni per maggiori informazioni su come farlo. -
Alcuni avvisi venivano emessi una sola volta, anche se attivati da più punti. Questo comportamento è stato rimosso, quindi è possibile che se si chiamano funzioni deprecate, si vedano più avvisi rispetto a prima. È necessario modificare tutte le chiamate di funzione deprecate con le versioni suggerite, perché i moduli deprecati saranno rimossi nelle future versioni di Qiskit.
-
Il modulo deprecato
qiskit.schemase il moduloqiskit.validation, che costruiva il validatore jsonschema dagli schemi, sono stati rimossi. Questo è stato deprecato nella versione 0.17.0 ed è stato sostituito da un repository dedicato per gli schemi dei payload dell'API IBM Quantum.Se ci si affidava ai file di schema precedentemente impacchettati in
qiskit.schemaso ai validatori costruiti su di essi, si deve usare quel repository e creare i validatori dai file di schema che contiene. -
Le funzioni
qiskit.qobj.validate_qobj_against_schemaeqiskit.qobj.common.validatorinsieme al kwargvalidatedei metodiQasmQobj.to_dict(),PulseQobj.to_dict(), eQobj.to_dict()sono stati rimossi. Questi sono stati deprecati nella versione 0.17.0. Se si utilizzano queste funzioni, è necessario costruire manualmente le funzioni di convalida jsonschema per gli oggettiQobj, utilizzando i file jsonschema dal repository dedicato agli schemi dei payload dell'API IBM Quantum. -
I pacchetti
fastjsonschemaejsonschemanon sono più presenti nell'elenco dei requisiti di qiskit-terra. L'uso interno di jsonschema è stato rimosso e non è più necessario utilizzare qiskit-terra. -
L'eccezione sollevata dalla funzione
assemble()quando vengono passati parametri non validi per la costruzione di un filePulseQobjè passata daSchemaValidationErroraQiskitError. Questo è stato necessario perché la classeSchemaValidationErrorè stata rimossa insieme al resto delle classi deprecateqiskit.schemaseqiskit.validation. Questo lo rende anche più coerente con le altre condizioni di errore diassemble()che già sollevavano un erroreQiskitError. -
Il passaggio di routing e il passaggio di layout predefiniti per il livello di ottimizzazione 3 del transpiler sono stati modificati in modo da usare
SabreSwapeSabreLayoutrispettivamente. Questo è stato fatto per migliorare la qualità del risultato in uscita, poiché l'uso dei passaggi a sciabola produce risultati migliori rispetto all'uso diStochasticSwapeDenseLayoutche erano utilizzati come predefiniti nelle versioni precedenti. Questa modifica migliorerà la qualità dei risultati durante l'esecuzione ditranspile()oexecute()con il kwargoptimization_levelimpostato su3. Sebbene questo sia generalmente un miglioramento, se per qualche motivo è necessario mantenere il comportamento precedente, è possibile farlo impostando esplicitamente i parametrirouting_method="stochastic"elayout_method="dense"quando si richiama il comandotranspile()conoptimization_level=3. -
Il tipo di ritorno di
pauli_basis()cambierà daPauliTableaPauliListin una futura versione di Qiskit Terra. Per passare immediatamente al nuovo comportamento, passare l'argomento parola chiavepauli_list=True. -
L'attributo
namedella classeSingleQubitUnitaryè stato modificato daunitaryasqu. Questo è stato necessario per evitare un conflitto con il nome della classeUnitaryGate, anch'essounitary, poiché i due gate non sono uguali e non hanno la stessa implementazione (e non possono essere usati in modo intercambiabile). -
La versione minima di Symengine richiesta per l'installazione è stata aumentata a 0.8.0. Questo è stato necessario per risolvere alcuni problemi con la gestione dei valori di
numpy.float16enumpy.float32quando si eseguebind()per vincolare i parametri in un fileParameterExpression. -
All'elenco dei requisiti è stato aggiunto un nuovo stivatore dipendente. È richiesto da qiskit-terra perché viene utilizzato per costruire l'interfaccia del plugin di sintesi unitaria.
Note di deprecazione
-
L'attributo
gatee il parametro di inizializzazione diqiskit.transpiler.passes.Decomposeè deprecato e sarà rimosso in una versione futura. Invece di questo singolo gate, si deve passare un elenco di nomi di gate al nuovo parametrogates_to_decompose. Questo è stato fatto perché il nuovo modulo consente di selezionare più di un gate come target di decomposizione, il che è più flessibile, e non richiede di rieseguire il passaggio più volte per decomporre un insieme di gate. -
C'è stata una significativa riorganizzazione del passaggio del transpiler per quanto riguarda le calibrazioni. I percorsi di importazione:
from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilder from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilderNoEchosono deprecati e saranno rimossi in una prossima versione. Il percorso di importazione:
from qiskit.transpiler.passes.scheduling.rzx_templates import rzx_templatesè anch'esso deprecato e sarà rimosso in una prossima versione. È necessario utilizzare i nuovi percorsi di importazione:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.transpiler.passes import RZXCalibrationBuilderNoEcho from qiskit.transpiler.passes.calibration.rzx_templates import rzx_templates -
La classe
DAGNodeviene deprecata come classe a sé stante e sarà utilizzata in futuro solo come classe genitore per le classiDAGOpNode,DAGInNode, eDAGOutNode. Come parte di questa deprecazione, i seguenti kwarg e attributi associati inDAGNodevengono anch'essi deprecati:type,op, ewire. -
Per il costruttore della classe
RZXCalibrationBuilderpassare un backend come primo parametro posizionale o con il kwargbackendè deprecato e non funzionerà più in una prossima versione. Invece unInstructionScheduleMapdovrebbe essere passato direttamente al kwarginstruction_schedule_mape un elenco di liste di nomi di canali per ogni qubit dovrebbe essere passato direttamente aqubit_channel_mapping. Ad esempio, se si chiama il passaggio come:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() cal_pass = RZXCalibrationBuilder(backend)invece si dovrebbe chiamare come:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() inst_map = backend.defaults().instruction_schedule_map channel_map = self.backend.configuration().qubit_channel_mapping cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, )Questa modifica è necessaria perché di norma gli oggetti del backend non sono serializzabili con pickle e si romperebbe quando viene usato con più processi all'interno di
transpile()quando si compilano più circuiti contemporaneamente. -
La proprietà
labeldella classeMCMTe sottoclasseMCMTVChainè stata deprecata e sarà rimossa in una prossima versione. Di conseguenza, anche il kwarglabeldel costruttore di entrambe le classi è deprecato, insieme al kwarglabeldel metodoMCMT.control(). Attualmente, la proprietàlabelviene utilizzata per denominare il target controllato quando è composto da più di un qubit target; tuttavia, questa proprietà non è mai stata pensata per essere specificabile dall'utente e può determinare un gate MCMT errato se viene utilizzato il nome di un'operazione nota. Dopo la deprecazione, la proprietàlabelnon sarà più specificabile dall'utente. Tuttavia, è possibile ottenere il nome generato della destinazione controllata tramiteMCMT.data[0][0].base_gate.name -
Il metodo
subgraph()della classeCouplingMapè deprecato e sarà rimosso in una prossima versione. Al posto del metodoreduce()che fa la stessa cosa, tranne che per il fatto che preserva l'ordine dell'elenco dei nodi per l'outputCouplingMap(mentresubgraph()non preserva l'ordine dell'elenco). -
La creazione di un'istanza di
InstructionSetcon l'argomento della parola chiavecircuit_cregsè deprecata. In generale, queste classi non devono mai essere costruite dagli utenti (ma sono usate internamente), ma se fosse necessario, si dovrebbe passare un callable come argomento della parola chiaveresource_requester. Ad esempio:from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet from qiskit.circuit.exceptions import CircuitError def my_requester(bits, registers): bits_set = set(bits) bits_flat = tuple(bits) registers_set = set(registers) def requester(specifier): if isinstance(specifer, Clbit) and specifier in bits_set: return specifier if isinstance(specifer, ClassicalRegster) and specifier in register_set: return specifier if isinstance(specifier, int) and 0 <= specifier < len(bits_flat): return bits_flat[specifier] raise CircuitError(f"Unknown resource: {specifier}") return requester my_bits = [Clbit() for _ in [None]*5] my_registers = [ClassicalRegister(n) for n in range(3)] InstructionSet(resource_requester=my_requester(my_bits, my_registers)) -
L'uso delle classi di attenuazione delle misure
qiskit.ignis.mitigation.CompleteMeasFittereqiskit.ignis.mitigation.TensoredMeasFitterdaqiskit-igniscome valori per il kwargmeasurement_error_mitigation_clsdel costruttore per la classeQuantumInstanceè deprecato e sarà rimosso in una prossima versione. Invece le classi equivalenti diqiskit.utils.mitigation,CompleteMeasFittereTensoredMeasFitterdovrebbero essere utilizzate. Questo si è reso necessario perché il progettoqiskit-ignisè ormai deprecato e non sarà più supportato nel prossimo futuro. Vale la pena notare che, a differenza delle classi equivalenti diqiskit-ignis, le versioni diqiskit.utils.mitigationsono supportate solo nel loro uso conQuantumInstance(cioè come classe e non come istanza con il kwargmeasurement_error_mitigation_cls) e non sono destinate a un uso indipendente. -
Il metodo
Optimizer.optimize()per tutti gli ottimizzatori (Optimizere classi derivate) è ora deprecato e sarà rimosso in una prossima versione. Si deve invece utilizzare il metodoOptimizer.minimize()che imita la firma della funzione SciPy’sminimize().Per sostituire l'attuale chiamata di ottimizzazione con quella di minimizzazione, si può sostituire
xopt, fopt, nfev = optimizer.optimize( num_vars, objective_function, gradient_function, variable_bounds, initial_point, )con
result = optimizer.minimize( fun=objective_function, x0=initial_point, jac=gradient_function, bounds=variable_bounds, ) xopt, fopt, nfev = result.x, result.fun, result.nfev -
L'importazione del modulo
qiskit.utilemetterà ora unDeprecationWarning. Gli utenti dovrebbero invece importare tutte le stesse funzionalità daqiskit.utils. Il moduloutilè stato deprecato da Terra 0.17, ma in precedenza non ha emesso alcun avviso. Verrà rimosso in Terra 0.20. -
La proprietà
tableè deprecata e sarà rimossa in una versione futura. Questo perchéSparsePauliOpè stato aggiornato per utilizzare internamentePauliListinvece diPauliTable. Questo per migliorare in modo significativo le prestazioni. Ora si dovrebbe accedere ai datiPauliListutilizzando l'attributoSparsePauliOp.paulis.
Correzioni di bug
-
È stato risolto un problema a causa del quale molti metodi di layout ignoravano le porte a 3 o più qubit, con conseguenti decisioni inattese sull'allocazione del layout. Il passaggio del transpiler
Unroll3qOrMoreviene ora eseguito prima del passaggio di layout in tutti i gestori di passaggi preimpostati quando viene chiamatotranspile()viene chiamato. Corretto #7156. -
I circuiti smontati ereditano ora le calibrazioni dei circuiti assemblati e degli esperimenti
QasmQobjed esperimenti. Correzioni #5348. -
Corretta l'impostazione degli attributi
ansatzooptimizerdi un'istanza a che comportava un comportamento anomaloVQEaNone, che comportava un comportamento difettoso. Per i dettagli, vedere il numero 7093. -
Corretta l'aggiunta di
PauliLists conqargs. Il metodo utilizzato per sollevare un errore di runtime se gli operandi hanno un numero diverso di qubit. -
Corretto un problema che causava un errore quando si cercava di calcolare un gradiente con la classe
CircuitGradientper un cancello che non era un cancello supportato. Questo bugfix trasporta un dato gate nell'insieme dei gate supportati per un metodo di gradiente richiesto. Correzioni #6918. -
Rimossi i risultati della calibrazione quando si utilizza la mitigazione degli errori con il metodo di
execute()metodo diQuantumInstance. Correzioni #7129. -
Corretto un avviso di deprecazione emesso quando si esegue il comando
QuantumCircuit.draw()ocircuit_drawer()con Sympy 1.9 installato, menzionando la funzione Sympyexpr_free_symbols(). I disegnatori di circuiti hanno utilizzato questo metodo per trovare istanze di costanti simboliche. -
È stato risolto un problema a causa del quale il kwarg di
axe l'opzionefigwidthnel kwarg distyleper il cassetto del circuitomplnon venivano scalati correttamente. Gli utenti possono ora passare unaxda una sottotrama Matplotlib al cassetto dei circuitimple il circuito verrà disegnato entro i confini della sottotrama. In alternativa, gli utenti possono impostarefigwidthin pollici nel dict kwarg distylee il disegno verrà scalato alla larghezza in pollici impostata. Corretto #6367. -
Corretto un problema con la funzione
circuit_drawer()e il metododraw()diQuantumCircuit. Quando si visualizza un'istruzionemeasuremirata a un bit classico invece che a un registro, utilizzando l'opzione del cassettolatex, il cassetto fallisce. -
Corretto un problema con la funzione
circuit_drawer()e il metododraw()diQuantumCircuit. Con una qualsiasi delle 3 opzioni di cassetto,mpl,latex, otext, se si incontra un gate con una condizione classica condizionata su un bit classico senza registro, il cassetto fallisce. -
Corretto un problema con la funzione
circuit_drawer()e il metododraw()diQuantumCircuit. Con una qualsiasi delle 3 opzioni di cassetto,mpl,latex, otext, se un cancello con una condizione classica fosse condizionato sullo stesso bit classico di unmeasuree il bit a cui la misura si rivolge non avesse un registro, il cassetto fallirebbe. -
C3SXGateha ora una decomposizione e una rappresentazione matriciale corretta. In precedenza equivaleva aSdgXGate().control(3), anziché al previstoSXGate().control(3). -
Il membro
namediqiskit.test.mock.utils.ConfigurableFakeBackendè stato cambiato inbackend_name. Questo è stato fatto per evitare un conflitto con il metodoname()ereditato dalla classe madre astrattaBackendV1genitore. Questo rendeConfigurableFakeBackendcompatibile con tutto ciò che si aspetta un oggettoBackendV1oggetto. Tuttavia, se prima si utilizzava direttamente l'attributoname, ora è necessario richiamarlo come metodo o accedere all'attributobackend_name. -
È stato risolto un problema per cui la chiamata
QuantumCircuit.decompose()su un circuito contenente un elementoInstructionil cui attributodefinitionera vuoto, lasciava l'istruzione al suo posto, invece di scomporla in zero operazioni. Ad esempio, con un circuito:from qiskit.circuit import QuantumCircuit empty = QuantumCircuit(1, name="decompose me!") circuit = QuantumCircuit(1) circuit.append(empty.to_gate(), [0])In precedenza, chiamando
circuit.decompose()non si cambiava il circuito. Ora, la decomposizione corretta decomporràemptyin zero istruzioni. Per saperne di più, vedere il numero 6997. -
Corretto un problema con la funzione
circuit_drawer()e il metododraw()diQuantumCircuit. Quando si visualizzava un'istruzionemeasurecontenente un classicoconditionutilizzando le opzionimplolatex, le informazioni diconditiona volte sovrascrivevano la visualizzazione dimeasure. -
Corretto un problema con la funzione
circuit_drawer()e il metododraw()diQuantumCircuit. Il cassettomplutilizza la notazione esadecimale per visualizzare il valore dicondition, mentre i cassettitextelatexutilizzano la notazione decimale. Ora tutti e tre i cassetti utilizzano la notazione esadecimale. -
Corretto un bug nel passaggio di transpilazione dell'ottimizzatore Hoare che poteva tentare di rimuovere due volte un cancello se poteva essere combinato separatamente con il suo predecessore e il suo successore per formare l'identità. Per maggiori dettagli, consultare il documento #7271.
-
La creazione di un'istruzione condizionale con il metodo standard
InstructionSet.c_if()con indici interi è ora coerente con lo schema di numerazione utilizzato dal sistema di istruzioniQuantumCircuitdi cui le istruzioni fanno parte. In precedenza, se c'erano dueClassicalRegistercon sovrapposizioni diClbitla numerazione sarebbe stata errata. Vedere #7246 per maggiori dettagli. -
La creazione di un'istruzione condizionale con il metodo standard
InstructionSet.c_if()avrà successo, anche se non ci sono istruzioniClassicalRegisternel circuito. Per maggiori dettagli, vedere il numero 7250. -
La creazione di un'istruzione condizionale con il metodo standard
InstructionSet.c_if()quando si utilizza un elementoClbitche è contenuto in un registroClassicalRegisterdi dimensione uno ora creerà correttamente una condizione sul bit, non sul registro. Vedere #7255 per maggiori dettagli. -
Il tentativo di rendere condizionale un'istruzione con il metodo standard
InstructionSet.c_if()ora solleva correttamente un errore se la risorsa classica non è presente nel circuito. Vedere #7255 per maggiori dettagli. -
È stato risolto un problema di compatibilità con Matplotlib 3.5, a causa del quale la sfera di Bloch non veniva renderizzata se aveva dei vettori collegati, come ad esempio usando
plot_bloch_vector. Per maggiori dettagli, vedere #7272. -
Corretto un problema con il metodo
NLocal.add_layer()aggiungeva erroneamente i livelli se l'oggettoNLocalera già stato costruito. -
Corretto un problema con il decapaggio dell'oggetto
InstructionScheduleMapquando si usa Python 3.6. Per i dettagli, vedere il numero #6944. -
È stata corretta l'assegnazione dei parametri degli impulsi a valore complesso con symengine. Ad esempio:
from qiskit import circuit, pulse import numpy as np amp = circuit.Parameter("amp") phase = circuit.Parameter("phase") with pulse.build() as sched: pulse.play(pulse.Gaussian(160, amp * np.exp(1j * phase), 40), pulse.DriveChannel(0)) sched.assign_parameters({amp: 0.1, phase: 1.57}, inplace=True)L'ampiezza assegnata è stata indicata come
ParameterExpression(0.1*exp(1.57*I))dopo l'introduzione dell'uso disymenginenella release 0.18.0. Ora viene valutato correttamente e mostrato come7.96327e-05 + 0.0999999683j. -
Corretto un problema per cui
QAOA.construct_circuit()con operatori diversi con lo stesso numero di qubit generava ogni volta lo stesso circuito. Per maggiori dettagli, vedere il numero 7223. -
È stato risolto un problema per cui
QAOAAnsatzaveva un numero errato di parametri se venivano fornite le identità diPauliSumOp, ad esempioPauliSumOp.from_list([("III", 1)]). Per maggiori dettagli, vedere il numero 7225. -
È stato risolto un problema per cui il metodo
QuantumCircuit.qasm()poteva restituire istruzioni OpenQASM 2 con identificatori non validi. Lo stesso bug è stato risolto perUnitaryGate. -
È stato risolto un problema a causa del quale il tentativo di visualizzare i bit senza registro causava un guasto a
mple ai cassetti del circuitolatex. È stato rimosso l'iniziale_dalla visualizzazione dei numeri dei bit senza registro nel cassettotext. Corretto #6732. -
Per i registri a un bit, tutti i cassetti dei circuiti visualizzano ora solo il nome del registro e non mostrano più il pedice
0. Corretto #5784. -
Corrette le collisioni di denominazione dei registri impliciti in
QuantumCircuit.qasmquando si tratta di qubit e clbit senza registro. In precedenza, i qubit e i clbit senza registro venivano inseriti nei corrispondentiqregecreg, entrambi chiamatiregless, nonostante la collisione. Ora avranno nomi separati, generati in modo deterministico, che non si scontreranno con i nomi dei registri definiti dall'utente nel circuito. -
È stato risolto un problema nella programmazione di circuiti con operazioni di clbits, ad esempio misure, porte condizionali, aggiornamenti, ecc
ASAPSchedule,ALAPSchedule, eAlignMeasures. Gli schedulatori aggiornati assumono che tutte le operazioni di I/O in clbit non richiedano tempo,measurescrive il valore misurato in un clbit alla fine ec_iflegge il valore condizionale in clbit all'inizio. Corretto #7006. -
La chiamata a
transpilesu un elenco vuoto ora restituisce correttamente un elenco vuoto senza emettere un avviso. Corretto #7287. -
Corretto un problema in
PiecewiseChebyshevquando la funzione da approssimare era costante. In questi casi, si deve passare la costante direttamente come argomento dif_x, invece di usare una funzione, come ad esempio:from qiskit.circuit.library.arithmetic import PiecewiseChebyshev PiecewiseChebyshev(1.0, degree=3)Per maggiori dettagli, vedere il numero 6707.
-
Se un'istanza dell'algoritmo
HHLè stata costruita senza un attributoQuantumInstance(il valore predefinito), i tentativi di usare le proprietà getter e setter per leggere o impostare un'istanza in seguito fallirebbero. I getter e i setter ora funzionano come previsto. -
Il metodo
QuantumCircuit.qasm()modifica ora i nomi delle copie delle istruzioni presenti nel circuito, non le istruzioni originali che vivono incircuit.data. Per maggiori dettagli, consultare il numero 6952. -
Corretto un bug in
PauliSumOp.permute()che causava un errore:QiskitError: 'Pauli string label "" is not valid.'se la permutazione avesse lo stesso numero di termini di Pauli. La chiamata a
permute([2, 1, 0])suX ^ Y ^ Znon genera più un errore e ora restituisceZ ^ Y ^ X. -
È stato risolto un problema a causa del quale i limiti dei parametri del mixer nell'opzione
QAOAAnsatznon venivano impostati. -
Determinazione fissa delle operazioni finali (barriere e misure) in passaggio
RemoveFinalMeasurementse nel metodoremove_final_measurements()della classeQuantumCircuitche in precedenza consideravano solo i nodi immediatamente precedenti a un nodo di uscita. -
Determinazione fissa delle operazioni finali in pass
RemoveFinalMeasurementse nel metodoremove_final_measurements()della classeQuantumCircuitche poteva considerare erroneamente una barriera come definitiva, anche se altre operazioni del circuito la seguivano. -
Rimozione corretta del registro classico a più bit nel passaggio
RemoveFinalMeasurementse nel metodoremove_final_measurements()della classeQuantumCircuitin cui i registri classici non venivano rimossi anche se gli altri bit erano inattivi, a meno che non venisse eseguita una misura finale in ogni singolo bit. Ora, i registri classici che diventano inattivi in seguito alla rimozione delle misure e delle barriere finali vengono sempre rimossi. I bit classici vengono rimossi se sono referenziati solo dai registri rimossi o non sono referenziati affatto e sono diventati inattivi a causa della rimozione. Questa correzione aggiunge anche una gestione corretta dei registri con bit sottostanti condivisi. -
È stato risolto un problema con
RemoveFinalMeasurementsche poteva causare l'invalidità del risultato diDAGCircuitdiventava non valido. Per maggiori dettagli, vedere il numero 7196. -
Corretto un problema con il metodo
remove_final_measurements()della classeQuantumCircuitche causava l'errore diQuantumCircuit.clbitsnon era corretto dopo l'invocazione. Per i dettagli, fare riferimento al numero 7089. -
Quando si rastrema un operatore zero vuoto in
qiskit.opflowil codice, dopo aver rilevato che si trattava di uno zero, registrava un avviso e restituiva l'operatore originale. Tali operatori si trovano comunemente negli operatori ausiliari, quando si usa Qiskit Nature, e il comportamento di cui sopra ha fatto sì cheVQElanciasse un'eccezione, poiché gli operatori non-zero rastremati erano un numero diverso di qubit rispetto agli operatori zero rastremati (poiché taper ha restituito l'operatore di input invariato). Il codice ora rastremerà correttamente un operatore nullo in modo che il numero di qubit si riduca come previsto e corrisponderà agli operatori non nulli rastremati, ad esempio`0*"IIII"`quando si rastrema di 3 qubit diventerà0*"I". -
Corretto un problema con il metodo
draw()e la funzionecircuit_drawer()in cui uno stile personalizzato impostato tramite il file di configurazione dell'utente (ad es.settings.conf) ignorerebbe il valore impostato del campocircuit_mpl_stylese il kwargstylesulla funzione/metodo non è impostato.
Altre note
-
Il cast di stringhe per
qiskit.circuit.ParameterExpressionnon ha più una precisione completa. Questo rimuove l'errore di 0s quando si stampano i parametri legati ai float. Ciò ha conseguenze sulla serializzazione QASM e sul cassetto di testo del circuito:>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> str(x.bind({x:0.5})) '0.5' # instead of '0.500000000000000' -
Il
QAOAAnsatzè stato aggiornato per utilizzare il simbolo di parametroγper l'operatore di costo eβper l'operatore di miscelazione, come da notazione standard nella letteratura QAOA.
Aer 0.9.1
Nessuna modifica
Ignis 0.7.0
Preludio
Questo rilascio depreca il progetto Qiskit Ignis, che è stato sostituito dal progetto Qiskit Experiments e il cui sviluppo attivo è cessato. Anche se deprecato, le correzioni di bug critici e di compatibilità continueranno a essere effettuate per dare agli utenti una sufficiente opportunità di migrare da Ignis. Dopo il periodo di deprezzamento (che non sarà inferiore a 3 mesi da questo rilascio) il progetto sarà ritirato e archiviato.
Nuove funzioni
-
Aggiornato il protocollo di accreditamento per utilizzare la routine di adattamento da https://arxiv.org/abs/2103.06603.
AccreditationFitterha ora i metodi FullAccreditation (protocollo precedente) e MeanAccreditation (nuovo protocollo). Inoltre, l'inserimento dei dati è stato modificato per utilizzare l'oggetto risultato AppendResult o un elenco di stringhe AppendStrings.qiskit.ignis.verification.QOTPCorrectString()è stato aggiunto. -
Aggiunta l'opzione per la generazione analitica veloce dei grafici delle sindromi.
RepetitionCodeha ora un nuovo argomento boolbrute, che consente di utilizzare ancora il metodo della forza bruta. È stata aggiunta la classe di aiutoRepetitionCodeSyndromeGeneratorper facilitare questa operazione. -
Il comando
RepetitionCodeha ora gli argomenti delle parole chiaveresetsedelay. Il primo determina se le porte di reset vengono inserite dopo la misurazione. Quest'ultimo consente di specificare un tempo (in dt) per il ritardo dopo ogni misurazione (e l'eventuale reset).Il metodo
syndrome_measurement()diRepetitionCodeha ora gli argomenti delle parole chiavefinaledelay. Il primo determina se aggiungere le porte di ripristino in base al sito globaleresets, o se sovrascriverlo con un comportamento appropriato per il ciclo finale di misurazioni della sindrome. Quest'ultimo consente di specificare un tempo (in dt) per il ritardo dopo ogni misurazione (e l'eventuale reset). -
La classe
RepetitionCodesupporta ora la codifica con stati base x. Questo può essere utilizzato impostando l'argomento della parola chiavexbasisquando si costruisce un oggettoRepetitionCode.
Note sull'aggiornamento
-
L'argomento parola chiave
resetè stato rimosso dal metodosyndrome_measurement()diRepetitionCode. Questo viene sostituito dall'argomento globaleresetsper la classe e dall'argomentofinalpersyndrome_measurement. Nei casi in cui in precedenza si aggiungeva il giro di misura finale usandoreset=Falseper evitare le porte di reset finali, ora si dovrebbe usarefinal=True. -
Rimuovere
ParametrizedScheduledaupdate_u_gates().ParametrizedScheduleè stato deprecato come parte di Qiskit-terra 0.17.0 e sarà rimosso nella prossima versione. La funzione ora aggiorna le porte u con i programmiScheduleche coinvolgono oggettiParameternon assegnati.
Note di deprecazione
-
Metodi deprecati in
AccreditationFitter, ovvero bound_variation_distance e single_protocol_run -
Il progetto Qiskit Ignis nel suo complesso è stato deprecato e il progetto sarà ritirato e archiviato in futuro. Anche se deprecato, al progetto verranno apportate solo correzioni di compatibilità e correzioni di bug critici. Invece di utilizzare Qiskit Ignis, dovreste migrare verso Qiskit Experiments. È possibile consultare la guida alla migrazione:
https://github.com/qiskit-community/qiskit-ignis#migration-guide