Skip to main content
IBM Quantum Platform

Note di rilascio di Qiskit 0.13


0.13.0

Terra 0.10.0

Preludio

La release 0.10.0 include diverse nuove funzionalità e correzioni di bug. Il cambiamento più importante di questa versione è l'aggiunta del supporto iniziale per l'utilizzo di Qiskit con i backend delle trappole ioniche intrappolate.

Nuove funzioni

  • Introdotti nuovi metodi in QuantumCircuit che consentono di aggiungere o rimuovere senza problemi le misure alla fine di un circuito.


    measure_all()

    Aggiunge un barrier seguito da un'operazione measure a tutti i qubit del circuito. Crea un ClassicalRegister di dimensione pari al numero di qubit del circuito, che memorizza le misure.


    measure_active()

    Aggiunge un'operazione barrier seguita da un'operazione measure a tutti i qubit attivi del circuito. Un qubit è attivo se ha almeno un'altra operazione che agisce su di esso. Crea un ClassicalRegister di dimensione pari al numero di qubit attivi nel circuito, che memorizza le misure.


    remove_final_measurements()

    Rimuove tutte le misure finali e le precedenti barrier da un circuito. Una misura è considerata "finale" se non è seguita da nessun'altra operazione, escluse le barriere e le altre misure. Dopo la rimozione delle misure, se tutti i bit classici di ClassicalRegister sono inattivi (non hanno operazioni collegate), allora ClassicalRegister viene rimosso.

    Esempi:

    # Using measure_all()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_all()
    circuit.draw()
    
    # A ClassicalRegister with prefix measure was created.
    # It has 2 clbits because there are 2 qubits to measure
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├───
                 └───┘ ░ └╥┘┌─┐
         q_1: |0>──────░──╫─┤M├
                       ░  ║ └╥┘
    measure_0: 0 ═════════╩══╬═
    
    measure_1: 0 ════════════╩═
    
    
    # Using measure_active()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_active()
    circuit.draw()
    
    # This ClassicalRegister only has 1 clbit because only 1 qubit is active
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├
                 └───┘ ░ └╥┘
         q_1: |0>──────░──╫─
                       ░  ║
    measure_0: 0 ═════════╩═
    
    
    # Using remove_final_measurements()
    # Assuming circuit_all and circuit_active are the circuits from the measure_all and
    # measure_active examples above respectively
    
    circuit_all.remove_final_measurements()
    circuit_all.draw()
    # The ClassicalRegister is removed because, after the measurements were removed,
    # all of its clbits were idle
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
    
    
    circuit_active.remove_final_measurements()
    circuit_active.draw()
    # This will result in the same circuit
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
  • È stato aggiunto il supporto iniziale per l'esecuzione di esperimenti su backend di trappole ioniche.

  • Al set di gate standard sono stati aggiunti un gate Rxx (rxx) e un gate globale Mølmer-Sørensen (ms).

  • Al modulo quantum_info.synthesis sono stati aggiunti un decompositore da Cnot a Rxx/Rx/Ry cnot_rxx_decompose e un decompositore di angoli di Eulero a singolo qubit OneQubitEulerDecomposer .

  • È stato aggiunto un passaggio di transpiler MSBasisDecomposer per srotolare circuiti definiti su U3 e porte Cnot in un circuito definito su Rxx,Ry e Rx. Questo passaggio sarà incluso nei gestori di passaggi preimpostati per i backend che includono il gate 'rxx' tra i gate di base supportati.

  • I backend di qiskit.test.mock contengono ora un'istantanea dei dati di calibrazione del dispositivo reale. È accessibile tramite il metodo properties() per ogni backend. Questo può essere usato per testare qualsiasi codice che dipenda dalle proprietà del backend, come i passaggi del transpiler che adattano il rumore o i modelli di rumore del dispositivo per la simulazione. In questo modo il ciclo di test e sviluppo sarà più rapido, senza la necessità di passare ai backend live.

  • Consente alla classe Result di restituire risultati parziali. Se viene caricato uno schema di risultati valido che contiene alcuni esperimenti che hanno avuto successo e altri che sono falliti, ciò consente di accedere ai dati degli esperimenti che hanno avuto successo, sollevando un'eccezione per gli esperimenti che non hanno avuto successo e visualizzando il messaggio di errore appropriato per i risultati falliti.

  • Alle seguenti funzioni di visualizzazione è stato aggiunto un kwarg ax :

    • qiskit.visualization.plot_histogram
    • qiskit.visualization.plot_state_paulivec
    • qiskit.visualization.plot_state_qsphere
    • qiskit.visualization.circuit_drawer ( Solompl backend)
    • qiskit.QuantumCircuit.draw ( Solompl backend)

    Questo kwarg viene usato per passare un oggetto matplotlib.axes.Axes alle funzioni di visualizzazione. Ciò consente di integrare queste funzioni di visualizzazione in un flusso di lavoro più ampio. Inoltre, se viene specificato un kwarg ax, le funzioni di visualizzazione non vengono restituite.

  • Alle seguenti funzioni di visualizzazione è stato aggiunto un kwarg ax_real e ax_imag :

    • qiskit.visualization.plot_state_hinton
    • qiskit.visualization.plot_state_city

    Questi nuovi karg funzionano come i kwarg di ax aggiunti di recente per altre funzioni di visualizzazione. Tuttavia, poiché questi grafici utilizzano due assi (uno per la componente reale, l'altro per la componente immaginaria). Avere due kwarg offre anche la flessibilità di generare una visualizzazione solo per uno dei componenti, invece di fare sempre entrambi. Ad esempio:

    from matplotlib import pyplot as plt
    from qiskit.visualization import plot_state_hinton
    
    ax = plt.gca()
    
    plot_state_hinton(psi, ax_real=ax)

    genererà solo un grafico della componente reale.

  • Un determinato gestore di passaggi può ora essere modificato con il nuovo metodo replace. Questo metodo consente di sostituire un particolare stadio in un gestore di passaggi, il che può essere utile quando si ha a che fare con gestori di passaggi preimpostati. Ad esempio, modifichiamo il selettore di layout del gestore di passaggi usato al livello di ottimizzazione 0:

    from qiskit.transpiler.preset_passmanagers.level0 import level_0_pass_manager
    from qiskit.transpiler.transpile_config import TranspileConfig
    
    pass_manager = level_0_pass_manager(TranspileConfig(coupling_map=CouplingMap([[0,1]])))
    
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: TrivialLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    La selezione del layout è impostata nella fase [1]. Sostituiamolo con DenseLayout:

    from qiskit.transpiler.passes import DenseLayout
    
    pass_manager.replace(1, DenseLayout(coupling_map), condition=lambda property_set: not property_set['layout'])
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    Se si desidera sostituirlo senza alcuna condizione, è possibile utilizzare la scorciatoia set-item:

    pass_manager[1] = DenseLayout(coupling_map)
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] FlowLinear: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller
  • Introdotto un nuovo comando ad impulsi Delay che può essere inserito in un impulso Schedule. Questo comando accetta un duration e può essere aggiunto a qualsiasi Channel. Altri comandi non possono essere programmati su un canale durante un ritardo.

    Il ritardo può essere aggiunto come qualsiasi altro comando a impulsi. Ad esempio:

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | sched
    
    # pad schedule
    padded_sched = pad(sched)
    
    assert padded_sched == ref_sched

    Si possono anche passare altri canali da imbottire e un tempo fino al quale imbottire, ad esempio:

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    dc1 = pulse.DriveChannel(1)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | delay(dc1) |  sched
    
    # pad schedule across both channels until up until the first time step
    padded_sched = pad(sched, channels=[dc0, dc1], until=1)
    
    assert padded_sched == ref_sched

