Note di rilascio di Qiskit 0.14
0.14.0
Terra 0.11.0
Preludio
La release 0.11.0 include diverse nuove funzionalità e correzioni di bug. Il cambiamento più importante di questa versione è l'aggiunta dello schedulatore di impulsi. Ciò consente agli utenti di definire il proprio programma quantistico come QuantumCircuit e quindi di mapparlo sulle istruzioni a impulsi sottostanti che controlleranno l'hardware quantistico per implementare il circuito.
Nuove funzioni
-
Aggiunti 5 nuovi comandi per recuperare facilmente i dati specifici dell'utente da
BackendProperties:gate_property,gate_error,gate_length,qubit_property,t1,t2,readout_errorefrequency. Restituiscono i valori specifici delle proprietà del backend. Ad esempio:from qiskit.test.mock import FakeOurense backend = FakeOurense() properties = backend.properties() gate_property = properties.gate_property('u1') gate_error = properties.gate_error('u1', 0) gate_length = properties.gate_length('u1', 0) qubit_0_property = properties.qubit_property(0) t1_time_0 = properties.t1(0) t2_time_0 = properties.t2(0) readout_error_0 = properties.readout_error(0) frequency_0 = properties.frequency(0) -
Aggiunto il metodo
Instruction.is_parameterized()per verificare se un oggetto istruzione è parametrizzato. Questo metodo restituisceTruese e solo se l'istruzione ha un oggettoParameterExpressionoParametercome uno dei suoi parametri. -
Aggiunto un nuovo passaggio di analisi
Layout2qDistance. Questo passaggio consente di "segnare" una selezione di layout, una volta impostatoproperty_set['layout']. Il punteggio sarà la somma delle distanze per ogni porta a due equbit del circuito, quando non sono direttamente collegate. Questo punteggio non tiene conto della direzione nella mappa di accoppiamento. Più basso è il numero, migliore è la selezione del layout.Ad esempio, si consideri una mappa di accoppiamento lineare
[0]--[2]--[1]e il seguente circuito:qr = QuantumRegister(2, 'qr') circuit = QuantumCircuit(qr) circuit.cx(qr[0], qr[1])Se il layout è
{qr[0]:0, qr[1]:1},Layout2qDistanceimposteràproperty_set['layout_score'] = 1. Se il layout è{qr[0]:0, qr[1]:2}, il risultato èproperty_set['layout_score'] = 0. Più basso è il punteggio, meglio è. -
Aggiunto
qiskit.QuantumCircuit.cnotcome alias per il metodocxdiQuantumCircuit. I nomicnotecxsono spesso usati in modo intercambiabile, ora il metodo cx può essere chiamato con entrambi i nomi. -
Aggiunto
qiskit.QuantumCircuit.toffolicome alias per il metodoccxdiQuantumCircuit. I nomitoffolieccxsono spesso usati in modo intercambiabile, ora il metodo ccx può essere chiamato con entrambi i nomi. -
Aggiunto
qiskit.QuantumCircuit.fredkincome alias per il metodocswapdiQuantumCircuit. I nomifredkinecswapsono spesso usati in modo intercambiabile, ora il metodo cswap può essere chiamato con entrambi i nomi. -
La modalità di uscita
latexperqiskit.visualization.circuit_drawer()e il metodoqiskit.circuit.QuantumCircuit.draw()hanno ora una modalità per passare il latex grezzo dalle etichette e dai parametri del gate. La sintassi per farlo rispecchia quella della modalità mathtext di matplotlib. Qualsiasi porzione di una stringa di etichetta compresa tra una coppia di caratteri '$' sarà trattata come latex grezzo e passata direttamente nel latex di output generato. Questo può essere sfruttato per aggiungere una formattazione più avanzata agli schemi circuitali generati con il cassetto Latex.Prima di questa versione, tutte le etichette dei gate venivano sottoposte a una conversione utf8 -> latex per assicurarsi che il latex di uscita compilasse la stringa come previsto. Questo è ancora ciò che accade per tutte le porzioni di un'etichetta al di fuori della coppia '$'. Inoltre, se si desidera utilizzare un segno di dollaro nell'etichetta, assicurarsi di eseguire l'escape nella stringa dell'etichetta (ad esempio
'\$').È possibile combinare questo passaggio con la conversione utf8 -> latex per creare l'etichetta esatta desiderata, ad esempio:
from qiskit import circuit circ = circuit.QuantumCircuit(2) circ.h([0, 1]) circ.append(circuit.Gate(name='α_gate', num_qubits=1, params=[0]), [0]) circ.append(circuit.Gate(name='α_gate$_2$', num_qubits=1, params=[0]), [1]) circ.append(circuit.Gate(name='\$α\$_gate', num_qubits=1, params=[0]), [1]) circ.draw(output='latex')l'etichetta del primo cancello personalizzato sarà
α_gate, il secondo saràα_gatecon un pedice 2 e l'etichetta dell'ultimo cancello personalizzato sarà$α$_gate. -
Aggiungere la classe
ControlledGateper rappresentare i cancelli controllati. Le istanze di cancelli controllati vengono create con il metodocontrol(n)degli oggettiGate, dovenrappresenta il numero di controlli. I qubit di controllo vengono prima dei qubit controllati nel nuovo gate. Ad esempio:from qiskit import QuantumCircuit from qiskit.extensions import HGate hgate = HGate() circ = QuantumCircuit(4) circ.append(hgate.control(3), [0, 1, 2, 3]) print(circ)genera:
q_0: |0>──■── │ q_1: |0>──■── │ q_2: |0>──■── ┌─┴─┐ q_3: |0>┤ H ├ └───┘ -
I valori consentiti dei parametri e dei campi di
meas_levelpossono ora essere un membro della classe IntEnumqiskit.qobj.utils.MeasLevel. Può essere utilizzato quando si chiamaexecute(o qualsiasi altro punto in cui è specificatomeas_level) con un esperimento a impulsi. Ad esempio:from qiskit import QuantumCircuit, transpile, schedule, execute from qiskit.test.mock import FakeOpenPulse2Q from qiskit.qobj.utils import MeasLevel, MeasReturnType backend = FakeOpenPulse2Q() qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0,1) qc_transpiled = transpile(qc, backend) sched = schedule(qc_transpiled, backend) execute(sched, backend, meas_level=MeasLevel.CLASSIFIED)In questo esempio,
meas_level=MeasLevel.CLASSIFIEDemeas_level=2possono essere usati indifferentemente. -
È incluso un nuovo selettore di layout basato sulla risoluzione dei vincoli. CSPLayout modella il problema di trovare un layout come un problema di vincoli e utilizza il backtracking ricorsivo per risolverlo.
cmap16 = CouplingMap(FakeRueschlikon().configuration().coupling_map) qr = QuantumRegister(5, 'q') circuit = QuantumCircuit(qr) circuit.cx(qr[0], qr[1]) circuit.cx(qr[0], qr[2]) circuit.cx(qr[0], qr[3]) pm = PassManager(CSPLayout(cmap16)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])Layout({ 1: Qubit(QuantumRegister(5, 'q'), 1), 2: Qubit(QuantumRegister(5, 'q'), 0), 3: Qubit(QuantumRegister(5, 'q'), 3), 4: Qubit(QuantumRegister(5, 'q'), 4), 15: Qubit(QuantumRegister(5, 'q'), 2) })Il parametro
CSPLayout(...,strict_direction=True)è più restrittivo, ma garantisce che non sia necessario eseguireCXDirectiondopo.pm = PassManager(CSPLayout(cmap16, strict_direction=True)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])Layout({ 8: Qubit(QuantumRegister(5, 'q'), 4), 11: Qubit(QuantumRegister(5, 'q'), 3), 5: Qubit(QuantumRegister(5, 'q'), 1), 6: Qubit(QuantumRegister(5, 'q'), 0), 7: Qubit(QuantumRegister(5, 'q'), 2) })Se il sistema di vincoli non è risolvibile, la proprietà di layout non viene impostata.
circuit.cx(qr[0], qr[4]) pm = PassManager(CSPLayout(cmap16)) circuit_after = pm.run(circuit) print(pm.property_set['layout'])None -
PulseBackendConfiguration (a cui si accede normalmente come backend.configuration ()) è stato esteso con metodi utili per esplorare i suoi dati e le funzionalità esistenti in PulseChannelSpec. PulseChannelSpec sarà deprecato in futuro. Ad esempio:
backend = provider.get_backend(backend_name) config = backend.configuration() q0_drive = config.drive(0) # or, DriveChannel(0) q0_meas = config.measure(0) # MeasureChannel(0) q0_acquire = config.acquire(0) # AcquireChannel(0) config.hamiltonian # Returns a dictionary with hamiltonian info config.sample_rate() # New method which returns 1 / dt -
PulseDefaults(a cui si accede normalmente comebackend.defaults()) ha un attributo,circuit_instruction_mapche ha i metodi di CmdDef. Il nuovo circuit_instruction_map è un oggetto diInstructionScheduleMapcon tre nuove funzioni, oltre a quella che aveva CmdDef :- qubit_instructions(qubits) restituisce le operazioni definite per i qubit
- assert_has(istruzione, qubit) solleva un errore se l'operazione non è definita
- remove(istruzione, qubit) come pop, ma non richiede parametri
Ci sono alcune differenze rispetto al CmdDef:
__init__non accetta argomenticmdsecmd_qubitssono deprecati e sostituiti coninstructionsequbits_with_instruction
Esempio:
backend = provider.get_backend(backend_name) inst_map = backend.defaults().circuit_instruction_map qubit = inst_map.qubits_with_instruction('u3')[0] x_gate = inst_map.get('u3', qubit, P0=np.pi, P1=0, P2=np.pi) pulse_schedule = x_gate(DriveChannel(qubit)) -
Alla funzione
qiskit.visualization.pulse_drawer()e al metodoqiskit.pulse.Schedule.draw()è stato aggiunto un nuovo parametro kwarg,show_framechange_channels, che consente di disabilitare la visualizzazione dei canali con le sole istruzioni framechange nelle visualizzazioni degli impulsi. Quando questo nuovo kwarg è impostato suFalse, la visualizzazione della programmazione degli impulsi in uscita non includerà i canali che includono solo le modifiche dei fotogrammi.Ad esempio:
from qiskit.pulse import * from qiskit.pulse import library as pulse_lib gp0 = pulse_lib.gaussian(duration=20, amp=1.0, sigma=1.0) sched = Schedule() channel_a = DriveChannel(0) channel_b = DriveChannel(1) sched += Play(gp0, channel_a) sched = sched.insert(60, ShiftPhase(-1.57, channel_a)) sched = sched.insert(30, ShiftPhase(-1.50, channel_b)) sched = sched.insert(70, ShiftPhase(1.50, channel_b)) sched.draw(show_framechange_channels=False) -
Viene aggiunta una nuova funzione di utilità
qiskit.result.marginal_counts()che consente la marginalizzazione dei conteggi su alcuni indici di interesse. Ciò è utile quando si misura un numero di qubit superiore al necessario e si desidera ottenere i conteggi delle osservazioni solo per un sottoinsieme di essi. -
Quando
passmanager.run(...)viene invocato con più di un circuito, la transpilazione di questi circuiti viene eseguita in parallelo. -
PassManagers può ora essere tagliato per creare un nuovo PassManager contenente un sottoinsieme di passaggi, utilizzando l'operatore di parentesi quadra. Ciò consente di eseguire o disegnare una parte del sito PassManager per facilitare i test e la visualizzazione. Ad esempio, proviamo a disegnare le prime 3 passate di una pm PassManager, oppure eseguiamo solo la seconda passata sul nostro circuito:
pm[0:4].draw() circuit2 = pm[1].run(circuit)Inoltre, PassManagers può essere creato aggiungendo due PassManagers o aggiungendo direttamente un passaggio/una lista di passaggi a una PassManager.
pm = pm1[0] + pm2[1:3] pm += [setLayout, unroller] -
A Qiskit è stato aggiunto un modulo di base
scheduler. Lo scheduler programma un input transpiledQuantumCircuitin un impulsoSchedule. Lo scheduler accetta come input unSchedulee unBackendimpulso, oppure unCmdDefche mette in relazione gli oggettiInstructioncircuito su qubit specifici con gli impulsi Scheduler e unmeas_mapche determina quali misure devono avvenire insieme.Esempio di programmazione:
from qiskit import QuantumCircuit, transpile, schedule from qiskit.test.mock import FakeOpenPulse2Q backend = FakeOpenPulse2Q() qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0,1) qc_transpiled = transpile(qc, backend) schedule(qc_transpiled, backend)alap``asapLo scheduler supporta attualmente due politiche di scheduling, as\late\code(01) e as\soon\code(01), che programmano rispettivamente le istruzioni a impulsi in modo che avvengano il più tardi possibile o il più presto possibile tra i qubit di un circuito. La politica di programmazione può essere selezionata con l'argomento di ingressomethod, ad esempio:schedule(qc_transpiled, backend, method='alap')È facile utilizzare un impulso
Scheduleall'interno di unQuantumCircuitmappandolo su un'istruzione di circuito personalizzata, come una porta che può essere utilizzata in unQuantumCircuit. Per farlo, occorre innanzitutto definire il gate personalizzato e poi aggiungere una voce nel sitoCmdDefper il gate, per ogni qubit a cui il gate sarà applicato. Il gate può essere utilizzato nel sitoQuantumCircuit. Al momento della programmazione, il gate viene mappato sul programma di impulsi sottostante. L'utilizzo di questa tecnica consente una facile integrazione con i moduli qiskit preesistenti, come Ignis.Ad esempio:
from qiskit import pulse, circuit, schedule from qiskit.pulse import pulse_lib custom_cmd_def = pulse.CmdDef() # create custom gate custom_gate = circuit.Gate(name='custom_gate', num_qubits=1, params=[]) # define schedule for custom gate custom_schedule = pulse.Schedule() custom_schedule += pulse_lib.gaussian(20, 1.0, 10)(pulse.DriveChannel) # add schedule to custom gate with same name custom_cmd_def.add('custom_gate', (0,), custom_schedule) # use custom gate in a circuit custom_qc = circuit.QuantumCircuit(1) custom_qc.append(custom_gate, qargs=[0]) # schedule the custom gate schedule(custom_qc, cmd_def=custom_cmd_def, meas_map=[[0]])
Problemi noti
- La funzione di transpiling in parallelo quando
passmanager.run(...)viene invocato con più di un circuito non è supportata in Windows. Per maggiori dettagli, vedere il numero 2988.
Note sull'aggiornamento
- La classe
qiskit.pulse.channels.SystemTopologyè stata utilizzata come classe ausiliaria perPulseChannelSpec. È stato rimosso con la deprecazione diPulseChannelSpece le modifiche aBackendConfigurationlo rendono inutile. - La rappresentazione dei qubit e dei bit classici come tuple, precedentemente deprecata nella versione 0.9, è stata rimossa. L'uso degli oggetti
QubiteClbitè il nuovo modo di rappresentare i qubit e i bit classici. - La rappresentazione precedentemente deprecata dell'insieme di basi come singola stringa è stata rimossa. Un elenco di stringhe è il nuovo modo preferito.
- Il metodo
BaseModel.as_dict, deprecato nella release 0.9, è stato rimosso in favore del metodoBaseModel.to_dict. - In PulseDefaults (a cui si accede normalmente come backend.defaults ()),
qubit_freq_estemeas_freq_estvengono ora restituiti in Hz anziché in GHz. Ciò significa che i nuovi valori di ritorno sono 1e9 * il loro valore precedente. - l' aneto è stato aggiunto come requisito. Questo è necessario per consentire il funzionamento di
passmanager.run()in parallelo per più di un circuito. - Il gate
UBase, precedentemente deprecato nella release 0.9, è stato rimosso. Al suo posto va utilizzato il cancelloU3Gate. - Il gate
CXBase, precedentemente deprecato nella release 0.9, è stato rimosso. Al suo posto va utilizzato il cancelloCnotGate. - L'istruzione
snapshotè utilizzata per convertire implicitamente il parametrolabelin stringa. Questa conversione è stata rimossa e viene sollevato un errore se non viene fornita una stringa. - Il gate
U0Gate, precedentemente deprecato nella release 0.9, è stato rimosso. Per inserire i ritardi si dovrebbe invece utilizzare il gateIdGate.
Note di deprecazione
-
La classe
qiskit.pulse.CmdDefè stata deprecata. Si dovrebbe invece utilizzare il sitoqiskit.pulse.InstructionScheduleMap. L'oggettoInstructionScheduleMapper un sistema abilitato agli impulsi è accessibile all'indirizzobackend.defaults().instruction_schedules. -
PulseChannelSpecè stato deprecato. Utilizzare inveceBackendConfiguration. La configurazione del backend è accessibile normalmente comebackend.configuration(). Il config è stato esteso con la maggior parte delle funzionalità di PulseChannelSpec, con alcune modifiche, come segue, dove 0 è un indice di qubit esemplare:pulse_spec.drives[0] -> config.drive(0) pulse_spec.measures[0] -> config.measure(0) pulse_spec.acquires[0] -> config.acquire(0) pulse_spec.controls[0] -> config.control(0)Ora, se si tenta di ottenere un canale per un qubit che non esiste per il dispositivo, verrà sollevato un
BackendConfigurationErrorcon una spiegazione utile.I metodi
memoryslotseregisterslotsdi PulseChannelSpec non sono stati migrati nella configurazione del backend. Queste risorse classiche non sono limitate dalla configurazione fisica di un sistema backend. Si prega di istanziarli direttamente:pulse_spec.memoryslots[0] -> MemorySlot(0) pulse_spec.registerslots[0] -> RegisterSlot(0)Il metodo
qubitsnon è migrato nella configurazione del backend. Il risultato diqubitspuò essere costruito come tale:[q for q in range(backend.configuration().n_qubits)] -
Qubitall'interno dipulse.channelsè stato deprecato. Non devono essere utilizzati. È possibile ottenere le mappature dei qubit del canale <=> attraverso il programma BackendConfiguration (o backend.configuration ()). -
La funzione
qiskit.visualization.circuit_drawer.qx_color_scheme()è stata deprecata. Questa funzione non è più utilizzata internamente e non riflette lo stile attuale di IBM QX. Se si utilizza questa funzione per generare un dizionario di stile in locale, è necessario salvare l'output e utilizzare direttamente il dizionario. -
L'eccezione
TranspilerAccessErrorè stata deprecata. È possibile utilizzare una funzione alternativaTranspilerErrorper ottenere la stessa funzionalità. Questa funzione alternativa fornisce la stessa identica funzionalità, ma con una maggiore generalità. -
I buffer in Pulse sono deprecati. Se viene fornito un buffer non nullo, viene emesso un avviso che ricorda di utilizzare un ritardo. Altre opzioni possono essere l'aggiunta di campioni a un'istruzione di impulso che sono ( 0.+0.j ) o l'impostazione del tempo di inizio dell'impulso successivo a
schedule.duration + buffer. -
Il passaggio dei tipi
sympy.Basic,sympy.Expresympy.Matrixcome parametri di istruzione è deprecato e sarà rimosso in una versione futura. È necessario convertire l'input in uno dei tipi supportati, che sono:intfloatcomplexstrnp.ndarray
Correzioni di bug
- I passaggi Collect2qBlocks e CommutationAnalysis del transpiler non erano in grado di elaborare i circuiti contenenti porte parametrizzate, impedendo la trasposizione dei circuiti parametrizzati al livello di ottimizzazione 2 o superiore. Questi passaggi sono stati corretti per trattare le porte parametrizzate come opache.
- La funzione align_measures presentava un problema a causa del quale gli impulsi di stimolo Measure non venivano allineati correttamente con gli impulsi Acquire, generando un errore. Il problema è stato risolto.
- L'uso di
numpy.random.seedè stato rimosso, in modo che le chiamate alle funzioni di qiskit non influenzino i risultati delle future chiamate anumpy.random - Corretta la condizione di race condition che si verifica nel job monitor quando
job.queue_position()restituisceNone.Noneè un ritorno valido dajob.queue_position(). - Il supporto del backend per
memory=Trueora viene controllato quando viene passato il kwarg.QiskitErrorrisultati se non supportati. - Quando si effettuava la transpilazione senza mappa di accoppiamento, non si controllava la quantità di qubit del circuito da transpilare. Ora il processo di transpile controlla che il backend abbia abbastanza qubit per allocare il circuito.
Altre note
- La funzione
qiskit.result.marginal_counts()sostituisce una funzione di utilità simile presente in qiskit-ignisqiskit.ignis.verification.tomography.marginal_counts(), che sarà deprecata in una futura versione di qiskit-ignis. - Tutti i tipi di output dei parametri sympy sono stati rimossi (o deprecati, come indicato) da qiskit-terra. Ciò include i parametri di tipo sympy negli oggetti
QuantumCircuit, nei nodi qasm ast o negli oggettiQobj.
Aer 0.3
Nessuna modifica
Ignis 0.2
Nessuna modifica
Acqua 0.6
Nessuna modifica
IBM Q Fornitore 0.4
Preludio
La versione 0.4.0 è la prima che utilizza tutte le funzionalità della nuova API IBM Q. In particolare, la classe IBMQJob è stata rinnovata per poter recuperare più informazioni da IBM Q, ed è stata aggiunta una classe Job Manager per consentire un utilizzo di livello superiore e più fluido di lavori grandi o complessi. Se non avete ancora effettuato l'aggiornamento dalla versione precedente IBM Q Experience o QConsole, consultate le note di rilascio di IBM Q Provider 0.3 (Qiskit 0.11 ) per maggiori dettagli su come effettuare la transizione. Gli account legacy non saranno più supportati a partire da questa release.
Nuove funzioni
Modifiche al lavoro
La classe IBMQJob è stata rivista e ora riproduce più fedelmente il contenuto di un lavoro remoto, oltre a nuove funzionalità:
- È ora possibile assegnare un nome a un lavoro, specificando
IBMQBackend.run(..., job_name='...')quando si invia un lavoro. Questo nome può essere recuperato tramiteIBMQJob.name()e può essere utilizzato per il filtraggio. - I lavori possono ora essere condivisi con altri utenti a diversi livelli (globale, per hub, gruppo o progetto) tramite un parametro opzionale
job_share_levelquando si invia il lavoro. IBMQJobhanno ora più attributi, che riflettono i contenuti dei lavori remoti IBM Q. Ciò implica che i nuovi attributi introdotti dall'API IBM Q saranno automaticamente e immediatamente disponibili per l'uso (ad esempio,job.new_api_attribute). I nuovi attributi saranno promossi a metodi quando saranno considerati stabili (ad esempio,job.name())..error_message()restituisce ulteriori informazioni sul motivo del fallimento di un lavoro..queue_position()accetta un parametrorefreshper forzare un aggiornamento..result()accetta un parametro opzionalepartial, per restituire eventuali risultati parziali di lavori non riusciti. Si tenga presente che i metodi diResult, comeget_counts(), solleveranno un'eccezione se applicati a esperimenti non riusciti.
Si noti che i cambiamenti includono alcune modifiche di basso livello della classe. Se le istanze sono state create manualmente, si noti che:
- la firma del costruttore è stata modificata per tenere conto delle nuove caratteristiche.
- il metodo
.submit()non può più essere chiamato direttamente e si prevede che i lavori vengano inviati tramite il metodo sincronoIBMQBackend.run()o tramite il Job Manager.
Gestore lavoro
È stato introdotto un nuovo Job Manager (IBMQJobManager), come meccanismo di livello superiore per la gestione di lavori composti da più circuiti o programmi a impulsi. Il Job Manager mira a fornire un'interfaccia trasparente, suddividendo in modo intelligente l'input in unità di lavoro efficienti e sfruttando appieno i diversi componenti. Sarà ampliato nelle prossime versioni e diventerà il punto di ingresso consigliato per la presentazione dei lavori.
Il metodo .run() riceve un elenco di circuiti o programmi di impulsi e restituisce un ManagedJobSet instance, che può essere utilizzato per tenere traccia degli stati e dei risultati di questi lavori. Ad esempio:
from qiskit.providers.ibmq.managed import IBMQJobManager
from qiskit.circuit.random import random_circuit
from qiskit import IBMQ
from qiskit.compiler import transpile
provider = IBMQ.load_account()
backend = provider.backends.ibmq_ourense
circs = []
for _ in range(1000000):
circs.append(random_circuit(2, 2))
transpile(circs, backend=backend)
# Farm out the jobs.
jm = IBMQJobManager()
job_set = jm.run(circs, backend=backend, name='foo')
job_set.statuses() # Gives a list of job statuses
job_set.report() # Prints detailed job information
results = job_set.results()
counts = results.get_counts(5) # Returns data for experiment 5provider.backends modifiche
Il membro provider.backends , che in precedenza era una funzione che restituiva un elenco di backend, è stato promosso a servizio. Questo implica che può essere usato sia nel modo precedente, come metodo .backends() , sia come attributo .backends con funzionalità ampliate:
-
contiene i backend esistenti di quel provider come attributi, che possono essere usati per il completamento automatico. Ad esempio:
my_backend = provider.get_backend('ibmq_qasm_simulator')Š equivalente a:
my_backend = provider.backends.ibmq_qasm_simulator -
i metodi
provider.backends.jobs()eprovider.backends.retrieve_job()possono essere utilizzati per recuperare i lavori a livello di provider.
Altre modifiche
- La funzione
backend.properties()accetta ora un parametro opzionaledatetime. Se specificato, la funzione restituisce le proprietà del backend più vicine, ma più vecchie, del filtro datetime specificato. - Alcuni
warningssono stati ridotti a messaggilogger.warning.