Note di rilascio di Qiskit 0.15
0.15.0
Terra 0.12.0
Preludio
La release 0.12.0 include diverse nuove funzionalità e correzioni di bug. Il cambiamento più importante di questa versione è l'aggiunta del supporto per gli impulsi parametrici a OpenPulse. Si tratta di comandi Pulse, che per descrivere un impulso utilizzano parametri anziché punti di campionamento. 0.12.0 è anche la prima versione ad includere il supporto per Python 3.8. Inoltre segna l'inizio della deprecazione del supporto a Python 3.5, che sarà rimosso quando la comunità upstream smetterà di supportarlo.
Nuove funzioni
-
Il passaggio
qiskit.transpiler.passes.CSPLayoutè stato ampliato con due nuovi parametri:call_limitetime_limit. Queste opzioni consentono di limitare la durata del passaggio. L'opzionecall_limitlimita il numero di volte in cui la funzione ricorsiva del risolutore backtracking può essere chiamata. Allo stesso modo,time_limitlimita la durata (in secondi) dell'esecuzione del solutore. I valori predefiniti sono rispettivamente1000chiamate e10secondi. -
qiskit.pulse.Acquirepuò ora essere applicato a un singolo qubit. Questo rende la programmazione degli impulsi più coerente e più facile da ragionare, poiché ora tutte le operazioni si applicano a un singolo canale. Ad esempio:acquire = Acquire(duration=10) schedule = Schedule() schedule.insert(60, acquire(AcquireChannel(0), MemorySlot(0), RegisterSlot(0))) schedule.insert(60, acquire(AcquireChannel(1), MemorySlot(1), RegisterSlot(1))) -
Un nuovo metodo
qiskit.transpiler.CouplingMap.draw()è stato aggiunto aqiskit.transpiler.CouplingMapper generare un'immagine graphviz dal grafico della mappa di accoppiamento. Ad esempio:from qiskit.transpiler import CouplingMap coupling_map = CouplingMap( [[0, 1], [1, 0], [1, 2], [1, 3], [2, 1], [3, 1], [3, 4], [4, 3]]) coupling_map.draw() -
Gli impulsi parametrici sono stati aggiunti a OpenPulse. Si tratta di comandi a impulsi che vengono parametrizzati e compresi dal backend. Le forme d'impulso arbitrarie sono ancora supportate dal comando SamplePulse. Le nuove classi di impulsi supportate sono:
qiskit.pulse.ConstantPulseqiskit.pulse.Dragqiskit.pulse.Gaussianqiskit.pulse.GaussianSquare
Possono essere utilizzati come qualsiasi altro comando Pulse. Un esempio:
from qiskit.pulse import (Schedule, Gaussian, Drag, ConstantPulse, GaussianSquare) sched = Schedule(name='parametric_demo') sched += Gaussian(duration=25, sigma=4, amp=0.5j)(DriveChannel(0)) sched += Drag(duration=25, amp=0.1, sigma=5, beta=4)(DriveChannel(1)) sched += ConstantPulse(duration=25, amp=0.3+0.1j)(DriveChannel(1)) sched += GaussianSquare(duration=1500, amp=0.2, sigma=8, width=140)(MeasureChannel(0)) << sched.durationIl programma risultante sarà simile a un programma SamplePulse costruito con
qiskit.pulse.pulse_lib, tuttavia il campionamento delle forme d'onda sarà eseguito dal backend. Il metodoqiskit.pulse.Schedule.draw()può essere utilizzato come di consueto. Tuttavia, il comando verrà convertito inSamplePulsecon il metodoqiskit.pulse.ParametricPulse.get_sample_pulse(), quindi l'impulso mostrato potrebbe non campionare la funzione continua nello stesso modo in cui lo farà il backend.Questa funzione può essere utilizzata per costruire programmi di impulsi per qualsiasi backend, ma gli impulsi saranno convertiti in oggetti
SamplePulsese il backend non supporta gli impulsi parametrici. I backend che li supportano avranno il seguente nuovo attributo:backend.configuration().parametric_pulses: List[str] # e.g. ['gaussian', 'drag', 'constant']Si noti che non è necessario che il backend supporti tutti gli impulsi parametrici definiti in Qiskit.
Quando il backend supporta gli impulsi parametrici e il programma degli impulsi viene costruito con essi, il Qobj assemblato è significativamente più piccolo. La dimensione di un PulseQobj costruito interamente con impulsi parametrici dipende solo dal numero di istruzioni, mentre la dimensione di un PulseQobj costruito diversamente crescerà con la durata delle istruzioni (poiché ogni campione deve essere specificato con un valore).
-
Aggiunte le funzioni di utilità
qiskit.scheduler.measure()eqiskit.scheduler.measure_all()al modulo qiskit.scheduler. Queste funzioni restituiscono unqiskit.pulse.Scheduleche misura i qubit utilizzando OpenPulse. Ad esempio:from qiskit.scheduler import measure, measure_all measure_q0_schedule = measure(qubits=[0], backend=backend) measure_all_schedule = measure_all(backend) measure_custom_schedule = measure(qubits=[0], inst_map=backend.defaults().instruction_schedule_map, meas_map=[[0]], qubit_mem_slots={0: 1}) -
Impulso
qiskit.pulse.Schedulehanno ora rappresentazioni migliori che per i programmi semplici dovrebbero essere espressioni valide di Python. -
I
qiskit.circuit.QuantumCircuitmetodiqiskit.circuit.QuantumCircuit.measure_active(),qiskit.circuit.QuantumCircuit.measure_all(), eqiskit.circuit.QuantumCircuit.remove_final_measurements()hanno ora un'aggiunta kwarginplace. Quandoinplaceè impostato suFalse, la funzione restituisce una copia modificata del circuito. Questo è diverso dal comportamento predefinito, che modifica l'oggetto circuito sul posto e non restituisce nulla. -
Sono stati aggiunti diversi nuovi metodi di costruzione alla classe
qiskit.transpiler.CouplingMapper costruire oggetti con grafici di accoppiamento dei qubit di base. I nuovi metodi del costruttore sono:Ad esempio, per utilizzare i nuovi costruttori per ottenere una mappa di accoppiamento di 5 qubit collegati in una catena lineare, si può ora eseguire:
from qiskit.transpiler import CouplingMap coupling_map = CouplingMap.from_line(5) coupling_map.draw() -
Introdotto un nuovo passaggio
qiskit.transpiler.passes.CrosstalkAdaptiveSchedule. Questo passaggio mira a ridurre l'impatto del rumore di diafonia su un programma. Utilizza i dati di caratterizzazione della diafonia provenienti dal backend per programmare i gate. Quando una coppia di porte presenta un'elevata diafonia, viene serializzata mediante una barriera. La serializzazione ingenua è dannosa perché comporta errori di decoerenza. Pertanto, questo passaggio utilizza un approccio di ottimizzazione SMT per calcolare un programma che minimizzi l'impatto della diafonia e degli errori di decoerenza.Il passaggio prende in input un circuito già transpilato sul backend, ossia il circuito è espresso in termini di qubit fisici e le porte di scambio sono state inserite e decomposte in CNOT, se necessario. Utilizzando questo circuito e i dati di caratterizzazione della diafonia, viene utilizzata un' ottimizzazione Z3 per costruire un nuovo circuito programmato come uscita.
Per utilizzare il pass su un circuito circ:
dag = circuit_to_dag(circ) pass_ = CrosstalkAdaptiveSchedule(backend_prop, crosstalk_prop) scheduled_dag = pass_.run(dag) scheduled_circ = dag_to_circuit(scheduled_dag)backend_propè un oggettoqiskit.providers.models.BackendPropertiesper il backend di destinazione.crosstalk_propè un dict che specifica i tassi di errore condizionati. Per due porteg1eg2,crosstalk_prop[g1][g2]specifica il tasso di errore condizionale dig1quandog1eg2vengono eseguiti simultaneamente. Un metodo per generarecrosstalk_propsarà aggiunto in una prossima versione di qiskit-ignis. Fino ad allora dovrete conoscere già le proprietà di diafonia del vostro dispositivo, oppure scrivere manualmente i vostri esperimenti di caratterizzazione del dispositivo. -
Nel gestore dei passaggi di preselezione per il livello di ottimizzazione 1,
qiskit.transpiler.preset_passmanagers.level_1_pass_manager()seqiskit.transpiler.passes.TrivialLayoutnon corrisponde perfettamente a un determinato circuito, si utilizza inveceqiskit.transpiler.passes.DenseLayoutviene utilizzato il layout pass. -
Aggiunto un nuovo metodo astratto
qiskit.quantum_info.Operator.dot()alla classe astrattaBaseOperator, in modo che sia incluso in tutte le implementazioni di tale classe astratta, comprese le classiqiskit.quantum_info.OperatoreQuantumChannel(ad esempio,qiskit.quantum_info.Choi). Questo metodo restituisce l'operatore giusto di moltiplicazionea.dot(b). Ciò equivale a chiamare il metodo operatoreqiskit.quantum_info.Operator.compose()con il kwargfrontimpostato suTrue. -
Aggiunto
qiskit.quantum_info.average_gate_fidelity()eqiskit.quantum_info.gate_error()al moduloqiskit.quantum_infoper lavorare conqiskit.quantum_info.OperatoreQuantumChannel(es,qiskit.quantum_info.Choi) gli oggetti. -
È stata aggiunta la funzione
qiskit.quantum_info.partial_trace()alla funzioneqiskit.quantum_infoche funziona conqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixclassi di stati quantici. Ad esempio:from qiskit.quantum_info.states import Statevector from qiskit.quantum_info.states import DensityMatrix from qiskit.quantum_info.states import partial_trace psi = Statevector.from_label('10+') partial_trace(psi, [0, 1]) rho = DensityMatrix.from_label('10+') partial_trace(rho, [0, 1]) -
Quando
qiskit.circuit.QuantumCircuit.draw()oqiskit.visualization.circuit_drawer()con il kwargwith_layoutimpostato su True (l'impostazione predefinita), la visualizzazione dell'output mostrerà i qubit fisici come numeri interi per distinguerli chiaramente dai qubit virtuali.Ad esempio:
from qiskit import QuantumCircuit from qiskit import transpile from qiskit.test.mock import FakeVigo qc = QuantumCircuit(3) qc.h(0) qc.cx(0, 1) qc.cx(0, 2) transpiled_qc = transpile(qc, FakeVigo()) transpiled_qc.draw(output='mpl') -
Aggiunte nuove funzioni di misura dello stato al modulo
qiskit.quantum_infoal modulo:qiskit.quantum_info.entropy(),qiskit.quantum_info.mutual_information(),qiskit.quantum_info.concurrence(), eqiskit.quantum_info.entanglement_of_formation(). Queste funzioni funzionano con gli elementiqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixe le classi. -
I metodi di decomposizione per le porte a singolo qubit in
qiskit.quantum_info.synthesis.one_qubit_decompose.OneQubitEulerDecomposersono stati ampliati per includere anche la base'ZXZ', caratterizzata da tre rotazioni attorno agli assi Z,X,Z. Ciò significa che un operatore generale 2x2 può essere scomposto nelle seguenti basi:U3,U1X,ZYZ,ZXZ,XYX,ZXZ.
Problemi noti
-
Esecuzione di funzioni che utilizzano
qiskit.tools.parallel_map()(ad esempioqiskit.execute.execute(),qiskit.compiler.transpile(), eqiskit.transpiler.PassManager.run()) potrebbero non funzionare se chiamate da uno script in esecuzione al di fuori di un bloccoif __name__ == '__main__':quando si usa Python 3.8 su MacOS. Gli altri ambienti non sono interessati da questo problema. Ciò è dovuto a cambiamenti nel modo in cui i processi paralleli vengono lanciati da Python 3.8 su MacOS. SeRuntimeErroroAttributeErrorvengono sollevati da script che chiamano direttamenteparallel_map()o quando si chiama una funzione che lo usa internamente con Python 3.8 e MacOS l'incorporazione delle chiamate agli script all'interno diif __name__ == '__main__':dovrebbe risolvere il problema. Ad esempio:from qiskit import QuantumCircuit, QiskitError from qiskit import execute, BasicAer qc1 = QuantumCircuit(2, 2) qc1.h(0) qc1.cx(0, 1) qc1.measure([0,1], [0,1]) # making another circuit: superpositions qc2 = QuantumCircuit(2, 2) qc2.h([0,1]) qc2.measure([0,1], [0,1]) execute([qc1, qc2], BasicAer.get_backend('qasm_simulator'))Dovrebbe essere modificata in:
from qiskit import QuantumCircuit, QiskitError from qiskit import execute, BasicAer def main(): qc1 = QuantumCircuit(2, 2) qc1.h(0) qc1.cx(0, 1) qc1.measure([0,1], [0,1]) # making another circuit: superpositions qc2 = QuantumCircuit(2, 2) qc2.h([0,1]) qc2.measure([0,1], [0,1]) execute([qc1, qc2], BasicAer.get_backend('qasm_simulator')) if __name__ == '__main__': main()se si verificano errori con Python 3.8 su MacOS.
Note sull'aggiornamento
-
Il valore del parametro
rep_timeper l'oggetto di configurazione del backend Pulse è ora in unità di secondi, non di microsecondi. La prima volta che un oggettoPulseBackendConfigurationviene inizializzato, viene emesso un singolo avviso all'utente per indicare questo. -
L'argomento
rep_timeperqiskit.compiler.assemble()accetta ora un valore in unità di secondi, non di microsecondi. Questo è stato fatto per rendere le unità con tutto il resto in polso. Se si sta passando un valore perrep_time, assicurarsi di aggiornare il valore per tenere conto di questa modifica. -
Il valore della proprietà
base_gatedegli oggettiqiskit.circuit.ControlledGateè stato cambiato dalla classe del gate di base a un'istanza della classe del gate di base. -
La proprietà
base_gate_namediqiskit.circuit.ControlledGateè stata rimossa; è possibile ottenere il nome del gate di base accedendo abase_gate.namesull'oggetto. Ad esempio:from qiskit import QuantumCircuit from qiskit.extensions import HGate qc = QuantumCircuit(3) cch_gate = HGate().control(2) base_gate_name = cch_gate.base_gate.name -
Modificato
qiskit.quantum_info.Operatorin modo che__mul__(che viene eseguito dall'operazione di moltiplicazione di python, se il lato sinistro dell'operazione è stato definito) implementi la moltiplicazione della matrice destra (ovveroqiskit.quantum_info.Operator.dot()), e__rmul__(che viene eseguito dall'operazione di moltiplicazione di python dal lato destro dell'operazione se il lato sinistro non ha definito__mul__) implementa la moltiplicazione scalare (cioèqiskit.quantum_info.Operator.multiply()). In precedenza entrambi i metodi implementavano la moltiplicazione scalare. -
Il secondo argomento della funzione
qiskit.quantum_info.process_fidelity()target, è ora opzionale. Se non viene specificato un target unitario, verrà restituita la fedeltà di processo del canale di ingresso con l'operatore di identità. -
qiskit.compiler.assemble()rispetterà ora il valore configurato dimax_shotsper un backend. Se viene specificato un valore per il kwargshotsche supera gli scatti massimi impostati nella configurazione del backend, la funzione solleverà un'eccezioneQiskitError. Inoltre, se non viene fornito alcun argomento per gli shots, il valore predefinito è 1024 (il comportamento precedente) omax_shotsdal backend, a seconda di quale sia il valore più basso.
Note di deprecazione
-
I metodi per aggiungere porte a un file
qiskit.circuit.QuantumCircuitcon argomenti di parole chiave abbreviate (ad esempioctl,tgt) hanno avuto i loro argomenti di parole chiave rinominati in modo da essere più descrittivi (ad esempiocontrol_qubit,target_qubit). I vecchi nomi sono stati deprecati. Di seguito è riportata una tabella con le firme di chiamata vecchie e nuove per i metodi diQuantumCircuit.Tipo di istruzionePrecedente FirmaNuova firmaqiskit.extensions.HGateqc.h(q)qc.h(qubit)qiskit.extensions.CHGateqc.ch(ctl, tgt)qc.ch((control_qubit, target_qubit))qiskit.extensions.IdGateqc.iden(q)qc.iden(qubit)qiskit.extensions.RGateqc.iden(q)qc.iden(qubit)qiskit.extensions.RGateqc.r(theta, phi, q)qc.r(theta, phi, qubit)qiskit.extensions.RXGateqc.rx(theta, q)qc.rx(theta, qubit)qiskit.extensions.CrxGateqc.crx(theta, ctl, tgt)qc.crx(theta, control_qubit, target_qubit)qiskit.extensions.RYGateqc.ry(theta, q)qc.ry(theta, qubit)qiskit.extensions.CryGateqc.cry(theta, ctl, tgt)qc.cry(theta, control_qubit, target_qubit)qiskit.extensions.RZGateqc.rz(phi, q)qc.rz(phi, qubit)qiskit.extensions.CrzGateqc.crz(theta, ctl, tgt)qc.crz(theta, control_qubit, target_qubit)qiskit.extensions.SGateqc.s(q)qc.s(qubit)qiskit.extensions.SdgGateqc.sdg(q)qc.sdg(qubit)qiskit.extensions.FredkinGateqc.cswap(ctl, tgt1, tgt2)qc.cswap(control_qubit, target_qubit1, target_qubit2)qiskit.extensions.TGateqc.t(q)qc.t(qubit)qiskit.extensions.TdgGateqc.tdg(q)qc.tdg(qubit)qiskit.extensions.U1Gateqc.u1(theta, q)qc.u1(theta, qubit)qiskit.extensions.Cu1Gateqc.cu1(theta, ctl, tgt)qc.cu1(theta, control_qubit, target_qubit)qiskit.extensions.U2Gateqc.u2(phi, lam, q)qc.u2(phi, lam, qubit)qiskit.extensions.U3Gateqc.u3(theta, phi, lam, q)qc.u3(theta, phi, lam, qubit)qiskit.extensions.Cu3Gateqc.cu3(theta, phi, lam, ctl, tgt)qc.cu3(theta, phi, lam, control_qubit, target_qubit)qiskit.extensions.XGateqc.x(q)qc.x(qubit)qiskit.extensions.CnotGateqc.cx(ctl, tgt)qc.cx(control_qubit, target_qubit)qiskit.extensions.ToffoliGateqc.ccx(ctl1, ctl2, tgt)qc.ccx(control_qubit1, control_qubit2, target_qubit)qiskit.extensions.YGateqc.y(q)qc.y(qubit)qiskit.extensions.CyGateqc.cy(ctl, tgt)qc.cy(control_qubit, target_qubit)qiskit.extensions.ZGateqc.z(q)qc.z(qubit)qiskit.extensions.CzGateqc.cz(ctl, tgt)qc.cz(control_qubit, target_qubit) -
L'esecuzione di
qiskit.pulse.Acquiresu più qubit è stata deprecata e sarà rimossa in una versione futura. Inoltre, i parametriqiskit.pulse.AcquireInstructionmem_slotsereg_slotssono stati deprecati. Al loro posto vanno utilizzatireg_slotemem_slot. -
L'attributo della
qiskit.providers.models.PulseDefaultsdella classecircuit_instruction_mapè stato deprecato e sarà rimosso in una prossima versione. Si deve invece utilizzare il nuovo attributoinstruction_schedule_map. Questo è stato fatto per far corrispondere il tipo di valore dell'attributo, che è unInstructionScheduleMap. -
Il comando
qiskit.pulse.PersistentValueè deprecato e sarà rimosso in una versione futura. Una funzionalità simile può essere ottenuta con il comandoqiskit.pulse.ConstantPulse(uno dei nuovi impulsi parametrici). Confrontate quanto segue:from qiskit.pulse import Schedule, PersistentValue, ConstantPulse, \ DriveChannel # deprecated implementation sched_w_pv = Schedule() sched_w_pv += PersistentValue(value=0.5)(DriveChannel(0)) sched_w_pv += PersistentValue(value=0)(DriveChannel(0)) << 10 # preferred implementation sched_w_const = Schedule() sched_w_const += ConstantPulse(duration=10, amp=0.5)(DriveChannel(0)) -
Python 3.5 in qiskit-terra è deprecato. Il supporto sarà rimosso nella prima versione dopo la data di fine vita della comunità upstream di Python, che è il 13/09/2020.
-
Il kwarg
require_cptpdella funzioneqiskit.quantum_info.process_fidelity()è stata deprecata e sarà rimossa in una prossima versione. È sostituita da due kwarg separatirequire_cperequire_tp. -
Impostazione del parametro
scaleperqiskit.circuit.QuantumCircuit.draw()eqiskit.visualization.circuit_drawer()come primo argomento posizionale è deprecato e sarà rimosso in una prossima versione. Si deve invece usarescalecome argomento della parola chiave. -
Il modulo
qiskit.tools.qi.qiè deprecato e sarà rimosso in una prossima versione. Le funzioni legacy del modulo sono state tutte sostituite da funzioni e classi del moduloqiskit.quantum_infomodulo. Di seguito è riportata una tabella delle funzioni deprecate e della loro sostituzione:ObsoletoSostituzioneqiskit.tools.partial_trace()qiskit.quantum_info.partial_trace()qiskit.tools.choi_to_pauli()qiskit.quantum_info.Choiequantum_info.PTMqiskit.tools.chop()numpy.roundqiskit.tools.qi.qi.outernumpy.outerqiskit.tools.concurrence()qiskit.quantum_info.concurrence()qiskit.tools.shannon_entropy()qiskit.quantum_info.shannon_entropy()qiskit.tools.entropy()qiskit.quantum_info.entropy()qiskit.tools.mutual_information()qiskit.quantum_info.mutual_information()qiskit.tools.entanglement_of_formation()qiskit.quantum_info.entanglement_of_formation()qiskit.tools.is_pos_def()quantum_info.operators.predicates.is_positive_semidefinite_matrix -
Il modulo
qiskit.quantum_info.states.statesè deprecato e sarà rimosso in una prossima versione. Le funzioni legacy del modulo sono state tutte sostituite da funzioni e classi del moduloqiskit.quantum_infomodulo.ObsoletoSostituzioneqiskit.quantum_info.states.states.basis_stateqiskit.quantum_info.Statevector.from_label()qiskit.quantum_info.states.states.projectorqiskit.quantum_info.DensityMatrix -
Il parametro
scalingdel metododraw()per gli oggettiScheduleePulseè stato deprecato e sarà rimosso in una prossima versione. Si deve invece utilizzare il nuovo parametroscale. Questo è stato fatto per avere un argomento coerente tra i disegni degli impulsi e dei circuiti. Ad esempio:#The consistency in parameters is seen below #For circuits circuit = QuantumCircuit() circuit.draw(scale=0.2) #For pulses pulse = SamplePulse() pulse.draw(scale=0.2) #For schedules schedule = Schedule() schedule.draw(scale=0.2)
Correzioni di bug
- In precedenza, chiamando
qiskit.circuit.QuantumCircuit.bind_parameters()prima della scomposizione di un circuito, i valori vincolati non venivano sostituiti correttamente nelle porte scomposte. Questo problema è stato risolto in modo che il legame e la decomposizione possano avvenire in qualsiasi ordine. Corregge il problema #2482 e il problema #3509 - In precedenza, il sito
Collect2qBlocksnon aveva considerato le condizioni classiche quando si trattava di decidere se inserire un cancello in un blocco esistente. In alcuni casi, ciò ha comportato la perdita delle condizioni classiche durante la trasposizione conoptimization_level=3. Questo problema è stato risolto in modo che le porte condizionate in modo classico non siano mai incluse in un blocco. Corregge il problema #3215 - Tutti i tipi di uscita per i cassetti del circuito in
qiskit.circuit.QuantumCircuit.draw()eqiskit.visualization.circuit_drawer()hanno un supporto fisso e/o migliorato per le porte personalizzate controllate dal disegno. Corregge il problema #3546, il problema #3763 e il problema #3764 - Sono stati aggiunti spiegazioni ed esempi alla documentazione dei metodi
qiskit.circuit.QuantumCircuitper l'aggiunta di porte:qiskit.circuit.QuantumCircuit.ccx(),qiskit.circuit.QuantumCircuit.ch(),qiskit.circuit.QuantumCircuit.crz(),qiskit.circuit.QuantumCircuit.cswap(),qiskit.circuit.QuantumCircuit.cu1(),qiskit.circuit.QuantumCircuit.cu3(),qiskit.circuit.QuantumCircuit.cx(),qiskit.circuit.QuantumCircuit.cy(),qiskit.circuit.QuantumCircuit.cz(),qiskit.circuit.QuantumCircuit.h(),qiskit.circuit.QuantumCircuit.iden(),qiskit.circuit.QuantumCircuit.rx(),qiskit.circuit.QuantumCircuit.ry(),qiskit.circuit.QuantumCircuit.rz(),qiskit.circuit.QuantumCircuit.s(),qiskit.circuit.QuantumCircuit.sdg(),qiskit.circuit.QuantumCircuit.swap(),qiskit.circuit.QuantumCircuit.t(),qiskit.circuit.QuantumCircuit.tdg(),qiskit.circuit.QuantumCircuit.u1(),qiskit.circuit.QuantumCircuit.u2(),qiskit.circuit.QuantumCircuit.u3(),qiskit.circuit.QuantumCircuit.x(),qiskit.circuit.QuantumCircuit.y(),qiskit.circuit.QuantumCircuit.z(). Corregge il problema #3400 - Correzioni per la gestione del parametro numero complesso nella visualizzazione dei circuiti. Corregge il problema #3640
Altre note
- I passaggi del transpiler nella cartella
qiskit.transpiler.passessono stati organizzati in sottodirectory per meglio classificarli per funzionalità. Sono ancora tutti accessibili nello spazio dei nomiqiskit.transpiler.passes.
Aer 0.4.0
Aggiunto
- Aggiunto
NoiseModel.from_backendper la costruzione di un modello di rumore di base del dispositivo per un backend IBMQ (#569)- Aggiunti metodi di simulazione multi-GPU a
QasmSimulator,StatevectorSimulatoreUnitarySimulator. Il simulatore qasm ha una versione gpu dei metodi della matrice di densità e del vettore di stato e vi si può accedere usando"method": "density_matrix_gpu"o"method": "statevector_gpu"inbackend_options. Il metodo statevector simulator gpu è accessibile tramite"method": "statevector_gpu". Il metodo GPU del simulatore unitario è accessibile tramite"method": "unitary_gpu". Questi backend utilizzano CUDA e richiedono una GPU NVidia.(#544)- Aggiunto il backend
PulseSimulator(#542)- Aggiunte le classi
PulseSystemModeleHamiltonianModelper rappresentare i modelli da usare inPulseSimulator(#496, #493)- Aggiunto
duffing_model_generatorsper generare oggettiPulseSystemModelda un elenco di parametri (#516)- Migrazione del solutore di funzioni ODE a C++ (#442, #350)
- Aggiunti test del simulatore di impulsi di alto livello (#379)
- Flag CMake BLAS_LIB_PATH per impostare il percorso in cui cercare la libreria BLAS (#543)
Modificato
- Modificata la struttura della directory
srcper organizzare il codice sorgente del simulatore. Le intestazioni del controllore del simulatore sono state spostate insrc/controllerse le intestazioni dello Stato del metodo del simulatore sono insrc/simulators(#544)- Spostata la posizione di alcune funzioni (#568): * Spostato il contenuto di
qiskit.provider.aer.noise.errorsnel moduloqiskit.providers.noise* Spostato il contenuto diqiskit.provider.aer.noise.utilsnel moduloqiskit.provider.aer.utils.- Abilitata l'ottimizzazione per aggregare porte consecutive in un circuito (fusione) per impostazione predefinita (#579).
Obsoleto
- Funzioni deprecate di
utils.qobj_utils(#568)- Deprecato
qiskit.providers.aer.noise.device.basic_device_noise_model. È sostituito dal metodoNoiseModel.from_backend(#569)
Rimosso
- Rimossi i metodi
NoiseModel.as_dict,QuantumError.as_dict,ReadoutError.as_dicteQuantumError.kron, deprecati in 0.3 (#568).
Ignis 0.2
Nessuna modifica
Acqua 0.6
Nessuna modifica
IBM Q Fornitore 0.4.6
Aggiunto
-
A
IBMQBackendsono stati aggiunti diversi nuovi metodi:wait_for_final_state()fino al termine del lavoro. Prende una funzione di callback che invocherà dopo ogni query per fornire un feedback.active_jobs()restituisce i lavori inviati a un backend che sono attualmente in uno stato non completato.job_limit()restituisce il limite dei lavori per un backend.remaining_jobs_count()restituisce il numero di lavori che è possibile inviare al backend prima che venga raggiunto il limite di lavori.
-
QueueInfoha ora un nuovo metodoformat()che restituisce una stringa formattata delle informazioni sulla coda. -
IBMQJobha ora tre nuovi metodi:done(),running(), ecancelled()che vengono utilizzati per indicare lo stato del lavoro. -
qiskit.providers.ibmq.ibmqbackend.IBMQBackend.run()accetta ora un parametro opzionale job_tags. Se specificati, i job_tag vengono assegnati al lavoro, che può essere successivamente utilizzato come filtro inqiskit.providers.ibmq.ibmqbackend.IBMQBackend.jobs(). -
IBMQJobManagerdispone di un nuovo metodoretrieve_job_set()che consente di recuperare un job set precedentemente inviato utilizzando l'ID del job set.
Modificato
- La gerarchia di
Exceptionè stata perfezionata con classi più specializzate. Tuttavia, è possibile continuare a catturare le loro eccezioni genitore (comeIBMQAccountError). Inoltre, la classe di eccezioneIBMQApiUrlErrorè stata sostituita daIBMQAccountCredentialsInvalidUrleIBMQAccountCredentialsInvalidToken.
Obsoleto
- L'uso di URL proxy senza protocollo (ad es.
http://) è deprecato a causa delle recenti modifiche di Python.