Skip to main content
IBM Quantum Platform

Note di rilascio di Qiskit 0.20


0.20.1

Terra 0.15.2

Correzioni di bug

  • Quando si accedeva all'attributo definition di un'istanza parametrica di Gate , QuantumCircuit era stato generato con un ParameterTable non valido, cosicché la lettura di QuantumCircuit.parameters o la chiamata a QuantumCircuit.bind_parameters riportavano in modo errato i parametri non vincolati. Questo problema è stato risolto.
  • SXGate().inverse() aveva precedentemente restituito un gate 'sx_dg' con un definition corretto ma un to_matrix errato. È stato aggiornato in modo che SXGate().inverse() restituisca un SXdgGate() e viceversa.
  • Instruction.inverse()se non sovrascritto da una sottoclasse, in alcuni casi restituisce un'istanza di Gate con un metodo to_matrix non corretto. Le istanze dei metodi to_matrix non corretti sono state rimosse.
  • Per C3XGate con un angle non nullo, l'inversione del gate tramite C3XGate.inverse() aveva precedentemente generato un gate inverso errato. Questo è stato corretto.
  • Le modalità di MCXGate sono state aggiornate per restituire un gate della stessa modalità quando si chiama .inverse(). Questo risolve un problema a causa del quale, in alcuni casi, la trasposizione di un circuito contenente l'inverso di una porta MCXVChain generava un errore.
  • In precedenza, quando si creava un gate di fase a controllo multiplo tramite PhaseGate.control, veniva restituito un gate MCU1Gate . Questo problema è stato corretto in modo che venga restituito un MCPhaseGate .
  • In precedenza, il tentativo di scomporre un circuito contenente un MCPhaseGate sollevava un errore dovuto a un'incongruenza nella definizione di MCPhaseGate. Questo è stato corretto.
  • QuantumCircuit.compose e DAGCircuit.compose avevano, in alcuni casi, tradotto in modo errato le porte condizionali se il circuito di ingresso conteneva più di un ClassicalRegister. Questo problema è stato risolto.
  • È stato risolto un problema durante la creazione di un oggetto qiskit.result.Counts da un dizionario dati vuoto. Ora questo creerà un oggetto Counts vuoto. Il metodo most_frequent() è stato aggiornato per sollevare un'eccezione più descrittiva quando l'oggetto è vuoto. Correzioni #5017
  • L'estensione dei circuiti con registri diversi ha aggiornato di conseguenza le proprietà qregs e cregs , ma non le liste qubits e clbits . Poiché questi non sono più generati dai registri, ma sono elenchi memorizzati nella cache, ciò comporta una discrepanza tra registri e bit. Questo problema è stato risolto e il metodo extend aggiorna esplicitamente gli elenchi di bit memorizzati nella cache.
  • Correggere i bug delle implementazioni concrete del metodo meth:~qiskit.circuit.ControlledGate.inverse che non conservano il parametro ctrl_state .
  • È stato corretto un bug che causava un errore di ricorsione per le pianificazioni di impulsi lunghi.

Aer 0.6.1

Nessuna modifica

Ignis 0.4.0

Nessuna modifica

Acqua 0.7.5

Nessuna modifica

IBM Q Fornitore 0.8.0

Nessuna modifica


0.20.0

Terra 0.15.1

Preludio

La release 0.15.0 include diverse nuove funzionalità e correzioni di bug. Alcuni punti salienti di questa release sono:

Questa versione include l'introduzione della traduzione di basi arbitrarie nel transpiler. Ciò include il supporto per l'indirizzamento diretto a una gamma più ampia di set di basi di dispositivi, ad esempio backend che implementano porte RZ, RY, RZ, CZ o iSwap.

La QuantumCircuit tiene ora traccia della fase globale. Ciò significa che il controllo di un circuito che ha una fase globale ora aggiunge correttamente una fase relativa e le definizioni delle matrici dei gate sono ora esatte anziché uguali fino a una fase globale.

