Note di rilascio di Qiskit 0.40
0.40.0
Con questa release viene ufficialmente deprecato il progetto del provider IBMQ di Qiskit come parte del metapacchetto Qiskit. Ciò significa che in una futura versione, pip install qiskit non includerà più automaticamente qiskit-ibmq-provider. Se attualmente si sta installando o elencando qiskit come dipendenza per ottenere qiskit-ibmq-provider, si dovrebbe aggiornare per includere esplicitamente anche qiskit-ibmq-provider . Questo viene fatto mentre il progetto Qiskit si muove verso un modello in cui il pacchetto qiskit contiene solo le funzionalità di base comuni per la costruzione e la compilazione di circuiti, programmi e applicazioni quantistiche. I pacchetti che si basano su questo nucleo o che collegano Qiskit all'hardware o ai simulatori saranno installabili come pacchetti separati.
Terra 0.23.0
Preludio
Qiskit Terra 0.23.0 è un'importante release che include una moltitudine di nuove funzionalità e correzioni di bug. I punti salienti di questa release sono:
Supporto per l'importazione di programmi OpenQASM 3 e per la creazione di oggetti da
QuantumCircuitdal programma in ingresso tramite due nuove funzioniqiskit.qasm3.load()eqiskit.qasm3.loads().Miglioramenti alla libreria di algoritmi di sintesi inclusi in Qiskit. Questo include le seguenti nuove funzioni di sintesi:
Sintesi di Clifford
Sintesi di funzioni lineari:
Sintesi permutativa:
SolovayKitaevDecompositiondettagliato in: https://arxiv.org/abs/quant-ph/0505030Nuovi plugin per
HighLevelSynthesis:
ACGSynthesisPermutationKMSSynthesisPermutationBasicSynthesisPermutationNuovo plugin per
UnitarySynthesisMiglioramenti delle prestazioni per
SabreLayout. Il passaggio è ora scritto principalmente in Rust, il che può portare a un miglioramento del tempo di esecuzione, ma il miglioramento maggiore è nella qualità dell'output (in media, meno porte introdotte in un sistema di controllo)SwapGateintrodotti daSabreSwap). Ad esempio, l'esecuzione diSabreLayouteSabreSwapsui circuiti Bernstein Vazirani che puntano al backendFakeSherbrookeproduce i seguenti risultati:![]()
In questa versione viene anche deprecato il supporto per l'esecuzione con Python 3.7. Ora viene emesso un DeprecationWarning se si esegue Qiskit con Python 3.7. Il supporto per Python 3.7 sarà rimosso con la release 0.25.0 (attualmente prevista per il luglio 2023); a quel punto sarà necessario avere Python 3.8 o una versione più recente per utilizzare Qiskit.
Nuove funzioni
-
Gli impulsi in
qiskit.pulse.librarypuò essere inizializzato con il nuovo parametro
angle, in modo da fornire due parametri float:ampeangle. L'inizializzazione con il complessoampè ancora supportata. -
La classe
AdaptVQEha un nuovo attributo,eigenvalue_historyche viene utilizzato per tenere traccia dell'energia più bassa raggiunta per ogni iterazione di AdaptVQE. Ad esempio:from qiskit.algorithms.minimum_eigensolvers import VQE from qiskit.algorithms.minimum_eigensolvers.adapt_vqe import AdaptVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import EvolvedOperatorAnsatz from qiskit.opflow import PauliSumOp from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp from qiskit.utils import algorithm_globals excitation_pool = [ PauliSumOp( SparsePauliOp(["IIIY", "IIZY"], coeffs=[0.5 + 0.0j, -0.5 + 0.0j]), coeff=1.0 ), PauliSumOp( SparsePauliOp(["ZYII", "IYZI"], coeffs=[-0.5 + 0.0j, 0.5 + 0.0j]), coeff=1.0 ), PauliSumOp( SparsePauliOp( ["ZXZY", "IXIY", "IYIX", "ZYZX", "IYZX", "ZYIX", "ZXIY", "IXZY"], coeffs=[ -0.125 + 0.0j, 0.125 + 0.0j, -0.125 + 0.0j, 0.125 + 0.0j, 0.125 + 0.0j, -0.125 + 0.0j, 0.125 + 0.0j, -0.125 + 0.0j, ], ), coeff=1.0, ), ] ansatz = EvolvedOperatorAnsatz(excitation_pool, initial_state=self.initial_state) optimizer = SLSQP() h2_op = PauliSumOp.from_list( [ ("IIII", -0.8105479805373266), ("ZZII", -0.2257534922240251), ("IIZI", +0.12091263261776641), ("ZIZI", +0.12091263261776641), ("IZZI", +0.17218393261915543), ("IIIZ", +0.17218393261915546), ("IZIZ", +0.1661454325638243), ("ZZIZ", +0.1661454325638243), ("IIZZ", -0.2257534922240251), ("IZZZ", +0.16892753870087926), ("ZZZZ", +0.17464343068300464), ("IXIX", +0.04523279994605788), ("ZXIX", +0.04523279994605788), ("IXZX", -0.04523279994605788), ("ZXZX", -0.04523279994605788), ] ) algorithm_globals.random_seed = 42 calc = AdaptVQE(VQE(Estimator(), ansatz, self.optimizer)) res = calc.compute_minimum_eigenvalue(operator=h2_op) print(calc.eigenvalue_history)il valore restituito di
calc.historydovrebbe essere all'incirca[-1.85727503], poiché si tratta di una singola iterazione. -
La registrazione di runtime durante l'esecuzione del programma
AdaptVQEè stato migliorato. Quando si esegue la classe ora, i messaggi di log di livelloDEBUGeINFOsaranno emessi durante l'esecuzione della classe. -
Aggiunto un nuovo passaggio del transpiler,
CollectAndCollapse, per raccogliere e consolidare blocchi di nodi in un circuito. Questo passaggio è stato progettato per essere una classe base generale per la raccolta e il consolidamento di blocchi combinati. Per essere del tutto generali, il lavoro di raccolta e collasso dei blocchi viene svolto tramite funzioni fornite durante l'istanziazione del passaggio. Ad esempio, il fileCollectLinearFunctionsè stato aggiornato per ereditare daCollectAndCollapsee raccoglie i blocchi diCXGateeSwapGatee sostituisce ogni blocco con un elementoLinearFunction. IlCollectCliffordsche ora si basa anch'esso suCollectAndCollapse, raccoglie blocchi di porte "Clifford" e sostituisce ogni blocco con una portaClifford.L'interfaccia supporta anche l'opzione
do_commutative_analysis, che consente di sfruttare la commutatività tra le porte per raccogliere blocchi di nodi più grandi. Ad esempio, la raccolta di blocchi di porte CX nel seguente circuito:qc = QuantumCircuit(2) qc.cx(0, 1) qc.z(0) qc.cx(1, 0)l'utilizzo di
do_commutative_analysisconsente di consolidare i due gate CX, in quanto il primo gate CX e il gate Z si scambiano. -
Aggiunta di una nuova classe
BlockCollectorche implementa varie strategie di raccolta e di una nuova classeBlockCollapserche implementa varie strategie di collasso. AttualmenteBlockCollectorinclude la strategia di raccogliere avidamente tutte le porte che aderiscono a una determinata funzione di filtro (ad esempio, raccogliere tutte le porte Clifford) eBlockCollapserinclude la strategia di consolidare tutte le porte di un blocco in un singolo oggetto (ad esempio, un blocco di porte Clifford può essere consolidato in un singolo oggetto)Clifford). -
Aggiunto un nuovo
CollectCliffordsche raccoglie blocchi di porte di Clifford e li consolida in oggettiqiskit.quantum_info.Cliffordoggetti. Questo passaggio eredita daCollectAndCollapsee in particolare supporta l'opzionedo_commutative_analysis. Supporta anche due opzioni aggiuntivesplit_blocksemin_block_size. Per ulteriori dettagli, consultare le note di rilascio diCollectAndCollapseeCollectLinearFunctionsper ulteriori dettagli. -
Il passo
CollectLinearFunctionsha diversi nuovi argomenti nel suo costruttore:-
do_commutative_analysis: consente di sfruttare la commutatività tra le porte per raccogliere blocchi di nodi più grandi. -
split_blocks: consente di suddividere i blocchi raccolti in sottoblocchi su sottoinsiemi disgiunti di qubit. Ad esempio, nel circuito seguente:qc = QuantumCircuit(4) qc.cx(0, 2) qc.cx(1, 3) qc.cx(2, 0) qc.cx(3, 1) qc.cx(1, 3)il singolo blocco di porte CX sui qubit
{0, 1, 2, 3}può essere suddiviso in due sottoblocchi disgiunti, uno sui qubit{0, 2}e l'altro sui qubit{1, 3}. -
min_block_size: consente di specificare la dimensione minima del blocco da consolidare; i blocchi con meno porte non verranno modificati. Ad esempio, nel circuito seguente:qc = QuantumCircuit(4) qc.cx(1, 2) qc.cx(2, 1)le due porte CX saranno consolidate quando
min_block_sizeè 1 o 2, e rimarranno invariate quandomin_block_sizeè 3 o più grande.
-
-
Aggiunto un algoritmo di sintesi efficiente in profondità
synth_cnot_depth_line_kms()per circuiti reversibili lineariLinearFunctionsull'architettura lineare nearest-neighbor, seguendo l'articolo: https://arxiv.org/abs/quant-ph/0701194. -
Il metodo
DAGCircuit.replace_block_with_op()restituirà ora il nuovo bloccoDAGOpNodeche viene creato quando il blocco viene sostituito. In precedenza, la chiamata a questo metodo non restituiva nulla. -
Aggiunto un algoritmo di sintesi efficiente dal punto di vista della profondità
synth_permutation_depth_lnn_kms()perPermutationrispetto all'architettura lineare nearest-neighbor, seguendo il documento: https://arxiv.org/abs/quant-ph/0701194 -
Aggiunta una nuova classe
PermutationGateper rappresentare la logica di permutazione come elemento di circuito. A differenza dell'elemento di libreriaPermutationche aveva una definizione statica, questa nuova classe evita di sintetizzare un circuito di permutazione quando viene dichiarata. Questo ritarda la sintesi effettiva al transpiler. Consente inoltre di utilizzare diversi algoritmi per la sintesi delle permutazioni, disponibili come plugin di permutazione ad alto livello.Un'altra caratteristica fondamentale di
PermutationGateè che implementa l'interfaccia__array__per restituire in modo efficiente una matrice unitaria per una permutazione. -
Aggiunti diversi plugin di sintesi ad alto livello per sintetizzare le permutazioni:
BasicSynthesisPermutationsi applica alle architetture completamente connesse e si basa sull'ordinamento. Questo è l'algoritmo precedentemente utilizzato per costruire circuiti quantistici per le permutazioni.ACGSynthesisPermutationsi applica alle architetture completamente connesse, ma si basa sul metodo di Alon, Chung e Graham. Sintetizza qualsiasi permutazione in profondità 2 (misurata in termini di SWAP).KMSSynthesisPermutationsi applica alle architetture lineari nearest-neighbor e corrisponde al metodo Kutin, Moulton, Smithline recentemente aggiunto.
Ad esempio:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PermutationGate from qiskit.transpiler import PassManager from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis from qiskit.transpiler.passes.synthesis.plugin import HighLevelSynthesisPluginManager # Create a permutation and add it to a quantum circuit perm = PermutationGate([4, 6, 3, 7, 1, 2, 0, 5]) qc = QuantumCircuit(8) qc.append(perm, range(8)) # Print available plugin names for synthesizing permutations # Returns ['acg', 'basic', 'default', 'kms'] print(HighLevelSynthesisPluginManager().method_names("permutation")) # Default plugin for permutations # Returns a quantum circuit with size 6 and depth 3 qct = PassManager(HighLevelSynthesis()).run(qc) print(f"Default: {qct.size() = }, {qct.depth() = }") # KMSSynthesisPermutation plugin for permutations # Returns a quantum circuit with size 18 and depth 6 # but adhering to the linear nearest-neighbor architecture. qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("kms", {})]))).run(qc) print(f"kms: {qct.size() = }, {qct.depth() = }") # BasicSynthesisPermutation plugin for permutations # Returns a quantum circuit with size 6 and depth 3 qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("basic", {})]))).run(qc) print(f"basic: {qct.size() = }, {qct.depth() = }") # ACGSynthesisPermutation plugin for permutations # Returns a quantum circuit with size 6 and depth 2 qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("acg", {})]))).run(qc) print(f"acg: {qct.size() = }, {qct.depth() = }") -
Aggiunte nuove classi per gli algoritmi Quantum Fisher Information (QFI) e Quantum Geometric Tensor (QGT) che utilizzano
primitives,qiskit.algorithms.gradients.QFIeqiskit.algorithms.gradients.LinCombQGTal modulo dei gradienti:qiskit.algorithms.gradients. Ad esempio:from qiskit.circuit import QuantumCircuit, Parameter from qiskit.algorithms.gradients import LinCombQGT, QFI estimator = Estimator() a, b = Parameter("a"), Parameter("b") qc = QuantumCircuit(1) qc.h(0) qc.rz(a, 0) qc.rx(b, 0) parameter_value = [[np.pi / 4, 0]] qgt = LinCombQGT(estimator) qgt_result = qgt.run([qc], parameter_value).result() qfi = QFI(qgt) qfi_result = qfi.run([qc], parameter_value).result() -
Aggiunto un nuovo argomento di parola chiave,
derivative_type, al costruttore dell'oggettoLinCombEstimatorGradient. Questo argomento accetta un enumDerivativeTypeche consente di specificare se calcolare solo le parti reali o immaginarie del gradiente. -
Aggiunta di una nuova opzione
circuit_reverse_bitsal file di configurazione utente. Consente agli utenti di impostare un booleano per il comportamento predefinito preferito dell'argomentoreverse_bitsdei cassetti dei circuitiQuantumCircuit.draw()ecircuit_drawer(). Ad esempio, aggiungendo una sezione al file di configurazione dell'utente nella posizione predefinita~/.qiskit/settings.confcon:[default] circuit_reverse_bits = Truecambierà l'impostazione predefinita per visualizzare i bit in ordine inverso.
-
Aggiunta di una nuova classe
Z2Symmetriesaqiskit.quantum_infoche viene utilizzata per identificare eventuali simmetrie di da un inputSparsePauliOp. -
Aggiunta di una nuova direttiva impulso
TimeBlockade. Questa direttiva si comporta in modo quasi identico all'istruzione di ritardo, ma viene rimossa prima dell'esecuzione. Questa direttiva è destinata a essere usata internamente al costruttore di impulsi e aiuta aScheduleBlockrappresentare istruzioni con intervalli di tempo assoluti. Questo permette al costruttore di impulsi di convertireScheduleinScheduleBlock, piuttosto che avvolgere con le istruzioniCallistruzioni. -
Aggiunti algoritmi abilitati alle primitive per l'evoluzione quantistica variazionale che implementano l'interfaccia per l'evoluzione quantistica. La classe
qiskit.algorithms.VarQRTEè utilizzata per l'evoluzione del tempo reale e la classeqiskit.algorithms.VarQITEviene utilizzata per l'evoluzione del tempo quantistico immaginario secondo un principio variazionale superato.Ogni algoritmo accetta un principio variazionale che implementa l'interfaccia astratta
ImaginaryVariationalPrincipleinterfaccia astratta. Sono incluse le seguenti implementazioni:Ad esempio:
from qiskit.algorithms import TimeEvolutionProblem, VarQITE from qiskit.algorithms.time_evolvers.variational import ImaginaryMcLachlanPrinciple from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import SparsePauliOp import numpy as np observable = SparsePauliOp.from_list( [ ("II", 0.2252), ("ZZ", 0.5716), ("IZ", 0.3435), ("ZI", -0.4347), ("YY", 0.091), ("XX", 0.091), ] ) ansatz = EfficientSU2(observable.num_qubits, reps=1) init_param_values = np.zeros(len(ansatz.parameters)) for i in range(len(ansatz.parameters)): init_param_values[i] = np.pi / 2 var_principle = ImaginaryMcLachlanPrinciple() time = 1 evolution_problem = TimeEvolutionProblem(observable, time) var_qite = VarQITE(ansatz, var_principle, init_param_values) evolution_result = var_qite.evolve(evolution_problem) -
Aggiunte regole per la conversione di
XXPlusYYGateeXXMinusYYGatead altre porte del sitoSessionEquivalenceLibrary. Questo permette di eseguiretranspile()che punta a un backend oTargetche utilizza questi gate. -
Aggiunti due nuovi backend falsi,
FakePragueeFakeSherbrookeal moduloqiskit.providers.fake_providermodulo.FakePraguefornisce un backend con un'istantanea delle proprietà del backend IBM Prague Egret R1 eFakeSherbrookefornisce un backend con un'istantanea delle proprietà del backend IBM Sherbrooke Eagle R3. -
È stato aggiunto un nuovo argomento di parola chiave,
allow_unknown_parameters, ai comandiParameterExpression.bind()eParameterExpression.subs()ai metodi. Se impostato, questo nuovo argomento consente di passare a questi metodi un dizionario contenente parametri sconosciuti senza che venga sollevato un errore. In precedenza, questo sollevava sempre un errore senza che ci fosse modo di disabilitare questo comportamento. -
L'argomento del metodo
BaseEstimator.run()dell'argomentoobservablesdel metodo accetta ora un tipo di ingressostro una sequenza distr, oltre agli altri tipi già accettati. Quando viene utilizzato, il formato della stringa di input deve corrispondere alla rappresentazione della stringa Pauli accettata dal costruttore per gli oggettiPaulioggetti. -
Aggiunto un nuovo metodo costruttore
QuantumCircuit.from_instructions()che consente di creare unQuantumCircuitda un iterabile di istruzioni. Ad esempio:from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit.circuit.quantumcircuitdata import CircuitInstruction from qiskit.circuit import Measure from qiskit.circuit.library import HGate, CXGate qr = QuantumRegister(2) cr = ClassicalRegister(2) instructions = [ CircuitInstruction(HGate(), [qr[0]], []), CircuitInstruction(CXGate(), [qr[0], qr[1]], []), CircuitInstruction(Measure(), [qr[0]], [cr[0]]), CircuitInstruction(Measure(), [qr[1]], [cr[1]]), ] circuit = QuantumCircuit.from_instructions(instructions) circuit.draw("mpl")
-
La classe
Cliffordaccetta ora un parametro opzionale per la parola chiavecopynel suo costruttore. Se impostato suFalse, unStabilizerTablefornito come input non verrà copiato, ma verrà utilizzato direttamente. Questo può avere dei vantaggi in termini di prestazioni, se i dati della tabella non verranno mai modificati con altri mezzi. -
Le prestazioni di
Clifford.compose()è stata notevolmente migliorata per tutti i numeri di qubit. Per operatori di 20 qubit, l'aumento di velocità è dell'ordine di 100 volte. -
Aggiunta di una nuova funzione di sintesi
synth_clifford_layers()per sintetizzare un fileCliffordin strati. L'algoritmo si basa su S. Bravyi, D. Maslov, I circuiti senza Hadamard espongono la struttura del gruppo di Clifford, arxiv:2003.09412. Questo decompone il Clifford in 8 strati di porte, tra cui due strati di porte CZ e uno strato di porte CX. Ad esempio, un circuito Clifford a 5 qubit viene scomposto nei seguenti strati:┌─────┐┌─────┐┌────────┐┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐ q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_1: ┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_2: ┤2 S2 ├┤2 CZ ├┤2 CX_dg ├┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_3: ┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_4: ┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├ └─────┘└─────┘└────────┘└─────┘└─────┘└─────┘└─────┘└────────┘Questo metodo permette di decomporre un
Cliffordin profondità di 2 qubit per la connettività linear nearest neighbor (LNN). -
I tipi di ritorno dei metodi
power()di diverse classi di gate della libreria standard sono stati aggiornati per restituire oggetti di gate più specifici, in modo da ottenere un output meno dispersivo e più efficiente. Ad esempio, l'esecuzione dipower()ora restituisce un'istanzaIGateinvece diUnitaryGatecome avveniva in precedenza.L'elenco completo dei tipi di uscita migliorati è il seguente:
-
L'oggetto
EquivalenceLibraryè ora rappresentato internamente come unPyDiGraph, questo oggetto grafo sottostante è accessibile dal nuovo attributographattributo. Questo attributo è destinato all'uso interno di Qiskit e pertanto deve essere sempre copiato prima di essere modificato dall'utente, per evitare che il grafico di equivalenza interno venga danneggiato. -
Il metodo
Operator.from_circuit()invertirà la permutazione dell'uscita causata dalla fase di routing/swap mapping del transpiler. Per impostazione predefinita, se in un circuito transpilato sono state inserite porte Swap, la matrice di uscita avrà la permutazione invertita, quindi la matrice restituita sarà equivalente al circuito originale non transpilato. Se si desidera disabilitare questo comportamento predefinito, l'argomento della parola chiaveignore_set_layoutpuò essere impostato aTrueper farlo (oltre al comportamento precedente di ignorare il layout iniziale dalla transpilazione). Se si desidera impostare manualmente un layout finale, è possibile utilizzare il nuovo argomento della parola chiavefinal_layoutper passare un oggettoLayoutda utilizzare per la permutazione dell'output. -
Aggiunto il supporto al passaggio
GateDirectionper gestire il passaggio simmetricoRXXGate,RYYGate, eRZZGatecancelli. Il passaggio ora gestirà correttamente questi cancelli e invertirà semplicemente l'ordine di qargs senza altre modifiche. -
È stato aggiunto il supporto per l'utilizzo dell'operatore di esponenziazione Python,
**, con gli oggettiGateè ora supportato. È equivalente all'esecuzione del metodoGate.power()sull'oggetto.Ad esempio:
from qiskit.circuit.library import XGate sx = XGate() ** 0.5 -
Aggiunta di una nuova forma di impulso
GaussianSquareDragalqiskit.pulse.librarymodulo. Questa forma d'impulso è simile aGaussianSquarema utilizza la formaDragdurante la salita e la discesa. La correzione della forma dell'impulso DRAG può sopprimere parte dello spettro di frequenza dell'ascesa e della caduta dell'impulso, evitando così di eccitare i qubit spettatori quando la loro frequenza è vicina a quella di pilotaggio dell'impulso. -
Aggiunto un nuovo argomento di parola chiave,
method, ai costruttori delle classiFiniteDiffEstimatorGradienteFiniteDiffSamplerGradiente. L'argomentomethodaccetta una stringa per indicare il metodo di calcolo da utilizzare per il gradiente. Esistono tre metodi, disponibili"central","forward"e"backward". Le definizioni dei metodi sono:MetodoCalcolo"central""forward""backward"dove è l'epsilon di offset.
-
Tutte le classi di gradienti in
qiskit.algorithms.gradientsora conservano le operazioni non parametrizzate, invece di tentare di srotolarle. Ciò consente di valutare i gradienti su porte personalizzate e opache che le singole primitive possono gestire e di mantenere un livello di astrazione più elevato per la sintesi e la compilazione ottimizzata dopo la costruzione dei circuiti a gradienti. -
È stato aggiunto un
TranslateParameterizedGatesper mappare solo le porte parametrizzate di un circuito a una base specificata, lasciando inalterate le porte non parametrizzate. Il passaggio tenta prima lo srotolamento e infine traduce se un gate parametrizzato non può essere ulteriormente srotolato. -
Il passaggio
CollectCliffordsè stato ampliato per raccogliere e combinare blocchi di "porte clifford" in oggettiClifforddove le "porte clifford" possono ora includere anche oggetti di tipoLinearFunction,Clifford, ePauliGate. Ad esempio:from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import LinearFunction, PauliGate from qiskit.quantum_info.operators import Clifford from qiskit.transpiler.passes import CollectCliffords from qiskit.transpiler import PassManager # Create a Clifford cliff_circuit = QuantumCircuit(2) cliff_circuit.cx(0, 1) cliff_circuit.h(0) cliff = Clifford(cliff_circuit) # Create a linear function lf = LinearFunction([[0, 1], [1, 0]]) # Create a pauli gate pauli_gate = PauliGate("XYZ") # Create a quantum circuit with the above and also simple clifford gates. qc = QuantumCircuit(4) qc.cz(0, 1) qc.append(cliff, [0, 1]) qc.h(0) qc.append(lf, [0, 2]) qc.append(pauli_gate, [0, 2, 1]) qc.x(2) # Run CollectCliffords transpiler pass qct = PassManager(CollectCliffords()).run(qc)Tutti i cancelli saranno raccolti e combinati in un unico
Clifford. Il circuito finale è quindi costituito da un singoloCliffordoggetto. -
CouplingMapè ora implicitamente iterabile e l'iterazione è identica all'iterazione dell'output diCouplingMap.get_edges(). In altre parole,from qiskit.transpiler import CouplingMap coupling = CouplingMap.from_line(3) list(coupling) == list(coupling.get_edges())funzionerà come previsto, così come le altre iterazioni. Si tratta di una comodità puramente sintattica.
-
Aggiunta una nuova funzione
synth_cnot_count_full_pmh()che serve a sintetizzare circuiti reversibili lineari per architetture all-to-all utilizzando il metodo di Patel, Markov e Hayes. Questa funzione è identica alla funzione disponibileqiskit.transpiler.synthesis.cnot_synth(), ma ha un nome più descrittivo ed è collocata in modo più logico nell'albero dei pacchetti. Questa nuova funzione sostituisce quella precedente, che probabilmente sarà deprecata in una versione futura. -
InstructionScheduleMapè stato aggiornato per memorizzare i dati di calibrazione del backend nel formato PulseQobj JSON e invocare la conversione quando si accede ai dati per la prima volta, cioè la conversione pigra. Questo aggiornamento della logica interna migliora drasticamente le prestazioni del caricamento del backend, soprattutto con molte voci di calibrazione. -
È stato aggiunto il nuovo modulo
qiskit.pulse.calibration_entries. Contiene diverse classi wrapper per le diverse rappresentazioni degli orari degli impulsi.ScheduleDefCallableDefPulseQobjDef
Queste classi implementano i metodi
get_schedule()eget_signature(), che restituiscono rispettivamente il programma degli impulsi e i nomi dei parametri da assegnare. Queste classi sono gestite internamente dal sistemaInstructionScheduleMapo backendTargete quindi non appaiono in un tipico programma utente. -
Introdotta una nuova sottoclasse
ScalableSymbolicPulse, come sottoclasse diSymbolicPulse. La nuova sottoclasse ha lo stesso comportamento diSymbolicPulsecon la differenza che assume che l'inviluppo dell'impulso includa un prefattore di ampiezza complessa della forma . Questa forma dell'inviluppo corrisponde a molti impulsi comuni, compresi tutti gli impulsi della libreria Qiskit Pulse (che in questa versione sono stati convertiti inamp,anglerappresentazione).La nuova sottoclasse elimina la natura non univoca della rappresentazione
amp,anglee confronta correttamente gli impulsi in base alla loro ampiezza complessa. -
Aggiunto un nuovo argomento di parola chiave,
dtype, al metodoPauliSumOp.from_list()metodo. Se specificato, questo argomento può essere usato per specificare l'indirizzodtypedell'array numpy allocato per il fileSparsePauliOputilizzato internamente dal costruitoPauliSumOp. -
È stato aggiunto il supporto per l'importazione di programmi OpenQASM 3 in Qiskit. È possibile accedervi più facilmente utilizzando le funzioni
qasm3.loads()eqasm3.load(), per caricare un programma direttamente da una stringa e indirettamente da un nome di file, rispettivamente. Ad esempio, ora si può fare:from qiskit import qasm3 circuit = qasm3.loads(""" OPENQASM 3.0; include "stdgates.inc"; qubit q; qubit[5] qr; bit c; bit[5] cr; h q; c = measure q; if (c) { h qr[0]; cx qr[0], qr[1]; cx qr[0], qr[2]; cx qr[0], qr[3]; cx qr[0], qr[4]; } else { h qr[4]; cx qr[4], qr[3]; cx qr[4], qr[2]; cx qr[4], qr[1]; cx qr[4], qr[0]; } cr = measure qr; """)Questo caricherà il programma in un'istanza
QuantumCircuitnella variabilecircuit.All'inizio non sono supportate tutte le funzionalità di OpenQASM 3, perché Qiskit non dispone ancora di un modo per rappresentare l'elaborazione classica avanzata dei dati. Le capacità dell'importatore aumenteranno insieme a quelle del resto di Qiskit. L'insieme iniziale di caratteristiche dell'importatore è approssimativamente lo stesso insieme di caratteristiche che verrebbe prodotto dall'esportatore (
qasm3.dump()eqasm3.dumps()).Si noti che il supporto di Qiskit a OpenQASM 3 non ha lo scopo di fornire una rappresentazione totalmente priva di perdite di dati di
QuantumCircuits. Per questo, si può considerare l'uso diqiskit.qpy. -
Le
primitives-classi di gradienti definite dalle classi di gradientiBaseEstimatorGradienteBaseSamplerGradientsono state aggiornate per semplificare l'estensione dell'interfaccia di base. Ci sono tre nuovi metodi interni sovrascrivibili,_preprocess(),_postprocess()e_run_unique()._preprocess()consente a una sottoclasse di personalizzare i circuiti e i parametri del gradiente di ingresso,_postprocessconsente di personalizzare il risultato di uscita e_run_uniqueconsente di calcolare il gradiente di un circuito con parametri unici. -
Il passaggio
SabreLayoutha migliorato notevolmente le prestazioni, essendo stato riscritto in Rust. Come parte di questa riscrittura, il passaggio è stato trasformato da un passaggio di analisi a un passaggio di trasformazione che eseguirà sia il layout che il routing. Ciò è stato fatto non solo per migliorare le prestazioni di esecuzione, ma anche per migliorare la qualità dei risultati. La funzionalità precedente del passaggio come passaggio di analisi può essere mantenuta impostando manualmente l'argomentorouting_passo usando il nuovo argomentoskip_routing. -
Il passo del
SabreLayoutha un nuovo argomento per il costruttorelayout_trials. Questo argomento viene utilizzato per controllare il numero di semi del generatore di numeri casuali con cui si cercherà di eseguireSabreLayoutcon. Quando è impostato, l'algoritmo di layout SABRE viene eseguitolayout_trialsun certo numero di volte e viene selezionato il risultato di qualità migliore (misurato nel minor numero di porte di scambio aggiunte). Queste prove di semina vengono eseguite in parallelo utilizzando il multithreading per ridurre al minimo il potenziale sovraccarico di prestazioni dovuto all'esecuzione di più volte del layout. Per impostazione predefinita, se non viene specificato, il passaggioSabreLayoututilizzerà il numero di CPU fisiche disponibili sul sistema locale. -
Aggiunte due nuove classi
SciPyRealEvolvereSciPyImaginaryEvolverche implementano metodi di integrazione per l'evoluzione temporale di uno stato quantistico. Il valore e la deviazione standard delle osservabili, così come i tempi in cui sono valutate, possono essere interrogati comeTimeEvolutionResult.observableseTimeEvolutionResult.times. Ad esempio:from qiskit.algorithms.time_evolvers.time_evolution_problem import TimeEvolutionProblem from qiskit.quantum_info import SparsePauliOp from qiskit.quantum_info.states.statevector import Statevector from qiskit.algorithms import SciPyImaginaryEvolver initial_state = Statevector.from_label("+++++") hamiltonian = SparsePauliOp("ZZZZZ") evolution_problem = TimeEvolutionProblem(hamiltonian, 100, initial_state, {"Energy":hamiltonian}) classic_evolver = SciPyImaginaryEvolver(num_timesteps=300) result = classic_evolver.evolve(evolution_problem) print(result.observables) -
Aggiunto il
SolovayKitaevper eseguire l'algoritmo Solovay-Kitaev per l'approssimazione di unitari a singolo qubit usando un insieme discreto di porte. In combinazione con il traduttore di basi, questo permette di convertire qualsiasi circuito unitario in un insieme di porte discrete universali, che possono essere implementate con tolleranza ai guasti.Questo passaggio può essere utilizzato, ad esempio, dopo la compilazione delle porte U e CX:
from qiskit import transpile from qiskit.circuit.library import QFT from qiskit.transpiler.passes.synthesis import SolovayKitaev qft = QFT(3) # optimize to general 1-qubit unitaries and CX transpiled = transpile(qft, basis_gates=["u", "cx"], optimization_level=1) skd = SolovayKitaev() # uses T Tdg and H as default basis discretized = skd(transpiled) print(discretized.count_ops())La decomposizione può essere utilizzata anche con il plugin di sintesi unitaria, come il metodo "sk" sul passaggio
UnitarySynthesistranspiler:from qiskit import QuantumCircuit from qiskit.quantum_info import Operator from qiskit.transpiler.passes import UnitarySynthesis circuit = QuantumCircuit(1) circuit.rx(0.8, 0) unitary = Operator(circuit).data unitary_circ = QuantumCircuit(1) unitary_circ.unitary(unitary, [0]) synth = UnitarySynthesis(basis_gates=["h", "s"], method="sk") out = synth(unitary_circ) out.draw('mpl')
-
La generazione di circuiti casuali con
qiskit.circuit.random.random_circuit()è ora significativamente più veloce per i circuiti di grandi dimensioni. -
La generazione di circuiti casuali con
qiskit.circuit.random.random_circuit()ora produrrà tutte le porte "standard" della libreria di circuiti di Qiskit (qiskit.circuit.library). Questo include due porte a 4-qubitC3SXGateeRC3XGatee i valori consentiti dimax_operandssono stati ampliati di conseguenza. -
Il passo del
Optimize1qGatesDecompositionha un nuovo argomento di parola chiave,target, nel suo costruttore. Questo argomento può essere usato per specificare unTargetche rappresenta il target di compilazione. Se utilizzato, sostituisce l'argomentobasisper determinare se un'istruzione del circuito è presente nel backend di destinazione. -
Il passo del
UnrollCustomDefinitionsha un nuovo argomento di parola chiave,target, nel suo costruttore. Questo argomento può essere usato per specificare unTargetche rappresenta il target di compilazione. Se utilizzato, sostituisce l'argomentobasis_gatesper determinare se un'istruzione del circuito è presente nel backend di destinazione. -
Aggiunta la classe
ReverseEstimatorGradientper una valutazione classica e veloce dei gradienti del valore di aspettativa basati sulla retropropagazione o sui gradienti a modalità inversa. Questa classe utilizza i vettori di stato e fornisce quindi gradienti esatti, ma scala esponenzialmente in base alle dimensioni del sistema. È stato progettato per un rapido calcolo di riferimento di sistemi di dimensioni ridotte. Può essere utilizzato, ad esempio, come:from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import SparsePauliOp from qiskit.algorithms.gradients import ReverseEstimatorGradient observable = SparsePauliOp.from_sparse_list([("ZZ", [0, 1], 1)], num_qubits=10) circuit = EfficientSU2(num_qubits=10) values = [i / 100 for i in range(circuit.num_parameters)] gradient = ReverseEstimatorGradient() result = gradient.run([circuit], [observable], [values]).result() -
Aggiunto un nuovo argomento di parola chiave,
use_dag, al costruttore della classeOneQubitEulerDecomposerclasse. Quandouse_dagè impostato suTrue, l'output del decompositore sarà un oggettoDAGCircuitinvece diQuantumCircuitoggetto. Questo è utile per i passaggi di transpiler che usanoOneQubitEulerDecomposer(come ad esempioOptimize1qGatesDecomposition), poiché lavorando direttamente con un elementoDAGCircuitevita l'overhead della conversione traQuantumCircuiteDAGCircuit. -
Aggiunta la possibilità per i passaggi di analisi di impostare pesi euristici personalizzati per i parametri
VF2LayouteVF2PostLayoutper i passaggi del transpiler. Se un passaggio di analisi imposta la chiavevf2_avg_error_mapnell'insieme di proprietà, il suo valore viene utilizzato per le ponderazioni degli errori invece dei tassi di errore del backendTarget(oBackendPropertiesperBackendV1). Il valore dovrebbe essere un'istanza diErrorMap, dove ogni valore rappresenta il tasso di errore medio per tutte le operazioni a 1 o 2 qubit su quei qubit. Se un valore èNaN, il bordo corrispondente viene trattato come un bordo ideale (o un qubit per le operazioni di 1q ). Ad esempio, una mappa degli errori creata come:from qiskit.transpiler.passes.layout.vf2_utils import ErrorMap error_map = ErrorMap(3) error_map.add_error((0, 0), 0.0024) error_map.add_error((0, 1), 0.01) error_map.add_error((1, 1), 0.0032)descrive un obiettivo a 2 qubit, dove il tasso di errore avg 1q è
0.0024sul qubit 0 e0.0032sul qubit 1, il tasso di errore avg 2q per le porte che operano su (0, 1) è 0.01, e (1, 0) non è supportato dall'obiettivo. Verrà utilizzato per l'attribuzione del punteggio se è impostato per la chiavevf2_avg_error_mapnel set di proprietà quandoVF2LayouteVF2PostLayoutvengono eseguiti. Ad esempio:from qiskit.transpiler import AnalysisPass, PassManager, Target from qiskit.transpiler.passes import VF2Layout from qiskit.transpiler.passes.layout.vf2_utils import ErrorMap from qiskit.circuit.library import CZGate, UGate from qiskit.circuit import Parameter class CustomVF2Scoring(AnalysisPass): """Set custom score for vf2.""" def run(self, dag): error_map = ErrorMap(3) error_map.add_error((0, 0), 0.0024) error_map.add_error((0, 1), 0.01) error_map.add_error((1, 1), 0.0032) self.property_set["vf2_avg_error_map"] = error_map target = Target(num_qubits=2) target.add_instruction( UGate(Parameter('theta'), Parameter('phi'), Parameter('lam')), {(0,): None, (1,): None} ) target.add_instruction( CZGate(), {(0, 1): None} ) vf2_pass = VF2Layout(target=target, seed=1234568942) pm = PassManager([CustomVF2Scoring(), vf2_pass])Questo funzionerà
VF2Layoutcon il punteggio personalizzato dierror_mapper un 2 qubitTargetche non contiene alcun tasso di errore.
Note sull'aggiornamento
-
Quando si inizializza una qualsiasi classe di impulsi in
qiskit.pulse.library:fornendo un argomento
ampcomplesso con unanglefinito si otterràPulseErrorora. Ad esempio, invece di chiamareGaussian(duration=100,sigma=20,amp=0.5j)si dovrebbe usareGaussian(duration=100,sigma=20,amp=0.5,angle=np.pi/2). L'inviluppo dell'impulso che prima era definito comeamp * ...è a sua volta definito comeamp * exp(1j * angle) * .... Questa modifica è stata apportata per supportare meglio gli esperimenti Qiskit in cui l'ampiezza e l'angolo degli impulsi sono calibrati in esperimenti separati. -
Per Python 3.7 singledispatchmethod è ora una dipendenza. Questo è stato aggiunto per consentire di sfruttare il meccanismo di dispacciamento dei metodi nella libreria standard delle nuove versioni di Python. Se si utilizza Python >= 3.8 non è necessaria alcuna dipendenza aggiuntiva.
-
Il passaggio del transpiler
MSBasisDecomposer, precedentemente deprecato e disponibile tramite il moduloqiskit.transpiler.passesè stato rimosso. È stato originariamente deprecato come parte del rilascio di Qiskit Terra 0.16.0 (10-16-2020). Al contrario, il passaggioBasisTranslatorper tradurre un circuito in una base appropriata con unRXXGate -
EquivalenceLibraryche sono inizializzati con l'attributobasenon avranno più un riferimento condiviso con l'oggettoEquivalenceLibrarypassato. Nelle versioni precedenti, se si modificavabasedopo che era stato usato per creare una nuova istanza, entrambe le istanze riflettevano la modificaEquivalenceLibraryentrambe le istanze riflettevano la modifica. Questo non è più il caso e gli aggiornamenti dibasenon si rifletteranno più nella nuova versione diEquivalenceLibrary. Ad esempio, se si è creata una libreria di equivalenze con:import math from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import XGate from qiskit.circuit.equivalence import EquivalenceLibrary original_lib = EquivalenceLibrary() qc = QuantumCircuit(1) qc.rx(math.pi, 0) original_lib.add_equivalence(XGate(), qc) new_lib = EquivalenceLibrary(base=original_lib)se si è modificato
original_libcon:import from qiskit.circuit.library import SXGate qc = QuantumCircuit(1) qc.rx(math.pi / 2, 0) original_lib.add_equivalence(SXGate(), qc)nelle versioni precedenti
new_libincludeva anche la definizione diSXGatedopo che era stata aggiunta aoriginal_lib, ma in questa versione non sarà più così. Questa modifica è stata apportata a causa del cambiamento della struttura interna dei dati in un grafo, che ha migliorato le prestazioni della classeEquivalenceLibraryclasse, soprattutto quando ci sono più esecuzioni del passaggio diBasisTranslatortranspiler. -
L'argomento di
initial_stateper il costruttore della classeNLocalclasse, insieme all'assegnazione diretta all'atrributoNLocal.initial_statedeve essere unQuantumCircuitora. Il supporto per l'uso di altri tipi per questo argomento e attributo non è più supportato. Il supporto per altri tipi è stato deprecato con il rilascio di Qiskit Terra 0.18.0 (luglio 2021). -
I cassetti della matrice LaTeX (ad esempio
array_to_latex,Statevector.draw('latex')) ora utilizzano la stessa funzione sympy del cassetto ket-convention. Ciò significa che alcuni numeri potrebbero essere visualizzati in modo diverso rispetto alle versioni precedenti, ma che l'esperienza sarà più uniforme. Ad esempio, può identificare nuovi fattori o razionalizzare i denominatori dove prima non lo faceva. L'impostazione predefinita diprecisionè stata modificata da 5 a 10. -
La versione del formato QPY emessa da
dump()è stata portata alla versione 6. Questa nuova versione del formato è incompatibile con le versioni precedenti e genera un errore quando si cerca di caricarla con un deserializzatore che non è in grado di gestire la versione 6 di QPY. Questa modifica è stata necessaria per supportare l'introduzione diScalableSymbolicPulse, che è stata gestita aggiungendo un attributoclass_name_sizeall'intestazione degli oggetti scaricatiSymbolicPulsedegli oggetti scaricati. -
Il metodo
__hash__per l'opzioneSymbolicPulseè stato rimosso. Questo è stato fatto per riflettere la natura mutabile (tramite l'assegnazione dei parametri) di questa classe, che potrebbe dare luogo a errori quando si usaSymbolicPulsein situazioni in cui era richiesto un oggetto hashable. Ciò significa che il metodo incorporatohash()e l'uso diSymbolicPulsecome chiavi in dizionari o membri di insiemi non funzionerà più. -
I nomi delle
Register(che include istanze diQuantumRegistereClassicalRegigster) non sono più vincolati a essere identificatori validi di OpenQASM 2. Questo viene fatto perché la restrizione è eccessivamente rigida, dato che Qiskit diventa sempre più disaccoppiato da OpenQASM 2 e anche le specifiche di OpenQASM 3 non sono così restrittive. Se ci si affida ai registri con nomi di identificatori OpenQASM 2 validi, è necessario iniziare a fare l'escape dei nomi. Una versione semplicistica di questo metodo potrebbe essere realizzata, ad esempio, da:import re import string def escape(name: str) -> str: out = re.sub(r"\W", "_", name, flags=re.ASCII) if not out or out[0] not in string.ascii_lowercase: return "reg_" + out return out -
I metodi
QuantumCircuitu1,u2,u3, e le loro varianti controllatecu1,cu3emcu1sono stati rimossi in seguito alla loro deprecazione in Qiskit Terra 0.16.0. Questo per eliminare i nomi dei gate che di solito sono specifici di IBM, a favore dei metodi più generalip(),u(),cp()ecu(). Le classi di porteU1Gate,U2GateeU3Gatesono ancora disponibili per l'uso conQuantumCircuit.append(), quindi i backend possono continuare a supportare basi con questi gate forniti esplicitamente. -
I metodi
QuantumCircuitcombineeextendsono stati rimossi in seguito alla loro deprecazione in Qiskit Terra 0.17.0. Questo perché queste funzioni sono semplicemente versioni meno potenti diQuantumCircuit.compose()che dovrebbero essere utilizzate al loro posto.L'eliminazione di
extendsignifica anche che gli operatori+e+=non sono più definiti perQuantumCircuit. Si possono invece utilizzare gli operatori&e&=che utilizzano rispettivamenteQuantumCircuit.compose(). -
Le funzioni precedentemente deprecate:
qiskit.circuit.measure.measure()eqiskit.circuit.reset.reset()sono state rimosse. Queste funzioni sono state deprecate nella release di Qiskit Terra 0.19.0 (dicembre 2021). Si devono invece usare i simboliQuantumCircuit.measure()eQuantumCircuit.reset()dell'oggettoQuantumCircuita cui si vuole aggiungere un elementoMeasureoResetall'operazione. -
I metodi precedentemente deprecati di
ParameterView, ereditati daset, sono stati rimossi daParameterView, il tipo restituito daQuantumCircuit.parameters. I metodi specifici che sono stati rimossi sono:add()difference()difference_update()discard()intersection()intersection_update()issubset()issuperset()symmetric_difference()symmetric_difference_update()union()update()
insieme al supporto per gli operatori di Python :
ixor:^=isub:-=ior:|=
Questi sono stati deprecati nella release di Qiskit Terra 0.17.0 (aprile 2021). Il tipo
ParameterViewè ora un tipo di vista sequenza generale e non supporta più queste operazioniset. -
I metodi di conversione precedentemente deprecati NetworkX per i metodi di conversione degli elementi
DAGCircuiteDAGDependencyper le classi :DAGCircuit.to_networkx(),DAGCircuit.from_networkx()eDAGDependency.to_networkx()sono stati rimossi. Questi metodi sono stati originariamente deprecati nell'ambito della release di Qiskit Terra 0.21.0 (giugno 2022). Qiskit utilizza rustworkx come libreria di grafi dalla release qiskit-terra 0.12.0 e da allora la funzione di conversione di NetworkX è stata un processo con perdite. Sono stati aggiunti originariamente in modo che gli utenti potessero sfruttare la libreria di algoritmi NetworkX’s per sfruttare funzionalità non presenti inDAGCircuite/o rustworkx. Tuttavia, da allora siaDAGCircuite rustworkx sono maturati e offrono maggiori funzionalità e il convertitoreDAGCircuitè strettamente legato a rustworkx per il suo funzionamento e i metodi del convertitore fornivano una funzionalità limitata e pertanto sono stati rimossi. -
tweedledumè stato rimosso come requisito fondamentale di Qiskit Terra. La funzionalità fornita (qiskit.circuit.classicalfunction) è ancora disponibile setweedledumviene installato manualmente, ad esempio da:pip install tweedledumQuesta modifica è stata apportata perché lo sviluppo di
tweedledumè rallentato al punto da non riuscire a tenere il passo con i nuovi rilasci di Python e del sistema operativo, e stava bloccando alcuni utenti di Qiskit nell'installazione di Qiskit. -
I controllori opzionali pigri
HAS_MATPLOTLIB,HAS_PIL,HAS_PYLATEXeHAS_PDFTOCAIROnon sono più esposti daqiskit.visualization, essendo stati deprecati in Qiskit Terra 0.21. La posizione canonica di questi (e di molti altri controllori pigri) èqiskit.utils.optionalse tutti e quattro gli oggetti possono essere trovati lì. -
L'argomento
gate, precedentemente deprecato, del costruttore del passaggio di transpilerDecomposee il suo attributo corrispondenteDecompose.gatesono stati rimossi. L'argomento e l'attributo sono stati deprecati con la release di Qiskit Terra 0.19.0 (dicembre 2021). Si deve invece utilizzare l'argomentogates_to_decomposeper il costruttore insieme all'attributoDecompose.gates_to_decompose. L'argomento e l'attributogates_to_decomposedovrebbero funzionare allo stesso modo, ma hanno un nome più esplicito e consentono di specificare elenchi di porte invece di supportare una sola porta. -
L'argomento
label, precedentemente deprecato, per il costruttore dell'oggettoMCMTeMCMTVChainè stato rimosso. È stato deprecato a partire dal rilascio di Qiskit Terra 0.19.0 (dicembre 2021). L'uso dell'argomentolabelsu queste classi ha avuto un comportamento non definito, in quanto sono sottoclassi diQuantumCircuitinvece che diInstruction. In questo modo, l'etichetta assegnata verrebbe generalmente ignorata. Se è necessario assegnare unlabela un'istanza diMCMToMCMTVChainè necessario convertirli in un'istanza diGateconto_gate()e poi assegnare l'etichetta desiderata all'attributolabelattributo. Ad esempio:from qiskit.circuit.library import MCMT, XGate mcmt_circuit = MCMT(XGate(), 3, 2) mcmt_gate = mcmt_circuit.to_gate() mcmt_gate.label = "Custom MCMT X" -
La dipendenza da
retworkxper Qiskit è stata rimossa e sostituita dalla libreriarustworkx. Si tratta degli stessi pacchetti, marustworkxè il nuovo nome diretworkx, che è stato rinominato nell'ambito del rilascio combinato di 0.12.0. Se in precedenza si utilizzava retworkx 0.12.0 con Qiskit, allora si è già installato rustworkx (retworkx 0.12.0 era solo uno shim di reindirizzamento per la retrocompatibilità). Questa modifica è stata apportata per migrare al nuovo nome del pacchetto che sarà l'unico supportato in futuro. -
Il comportamento predefinito del
SabreLayoutè cambiato. Il passaggio non è più unAnalysisPasse per impostazione predefinita calcolerà il layout iniziale, lo applicherà al circuito ed eseguirà internamente ancheSabreSwapinternamente e applica la mappatura degli swap e imposta la proprietàfinal_layoutcon la permutazione causata dagli inserimenti degli swap. Questo significa che per gli utenti che eseguonoSabreLayoutcome parte di un sistema personalizzatoPassManagerdovranno modificare il gestore di pass per tenere conto di questo (a meno che non abbiano impostato l'argomentorouting_passperSabreLayout). Questa modifica è stata apportata nell'interesse di migliorare la qualità dell'outputSabreLayoutora eseguirà più prove di seme in parallelo e per calcolare quale seme fornisce i risultati migliori deve eseguire sia il layout che l'instradamento insieme. Ci sono tre modi per regolare l'utilizzo nel gestore di pass personalizzati. Il primo è quello di evitare di usare l'incorporazione nel gestore dei passaggi di preset. Se in precedenza si eseguiva qualcosa come:from qiskit.transpiler import PassManager from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.SabreLayout pm = PassManager() pm.append(SabreLayout(coupling_map) pm += common.generate_embed_passmanager(coupling_map)per calcolare il layout e poi applicarlo (che in genere era seguito dall'instradamento), è possibile regolare l'utilizzo in modo che sia semplicemente così:
from qiskit.transpiler import PassManager from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.SabreLayout pm = PassManager() pm.append(SabreLayout(coupling_map)come
SabreLayoutapplicherà il layout e non sarà più necessaria la fase di incorporamento. In alternativa, è possibile specificare l'argomentorouting_pass, che ripristina il comportamento precedenteSabreLayoutal suo comportamento precedente. Per esempio, se si vuole eseguireSabreLayoutcome veniva eseguito nelle versioni precedenti, si può fare qualcosa di simile:from qiskit.transpiler.passes import SabreSwap, SabreLayout routing_pass = SabreSwap( coupling_map, "decay", seed=seed, fake_run=True ) layout_pass = SabreLayout(coupling_map, routing_pass=routing_pass, seed=seed)che avrà
SabreLayouteseguito come un passaggio di analisi e impostare solo il set di proprietàlayout. L'approccio finale consiste nello sfruttare l'argomentoskip_routingsuSabreLayout, quando questo argomento è impostato suTruesalta l'applicazione del layout trovato e l'inserimento delle porte di scambio dal routing. Tuttavia, questo comporta una penalizzazione in termini di tempo di esecuzione, poichéSabreLayoutcontinua a calcolare l'instradamento e non utilizza questi dati. I primi due approcci descritti non comportano costi aggiuntivi. -
I layout calcolati dal passaggio
SabreLayout(quando viene eseguito senza l'argomentorouting_pass) con un valore di seme fisso può cambiare rispetto alle versioni precedenti. Ciò è dovuto all'utilizzo di un nuovo generatore di numeri casuali nell'ambito della riscrittura del passaggioSabreLayoutin Rust, che ha migliorato significativamente le prestazioni. Se si desidera avere un risultato costante, è possibile eseguire il passaggio in una versione precedente di Qiskit e sfruttare la funzioneqiskit.qpyper salvare il circuito e poi caricarlo con la versione attuale. In alternativa, è possibile impostare esplicitamente l'argomentorouting_passa un'istanza diSabreSwapper rispecchiare il comportamento precedente diSabreLayout:from qiskit.transpiler.passes import SabreSwap, SabreLayout routing_pass = SabreSwap( coupling_map, "decay", seed=seed, fake_run=True ) layout_pass = SabreLayout(coupling_map, routing_pass=routing_pass, seed=seed)che rispecchierà il comportamento del passaggio nella versione precedente. Si noti che se si utilizzava l'argomento
swap_trialssuSabreLayoutnelle versioni precedenti, quando si modifica l'utilizzo in questa forma, è necessario impostare l'argomentotrialssul costruttoreSabreSwapse si vuole mantenere l'output precedente con un seme fisso. -
Il circuito esatto restituito da
qiskit.circuit.random.random_circuitper un dato seme è cambiato. Ciò è dovuto a miglioramenti dell'efficienza nella generazione interna di numeri casuali per la funzione. -
La versione richiesta per il pacchetto di funzioni opzionali
qiskit-toqm, installabile tramitepip install qiskit-terra[toqm], è stata aggiornata dalla versione0.0.4a0.1.0. Per utilizzare il metodo di instradamentotoqmcontranspile()è necessario utilizzare qiskit-toqm versione0.1.0o più recente. Le versioni precedenti non sono più rilevabili dal transpiler. -
L'output
QuasiDistributiondel metodoSampler.runè stato aggiornato per filtrare gli stati con probabilità pari a zero. Ora, se uno stato valido non è presente nell'output del dizionario, si può assumere che abbia una probabilità pari a 0. In precedenza, tutti i risultati possibili per un determinato numero di bit (ad esempio, per un risultato a 3 bit000,001,010,011,100,101,110, e111) anche se la probabilità di un determinato stato era pari a 0. Questa modifica è stata apportata per ridurre le dimensioni dell'output, poiché per un numero maggiore di bit le dimensioni dell'output potevano essere piuttosto grandi. Inoltre, il filtraggio dei risultati a probabilità zero rende l'output coerente con altre implementazioni diBaseSampler. -
Il comportamento del costruttore di impulsi quando viene chiamato un elemento
Scheduleè stato aggiornato. I programmi chiamati vengono convertiti internamente inScheduleBlocke ora il meccanismo di riferimento viene sempre applicato invece di aggiungere i programmi avvolti dall'istruzioneCall. Si noti che il blocco convertito non recupera necessariamente il contesto di allineamento originale. Si tratta semplicemente di una sequenza allineata ASAP di istruzioni a impulsi con intervalli di tempo assoluti. Si tratta di un aggiornamento della rappresentazione interna dei programmi di impulsi chiamati e quindi di nessuna modifica dell'API. Tuttavia laCallistruzione eSchedulenon compaiono più nel programma di impulsi del costruttore. Questa modifica garantisce che i blocchi di programma generati siano sempre compatibili con QPY. Se si filtrano le istruzioni del programma di output in base aCallè possibile accedere al campoScheduleBlock.referencesper recuperare il programma chiamato. -
RZXCalibrationBuildereRZXCalibrationBuilderNoEchosono stati aggiornati per generareScheduleBlock. Questa modifica garantisce che i circuiti transpilati siano sempre compatibili con QPY. Se si utilizza direttamente il metodorescale_cr_inst()da un altro programma o da una sottoclasse di pass per ridimensionare l'impulso di risonanza trasversale del dispositivo, ora questo metodo è stato trasformato in una macro del costruttore di impulsi ed è necessario utilizzarlo nel contesto del costruttore di impulsi per adottare la nuova versione. La chiamata al metodo inietta un'istruzione di riproduzione nel programma dell'impulso contestuale, invece di restituire un'istruzione con l'impulso allungatoPlaycon l'impulso allungato.
Note di deprecazione
-
Il supporto per l'esecuzione di Qiskit con Python 3.7 è stato deprecato e sarà rimosso nella release qiskit-terra 0.25.0. Ciò significa che a partire dalla versione 0.25.0 sarà necessario aggiornare la versione Python in uso a Python 3.8 o superiore.
-
La classe
LinearFunctionsSynthesisè ora deprecata e sarà rimossa in una prossima versione. È stata sostituita dalla più generale classeHighLevelSynthesische dovrebbe essere utilizzata al suo posto. Per esempio, è possibile istanziare un'istanza diHighLevelSynthesische si comporterà comeLinearFunctionSynthesiscon:from qiskit.transpiler.passes import HighLevelSynthesis from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig HighLevelSynthesis( HLSConfig( linear_function=[("default", {})], use_default_on_unspecified=False, ) ) -
Il supporto per il passaggio di liste di valori di argomenti alla funzione
transpile()è deprecato e sarà rimosso nella versione 0.25.0. Questo viene fatto per ridurre notevolmente l'overhead dell'esecuzione parallela per il transpiling di più circuiti contemporaneamente. Se si utilizza questa funzionalità al momento, è possibile chiamare il comandotranspile()più volte. Ad esempio, se in precedenza si faceva qualcosa come:from qiskit.transpiler import CouplingMap from qiskit import QuantumCircuit from qiskit import transpile qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)] results = transpile([qc] * 6, coupling_map=cmaps)invece si dovrebbe eseguire qualcosa come:
from itertools import cycle from qiskit.transpiler import CouplingMap from qiskit import QuantumCircuit from qiskit import transpile qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)] results = [] for qc, cmap in zip(cycle([qc]), cmaps): results.append(transpile(qc, coupling_map=cmap))Si può anche sfruttare
parallel_map()omultiprocessingdalla libreria standard Python, se si vuole eseguire il tutto in parallelo. -
La versione legacy del cassetto degli impulsi presente in
qiskit.visualization.pulseè stata deprecata e sarà rimossa in una versione futura. Questo include le classiScheduleDrawere :class`WaveformDrawer`. Questo modulo è stato sostituito dal cassettoqiskit.visualization.pulse_v2e l'API tipica dell'utentepulse_drawer()ePulseBlock.draw()sono già aggiornati internamente per utilizzareqiskit.visualization.pulse_v2. -
Il metodo
pulse.Instruction.draw()è stato deprecato e sarà rimosso in una versione futura. La necessità di questo metodo è stata superata dal cassettoqiskit.visualization.pulse_v2, che non richiede che gli oggettiInstrucionabbiano un proprio metodo di disegno. Se si ha bisogno di disegnare un'istruzione a impulsi, si dovrebbe utilizzare l'opzionepulse_drawer()al suo posto. -
L'importazione
qiskit.circuit.qpy_serializationè deprecata, poiché QPY è stato promosso al livello superiore. Si dovrebbero importare gli stessi oggetti daqiskit.qpyinvece. Il vecchio percorso sarà rimosso in un futuro di Qiskit Terra. -
L'oggetto
qiskit.IBMQè deprecato. Questo oggetto alias reindirizza pigramente l'accesso agli attributi aqiskit.providers.ibmq.IBMQ. Poiché il pacchettoqiskit-ibmq-providerè stato sostituito dal pacchettoqiskit-ibm-provider, che mantiene il proprio spazio dei nomi, questo alias non è più rilevante con il nuovo pacchetto. Se ci si affidava all'aliasqiskit.IBMQ, si dovrebbe aggiornare l'uso per utilizzare direttamenteqiskit.providers.ibmq.IBMQ(e considerare anche la migrazione aqiskit-ibm-provider, vedere la guida alla migrazione per maggiori dettagli). -
Diversi metodi pubblici dei convertitori di Qobj sono stati deprecati e in una prossima versione non saranno più direttamente richiamabili. L'elenco dei metodi è:
In
InstructionToQobjConverter,convert_acquire()convert_bundled_acquires()convert_set_frequency()convert_shift_frequency()convert_set_phase()convert_shift_phase()convert_delay()convert_play()convert_snapshot()
In
QobjToInstructionConverter,convert_acquire()convert_set_phase()convert_shift_phase()convert_set_frequency()convert_shift_frequency()convert_delay()bind_pulse()convert_parametric()convert_snapshot()
Invece di richiamare direttamente uno di questi metodi, essi verranno selezionati implicitamente quando viene richiamata direttamente un'istanza del convertitore. Ad esempio:
converter = QobjToInstructionConverter() converter(pulse_qobj) -
Le funzioni
qiskit.visualization.state_visualization.num_to_latex_ket()eqiskit.visualization.state_visualization.num_to_latex_terms()sono state deprecate e saranno rimosse in una prossima versione. Queste funzioni sono state utilizzate principalmente internamente dall'uscita LaTeX diStatevector.draw()eDensityMatrix.draw()che non utilizza più queste funzioni e si appoggia invece a sympy. Se si utilizzavano queste funzioni, si dovrebbe fare a meno di usare le funzioni nsimplify() latex() di Sympy. -
Il metodo
Register.qasm()è deprecato e sarà rimosso in una versione futura. Questo metodo si trova nelle sottoclassiQuantumRegistereClassicalRegister. La deprecazione è dovuta al fatto che il metodoqasm()promuove una visione errata della parte responsabile della conversione sicura in OpenQASM 2; un singolo oggetto da solo non ha il contesto per fornire una conversione sicura, come ad esempio se il suo nome si scontra dopo l'escape per produrre un identificatore valido. -
L'espressione regolare variabile di classe
Register.name_formatè deprecata e sarà rimossa in una prossima versione. I nomi dei registri possono ora essere qualsiasi stringa valida di Python, quindi l'espressione regolare non serve più. -
Le funzioni
qiskit.quantum_info.synthesis.decompose_clifford()eqiskit.quantum_info.synthesis.decompose_cnot_dihedral()sono deprecate e saranno rimosse in una versione futura. Sono sostituite dalle due funzioniqiskit.synthesis.synth_clifford_full()eqiskit.synthesis.synth_cnotdihedral_full()rispettivamente.
Correzioni di bug
-
È stato risolto un problema nel metodo
PauliOp.adjoint()che restituiva il valore corretto per le paoli con coefficienti complessi, ad esempio:PauliOp(Pauli("iX")). Corretto #9433. -
Corretto un problema con gli algoritmi di stima dell'ampiezza nel modulo
qiskit.algorithms.amplitude_estimators(vedereamplitude_estimators) per l'utilizzo con primitive costruite a partire dalla primitiva astrattaBaseSampler(come ad esempioSamplereBackendSampler). In precedenza, i risultati della misurazione venivano estesi a un numero di bit superiore a quello effettivamente misurato, il che, per gli oracoli con più di un qubit, portava a potenziali errori nella rilevazione degli stati quantistici "buoni" per gli oracoli. -
È stato risolto un problema a causa del quale i metodi
QuantumCircuit.add_calibrations()eDAGCircuit.add_calibrations()non corrispondevano nel comportamento della logica di formattazione dei parametri. In precedenza,DAGCircuit.add_calibrations()cercava di lanciare ogni parametro infloat, mentreQuantumCircuit.add_calibrations()utilizzava i parametri così come sono. Questo potrebbe causare un errore durante l'esecuzionetranspile()su un sistemaQuantumCircuitcon gate a impulsi, poiché i parametri delle calibrazioni potrebbero essere mantenuti come oggettiParameterExpresion. -
Corretto un problema di deserializzazione nel file (
qiskit.qpy)load()in cui i circuiti contenenti porte di classeMCXGate,MCXGrayCode,MCXRecursive, eMCXVChainnon verrebbero deserializzati. Corretto #9390. -
È stato risolto un problema in
TensoredOp.to_matrix()in cui il coefficiente globale dell'operatore veniva moltiplicato alla matrice finale più di una volta. Ora, il coefficiente globale viene applicato correttamente, indipendentemente dal numero di operatori o stati tensurati. Corretto #9398. -
L'output del metodo
run()della classeBackendSamplerimposta ora gli attributishotsestddev_upper_bounddella classe restituitaQuasiDistribution. In precedenza questi attributi mancavano e ciò impediva alcune post-elaborazioni dell'output. Corretto #9311 -
Il metodo di esportazione di OpenQASM 2
QuantumCircuit.qasm()emette ora, per impostazione predefinita, numeri in virgola mobile di maggiore precisione per i parametri del gate. Inoltre, viene utilizzato un limite più stretto ( invece di ) per verificare se un dato parametro è vicino a una frazione/potenza di . Corretto #7166. -
Corretto il supporto nel modulo
primitivesper l'esecuzione diQuantumCircuitcon istruzioni di flusso di controllo (ad es.IfElseOp). In precedenza, le classi baseBaseSamplereBaseEstimatornon potevano normalizzare correttamente tali circuiti. Tuttavia, l'esecuzione di questi circuiti dipende dalla particolare implementazione delle primitive che supportano le istruzioni del flusso di controllo. Si tratta solo di un supporto fisso per consentire a una particolare implementazione diBaseSampleroBaseEstimatordi utilizzare le istruzioni di flusso di controllo. -
È stato risolto un problema con il metodo
PauliOp.matmul()che restituiva risultati errati coniI. Corretto #8680. -
È stato risolto un problema con la classe Approximate Quantum Compiler (
AQC) che causava la restituzione di un circuito errato quando l'unitario in ingresso aveva un determinante di -1. Corretto #9327 -
Corretto un problema con il metodo
QuantumCircuit.compose()che rifiutava erroneamente specificatori validi di qubit o clbit. Questo problema è stato risolto in modo che il metodo accetti ora lo stesso insieme di specificatori qubit e clbit di altri metodiQuantumCircuitcome ad esempioappend(). Corretto #8691. -
È stato risolto un problema con il metodo
QuantumCircuit.compose()in cui il metodo mappava erroneamente i registri nelle condizioni del circuito dato ai registri completi della base. In precedenza, la mappatura era molto imprecisa; i bit utilizzati all'interno di ogni condizione non erano soggetti alla mappatura e si cercava invece di trovare il registro corrispondente in modo impreciso. Questo potrebbe anche portare a espandere una condizione su un registro più piccolo in un registro più grande, il che non è una trasformazione valida. Ora, una condizione su un singolo bit o su un registro sarà composta in modo da riguardare esattamente i bit definiti dall'argomentoclbits. Se necessario, al circuito di base verrà aggiunto un nuovo registro di aliasing. Corretto #6583. -
È stato risolto un problema con la funzione
transpile()quando viene eseguita conoptimization_levelimpostato su1,2o3e nessun argomentobackend,basis_gatesotargetspecificato. Se il circuito di ingresso presentasse delle serie di porte a qubit singolo che potrebbero essere semplificate, il circuito di uscita non sarebbe il più ottimizzato possibile, poiché tali serie di porte a qubit singolo non sarebbero state eliminate. Questo problema poteva essere corretto in precedenza specificando gli argomentibackend,basis_gates, otargetnella chiamatatranspile()ma ora l'output sarà il più semplificato possibile senza conoscere i gate di destinazione consentiti. Corretto #9217 -
È stato risolto un problema con la funzione
transpile()quando viene eseguita conoptimization_level=3e nessun argomentobackend,basis_gatesotargetspecificato. Se il circuito di ingresso contenesse un qualsiasi blocco di 2 qubit equivalente a una matrice identità, il circuito di uscita non sarebbe ottimizzato al meglio e conterrebbe ancora quel blocco identità. Questo problema poteva essere corretto in precedenza specificando gli argomentibackend,basis_gates, otargetnella chiamatatranspile()ma ora l'output sarà il più semplificato possibile senza conoscere i gate di destinazione consentiti. Corretto #9217 -
È stato risolto un problema con
LinCombSamplerGradientche potenzialmente sollevava un errore quando veniva eseguito con la classeSamplerdiqiskit-aer. -
Corretto un problema con
NumPyEigensolvere per estensioneNumPyMinimumEigensolverin cui la risoluzione di sottoclassi diBaseOperatordiverse daOperatorcausava un errore. -
È stato risolto un problema nell'output dei metadati di
primitivesin cui l'elenco veniva copiato per riferimento e tutti gli elementi venivano aggiornati con lo stesso valore a ogni iterazione. -
È stato risolto un problema con
QobjToInstructionConverterquando vengono chiamati più backend e questi hanno accidentalmente lo stesso nome di impulso nella libreria di impulsi. Si trattava di un caso limite che poteva verificarsi solo quando un'istanza del convertitore veniva riutilizzata su più backend (non si trattava di un modello di utilizzo tipico). -
È stato risolto un problema con la classe
PVQDa causa del quale la funzione di perdita non era in grado di squadrare la fedeltà. Il problema è stato risolto in modo che la funzione di perdita corrisponda alla definizione dell'algoritmo originale. -
Corretto un bug in QPY (
qiskit.qpy) per cui i circuiti contenenti registri i cui bit si trovavano nel circuito dopo i bit sciolti non riuscivano a essere deserializzati. Vedere il n. 9094. -
La classe
TwoQubitWeylDecompositionè ora compatibile con il protocollopickle. In precedenza, non riusciva a deserializzare e sollevava unTypeError. Vedere il n. 7312. -
È stato risolto un problema con il metodo
LocalReadoutMitigator.quasi_probabilities()in cui l'argomentoshotsnon veniva utilizzato. Viene ora utilizzato per impostare il numero di colpi nell'oggetto di ritorno. -
Corretta una regressione nella costruzione di
ClifforddaQuantumCircuitsche contiene altri oggettiCliffordoggetti. -
Corretto un problema con la classe
TwoQubitWeylDecomposition(e le sue sottoclassi) per consentire alla libreria standard Pythonpickledi serializzare queste classi. Questo ha parzialmente risolto il problema #7312 -
QuantumCircuit.qasm()ora eviterà correttamente i nomi di gate e registri che si scontrano con parole chiave riservate di OpenQASM 2. Correzioni #5043. -
È stato risolto un problema nel programma
RZXCalibrationBuilderin cui la sequenza di impulsi ECR era disallineata. Corretto #9013. -
È stato risolto un problema con il programma
pulse_drawer()per cui in alcuni casi la visualizzazione dell'output ometteva alcuni dei canali di una pianificazione. Corretto #8981.
Aer 0.11.2
Nessuna modifica
IBM Q Fornitore 0.19.2
Nessuna modifica