Note sull'aggiornamento

  • Le assegnazioni e le modifiche all'attributo data degli oggetti qiskit.QuantumCircuit sono ora convalidate secondo le stesse regole utilizzate in tutta l'API QuantumCircuit . Questo è stato fatto per migliorare le prestazioni dell'API dei circuiti, dato che ora si può assumere che l'attributo data sia in un formato noto. Se in precedenza si modificava manualmente l'attributo data di un oggetto circuito, questo potrebbe non funzionare più se le modifiche apportate hanno dato luogo a una struttura di dati diversa dall'elenco di istruzioni con contesto nel formato [(instruction, qargs, cargs)]

  • Il passmanager predefinito del transpiler per il livello di ottimizzazione 2 ora utilizza il meccanismo di selezione del layout di DenseLayout invece di NoiseAdaptiveLayout. Anche il passaggio Denselayout è stato modificato per renderlo consapevole del rumore.

  • La classe deprecata DeviceSpecification è stata rimossa. Si dovrebbe invece utilizzare il sito PulseChannelSpec. Ad esempio, è possibile eseguire qualcosa come:

    device = pulse.PulseChannelSpec.from_backend(backend)
    device.drives[0]    # for DeviceSpecification, this was device.q[0].drive
    device.memoryslots  # this was device.mem
  • Il modulo deprecato qiskit.pulse.ops è stato rimosso. Utilizzate direttamente i metodi Schedule e Instruction . Ad esempio, piuttosto che:

    ops.union(schedule_0, schedule_1)
    ops.union(instruction, schedule)  # etc

    Utilizzare invece:

    schedule_0.union(schedule_1)
    instruction.union(schedule)

    Lo stesso schema si applica ad altre funzioni di ops : insert, shift, append, e flatten.