Nuove funzioni

  • Una nuova classe DAG qiskit.dagcircuit.DAGDependency per rappresentare la forma di dipendenza del circuito. In questo DAG, i nodi sono operazioni (porte, misure, barriere, ecc...) e gli spigoli corrispondono alla non commutazione tra due operazioni.

  • Sono state aggiunte quattro nuove funzioni a qiskit.converters per convertire avanti e indietro in DAGDependency. Queste funzioni sono:

    Ad esempio:

    from qiskit.converters.dagdependency_to_circuit import dagdependency_to_circuit
    from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
    
    circuit_in = QuantumCircuit(2)
    circuit_in.h(qr[0])
    circuit_in.h(qr[1])
    
    dag_dependency = circuit_to_dagdependency(circuit_in)
    circuit_out = dagdepency_to_circuit(dag_dependency)
  • Sono stati aggiunti due nuovi passaggi di transpiler a qiskit.transpiler.passes Il primo, UnrollCustomDefinitionssrotola tutte le istruzioni del circuito in base alle loro proprietà definition fermandosi al raggiungimento del sito basis_gates o di un insieme di porte nel campo fornito EquivalenceLibrary. Il secondo, BasisTranslatorutilizza l'insieme delle traduzioni del file fornito EquivalenceLibrary per riscrivere le istruzioni del circuito in una base specifica.

  • È stato aggiunto un nuovo argomento della parola chiave translation_method a transpile() per consentire la selezione del metodo da utilizzare per la traduzione dei circuiti nelle porte dei dispositivi disponibili. Ad esempio, transpile(circ, backend, translation_method='translator'). Le scelte valide sono:

    Il valore predefinito è 'translator'.

  • È stata aggiunta una nuova classe per la gestione dei dati dei risultati dei conteggi, qiskit.result.Countsè stata aggiunta. Questa classe è una sottoclasse di dict e può essere utilizzata come qualsiasi altro dizionario. Tuttavia, include metodi e attributi di aiuto per gestire i risultati dei conteggi degli esperimenti e gestisce anche la post-elaborazione e la formattazione delle stringhe binarie all'inizializzazione dell'oggetto. A Counts può essere creato passando un dizionario di conteggi con le chiavi che possono essere numeri interi, stringhe esadecimali della forma '0x4a', stringhe binarie della forma '0b1101', una stringa di bit formattata attraverso i registri e gli slot di memoria (cioè '00 10'), o una stringa dit. Ad esempio:

    from qiskit.result import Counts
    
    counts = Counts({"0x0': 1, '0x1', 3, '0x2': 1020})
  • È stato aggiunto un nuovo metodo per costruire qiskit.dagcircuit.DAGCircuit è stato aggiunto, from_networkx(). Questo metodo riceve un oggetto networkx MultiDiGraph (nel formato restituito da to_networkx()) e restituisce un nuovo oggetto DAGCircuit oggetto. L'intento di questa funzione è di consentire agli autori di passaggi di transpiler di sfruttare la libreria di algoritmi di grafi di networkx se una funzione non è presente nell' API di retworkx. Tuttavia, si spera che in questi casi venga aperto un problema con l' issue tracker di retworkx (o meglio ancora che venga inviata una richiesta di pull).

  • Un nuovo kwarg per init_qubits è stato aggiunto a assemble() e execute(). Per i backend che supportano questa funzione, init_qubits può essere utilizzato per controllare se il backend che esegue i circuiti inserisce sequenze di inizializzazione all'inizio di ogni ripresa. Per impostazione predefinita è impostato su True , il che significa che si può supporre che tutti i qubit si trovino nello stato ground all'inizio di ogni colpo. Tuttavia, quando init_qubits è impostato su False i qubit saranno non inizializzati all'inizio di ogni esperimento e tra un colpo e l'altro. Si noti che il backend che esegue i circuiti deve supportare questa funzione perché questo flag abbia effetto.

  • Un nuovo kwarg rep_delay è stato aggiunto a qiskit.compiler.assemble(), qiskit.execute.execute(), e al costruttore di PulseQobjtConfig.qiskit Questo nuovo kwarg viene utilizzato per indicare il tempo tra le esecuzioni del programma. Deve essere scelto dall'elenco dei valori validi impostati come rep_delays da un oggetto backend PulseBackendConfiguration a cui si può accedere come backend.configuration().rep_delays).

    Il kwarg rep_delay funzionerà solo sui backend che consentono un tempo di ripetizione dinamico. Questo sarà indicato anche nell'oggetto PulseBackendConfiguration per un backend come attributo dynamic_reprate_enabled . Se dynamic_reprate_enabled è False , verrà utilizzato il valore rep_time specificato per qiskit.compiler.assemble(), qiskit.execute.execute(), o il costruttore di PulseQobjtConfig verrà utilizzato al posto di rep_delay. rep_time consente di specificare solo la durata di un programma, piuttosto che il ritardo tra i programmi.

  • Il file qobj_schema.json JSON Schema in qiskit.schemas è stato aggiornato per includere rep_delay come proprietà di configurazione opzionale per i qobj di impulso.

  • Il file backend_configuration_schema.json JSON Schema in mod:qiskit.schemas è stato aggiornato per includere rep_delay_range e default_rep_delay come proprietà opzionali per la configurazione del backend dell'impulso.

  • Un nuovo attributo, global_phaseutilizzato per tracciare la fase globale, è stato aggiunto alla classe qiskit.circuit.QuantumCircuit classe. Ad esempio:

    import math
    
    from qiskit import QuantumCircuit
    
    circ = QuantumCircuit(1, global_phase=math.pi)
    circ.u1(0)

    Anche la fase globale può essere modificata o interrogata con circ.global_phase nell'esempio precedente. In entrambi i casi l'impostazione è in radianti. Se il circuito viene convertito in un'istruzione o in un gate, la fase globale è rappresentata da due rotazioni di un singolo qubit sul primo qubit.

    Ciò consente ad altri metodi e funzioni che consumano un oggetto QuantumCircuit di prendere in considerazione la fase globale. Ad esempio. con l'attributo global_phase il metodo to_matrix() per un cancello può ora corrispondere esattamente alle sue scomposizioni, anziché solo a una fase globale.

    Lo stesso attributo è stato aggiunto anche alla classe DAGCircuit in modo che la fase globale possa essere tracciata durante la conversione tra i formati QuantumCircuit e DAGCircuit.

  • Due nuove classi, AncillaRegister e AncillaQubit sono state aggiunte al modulo qiskit.circuit modulo. Sono sottoclassi di QuantumRegister e Qubit rispettivamente, e consentono di contrassegnare i qubit come ancillari. Ciò consentirà di riutilizzare questi qubit in circuiti e algoritmi più grandi.

  • Un nuovo metodo, control()è stato aggiunto al metodo QuantumCircuit. Questo metodo restituisce una versione controllata dell'oggetto QuantumCircuit con controlli aperti e chiusi. In precedenza, questa funzionalità era accessibile solo tramite la classe Gate classe.

  • Un nuovo metodo repeat() è stato aggiunto alla classe QuantumCircuit classe. Restituisce un nuovo oggetto circuito contenente un numero specifico di ripetizioni del circuito originale. Ad esempio:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    repeated_qc = qc.repeat(3)
    repeated_qc.decompose().draw(output='mpl')

    I parametri sono copiati per riferimento, il che significa che se si aggiornano i parametri in un'istanza del circuito, tutte le ripetizioni saranno aggiornate.

  • Un nuovo metodo reverse_bits() è stato aggiunto alla classe QuantumCircuit classe. Questo metodo inverte l'ordine dei bit in un circuito (sia quelli quantistici che quelli classici). Può essere utilizzato per commutare un circuito da little-endian a big-endian e viceversa.

  • Un nuovo metodo, combine_into_edge_map()è stato aggiunto alla classe qiskit.transpiler.Layout classe. Questo metodo consente di convertire due Layout oggetti in una mappa di qubit per comporre due circuiti.

  • Una nuova classe, ConfigurableFakeBackend, è stata aggiunta al modulo qiskit.test.mock.utils . Questa nuova classe consente di creare mock backend configurabili da utilizzare per i test. Ad esempio:

    from qiskit.test.mock.utils import ConfigurableFakeBackend
    
    backend = ConfigurableFakeBackend("Tashkent",
                                      n_qubits=100,
                                      version="0.0.1",
                                      basis_gates=['u1'],
                                      qubit_t1=99.,
                                      qubit_t2=146.,
                                      qubit_frequency=5.,
                                      qubit_readout_error=0.01,
                                      single_qubit_gates=['u1'])

    creerà un oggetto backend con 100 qubit e tutti gli altri parametri specificati nel costruttore.

  • Un nuovo metodo draw() è stato aggiunto alla classe qiskit.circuit.EquivalenceLibrary classe. Questo metodo può essere utilizzato per disegnare il contenuto di una libreria di equivalenze, che può essere utile per il debug. Ad esempio:

    from numpy import pi
    
    from qiskit.circuit import EquivalenceLibrary
    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit import QuantumRegister
    from qiskit.circuit import Parameter
    from qiskit.circuit.library import HGate
    from qiskit.circuit.library import U2Gate
    from qiskit.circuit.library import U3Gate
    
    my_equiv_library = EquivalenceLibrary()
    
    q = QuantumRegister(1, 'q')
    def_h = QuantumCircuit(q)
    def_h.append(U2Gate(0, pi), [q[0]], [])
    my_equiv_library.add_equivalence(HGate(), def_h)
    
    theta = Parameter('theta')
    phi = Parameter('phi')
    lam = Parameter('lam')
    def_u2 = QuantumCircuit(q)
    def_u2.append(U3Gate(pi / 2, phi, lam), [q[0]], [])
    my_equiv_library.add_equivalence(U2Gate(phi, lam), def_u2)
    
    my_equiv_library.draw()
  • Una nuova istruzione di fase, SetPhase, è stata aggiunta a qiskit.pulse. Questa istruzione imposta la fase degli impulsi successivi sulla fase specificata (in radianti). Ad esempio:

    import numpy as np
    
    from qiskit.pulse import DriveChannel
    from qiskit.pulse import Schedule
    from qiskit.pulse import SetPhase
    
    sched = Schedule()
    sched += SetPhase(np.pi, DriveChannel(0))

    In questo esempio, la fase degli impulsi applicati a DriveChannel(0) dopo l'istruzione SetPhase sarà impostata su π\pi radianti.

  • È stata aggiunta una nuova istruzione per gli impulsi ShiftFrequency qiskit.pulse.instructions. Questa istruzione consente di spostare la frequenza di un canale dalla frequenza impostata. Ad esempio:

    from qiskit.pulse import DriveChannel
    from qiskit.pulse import Schedule
    from qiskit.pulse import ShiftFrequency
    
    sched = Schedule()
    sched += ShiftFrequency(-340e6, DriveChannel(0))

    In questo esempio, tutti gli impulsi applicati a DriveChannel(0) dopo il comando ShiftFrequency avranno l'inviluppo a frequenza decrementata da 340MHz.

  • Un nuovo metodo conjugate() è stato aggiunto alla classe ParameterExpression classe. Ciò consente di chiamare numpy.conj() senza sollevare un errore. Poiché un ParameterExpression è reale, restituirà se stesso. Questo comportamento è analogo a quello di Python floats/ints.

  • Una nuova classe PhaseEstimation è stata aggiunta a qiskit.circuit.library. Questa classe di libreria di circuiti è il circuito utilizzato nella formulazione originale dell'algoritmo di stima della fase in arXiv:quant-ph/9511026. La stima di fase è il compito di stimare la fase ϕ\phi di un autovalore e2πiϕe^{2\pi i\phi} di un operatore unitario UU, fornito del corrispondente autostato psi|psi\rangle. Ovvero

Uψ=e2πiϕψU|\psi\rangle = e^{2\pi i\phi} |\psi\rangle

Questa stima (e quindi questo circuito) è una routine centrale di molti algoritmi noti, come l'algoritmo di Shor o la stima dell'ampiezza quantistica.

  • La qiskit.visualization ha una nuova funzione plot_state_qsphere() ha un nuovo kwarg show_state_labels che viene utilizzato per controllare se ogni blob nella visualizzazione di qsphere è etichettato. Per impostazione predefinita, questo kwarg è impostato su True e mostra gli stati base accanto a ciascun blob. Questa funzione può essere disattivata, tornando al comportamento precedente, impostando il kwarg show_state_labels su False.

  • La qiskit.visualization ha un nuovo kwarg che viene impostato a plot_state_qsphere() ha un nuovo kwarg show_state_phases , impostato di default a False . Se impostato su True , visualizza la fase di ogni stato base.

  • La qiskit.visualization ha un nuovo kwarg che viene impostato a plot_state_qsphere() ha un nuovo kwarg use_degrees , impostato di default a False . Quando è impostato su True , visualizza la fase di ogni stato base in gradi, insieme al cerchio di fase in basso a destra.

  • Una nuova classe, QuadraticForm al modulo qiskit.circuit.library per implementare una forma quadratica su variabili binarie. L'elemento della libreria di circuiti implementa l'operazione

x0xQ(x)mod2m|x\rangle |0\rangle \mapsto |x\rangle |Q(x) \mod 2^m\rangle

per la forma quadratica QQ e mm qubit di uscita. Il risultato è nei qubit di uscita mm è codificato in complemento a due. Se mm non viene specificato, il circuito sceglierà il numero minimo di qubit necessario per rappresentare il risultato senza applicare un'operazione modulo. La forma quadratica viene specificata utilizzando una matrice per i termini quadratici, un vettore per i termini lineari e un offset costante. Se tutti i termini sono interi, il circuito implementa esattamente la forma quadratica, altrimenti è solo un'approssimazione.

Ad esempio:

import numpy as np

from qiskit.circuit.library import QuadraticForm

A = np.array([[1, 2], [-1, 0]])
b = np.array([3, -3])
c = -2
m = 4
quad_form_circuit = QuadraticForm(m, A, b, c)
  • Aggiungi qiskit.quantum_info.Statevector.expectation_value() e qiskit.quantum_info.DensityMatrix.expectation_value() metodi per il calcolo del valore di aspettativa di un qiskit.quantum_info.Operator.

  • Per il kwarg seed nel costruttore per gli oggetti qiskit.circuit.library.QuantumVolume è ora possibile utilizzare gli oggetti generatori casuali di numpy. In precedenza, solo i numeri interi erano un input valido. Questo è utile quando si integra QuantumVolume come parte di una funzione più ampia con una propria generazione di numeri casuali, ad esempio la generazione di una sequenza di circuiti QuantumVolume circuiti.

  • Il QuantumCircuit metodo compose() ha un nuovo kwarg front che può essere usato per anteporre l'altro circuito al circuito di origine invece di aggiungerlo. Ad esempio:

    from qiskit.circuit import QuantumCircuit
    
    circ1 = QuantumCircuit(2)
    circ2 = QuantumCircuit(2)
    
    circ2.h(0)
    circ1.cx(0, 1)
    
    circ1.compose(circ2, front=True).draw(output='mpl')
  • Due nuovi passaggi, SabreLayout e SabreSwap per il layout e il routing sono stati aggiunti a qiskit.transpiler.passes. Questi nuovi passaggi si basano sull'algoritmo presentato in Li et al..., "Affrontare il problema della mappatura dei Qubit per i dispositivi quantistici NISQ-Era", ASPLOS 2019. Possono essere selezionati anche quando si utilizza la funzione transpile() impostando il kwarg layout_method su 'sabre' e/o il kwarg routing_method su 'sabre' per utilizzare SabreLayout e SabreSwap rispettivamente.

  • Aggiunto il metodo replace() alla classe qiskit.pulse.Schedule che consente di sostituire un'istruzione di impulso con un'altra. Ad esempio:

    .. code-block:: python

    da qiskit import pulse

    d0 = pulse.DriveChannel(0)

    sched = pulse.Schedule ()

    old = pulse.Play ( pulse.Constant (100, 1.0 ), d0 ) new = pulse.Play ( pulse.Constant (100, 0.1 ), d0 )

    sched += vecchio

    sched = sched.replace (vecchio, nuovo)

    assert sched == pulse.Schedule (new)

  • Aggiunte nuove classi di porte a qiskit.circuit.library per i gate X\sqrt{X}, il suo adiacente X\sqrt{X}^\dagger e i gate controllati X\sqrt{X} come SXGate, SXdgGate, e CSXGate. Possono anche essere aggiunti a un oggetto QuantumCircuit utilizzando i tasti sx(), sxdg(), e csx() rispettivamente.

  • Aggiungere il supporto per le istruzioni di Reset a qiskit.quantum_info.Statevector.from_instruction(). Si noti che ciò comporta un campionamento RNG nella scelta della proiezione allo stato zero nel caso in cui il qubit sia in uno stato di sovrapposizione. Il seme per il campionamento può essere impostato con il metodo seed() metodo.

  • I metodi qiskit.circuit.ParameterExpression.subs() e qiskit.circuit.QuantumCircuit.assign_parameters() accettano ora ParameterExpression come valore di destinazione da sostituire.

    Ad esempio:

    from qiskit.circuit import QuantumCircuit, Parameter
    
    p = Parameter('p')
    source = QuantumCircuit(1)
    source.rz(p, 0)
    
    x = Parameter('x')
    source.assign_parameters({p: x*x})
         ┌──────────┐
    q_0:Rz(x**2)
         └──────────┘
  • Il QuantumCircuit() ha un nuovo kwarg che può essere utilizzato per impostare un'etichetta per l'uscita to_gate() ha un nuovo kwarg label che può essere usato per impostare un'etichetta per l'oggetto di output Gate oggetto. Ad esempio:

    from qiskit.circuit import QuantumCircuit
    
    circuit_gate = QuantumCircuit(2)
    circuit_gate.h(0)
    circuit_gate.cx(0, 1)
    custom_gate = circuit_gate.to_gate(label='My Special Bell')
    new_circ = QuantumCircuit(2)
    new_circ.append(custom_gate, [0, 1], [])
    new_circ.draw(output='mpl')
  • Aggiunto il UGate, CUGate, PhaseGate, e CPhaseGate con i corrispondenti metodi QuantumCircuit metodi u(), cu(), p(), e cp(). Il UGate il gate è il generico gate di rotazione a singolo qubit con 3 angoli di Eulero e il CUGate è la sua versione controllata. CUGate ha 4 parametri per tenere conto di un'eventuale fase globale della porta U. Il PhaseGate e CPhaseGate sono la porta di fase generale ad angolo arbitrario e la sua versione controllata.

  • Un nuovo kwarg, cregbundle , è stato aggiunto alla funzione qiskit.visualization.circuit_drawer() e al metodo QuantumCircuit metodo draw(). Quando è impostato su True , nelle visualizzazioni dei circuiti per i cassetti text e mpl le creme saranno raggruppate in un'unica linea. Il valore predefinito è True. Risolve il problema n. 4290.

    Ad esempio:

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='mpl', cregbundle=True)
  • Un nuovo kwarg, initial_state , è stato aggiunto alla funzione qiskit.visualization.circuit_drawer() e al metodo QuantumCircuit metodo draw(). Se impostato su True , lo stato iniziale sarà ora incluso nelle visualizzazioni dei circuiti per tutti i cassetti. Risolve il problema n. 4293.

    Ad esempio:

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(2)
    circuit.measure_all()
    circuit.draw(output='mpl', initial_state=True)
  • Le etichette vengono ora visualizzate quando si utilizza il cassetto 'mpl'. Esistono due tipi di etichette: le etichette per cancelli e le etichette di controllo. Le etichette dei cancelli sostituiscono il nome del cancello sul display. Le etichette di controllo vengono visualizzate sopra o sotto i controlli di un cancello. Risolve i problemi #3766, #4580 Risolve i problemi #3766 e #4580.

    Ad esempio:

    from qiskit import QuantumCircuit
    from qiskit.circuit.library.standard_gates import YGate
    circuit = QuantumCircuit(2)
    circuit.append(YGate(label='A Y Gate').control(label='Y Control'), [0, 1])
    circuit.draw(output='mpl')

Note sull'aggiornamento

  • Implementazioni del gate X multicontrollato ( MCXGrayCode, MCXRecursive, e MCXVChain) hanno cambiato le proprietà name per descrivere più accuratamente la loro implementazione: mcx_gray, mcx_recursive, e mcx_vchain rispettivamente. In precedenza, questi gate condividevano il nome mcx con MCXGate, il che causava un'errata trasposizione e simulazione di questi gate.

  • Per impostazione predefinita, i passmanager preimpostati in qiskit.transpiler.preset_passmanagers utilizza UnrollCustomDefinitions e BasisTranslator per gestire il cambio di base, invece del precedente valore predefinito Unroller. Questo è stato fatto perché i nuovi passaggi sono più flessibili e consentono di puntare a qualsiasi set di basi, ma l'output può essere diverso. Per utilizzare il default precedente si può impostare il kwarg di translation_method su transpile() a 'unroller'.

  • Le funzioni di conversione qiskit.converters.circuit_to_gate() e :func` qiskit.converters.circuit_to_instruction\ avevano precedentemente incluso automaticamente il gate o l'istruzione generata nell'attivoSessionEquivalenceLibrary. Questi convertitori accettano ora un argomento opzionale, la parola chiave equivalence_library` , per specificare se e dove le istanze convertite devono essere registrate. Il comportamento predefinito è stato modificato in modo da non registrare l'istanza convertita.

  • Il valore predefinito del kwarg di cregbundle per il metodo e il metodo qiskit.circuit.QuantumCircuit.draw() e per la funzione qiskit.visualization.circuit_drawer() è stato modificato in True. Ciò significa che, per impostazione predefinita, i bit classici dello schema circuitale saranno ora raggruppati, ad esempio:

    from qiskit.circuit import QuantumCircuit
    
    circ = QuantumCircuit(4)
    circ.x(0)
    circ.h(1)
    circ.measure_all()
    circ.draw(output='mpl')

    Se si desidera che il disegno del circuito mantenga il comportamento precedente e mostri ogni bit classico nel diagramma, è possibile impostare il kwarg cregbundle su False. Ad esempio:

    from qiskit.circuit import QuantumCircuit
    
    circ = QuantumCircuit(4)
    circ.x(0)
    circ.h(1)
    circ.measure_all()
    circ.draw(output='mpl', cregbundle=False)
  • Schedule tracciando con qiskit.pulse.Schedule.draw() e qiskit.visualization.pulse_drawer() non visualizzerà più la tabella degli eventi per impostazione predefinita. Questo può essere riattivato impostando il kwarg di table su True.

  • Il passaggio RemoveResetInZeroState era precedentemente incluso nel gestore di pass preimpostati level_0_pass_manager() che veniva utilizzato con le funzioni optimization_level=0 per transpile() e execute() . Tuttavia, RemoveResetInZeroState è un passaggio di ottimizzazione e non avrebbe dovuto essere incluso nel livello di ottimizzazione 0, quindi è stato rimosso. Se è necessario eseguire transpile() con RemoveResetInZeroState utilizzare un gestore di pass personalizzato o optimization_level 1, 2 o 3.

  • Il deprecato kwarg line_length per la funzione qiskit.visualization.circuit_drawer() e il metodo qiskit.circuit.QuantumCircuit.draw() è stato rimosso. È stato deprecato dalla versione 0.10.0. È invece possibile utilizzare il kwarg di fold per regolare l'ampiezza dello schema circuitale.

  • La modalità di uscita 'mpl' per il qiskit.circuit.QuantumCircuit.draw() e circuit_drawer() richiede ora l'installazione della libreria pylatexenc. Questa era già una dipendenza opzionale per la visualizzazione, ma in precedenza era richiesta solo per la modalità di output 'latex' . Ora è richiesto anche per il cassetto matplotlib, perché è necessario per gestire correttamente il dimensionamento delle porte con le etichette mathtext di matplotlib per le porte.

  • I metodi deprecati get_tokens per i file qiskit.qasm.Qasm e qiskit.qasm.QasmParser sono stati rimossi. Questi metodi sono stati deprecati dalla versione 0.9.0. Si devono invece utilizzare i metodi qiskit.qasm.Qasm.generate_tokens() e qiskit.qasm.QasmParser.generate_tokens() .

  • Il kwarg deprecato channels_to_plot per qiskit.pulse.Schedule.draw(), qiskit.pulse.Instruction.draw(), qiskit.visualization.pulse.matplotlib.ScheduleDrawer.draw e pulse_drawer() è stato rimosso. Il kwarg è stato deprecato dalla versione 0.11.0 ed è stato sostituito dal kwarg channels , che funziona in modo identico e dovrebbe essere usato al suo posto.

  • L'attributo deprecato circuit_instruction_map della classe qiskit.providers.models.PulseDefaults è stato rimosso. Questo attributo è stato deprecato dalla versione 0.12.0 ed è stato sostituito dall'attributo instruction_schedule_map , che può essere utilizzato al suo posto.

  • Il metodo union di Schedule e Instruction sono stati deprecati dalla versione 0.12.0 e ora sono stati rimossi. Utilizzare i metodi qiskit.pulse.Schedule.insert() e qiskit.pulse.Instruction.meth() con il metodo kwarg``time=0``.

  • Il deprecato argomento scaling del metodo draw di Schedule e Instruction è stato sostituito con scale dal rilascio di 0.12.0 e ora è stato rimosso. Utilizzare invece il sito scale kwarg.

  • L'argomento deprecato period alle funzioni qiskit.pulse.library sono stati sostituiti da freq a partire dalla versione 0.13.0 e ora sono stati rimossi. Utilizzare freq kwarg invece di period.

  • Il modulo qiskit.pulse.commands , contenente le classi di Commands , è stato deprecato nella versione 0.13.0 e ora è stato rimosso. Se si utilizzano ancora i comandi, è necessario aggiornare il codice Pulse. Ad esempio:

    Precedente
    Nuovo
    Command(args)(channel)Instruction(args, channel)
    \Pitone
    Acquisire(durata)( AcquireChannel(0 ))
    ```\Pitone
    Acquisire(durata, AcquireChannel(0 ))
    | ```python
    Delay(duration)(channel) 
    ```             | ```python
    Delay(duration, channel) 
    ```                                          |
    | ```python
    FrameChange(angle)(DriveChannel(0)) 
    ```  | ```python
    # FrameChange was also renamed ShiftPhase(angle, DriveChannel(0)) 
    ``` |
    | ```python
    Gaussian(...)(DriveChannel(0)) 
    ```       | ```python
    # Pulses need to be `Play`d Play(Gaussian(...), DriveChannel(0)) 
    ```  |
    
    
  • Tutte le classi e le funzioni del modulo qiskit.tool.qi sono state deprecate nella versione 0.12.0 e ora sono state rimosse. Utilizzate invece il modulo qiskit.quantum_info e i nuovi metodi e classi che contiene per lavorare con gli stati e gli operatori quantistici.

  • Le funzioni qiskit.quantum_info.basis_state e qiskit.quantum_info.projector sono deprecate a partire da Qiskit Terra 0.12.0 e sono state rimosse. Utilizzare qiskit.quantum_info.QuantumState e le sue derivate qiskit.quantum_info.Statevector e qiskit.quantum_info.DensityMatrix per lavorare con gli stati.

  • Le funzioni di plottaggio interattivo di qiskit.visualization, iplot_bloch_multivector, iplot_state_city, iplot_state_qsphere, iplot_state_hinton, iplot_histogram, iplot_state_paulivec ora sono solo alias deprecati per gli equivalenti basati su matplotlib e non sono più interattivi. Il codice JS statico ospitato su cui si basavano queste funzioni è stato rimosso e non possono più funzionare. Una normale deprecazione non era possibile perché il sito da cui dipendevano non esisteva più.

  • I componenti di validazione che utilizzano marshmallow di qiskit.validation sono stati rimossi da terra. Poiché non vengono più utilizzati per costruire oggetti in terra.

  • Le classi dello schema marshmallow in qiskit.result sono state rimosse, poiché non sono più utilizzate dalla classe qiskit.result.Result .

  • L'output del metodo to_dict() per la classe qiskit.result.Result non è più in un formato per la serializzazione diretta di JSON. A seconda del contenuto delle istanze di queste classi, possono esserci tipi che il codificatore JSON predefinito non sa come gestire, ad esempio numeri complessi o array numpy. Se si serializza direttamente l'output del metodo to_dict() , occorre assicurarsi che il codificatore JSON sia in grado di gestire questi tipi.

  • L'opzione di acquisire più qubit contemporaneamente è stata deprecata nella versione 0.12.0 e ora è stata rimossa. In particolare, gli argomenti di init mem_slots e reg_slots sono stati rimossi da qiskit.pulse.instructions.Acquiree channel, mem_slot e reg_slot daranno luogo a un errore se viene fornito un elenco come input.

  • È stato rimosso il supporto per l'uso della variabile d'ambiente USE_RETWORKX , introdotta nella versione 0.13.0 per fornire un fallback opzionale all'implementazione legacy basata su networkx qiskit.dagcircuit.DAGCircuit è stato rimosso. Questo flag è stato pensato solo per fornire una valvola di sfogo agli utenti che hanno riscontrato un problema con la nuova implementazione per una release durante la transizione a retworkx.

  • Il modulo all'interno di qiskit.pulse responsabile delle trasformazioni schedule->schedule è stato rinominato da reschedule.py a transforms.py. Il precedente percorso di importazione è stato deprecato. Per aggiornare il codice:

    from qiskit.pulse.rescheduler import <X>

    dovrebbe essere sostituito da:

    from qiskit.pulse.transforms import <X>
  • Nelle versioni precedenti, una classe PassManager non consentiva alle classi TransformationPass di modificare il file PropertySet. Questa restrizione è stata eliminata, per cui una classe TransformationPass ha ora accesso in lettura e scrittura sia a PropertySet che a DAGCircuit durante run(). Questa modifica è stata apportata per facilitare in modo più efficiente le classi di TransformationPass che hanno uno stato interno che può essere necessario per i passaggi successivi nel file PassManager. Senza questa modifica, sarebbe stato necessario un secondo AnalysisPass ridondante per ricreare lo stato interno, con un notevole sovraccarico di lavoro.

Note di deprecazione

Correzioni di bug

  • Il qiskit.circuit.QuantumCircuit metodo num_nonlocal_gates precedentemente includeva oggetti multi-qubit qiskit.circuit.Instruction (ad esempio, Barrier) nel conteggio delle porte non locali. Il problema è stato corretto in modo che vengano conteggiati solo gli oggetti Gate vengono contati solo gli oggetti non locali. Correzioni #4500

  • ControlledGate le istanze con un set ctrl_state in alcuni casi non venivano valutate come uguali, anche se le porte confrontate erano equivalenti. Questo problema è stato risolto in modo tale che le correzioni #4573

  • Quando si accede a un bit da un elemento qiskit.circuit.QuantumRegister o qiskit.circuit.ClassicalRegister by index when using numpy integer types <https://numpy.org/doc/stable/user/basics.types.html> `__ would previously raise a CircuitError exception. Questo problema è stato risolto in modo che i tipi di numpy possano essere usati in aggiunta al tipo Python 'built-in int . Correzioni #3929.

  • È stato risolto un bug per cui veniva utilizzato solo il primo qiskit.pulse.configuration.Kernel o qiskit.pulse.configuration.Discriminator per un qiskit.pulse.Acquire quando c'erano più acquisizioni contemporaneamente in un qiskit.pulse.Schedule.

  • L'unità SI utilizzata per la costruzione degli oggetti qiskit.pulse.SetFrequency è in Hz, ma quando viene creato un oggetto da un'istanza è necessario convertirlo in GHz PulseQobjInstruction viene creato da un'istanza di SetFrequency , deve essere convertito in GHz. Questa conversione mancava nelle versioni precedenti ed è stata corretta.

  • In precedenza era possibile impostare il numero di qubit di controllo a zero, nel qual caso veniva restituita l'operazione originale, potenzialmente non controllata. Questo potrebbe causare un AttributeError se il chiamante tentasse di accedere a un attributo che solo l'oggetto ControlledGate hanno. Questo problema è stato risolto aggiungendo un getter e un setter per num_ctrl_qubits per convalidare l'uso di un valore valido. Correzioni #4576

  • I controlli aperti sono stati implementati modificando un oggetto Gate oggetti definition. Tuttavia, quando il gate esiste già nell'insieme di basi, questa definizione non è stata utilizzata, con il risultato di inviare circuiti errati a un backend dopo la transpilazione. Il problema è stato risolto modificando il passaggio Unroller in modo che utilizzi la definizione se incontra un cancello controllato con controlli aperti. Correzioni #4437

  • L'argomento della parola chiave insert_barriers nella classe ZZFeatureMap non inserisce effettivamente delle barriere tra gli strati di Hadamard e gli strati di evoluzione. Il problema è stato risolto in modo che le barriere siano ora inserite correttamente.

  • Corretto il problema per cui alcune porte con tre o più qubit non riuscivano a essere compilate in alcuni casi. Per maggiori dettagli, fare riferimento a #4577 <https://github.com/Qiskit/qiskit/issues/4577.

  • Il backend di output matplotlib ('mpl') per il metodo qiskit.circuit.QuantumCircuit metodo draw() e la funzione qiskit.visualization.circuit_drawer() non si ridimensionava correttamente quando era impostato il kwarg scale . I caratteri e le larghezze delle linee non sono stati scalati con il resto dell'immagine. Il problema è stato risolto e ora tutti gli elementi dello schema circuitale sono in scala corretta. Ad esempio:

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.draw(output='mpl', scale=0.5)

    Correzioni #4179.

  • Corregge il problema per cui l'inizializzazione o l'evoluzione di qiskit.quantum_info.Statevector e qiskit.quantum_info.DensityMatrix per circuiti per circuiti contenenti istruzioni Barrier sollevava un'eccezione. Correzioni #4461

  • In precedenza, quando un elemento QuantumCircuit conteneva un Gate con una condizione classica il transpiler a volte falliva quando si usava optimization_level=3 su transpile() o execute() che sollevava un UnboundLocalError. Questo problema è stato risolto aggiornando il ConsolidateBlocks per tenere conto della condizione classica. Correzioni #4672.

  • In alcune situazioni i nomi di gate e registri lunghi traboccavano o lasciavano uno spazio vuoto eccessivo intorno ad essi quando si utilizzava il backend di output 'mpl' per il metodo e il registro qiskit.circuit.QuantumCircuit.draw() metodo e qiskit.visualization.circuit_drawer() funzione. Il problema è stato risolto utilizzando una larghezza di testo corretta per un carattere proporzionale. Correzioni di #4611, #4605, #4545, #4497, #4449 e #3641.

  • Quando si utilizza il backend di output style` kwarg on the :meth:`qiskit.circuit.QuantumCircuit.draw` or :func:`qiskit.visualization.circuit_drawer` with the ``'mpl' con la chiave del dizionario 'showindex' impostata su True, i numeri di indice in cima alla colonna non si allineano correttamente. Il problema è stato risolto.

  • Quando si usa cregbunde=True con il backend di output 'mpl' per il metodo qiskit.circuit.QuantumCircuit.draw() e la funzione qiskit.visualization.circuit_drawer() e si misura su una seconda piega, la freccia di misura sovrascrive il conteggio di creg. Per evitare ciò, il conteggio è stato spostato a sinistra. Correzioni #4148.

  • Quando si utilizza il backend di output 'mpl' per il metodo qiskit.circuit.QuantumCircuit.draw() e la funzione qiskit.visualization.circuit_drawer() funzione CSwapGate e una porta controllata RZZGate le porte vengono ora visualizzate con i loro simboli appropriati invece che in un riquadro.

  • Quando si utilizza il backend di output 'mpl' per il metodo qiskit.circuit.QuantumCircuit.draw() metodo e qiskit.visualization.circuit_drawer() le porte controllate create con il metodo to_gate() non erano correttamente spaziate e potevano sovrapporsi ad altre porte nello schema circuitale. Il problema è stato risolto.

  • Quando si utilizza il backend di output 'mpl' per il metodo qiskit.circuit.QuantumCircuit.draw() e qiskit.visualization.circuit_drawer() le porte di funzioni con array come parametri, come HamiltonianGate, non vengono più visualizzate con uno spazio eccessivo intorno ad esse. Correzioni #4352.

  • Quando si utilizza il backend di output 'mpl' per il metodo qiskit.circuit.QuantumCircuit.draw() metodo e qiskit.visualization.circuit_drawer() i gate generici creati istanziando direttamente il metodo qiskit.circuit.Gate visualizzano ora il colore di sfondo corretto per il gate. Correzioni #4496.

  • Quando si utilizza il backend di output 'mpl' per il metodo qiskit.circuit.QuantumCircuit.draw() e qiskit.visualization.circuit_drawer() è stato risolto un problema di AttributeError che si verificava quando si usavano Isometry o Initialize . Correzioni #4439.

  • Quando si utilizza il backend di output 'mpl' per il metodo qiskit.circuit.QuantumCircuit.draw() metodo e qiskit.visualization.circuit_drawer() alcuni varchi controllati dall'apertura non visualizzavano correttamente i controlli di apertura. Il problema è stato corretto in modo che i controlli aperti vengano visualizzati correttamente come cerchi aperti. Correzioni #4248.

  • Quando si utilizza il backend di output 'mpl' per il metodo qiskit.circuit.QuantumCircuit.draw() e per la funzione qiskit.visualization.circuit_drawer() impostando il kwarg di fold su -1, il circuito verrà visualizzato correttamente senza pieghe. Correzioni #4506.

  • Gli impulsi parametrici di qiskit.pulse.library.discrete hanno ora le estremità degli impulsi parametrici pari a zero per impostazione predefinita. Gli estremi sono definiti in modo tale che per una funzione f(x)f(x) allora f(1)=f(duration+1)=0f(-1) = f(duration + 1) = 0. Correzioni #4317

Altre note

  • La classe qiskit.result.Result che in precedenza era stata costruita utilizzando la libreria marshmallow, è stata riadattata per non dipendere più da marshmallow. Questa nuova implementazione dovrebbe essere una transizione senza soluzione di continuità, ma alcuni comportamenti specifici precedentemente ereditati da marshmallow potrebbero non funzionare. Si prega di presentare i problemi per qualsiasi incompatibilità riscontrata.

Aer 0.6.1

Preludio

Questa versione di 0.6.0 include numerosi miglioramenti delle prestazioni per tutti i simulatori del provider Aer e modifiche significative al sistema di compilazione quando si costruisce dai sorgenti. Le principali modifiche riguardano il supporto della vettorizzazione SIMD, l'approssimazione del metodo di stato del prodotto matriciale tramite il troncamento della dimensione dei legami, un calcolo più efficiente del valore di aspettativa di Pauli e un'efficienza notevolmente migliorata nella conversione in Python degli oggetti risultato in C++. Il sistema di compilazione è stato aggiornato per utilizzare Conan per gestire le dipendenze comuni del C++ durante la compilazione dai sorgenti.

Nuove funzioni

  • Aggiungere il supporto per l'istantanea della matrice di densità ai metodi "statevector" e "statevector_gpu" di QasmSimulator.

  • Consentire snapshot della matrice di densità su qubit specifici, non solo su tutti i qubit. Questo calcola la traccia parziale dello stato sui qubit rimanenti.

  • Aggiunge il supporto dell'istantanea del valore di aspettativa di Pauli al metodo di simulazione "densità_matrice" di qiskit.providers.aer.QasmSimulator. Aggiungere istantanee ai circuiti utilizzando l'estensione qiskit.providers.aer.extensions.SnapshotExpectationValue .

  • Migliora notevolmente le prestazioni dell'algoritmo di istantanea del valore di aspettativa di Pauli per i metodi di simulazione "statevector", "statevector\gpu", "density_matrix" e "density_matrix_gpu" di qiskit.providers.aer.QasmSimulator.

  • Abilitare l'ottimizzazione del circuito gate-fusion da qiskit.providers.aer.QasmSimulator in entrambi i backend qiskit.providers.aer.StatevectorSimulator e qiskit.providers.aer.UnitarySimulator .

  • Migliorare le prestazioni dei dati medi delle istantanee nei risultati del simulatore. Questo ha effetti sulla probabilità, sul valore di aspettativa di Pauli e sulle istantanee della matrice di densità utilizzando le seguenti estensioni:

    • qiskit.providers.aer.extensions.SnapshotExpectationValue
    • qiskit.providers.aer.extensions.SnapshotProbabilities
    • qiskit.providers.aer.extensions.SnapshotDensityMatrix
  • Aggiungere il costruttore move e migliorare l'uso della memoria della classe matrix del C++ per ridurre al minimo le copie delle matrici quando si sposta l'output dei simulatori nei risultati.

  • Migliorare le prestazioni del simulatore unitario.

  • Aggiungere un'approssimazione al metodo di simulazione "matrix_product_state" di QasmSimulator per limitare la dimensione dei legami della MPS.

    Esistono due modalità di approssimazione. Entrambi scartano i coefficienti di Schmidt più piccoli seguendo l'algoritmo SVD. Esistono due parametri che controllano il grado di approssimazione: "matrix_product_state_max_bond_dimension" (int): Imposta un limite al numero di coefficienti di Schmidt conservati alla fine dell'algoritmo svd. I coefficienti che superano questo limite vengono scartati. (predefinito: Nessuno, cioè nessun limite alla dimensione del legame). "matrix_product_state_truncation_threshold" (doppio): Scarta i coefficienti più piccoli per i quali la somma dei loro quadrati è inferiore a questa soglia. (Predefinito: 1e-16 ).

  • Migliorare le prestazioni del campionamento delle misure quando si utilizza il metodo di simulazione "matrix_product_state" QasmSimulator .

  • Aggiungere il supporto per le istruzioni ad impulsi Delay, Phase e SetPhase a qiskit.providers.aer.PulseSimulator.

  • Migliorare le prestazioni di qiskit.providers.aer.PulseSimulator mettendo in cache le chiamate alle funzioni RHS

  • Introdurre metodi alternativi di risoluzione delle DE, specificabili attraverso backend_options nel sito qiskit.providers.aer.PulseSimulator.

  • Migliorare le prestazioni delle classi di risultati del simulatore utilizzando la semantica del movimento e rimuovendo le copie non necessarie che si verificavano quando si combinavano i risultati di esperimenti separati nell'oggetto risultato finale.

  • Migliorare notevolmente le prestazioni della conversione pybind11 dei risultati del simulatore, utilizzando la semantica move dove possibile e spostando i risultati di vettori e matrici in array Numpy senza copie.

  • Modifica del motore RNG per i simulatori da Mersenne twister a 32 bit a Mersenne twister a 64 bit.

  • Migliora le prestazioni del metodo di simulazione "statevector" di qiskit.providers.aer.QasmSimulator e qiskit.providers.aer.StatevectorSimulator utilizzando gli intrinseci SIMD sui sistemi che supportano il set di istruzioni AVX2. AVX2 viene rilevato e abilitato automaticamente in fase di esecuzione.

Note sull'aggiornamento

  • Cambia il sistema di compilazione per usare il gestore di pacchetti Conan. Questo strumento gestirà la maggior parte delle dipendenze necessarie al codice sorgente C++. La connessione a Internet potrebbe essere necessaria per la prima compilazione o quando vengono aggiunte o aggiornate le dipendenze, per scaricare i pacchetti necessari se non sono presenti nel repository locale di Conan.

    Quando si costruisce la versione standalone di qiskit-aer è necessario installare prima conan con:

    pip install conan
  • Modifica il modo in cui vengono gestiti i passaggi di transpilazione nelle classi Controller C++, in modo che ogni passaggio debba essere chiamato esplicitamente. Ciò consente una maggiore personalizzazione del momento in cui ogni passaggio deve essere richiamato e con quali parametri. In particolare, ciò consente di impostare parametri diversi per il passaggio di ottimizzazione della fusione dei gate a seconda del metodo di simulazione QasmController.

  • Aggiungere gate_length_units kwarg a qiskit.providers.aer.noise.NoiseModel.from_device() per specificare gate_lengths personalizzato nella funzione del modello di rumore del dispositivo per gestire le conversioni di unità per il codice interno.

  • Aggiunta del gate Controlled-Y ("cy") ai metodi di simulazione dello stabilizzatore supportati dal gateset.

  • Per il backend di Aer la validazione jsonschema degli oggetti qobj in ingresso da terra è ora opt-in invece di essere abilitata di default. Se si vuole abilitare la validazione jsonschema di qobj, impostare il kwarg validate sul metodo qiskit.providers.aer.QasmSimualtor.run() per l'oggetto backend a True.

  • Aggiunge un oggetto OpSet alla classe State del simulatore di base, per consentire una più facile convalida di istruzioni, porte e istantanee supportate dai simulatori.

  • Riformulare la classe OpSet. Spostare OpSet in un file di intestazione separato e aggiungere i metodi contains e difference basati su std::set::contains e std::algorithm::set_difference. Queste sostituiscono le istruzioni invalidate e validate rimosse da OpSet,, ma con l'ordine invertito. Restituisce un elenco di altre operazioni non presenti nell'opset corrente piuttosto che di istruzioni dell'opset non presenti nell'altro.

  • Migliora il controllo dell'ottimizzazione del campionamento delle misure. La parte costosa di questa operazione viene ora eseguita una sola volta durante la costruzione del circuito, anziché più volte durante la simulazione per controllare i requisiti di memoria, il metodo di simulazione e l'esecuzione finale.

Correzioni di bug

  • Rimuovere "extended_stabilizer" dai metodi di simulazione selezionati automaticamente. Questo è necessario perché il metodo dello stabilizzatore esteso non è esatto e può dare risultati errati per alcuni circuiti, a meno che l'utente non sappia come ottimizzare i parametri di configurazione.

    Il metodo automatico ora seleziona solo i metodi "stabilizzatore", "matrice_densità" e "vettore di stato". Se viene eseguito un circuito non-Clifford troppo grande per il metodo statevector, viene sollevata un'eccezione che suggerisce di provare a usare esplicitamente i metodi "extended_stabilizer" o "matrix_product_state".

  • Disabilita la fusione dei gate per il metodo di simulazione dello stato del prodotto matriciale, poiché in alcuni casi causava problemi con la restituzione di risultati errati.

  • Corregge un bug che causava un'errata valutazione dei canali nel sito qiskit.providers.aer.PulseSimulator.

  • Correzione di alcuni bug minori relativi a casi limite di parsing hamiltoniano nella classe qiskit.providers.aer.pulse.system_models.hamiltonian_model.HamiltonianModel .

Ignis 0.4.0

Preludio

La principale modifica apportata in questa release è una rifattorizzazione del codice del Randomized Benchmarking per integrare la classe Clifford aggiornata da Terra e per migliorare la classe CNOT-Dihedral qiskit.quantum_info.Clifford di Terra e per migliorare la classe CNOT-Dihedral.

Nuove funzioni

  • La funzione qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() è stata riadattata in modo da utilizzare la classe Clifford aggiornata Cliffordper consentire un efficiente Randomized Benchmarking (RB) su sequenze Clifford con più di 2 qubit. Inoltre, il codice della classe CNOT-Dihedral qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral è stato rifattorizzato per renderlo più efficiente, utilizzando array numpy e non utilizzando file pickle pre-generati che memorizzano tutti gli elementi del gruppo 2-qubit. La funzione qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() ha un nuovo kwarg rand_seed che può essere usato per specificare un seme per il generatore di numeri casuali usato per generare i circuiti RB. Questo può essere utile per avere un circuito riproducibile.
  • La funzione qiskit.ignis.verification.qv_circuits() ha un nuovo kwarg seed che può essere usato per specificare un seme per il generatore di numeri casuali usato per generare i circuiti Quantum Volume. Questo può essere utile per avere un circuito riproducibile.

Note sull'aggiornamento

  • La funzione qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() ora utilizza la classe Clifford aggiornata Clifford e la classe CNOT-Dihedral aggiornata qiskit.ignis.verification.randomized_benchmarking.CNOTDihedral per costruire il suo output, invece di utilizzare tabelle di gruppi pre-generate per gli elementi dei gruppi Clifford e CNOT-Dihedral, che erano memorizzate in file pickle. Ciò può comportare differenze minime rispetto all'output della versione precedente.
  • Un nuovo requisito scikit-learn è stato aggiunto all'elenco dei requisiti. Questa dipendenza è stata aggiunta nella release 0.3.0, ma non era esposta correttamente come dipendenza in quella release. Questo porterebbe a un ImportError se il modulo qiskit.ignis.measurement.discriminator.iq_discriminators fosse importato. Ora è correttamente elencato come dipendenza, in modo che scikit-learn venga installato con qiskit-ignis.
  • La funzione qiskit.ignis.verification.qv_circuits() ora utilizza la classe della libreria dei circuiti QuantumVolume per costruire il suo output, invece di costruire il circuito da zero. Ciò può comportare differenze minime rispetto all'output della versione precedente.
  • Gli installatori di tomografie possono ora ottenere anche un elenco di oggetti Risultato invece di un singolo Risultato, come richiesto nel problema #320.

Note di deprecazione

  • Il kwarg interleaved_gates per la funzione qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq() è stato deprecato e sarà rimosso in una prossima versione. È sostituito da interleaved_elem. Le funzioni helper qiskit.ignis.verification.randomized_benchmarking.BasicUtils, qiskit.ignis.verification.randomized_benchmarking.CliffordUtils e qiskit.ignis.verification.randomized_benchmarking.DihedralUtils sono state deprecate. Queste classi sono sostituite da qiskit.ignis.verification.randomized_benchmarking.RBgroup che gestisce le operazioni di gruppo necessarie per RB. La classe qiskit.ignis.verification.randomized_benchmarking.Clifford è sostituita da Clifford.

  • I kwarg qr e cr per la funzione qiskit.ignis.verification.qv_circuits() sono stati deprecati e saranno rimossi in una prossima versione. Questi kwarg sono stati documentati per essere utilizzati per specificare un elemento qiskit.circuit.QuantumRegister e qiskit.circuit.ClassicalRegister da usare nei circuiti di Quantum Volume generati, invece di crearne di nuovi. Tuttavia, i parametri non vengono mai rispettati e viene sempre creato un nuovo Registro, indipendentemente dal fatto che siano impostati o meno. Questo comportamento è invariato e questi kwarg non hanno ancora alcun effetto, ma vengono deprecati prima di essere rimossi per evitare un cambiamento di rottura per gli utenti che potrebbero aver impostato uno dei due.

  • Il supporto per il passaggio di sottoinsiemi di qubit come elenco nel parametro qubit_lists per la funzione qiskit.ignis.verification.qv_circuits() è stato deprecato e sarà rimosso in una versione futura. In passato veniva utilizzato per specificare un layout per eseguire il circuito su un dispositivo. In altre parole, se si dispone di un dispositivo a 5 qubit e si vuole eseguire un circuito QV a 2 qubit sui qubit 1, 3 e 4 di quel dispositivo. Si passerebbe [1, 3, 4] come una delle liste in qubit_lists, che genererebbe un circuito virtuale a 5 qubit e avrebbe qv applicato ai qubit 1, 3 e 4 in quel circuito virtuale. Tuttavia, questa funzionalità non è necessaria e si sovrappone al concetto di initial_layout nel transpiler e se un circuito è stato incorporato con un set di layout. Per andare avanti, invece, si dovrebbe semplicemente eseguire transpile() o execute() con il layout iniziale impostato per farlo. Ad esempio, l'esecuzione dell'esempio precedente diventerebbe:

    from qiskit import execute
    from qiskit.ignis.verification import qv_circuits
    
    initial_layout = [1, 3, 4]
    qv_circs, _ = qv_circuits([list(range3)])
    execute(qv_circuits, initial_layout=initial_layout)

Correzioni di bug

  • Correzione di un bug relativo alla posizione degli impulsi di misura inseriti da py:func:qiskit.ignis.characterization.calibrations.pulse_schedules.drag_schedules. Correzioni #465

Acqua 0.7.5

Nuove funzioni

  • Eliminata la dipendenza soft da CPLEX in ADMMOptimizer. Ora gli ottimizzatori predefiniti utilizzati da ADMMOptimizer sono MinimumEigenOptimizer per i problemi QUBO e SlsqpOptimizer come ottimizzatore continuo. È ancora possibile utilizzare CplexOptimizer come ottimizzatore per ADMMOptimizer, ma deve essere impostato esplicitamente.
  • Il nuovo sito di Yahoo! creazione di un fornitore di finanziamenti.
  • Introdotto QuadraticProgramConverter , una classe astratta per i convertitori. Aggiunti i metodi convert/interpret per i convertitori invece di encode/decode. Aggiunti to_ising e from_ising alla classe QuadraticProgram . Spostati tutti i parametri da convert al costruttore, tranne name. Creato setter/getter per i parametri del convertitore. Aggiunti auto_define_penalty e interpret for``LinearEqualityToPenalty``. Ora i messaggi di errore dei convertitori sono più informativi.
  • Aggiunto un ottimizzatore SLSQP qiskit.optimization.algorithms.SlsqpOptimizer come wrapper del corrispondente metodo di ottimizzazione SciPy. Si tratta di un ottimizzatore classico, che non dipende da algoritmi quantistici e può essere utilizzato in sostituzione di CobylaOptimizer.
  • L'ottimizzatore Cobyla è stato modificato per accogliere la funzione di avvio multiplo introdotta nell'ottimizzatore SLSQP. Per impostazione predefinita, l'ottimizzatore non viene eseguito in modalità di avvio multiplo.
  • SummedOp esegue un controllo matematicamente più corretto dell'uguaglianza, dove espressioni come X + X == 2*X e X + Z == Z + X sono valutate come True.

Note di deprecazione

  • La classe di ottimizzazione GSLS ha deprecato il parametro __init__ max_iter a favore di maxiter. La classe di ottimizzazione SPSA ha deprecato il parametro __init__ max_trials a favore di maxiter. la funzione optimize_svm ha deprecato il parametro max_iters a favore di maxiter. La classe ADMMParameters ha deprecato il parametro __init__ max_iter a favore di maxiter.
  • Le classi di conversione ising qiskit.optimization.converters.QuadraticProgramToIsing e qiskit.optimization.converters.IsingToQuadraticProgram sono state deprecate e saranno rimosse in una prossima versione. Si devono invece utilizzare i metodi qiskit.optimization.QuadraticProgram to_ising() e from_ising() .
  • Il metodo pprint_as_string per qiskit.optimization.QuadraticProgram è stato deprecato e sarà rimosso in una prossima versione. Si dovrebbe invece eseguire .pprint_as_string() sull'output di to_docplex()
  • Il metodo prettyprint per qiskit.optimization.QuadraticProgram è stato deprecato e sarà rimosso in una prossima versione. Si dovrebbe invece eseguire .prettyprint() sull'output di to_docplex()

Correzioni di bug

  • Modificato nella versione python 3.8: Su macOS, il metodo di avvio dello spawn è ora quello predefinito. Il metodo di avvio della forchetta deve essere considerato non sicuro, in quanto può causare arresti anomali nei sottoprocessi. Tuttavia P_BFGS non supporta lo spawn, quindi torniamo al processo singolo. Per maggiori dettagli, consultare il documento #1109 <https://github.com/qiskit-community/qiskit-aqua/issues/1109>.
  • I parametri di binding in CircuitStateFn non copiavano il valore di is_measurement e impostavano sempre is_measurement=False. Il problema è stato risolto.
  • In precedenza, SummedOp.to_matrix_op costruiva una lista MatrixOp’s (con matrici numpy) e poi le sommava, restituendo un singolo MatrixOp. Alcuni algoritmi (ad esempio vqe) richiedono la somma di migliaia di matrici, il che esaurisce la memoria durante la costruzione dell'elenco di matrici. Con questa modifica, non viene costruito alcun elenco. Piuttosto, ogni operando della somma viene convertito in una matrice, aggiunto a un accumulatore e scartato.
  • La modifica dei backend in VQE da statevector a qasm_simulator o a un dispositivo reale causava un errore dovuto al riutilizzo incompatibile di CircuitSampler. Il VQE è stato modificato per creare sempre un nuovo CircuitSampler e creare una nuova aspettativa nel caso in cui non sia stata inserita dall'utente. Per maggiori dettagli, consultare il documento #1153 <https://github.com/qiskit-community/qiskit-aqua/issues/1153>.
  • I fornitori di servizi finanziari di Exchange e Wikipedia sono stati corretti per gestire correttamente i dati di Quandl. Per maggiori dettagli, consultare il documento #775 <https://github.com/qiskit-community/qiskit-aqua/issues/775>. Corregge un errore di divisione per 0 nei calcoli del vettore medio e della matrice di covarianza dei fornitori di servizi finanziari. Per maggiori dettagli, consultare il documento #781 <https://github.com/qiskit-community/qiskit-aqua/issues/781>.
  • La proprietà ListOp.combo_fn è stata persa in diverse trasformazioni, come la conversione in un altro tipo di operatore, l'attraversamento, la riduzione o la moltiplicazione. Ora questo attributo viene propagato all'operatore risultante.
  • La valutazione di alcune espressioni di operatori, come quella di SummedOp``s and evaluations with the ``CircuitSampler , non trattava correttamente i coefficienti o li ignorava completamente. E.g. valutando ~StateFn(0 * (I + Z)) @ Plus non si è ottenuto 0 o la normalizzazione di ~StateFn(I) @ ((Plus + Minus) / sqrt(2)) ha mancato un fattore di sqrt(2). Il problema è stato risolto.
  • OptimizationResult includeva alcuni setter pubblici e le variabili di classe erano Optional. Questa correzione rende tutte le variabili della classe di sola lettura, in modo che mypy e pylint possano controllare i tipi in modo più efficace. MinimumEigenOptimizer.solve bitstings generati in un risultato come str. Questa correzione ha modificato il risultato in List[float] come fanno gli altri algoritmi. Alcune classi pubbliche relative agli algoritmi di ottimizzazione mancavano nella documentazione di qiskit.optimization.algorithms. Questa correzione ha aggiunto tutte le classi di questo tipo alla documentazione. #1131 <https://github.com/qiskit-community/qiskit-aqua/issues/1131> per maggiori dettagli.
  • OptimizationResult.__init__ non ha controllato se le dimensioni di x e variables corrispondono o meno (dovrebbero corrispondere). Questa correzione ha aggiunto il controllo per sollevare un errore se non corrispondono e corregge i bug rilevati dal controllo. Questa correzione aggiunge anche i test unitari mancanti relativi a OptimizationResult.variable_names e OptimizationResult.variables_dict in test_converters. #1167 <https://github.com/qiskit-community/qiskit-aqua/issues/1167> per maggiori dettagli.
  • Correggere il binding dei parametri in OperatorStateFn, che non vincolava i parametri della primitiva sottostante ma solo i coefficienti.
  • op.eval(other), dove op è di tipo OperatorBase, a volte restituisce silenziosamente un valore senza senso quando il numero di qubit in op e other non sono uguali. Questa correzione comporta un comportamento corretto, che consiste nel lanciare un errore anziché restituire un valore, perché l'input in questo caso non è valido.
  • Il metodo construct_circuit di VQE restituiva in precedenza il valore di aspettativa da valutare come tipo OperatorBase. Questa funzionalità è stata spostata in construct_expectation e construct_circuit restituisce un elenco dei circuiti che vengono valutati per calcolare il valore di aspettativa.

IBM Q Fornitore 0.8.0

Nuove funzioni

  • IBMQBackend ha ora un nuovo metodo reservations() che restituisce le informazioni sulla prenotazione per il backend, con un filtro opzionale. Inoltre, ora è possibile utilizzare provider.backends.my_reservations() per richiedere le proprie prenotazioni.
  • qiskit.providers.ibmq.job.IBMQJob.result() solleva un'eccezione IBMQJobFailureError se il lavoro è fallito. Il messaggio di eccezione ora contiene il motivo per cui il lavoro è fallito, se l'intero lavoro è fallito per un unico motivo.
  • Un nuovo attributo client_version è stato aggiunto a IBMQJob e a qiskit.result.Result recuperato tramite qiskit.providers.ibmq.job.IBMQJob.result(). client_version è un dizionario in cui la chiave è il nome e il valore è la versione del client usato per inviare il lavoro, come Qiskit.
  • La funzione least_busy() accetta ora un nuovo parametro opzionale reservation_lookahead. Se specificato o predefinito, un backend è considerato non disponibile se ha prenotazioni nei prossimi n minuti, dove n è il valore di reservation_lookahead. Ad esempio, se si utilizza il valore predefinito di 60, tutti i backend che hanno prenotazioni nei successivi 60 minuti sono considerati non disponibili.
  • ManagedResults dispone di un nuovo metodo combine_results() che combina i risultati di tutti i lavori gestiti e restituisce un singolo oggetto Result oggetto. Questo oggetto Result può essere utilizzato, ad esempio, nei metodi di qiskit-ignis adattamento.

Note sull'aggiornamento

  • I timestamp nei seguenti campi sono ora in ora locale anziché UTC:

    • Proprietà di backend restituite da qiskit.providers.ibmq.IBMQBackend.properties().
    • Proprietà di backend restituite da qiskit.providers.ibmq.job.IBMQJob.properties().
    • estimated_start_time e estimated_complete_time in QueueInfo, restituito da qiskit.providers.ibmq.job.IBMQJob.queue_info().
    • date in Result, restituito da qiskit.providers.ibmq.job.IBMQJob.result().

    Inoltre, anche il parametro datetime per qiskit.providers.ibmq.IBMQBackend.properties() dovrebbe essere in ora locale, a meno che non contenga informazioni sul fuso orario UTC.

  • websockets 8.0 o superiore è ora richiesto se si usa Python 3.7 o superiore. websockets 7.0 continuerà a essere utilizzato per Python 3.6 o inferiore.

  • In Windows, il criterio del ciclo di eventi è impostato su WindowsSelectorEventLoopPolicy invece di utilizzare il valore predefinito WindowsProactorEventLoopPolicy. Questo risolve il problema per cui il metodo qiskit.providers.ibmq.job.IBMQJob.result() poteva bloccarsi su Windows. Correzioni #691

Note di deprecazione

  • L'uso di Qconfig.py per salvare le credenziali di IBM Quantum Experience è deprecato e sarà rimosso nella prossima versione. Si dovrebbe invece usare qiskitrc (l'impostazione predefinita).

Correzioni di bug

  • Corregge un problema per cui una chiamata a qiskit.providers.ibmq.IBMQBackend.jobs() può bloccarsi se il numero di lavori restituiti è elevato. Correzioni #674
  • Corregge un problema che sollevava un ValueError quando si costruivano mappe di errori in Jupyter per i backend non in linea. Correzioni #706
  • qiskit.providers.ibmq.IBMQBackend.jobs() restituirà ora l'elenco corretto degli oggetti IBMQJob quando il kwarg status è impostato su 'RUNNING'.
  • I metadati del pacchetto sono stati aggiornati per riflettere correttamente la dipendenza da qiskit-terra >= 0.14.0. Questa dipendenza è stata implicitamente aggiunta come parte del rilascio di 0.7.0, ma non è stata riflessa nei requisiti del pacchetto, per cui in precedenza era possibile installare qiskit-ibmq-provider con una versione di qiskit-terra troppo vecchia. Correzioni #677
Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.