Note di deprecazione

  • L'uso della proprietà control di qiskit.circuit.Instruction per il controllo classico è ora deprecato. In futuro questa proprietà sarà utilizzata per il controllo quantistico. Le operazioni condizionate classiche saranno invece gestite dalla proprietà condition di qiskit.circuit.Instruction.
  • Il supporto per l'impostazione dei parametri di qiskit.circuit.Instruction con un oggetto di tipo qiskit.qasm.node.Node è stato deprecato. Node che sono stati usati in precedenza come parametri, devono essere convertiti in un tipo supportato prima di inizializzare un nuovo oggetto Instruction o di chiamare il setter Instruction.params . I tipi supportati sono int, float, complex, str, qiskit.circuit.ParameterExpression, o numpy.ndarray.
  • Nella release qiskit 0.9.0 la rappresentazione dei bit (sia dei qubit che dei bit classici) è passata da tuple della forma (register, index) a istanze delle classi qiskit.circuit.Qubit e qiskit.circuit.Clbit. Per la retrocompatibilità è stato supportato il confronto dell'uguaglianza tra una tupla legacy e le classi di bit, quando tutto è passato dalle tuple agli oggetti. Questo supporto è ora deprecato e sarà rimosso in futuro. In futuro, tutto dovrebbe utilizzare le classi di bit invece delle tuple.
  • Quando l'output mpl è usato per qiskit.QuantumCircuit.draw() o qiskit.visualization.circuit_drawer() e viene usato il kwarg style , il passaggio di chiavi di dizionario non supportate come parte del dizionario style` è ora deprecato. Se prima questi argomenti sconosciuti venivano ignorati silenziosamente, in futuro le chiavi non supportate solleveranno un'eccezione.
  • Il kwarg line length per il metodo qiskit.QuantumCircuit.draw() e la funzione qiskit.visualization.circuit_drawer() con la modalità di uscita testo è deprecato. È stato sostituito da fold kwarg, che si comporta in modo identico per la modalità di output testo (ma ora supporta anche la modalità di output mpl). line_length sarà rimosso in una prossima versione, quindi le chiamate devono essere aggiornate per usare fold .
  • Il campo fold nel kwarg dict di style per il metodo qiskit.QuantumCircuit.draw() e la funzione qiskit.visualization.circuit_drawer() è stato deprecato. È stato sostituito da fold kwarg su entrambe le funzioni. Questo kwarg si comporta in modo identico al campo nel dict dello stile.

Correzioni di bug

  • La stratificazione delle istruzioni alla base di tutti i tipi di disegno dei circuiti è cambiata per affrontare la giustificazione destra/sinistra. In alcuni casi, il risultato è un output topologicamente equivalente al rendering delle versioni precedenti, ma visivamente diverso rispetto a quello ottenuto in precedenza. Corregge il problema #2802
  • Aggiungere memory_slots a QobjExperimentHeader di Qobj a impulsi. Questo risolve un errore nel formato dei dati dei risultati di meas_level=2 degli esperimenti ad impulsi. Gli stati quantici misurati vengono restituiti come stringa di bit con padding a zero in base al numero impostato per memory_slots.
  • Corretta la visualizzazione del gate rzz nel cassetto dei circuiti in lattice in modo che corrisponda al gate cu1 per riflettere la simmetria del gate rzz. La correzione si basa sul comando cds del pacchetto qcircuit latex. Corregge il problema #1957

Altre note

  • matplotlib.figure.Figure gli oggetti restituiti dalle funzioni di visualizzazione non sono più sempre chiusi per impostazione predefinita. Invece gli oggetti figura restituiti sono chiusi solo se il backend matplotlib configurato è un backend jupyter inline (impostato con %matplotlib inline o %matplotlib notebook). Gli oggetti figura di output sono ancora chiusi con questi backend per evitare duplicazioni di output nei notebook di jupyter (motivo per cui Figure.close() è stato aggiunto originariamente).

Aer 0.3

Nessuna modifica

Ignis 0.2

Nessuna modifica

Acqua 0.6

Nessuna modifica

IBM Q Fornitore 0.3

Nessuna modifica

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.