Skip to main content
IBM Quantum Platform

Note di rilascio di Qiskit 0.12


0.12.0

Terra 0.9

Preludio

La versione 0.9 include molte nuove funzionalità e molte correzioni di bug. I cambiamenti più importanti di questa versione sono le nuove funzionalità di debug per PassManagers. Questo include una funzione per visualizzare un PassManager, la possibilità di aggiungere una funzione di callback a un PassManager, e la registrazione dei passaggi eseguiti nel PassManager. Inoltre, questa versione standardizza il modo in cui è possibile impostare un layout iniziale per il circuito. Quindi ora si può sfruttare initial_layout il parametro kwarg su qiskit.compiler.transpile() e qiskit.execute() e i qubit del circuito saranno disposti sui qubit desiderati del dispositivo. La visualizzazione dei circuiti ora lo mostra chiaramente anche quando si visualizza un circuito che è stato transpilato con un layout.

Nuove funzioni

  • Un oggetto DAGCircuit (cioè la rappresentazione grafica di un QuantumCircuit in cui le dipendenze delle operazioni sono esplicite) può ora essere visualizzato con il metodo .draw() . Questo è in linea con la filosofia di Qiskit di una facile visualizzazione. Altri oggetti che supportano il metodo .draw() sono QuantumCircuit, PassManager e Schedule.

  • Aggiunta una nuova funzione di visualizzazione qiskit.visualization.plot_error_map() per tracciare la mappa degli errori per un determinato backend. Riceve un oggetto backend da qiskit-ibmq-provider e traccia la mappa degli errori corrente per quel dispositivo.

  • Sia qiskit.QuantumCircuit.draw() che qiskit.visualization.circuit_drawer() supportano ora l'annotazione dei qubit nella visualizzazione con informazioni sul layout. Se l'oggetto QuantumCircuit che si sta disegnando include metadati di layout (che di solito sono impostati solo sul circuito in uscita dalle chiamate a transpile() ), per impostazione predefinita quel layout sarà mostrato sul diagramma. Questo viene fatto per tutti i backend dei cassetti dei circuiti. Ad esempio:

    from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
    from qiskit.compiler import transpile
    
    qr = QuantumRegister(2, 'userqr')
    cr = ClassicalRegister(2, 'c0')
    qc = QuantumCircuit(qr, cr)
    qc.h(qr[0])
    qc.cx(qr[0], qr[1])
    qc.y(qr[0])
    qc.x(qr[1])
    qc.measure(qr, cr)
    
    # Melbourne coupling map
    coupling_map = [[1, 0], [1, 2], [2, 3], [4, 3], [4, 10], [5, 4],
                    [5, 6], [5, 9], [6, 8], [7, 8], [9, 8], [9, 10],
                    [11, 3], [11, 10], [11, 12], [12, 2], [13, 1],
                    [13, 12]]
    qc_result = transpile(qc, basis_gates=['u1', 'u2', 'u3', 'cx', 'id'],
                          coupling_map=coupling_map, optimization_level=0)
    qc.draw(output='text')

    produrrà un diagramma del tipo:

                      ┌──────────┐┌──────────┐┌───┐┌──────────┐┌──────────────────┐┌─┐
       (userqr0) q0|0>U2(0,pi) ├┤ U2(0,pi) ├┤ X ├┤ U2(0,pi) ├┤ U3(pi,pi/2,pi/2) ├┤M├───
                      ├──────────┤└──────────┘└─┬─┘├──────────┤└─┬─────────────┬──┘└╥┘┌─┐
       (userqr1) q1|0>U2(0,pi) ├──────────────■──┤ U2(0,pi) ├──┤ U3(pi,0,pi) ├────╫─┤M├
                      └──────────┘                 └──────────┘  └─────────────┘    ║ └╥┘
      (ancilla0) q2|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
      (ancilla1) q3|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
      (ancilla2) q4|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
      (ancilla3) q5|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
      (ancilla4) q6|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
      (ancilla5) q7|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
      (ancilla6) q8|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
      (ancilla7) q9|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
     (ancilla8) q10|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
     (ancilla9) q11|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
    (ancilla10) q12|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
    (ancilla11) q13|0>──────────────────────────────────────────────────────────────╫──╫─
                                                                                    ║  ║
              c0_0: 0 ══════════════════════════════════════════════════════════════╩══╬═
    
              c0_1: 0 ═════════════════════════════════════════════════════════════════╩═

    Se non si desidera che il layout venga visualizzato sui circuiti transpilati (o su qualsiasi altro circuito con un layout impostato), esiste un nuovo kwarg booleano per entrambe le funzioni, with_layout (con valore predefinito True), che, se impostato False , disabilita l'annotazione del layout nei circuiti di uscita.

  • È stato aggiunto un nuovo passaggio di analisi CountOpsLongest per recuperare il numero di operazioni sul percorso più lungo del DAGCircuit. Quando viene utilizzato, aggiunge una chiave count_ops_longest_path al dizionario dei set di proprietà. È possibile aggiungerlo al passmanager con qualcosa di simile:

    from qiskit.transpiler.passes import CountOpsLongestPath
    from qiskit.transpiler.passes import CxCancellation
    from qiskit.transpiler import PassManager
    
    pm = PassManager()
    pm.append(CountOpsLongestPath())

    e poi accedere al percorso più lungo tramite il valore della proprietà impostata con qualcosa di simile:

    pm.append(
        CxCancellation(),
        condition=lambda property_set: property_set[
            'count_ops_longest_path'] < 5)

    che imposterà una condizione su quel passaggio in base al percorso più lungo.

  • Due nuove funzioni, sech() e sech_deriv() , sono state aggiunte al modulo qiskit.pulse.pulse_lib della libreria degli impulsi per creare rispettivamente un oggetto SamplePulse secante iperbolico non normalizzato e un oggetto SamplePulse derviante secante iperbolico non normalizzato.

  • È stata aggiunta una nuova opzione kwarg vertical_compression al metodo QuantumCircuit.draw() e alla funzione qiskit.visualization.circuit_drawer() . Questa opzione funziona solo con il backend text . Questa opzione può essere impostata su high, medium (il valore predefinito) o low per regolare la quantità di spazio verticale utilizzato dalla visualizzazione di output.

  • È stata aggiunta una nuova opzione kwarg booleana idle_wires al metodo QuantumCircuit.draw() e alla funzione qiskit.visualization.circuit_drawer() . Funziona per tutti i backend dei cassetti. Quando idle_wires è impostato False in una chiamata di cassetto, il cassetto non disegnerà alcun bit che non abbia elementi di circuito nella visualizzazione del circuito quantico di uscita.

  • È stata aggiunta una nuova funzione di visualizzazione PassManager qiskit.visualization.pass_mamanger_drawer() . Questa funzione riceve un oggetto PassManager e genera un diagramma di controllo del flusso di tutti i passaggi eseguiti in PassManager.

  • Quando si crea un PassManager è ora possibile specificare una funzione di callback che, se specificata, verrà eseguita dopo l'esecuzione di ogni passaggio. A questa funzione viene passato un insieme di kwarg a ogni chiamata con lo stato del gestore dei passaggi dopo l'esecuzione di ogni passaggio. Attualmente questi kwarg sono:

    • pass_ (Pass): il passaggio che viene eseguito
    • dag (DAGCircuit): l'uscita dag del passaggio
    • time (float): il tempo di esecuzione del passaggio
    • property_set (PropertySet): il set di proprietà
    • count (int): l'indice per l'esecuzione del passaggio

    Tuttavia, vale la pena notare che questi argomenti, pur essendo impostati per la versione 0.9, espongono gli interni del gestore di passaggi e sono soggetti a modifiche nelle versioni future.

    Ad esempio, si può usare per creare una funzione di callback che visualizzi l'output del circuito dopo l'esecuzione di ogni passaggio:

    from qiskit.transpiler import PassManager
    
    def my_callback(**kwargs):
        print(kwargs['dag'])
    
    pm = PassManager(callback=my_callback)

    Inoltre, è possibile specificare la funzione di callback quando si utilizza qiskit.compiler.transpile():

    from qiskit.compiler import transpile
    
    def my_callback(**kwargs):
        print(kwargs['pass'])
    
    transpile(circ, callback=my_callback)
  • È stato aggiunto un nuovo metodo filter() alla classe qiskit.pulse.Schedule . Questo permette di filtrare le istruzioni in un programma. Ad esempio, filtrare per tipo di istruzione:

    from qiskit.pulse import Schedule
    from qiskit.pulse.commands import Acquire
    from qiskit.pulse.commands import AcquireInstruction
    from qiskit.pulse.commands import FrameChange
    
    sched = Schedule(name='MyExperiment')
    sched.insert(0, FrameChange(phase=-1.57)(device))
    sched.insert(60, Acquire(5))
    acquire_sched = sched.filter(instruction_types=[AcquireInstruction])
  • Metodi di decomposizione aggiuntivi per diversi tipi di porte. Questi metodi utilizzeranno diverse tecniche di decomposizione per scomporre un gate in una sequenza di CNOT e di gate a singolo qubit. Sono stati aggiunti i seguenti metodi:

    Metodo
    Descrizione
    QuantumCircuit.iso()Aggiungere a un circuito un'isometria arbitraria da m a n qubit. Questo permette di attaccare unitari arbitrari su n qubit (m=n) o di preparare qualsiasi stato di n qubit ( m=0 )
    QuantumCircuit.diag_gate()Aggiungere un gate diagonale al circuito
    QuantumCircuit.squ()Decomporre un unitario 2x2 arbitrario in tre porte di rotazione e aggiungere a un circuito
    QuantumCircuit.ucg()Collegare un gate a controllo uniforme (detto anche gate multiplexato) a un circuito
    QuantumCircuit.ucx()Collegare un gate di rotazione Rx a controllo uniforme (detto anche multiplexato) a un circuito
    QuantumCircuit.ucy()Collegare un gate di rotazione Ry a controllo uniforme (detto anche multiplexato) a un circuito
    QuantumCircuit.ucz()Collegare un gate di rotazione Rz a controllo uniforme (detto anche multiplexato) a un circuito
  • Aggiunta degli algoritmi Gray-Synth e Patel-Markov-Hayes per la sintesi di circuiti lineari CNOT-Phase e CNOT-only. Queste funzioni consentono di sintetizzare circuiti costituiti solo da porte CNOT, data una funzione lineare, o un circuito costituito solo da porte CNOT e di fase, data una descrizione matriciale.

  • È stata aggiunta una nuova funzione random_circuit al modulo qiskit.circuit.random . Questa funzione genera un circuito casuale di una dimensione specificata, selezionando casualmente diverse porte e aggiungendole al circuito. Ad esempio, è possibile utilizzare questo metodo per generare un circuito a 5 bit con una profondità di 10 utilizzando:

    from qiskit.circuit.random import random_circuit
    
    circ = random_circuit(5, 10)
  • È stato aggiunto un nuovo kwarg output_names alla funzione qiskit.compiler.transpile() . Questo kwarg accetta una stringa o un elenco di stringhe e le usa come valore del nome del circuito per i circuiti di uscita che vengono restituiti dalla chiamata a transpile() . Ad esempio:

    from qiskit.compiler import transpile
    my_circs = [circ_a, circ_b]
    tcirc_a, tcirc_b = transpile(my_circs,
                                 output_names=['Circuit A', 'Circuit B'])

    l'attributo name su tcirc_a e tcirc_b sarà rispettivamente 'Circuit A' e 'Circuit B' .

  • È stato aggiunto un nuovo metodo equiv() alle classi qiskit.quantum_info.Operator e qiskit.quantum_info.Statevector . Questi metodi vengono utilizzati per verificare se un secondo oggetto Operator o Statevector è equivalente fino alla fase globale.

  • Il file di configurazione utente presenta diverse nuove opzioni:

    • Il campo circuit_drawer accetta ora un valore automatico. Quando viene impostato come valore per il campo circuit_drawer , il backend del cassetto predefinito sarà mpl, se disponibile, altrimenti verrà utilizzato il backend del testo.
    • Un nuovo campo circuit_mpl_style può essere utilizzato per impostare lo stile predefinito utilizzato dal cassetto dei circuiti di matplotlib. I valori validi per questo campo sono bw e default per impostare rispettivamente lo stile predefinito in bianco e nero o lo stile di colore predefinito.
    • Un nuovo campo transpile_optimization_level può essere usato per impostare il livello di ottimizzazione predefinito del transpiler da usare per le chiamate a qiskit.compiler.transpile(). Il valore può essere impostato a 0, 1, 2 o 3.
  • 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
    
    drive_channel = pulse.DriveChannel(0)
    delay = pulse.Delay(20)
    
    sched = pulse.Schedule()
    sched += delay(drive_channel)

Note sull'aggiornamento

  • Il modulo qiskit._util , precedentemente deprecato, è stato rimosso. qiskit.util dovrebbe essere utilizzato al suo posto.

  • Il metodo QuantumCircuit.count_ops() ora restituisce un oggetto OrderedDict invece di un dict. Questo dovrebbe essere compatibile per la maggior parte dei casi d'uso, dato che OrderedDict è una sottoclasse di dict . Tuttavia, potrebbe essere necessario aggiornare i controlli di tipo e altri controlli di classe.

  • Il metodo DAGCircuit.width() restituisce ora il numero totale di bit quantistici e di bit classici. Prima restituiva solo il numero di bit quantici. Se si desidera solo il numero di bit quantici, è possibile utilizzare DAGCircuit.num_qubits() .

  • La funzione DAGCircuit.num_cbits() è stata rimossa. Si può invece utilizzare DAGCircuit.num_clbits().

  • I singoli bit quantistici e classici non sono più rappresentati come tuple (register, index) . Ora sono istanze delle classi Qubit e Clbit. Se si ha a che fare con singoli bit, assicurarsi di aggiornare i controlli di utilizzo o di tipo per cercare queste nuove classi invece delle tuple.

  • Le classi di passmanager preimpostate qiskit.transpiler.preset_passmanagers.default_pass_manager e qiskit.transpiler.preset_passmanagers.default_pass_manager_simulator (che erano i precedenti passmanager predefiniti per le chiamate a qiskit.compiler.transpile() ) sono state rimosse. Se si utilizzava manualmente questo pass manager, passare al nuovo default, qiskit.transpile.preset_passmanagers.level1_pass_manager.

  • Il pass LegacySwap è stato rimosso. Se lo si utilizzava in un gestore di pass personalizzato, il suo utilizzo può essere sostituito dal pass StochasticSwap , che è una versione più veloce e stabile. Tutti i passmanager preimpostati sono stati aggiornati per utilizzare StochasticSwap pass al posto di LegacySwap.

  • I seguenti metodi deprecati di qiskit.dagcircuit.DAGCircuit sono stati rimossi:

    • DAGCircuit.get_qubits() - Utilizzare invece DAGCircuit.qubits()

    • DAGCircuit.get_bits() - Utilizzare invece DAGCircuit.clbits()

    • DAGCircuit.qasm() - Utilizzare una combinazione di qiskit.converters.dag_to_circuit() e QuantumCircuit.qasm(). Ad esempio:

      from qiskit.dagcircuit import DAGCircuit
      from qiskit.converters import dag_to_circuit
      my_dag = DAGCircuit()
      qasm = dag_to_circuit(my_dag).qasm()
    • DAGCircuit.get_op_nodes() - Utilizzare invece DAGCircuit.op_nodes() . Si noti che il tipo di ritorno è un elenco di oggetti DAGNode per op_nodes() invece dell'elenco di tuple precedentemente restituito da get_op_nodes().

    • DAGCircuit.get_gate_nodes() - Utilizzare invece DAGCircuit.gate_nodes() . Si noti che il tipo di ritorno è un elenco di oggetti DAGNode per gate_nodes() invece dell'elenco di tuple precedentemente restituito da get_gate_nodes().

    • DAGCircuit.get_named_nodes() - Utilizzare invece DAGCircuit.named_nodes() . Si noti che il tipo di ritorno è una lista di oggetti DAGNode per named_nodes() invece della lista di node_ids precedentemente restituita da get_named_nodes().

    • DAGCircuit.get_2q_nodes() - Utilizzare invece DAGCircuit.twoQ_gates() . Si noti che il tipo di ritorno è un elenco di oggetti DAGNode per twoQ_gates() invece dell'elenco di dati_dicati precedentemente restituito da get_2q_nodes().

    • DAGCircuit.get_3q_or_more_nodes() - Utilizzare invece DAGCircuit.threeQ_or_more_gates() . Si noti che il tipo di ritorno è un elenco di oggetti DAGNode per threeQ_or_more_gates() invece dell'elenco di tuple precedentemente restituito da get_3q_or_more_nodes().

  • I seguenti metodi qiskit.dagcircuit.DAGCircuit avevano un supporto deprecato per l'accettazione di un node_id come parametro. Questo è stato rimosso e ora solo gli oggetti DAGNode sono accettati come input:

    • successors()
    • predecessors()
    • ancestors()
    • descendants()
    • bfs_successors()
    • quantum_successors()
    • remove_op_node()
    • remove_ancestors_of()
    • remove_descendants_of()
    • remove_nonancestors_of()
    • remove_nondescendants_of()
    • substitute_node_with_dag()
  • Il metodo qiskit.dagcircuit.DAGCircuit rename_register() è stato rimosso. Questo era inutilizzato da tutto il codice di qiskit. Se ci si affida ad essa esternamente, si dovrà reimplementare una funzione esterna.

  • La proprietà qiskit.dagcircuit.DAGCircuit multi_graph è stata rimossa. L'accesso diretto all'oggetto sottostante networkx multi_graph non è più supportato. Si deve invece utilizzare l'API fornita dalla classe DAGCircuit .

  • La classe di eccezione deprecata qiskit.qiskiterror.QiskitError è stata rimossa. Si dovrebbe invece utilizzare qiskit.exceptions.QiskitError.

  • I kwarg booleani, ignore_requires e ignore_preserves del costruttore qiskit.transpiler.PassManager sono stati rimossi. Queste non sono più opzioni valide.

  • Il modulo qiskit.tools.logging è stato rimosso. Questo modulo non è stato utilizzato da nessuno e non ha aggiunto nulla alle interfacce che il modulo logging della libreria standard di Python fornisce. Se si vuole impostare un formattatore personalizzato per il logging, utilizzare invece il modulo logging della libreria standard.

  • La classe CompositeGate è stata rimossa. Si dovrebbe invece creare direttamente un oggetto istruzione da un circuito e aggiungerlo al circuito. Ad esempio, è possibile eseguire qualcosa come:

    custom_gate_circ = qiskit.QuantumCircuit(2)
    custom_gate_circ.x(1)
    custom_gate_circ.h(0)
    custom_gate_circ.cx(0, 1)
    custom_gate = custom_gate_circ.to_instruction()
  • I kwarg precedentemente deprecati, seed e config per qiskit.compiler.assemble() , sono stati rimossi e si utilizzano rispettivamente seed_simulator e run_config .

  • I convertitori qiskit.converters.qobj_to_circuits() e qiskit.converters.circuits_to_qobj() , precedentemente deprecati, sono stati rimossi. Utilizzare invece qiskit.assembler.disassemble() e qiskit.compiler.assemble() rispettivamente.

  • Il deprecato kwarg seed_mapper per qiskit.compiler.transpile() è stato rimosso. Si dovrebbe invece utilizzare seed_transpiler

  • I kwarg seed, seed_mapper, config e circuits per la funzione qiskit.execute() , precedentemente deprecati, sono stati rimossi. Utilizzare invece gli argomenti seed_simulator, seed_transpiler, run_config e experiments .

  • Il modulo qiskit.tools.qcvv , in precedenza deprecato, è stato rimosso.

  • Le funzioni qiskit.transpiler.transpile() e qiskit.transpiler.transpile_dag() , precedentemente deprecate, sono state rimosse. Si dovrebbe invece utilizzare qiskit.compiler.transpile. Se si utilizzava transpile_dag() , questo può essere sostituito dalla corsa:

    circ = qiskit.converters.dag_to_circuit(dag)
    out_circ = qiskit.compiler.transpile(circ)
    qiskit.converters.circuit_to_dag(out_circ)
  • La funzione qiskit.compile() , precedentemente deprecata, è stata rimossa e si devono utilizzare qiskit.compiler.transpile() e qiskit.compiler.assemble().

  • La magia della cella di jupyter %%qiskit_progress_bar da qiskit.tools.jupyter è stata cambiata in una magia di linea. Questo è stato fatto per riflettere meglio l'uso e il funzionamento della magia. Se si utilizzava la magia di cella %%qiskit_progress_bar in un blocco note esistente, è necessario aggiornare questa magia di riga cambiandola in %qiskit_progress_bar . Tutto il resto dovrebbe comportarsi in modo identico.

  • La funzione deprecata qiskit.tools.qi.qi.random_unitary_matrix() è stata rimossa. Si dovrebbe invece utilizzare la funzione qiskit.quantum_info.random.random_unitary() .

  • La funzione deprecata qiskit.tools.qi.qi.random_density_matrix() è stata rimossa. Si dovrebbe invece utilizzare la funzione qiskit.quantum_info.random.random_density_matrix() .

  • La funzione deprecata qiskit.tools.qi.qi.purity() è stata rimossa. Si dovrebbe invece utilizzare la funzione qiskit.quantum_info.purity() .

  • Il metodo deprecato QuantumCircuit._attach() è stato rimosso. Dovreste invece utilizzare QuantumCircuit.append() .

  • Il metodo qiskit.qasm.Qasm get_filename() è stato rimosso. È invece possibile utilizzare il metodo return_filename() .

  • Il modulo deprecato qiskit.mapper è stato rimosso. L'elenco delle funzioni e delle classi con le relative alternative è il seguente:

    • qiskit.mapper.CouplingMap: qiskit.transpiler.CouplingMap dovrebbe essere utilizzato al suo posto.
    • qiskit.mapper.Layout: qiskit.transpiler.Layout dovrebbe essere utilizzato al suo posto
    • qiskit.mapper.compiling.euler_angles_1q(): qiskit.quantum_info.synthesis.euler_angles_1q() dovrebbe essere utilizzato al suo posto
    • qiskit.mapper.compiling.two_qubit_kak(): qiskit.quantum_info.synthesis.two_qubit_cnot_decompose() dovrebbe essere utilizzato al suo posto.

    Le classi di eccezione deprecate qiskit.mapper.exceptions.CouplingError e qiskit.mapper.exceptions.LayoutError non hanno un'alternativa, poiché non servono a nulla senza il modulo qiskit.mapper .

  • Il modulo qiskit.pulse.samplers è stato spostato in qiskit.pulse.pulse_lib.samplers. È necessario aggiornare le importazioni di qiskit.pulse.samplers a qiskit.pulse.pulse_lib.samplers.

  • seaborn è ora una dipendenza per la funzione qiskit.visualization.plot_state_qsphere(). È necessario generare mappe di colore angolari adeguate per la visualizzazione. Il target di installazione degli extra qiskit-terra[visualization] è stato aggiornato per installare seaborn>=0.9.0 Se si usano le visualizzazioni e in particolare la funzione plot_state_qsphere() , si può usare quella per installare seaborn o semplicemente eseguire manualmente pip install seaborn>=0.9.0

  • Le funzioni qiksit.visualization.plot_state e qiskit.visualization.iplot_state , precedentemente deprecate, sono state rimosse. Si deve invece utilizzare la funzione specifica per ogni tipo di tracciato. È possibile fare riferimento alle tabelle seguenti per mappare le funzioni deprecate con le nuove funzioni equivalenti:

    Qiskit Terra 0.6
    Qiskit Terra 0.7 +
    stato_tracciato(rho)grafico_stato_città(rho)
    plot_state(rho, method='city')grafico_stato_città(rho)
    plot_state(rho, metodo='paulivec')stato_paulivec(rho)
    plot_state(rho, metodo='qsphere')tracciare lo stato della sferaq(rho)
    plot_state(rho, metodo='bloch')grafico_bloch_multivettore(rho)
    plot_state(rho, metodo='hinton')trama_stato_hinton(rho)
  • Le dipendenze di pylatexenc e pillow per i backend dei cassetti dei circuiti latex e latex_source non sono più elencate come requisiti. Se si intende utilizzare i cassetti del circuito latex, assicurarsi di avere entrambi i pacchetti installati o utilizzare gli extra di setuptools per installarli insieme a qiskit-terra:

    pip install qiskit-terra[visualization]
  • La radice dello spazio dei nomi qiskit ora emette un avviso all'importazione se non è stato possibile impostare qiskit.IBMQ o qiskit.Aer . Ciò si verifica ogni volta che viene importato qualcosa nello spazio dei nomi qiskit . Queste avvertenze sono state aggiunte per chiarire subito agli utenti se stanno eseguendo qiskit e i pacchetti qiskit-aer e qiskit-ibmq-provider non possono essere trovati. Non è sempre chiaro se i pacchetti sono mancanti o se python packaging/pip ha installato un elemento in modo errato, finché non si va a usarli e si ottiene un ImportError vuoto. Questi avvisi dovrebbero chiarire subito se mancano questi alias comunemente usati.

    Tuttavia, per gli utenti che scelgono di non utilizzare né qiskit-aer né qiskit-ibmq-provider, questo potrebbe causare ulteriore rumore. Per questi utenti questi avvisi sono facilmente sopprimibili utilizzando la libreria standard Python warnings. Gli utenti possono sopprimere gli avvisi mettendo queste due righe prima di qualsiasi importazione da qiskit:

    import warnings
    warnings.filterwarnings('ignore', category=RuntimeWarning,
                            module='qiskit')

    In questo modo si sopprimono gli avvertimenti emessi dalla mancata installazione di qiskit-aer o qiskit-ibmq-provider, ma si conservano tutti gli altri avvertimenti emessi da qiskit o da qualsiasi altro pacchetto.

Note di deprecazione

  • Le porte U e CX sono state deprecate. Se si utilizzano queste porte nel codice, è necessario aggiornarle per utilizzare invece u3 e cx . Ad esempio, se si utilizzano le funzioni di gate circuitali circuit.u_base() e circuit.cx_base() , è necessario aggiornarle rispettivamente come circuit.u3() e circuit.cx() .

  • Il gate u0 è stato deprecato in favore dell'uso di più gate iden e sarà rimosso in futuro. Se si utilizza il gate u0 nel proprio circuito, è necessario aggiornare le chiamate per utilizzare iden. Ad esempio, se prima si utilizzava circuit.u0(2) nel circuito, questo deve essere aggiornato:

    circuit.iden()
    circuit.iden()

    invece.

  • La classe qiskit.pulse.DeviceSpecification è ormai deprecata. Si dovrebbe invece utilizzare qiskit.pulse.PulseChannelSpec.

  • L'accesso a una classe qiskit.circuit.Qubit, qiskit.circuit.Clbit o qiskit.circuit.Bit tramite indice è deprecato (per compatibilità con le tuple (register, index) che queste classi hanno sostituito). Si devono invece usare gli attributi register e index .

  • Il passaggio di un bit al metodo qiskit.QuantumCircuit append come tupla (register, index) è deprecato. Si devono invece utilizzare direttamente gli oggetti bit.

  • L'accesso agli elementi di un oggetto qiskit.transpiler.Layout con una tupla (register, index) è deprecato. Si deve invece utilizzare direttamente un oggetto bit.

  • Il metodo del costruttore qiskit.transpiler.Layout qiskit.transpiler.Layout.from_tuplelist() è deprecato. Si deve invece utilizzare il costruttore qiskit.transpiler.Layout.from_qubit_list() .

  • Il modulo qiskit.pulse.ops è stato deprecato. Tutte le funzioni fornite:

    • union
    • flatten
    • shift
    • insert
    • append

    hanno metodi equivalenti disponibili direttamente nelle classi qiskit.pulse.Schedule e qiskit.pulse.Instruction . Si dovrebbero invece utilizzare questi metodi.

  • Il metodo qiskit.qasm.Qasm get_tokens() è deprecato. Si deve invece utilizzare il metodo generate_tokens() .

  • Il metodo qiskit.qasm.qasmparser.QasmParser get_tokens() è deprecato. Si deve invece utilizzare il metodo read_tokens() .

  • Il metodo as_dict() per la classe Qobj è stato deprecato e sarà rimosso in futuro. Dovreste invece sostituire i richiami con to_dict() .

Correzioni di bug

  • La definizione di CU3Gate è stata modificata in modo da essere equivalente alla definizione canonica di U3Gate.

  • La gestione del layout nel gestore dei passaggi è stata standardizzata. Questo risolve diversi problemi segnalati relativi alla gestione del layout. Il parametro kwarg di initial_layout su qiskit.compiler.transpile() e qiskit.execute() ora disporrà i qubit del circuito sui qubit desiderati del dispositivo durante la trasposizione dei circuiti.

  • Il supporto per gli unitari n-qubit è stato aggiunto al simulatore BasicAer e unitary (porte unitarie arbitrarie) è stato aggiunto all'insieme delle porte di base per i simulatori

  • Il sito qiskit.visualization.plost_state_qsphere() è stato aggiornato per risolvere diversi problemi. Ora la visualizzazione di Q Sphere viene generata correttamente e i seguenti aspetti sono stati aggiornati:

    • Tutti gli stati base complementari sono antipodali

    • La fase è indicata dal colore della linea e del marcatore sulla superficie della sfera


    • La probabilità è indicata dalla trasparenza della linea e dal volume del pennarello su

      superficie della sfera

Altre note

  • Il valore predefinito di PassManager per qiskit.compiler.transpile() e qiskit.execute() è stato modificato in gestore di passaggi di ottimizzazione di livello 1 definito in qiskit.transpile.preset_passmanagers.level1_pass_manager.

  • Tutti i backend dei disegnatori di circuiti ora esprimono i parametri delle porte di un circuito come frazioni comuni di pi greco nella visualizzazione di uscita. Se il valore di un parametro può essere espresso come frazione di pi greco, verrà utilizzato al posto dell'equivalente numerico.

  • Quando si usa qiskit.assembler.assemble_schedules() , se non si fornisce il numero di slot di memoria da usare, il numero verrà dedotto in base al numero di acquisizioni nei programmi di input.

  • L'avviso di deprezzamento della proprietà qiskit.dagcircuit.DAGCircuit node_counter è stato rimosso. La modifica del comportamento oggetto dell'avviso è stata messa in atto quando l'avviso è stato aggiunto, quindi avvertire che è cambiato non serve a nulla.

  • Le chiamate a PassManager.run() ora emettono messaggi di log python a livello INFO per ogni esecuzione del passaggio. Questi messaggi includono il nome del passaggio e il tempo totale di esecuzione del passaggio. Python è stato utilizzato perché permette al logging di Qiskit-Terra di integrarsi in modo standard con altre applicazioni e librerie. Tutte le registrazioni per il transpiler avvengono nello spazio dei nomi qiskit.transpiler , utilizzato da logging.getLogger('qiskit.transpiler). Ad esempio, per attivare la registrazione del livello DEBUG per il transpiler si può eseguire:

    import logging
    
    logging.basicConfig()
    logging.getLogger('qiskit.transpiler').setLevel(logging.DEBUG)

    che imposta il livello di log del transpiler a DEBUG e configura i messaggi da stampare su stderr.

Aer 0.3

  • È disponibile un nuovo simulatore di matrice di densità ad alte prestazioni che può essere utilizzato insieme ai nostri modelli di rumore, per simulare meglio gli scenari del mondo reale.
  • Abbiamo aggiunto un simulatore di Stato prodotto matrice (MPS). L'MPS consente una simulazione efficiente di diverse classi di circuiti quantistici, anche in presenza di forti correlazioni e di stati altamente entangled. Per i casi che si prestano a MPS, è possibile simulare esattamente circuiti con diverse centinaia di qubit e oltre, ad esempio per ottenere i valori di aspettativa delle osservabili.
  • Le istantanee possono essere eseguite in tutti i nostri simulatori.
  • Ora possiamo misurare anche circuiti di campionamento con errori di lettura, non solo circuiti ideali.
  • Abbiamo aumentato alcune ottimizzazioni dei circuiti con la presenza di rumore.
  • Sono state incluse migliori approssimazioni dell'errore a 2 qubit.
  • Sono stati inclusi alcuni strumenti per rendere alcune simulazioni rumorose più facili da realizzare e più veloci da simulare.
  • Aumento delle prestazioni con simulazioni che richiedono una minore precisione numerica in virgola mobile.

Ignis 0.2

Nuove funzioni

Correzioni di bug

  • Corretto un bug nell'errore di adattamento di RB
  • Corretto un bug nel fitter di caratterizzazione quando si seleziona un indice di qubit da adattare

Altre note

  • La mitigazione delle misure ora opera in parallelo quando viene applicata a più risultati
  • I valori di ipotesi per i montatori RB sono migliorati

Acqua 0.6

Aggiunto

  • Porte di Toffoli in fase relativa rccx (con 2 controlli) e rcccx (con 3 controlli).

  • Forma variazionale RYCRX

  • Una nuova modalità di 'basic-no-ancilla' a mct.

  • Le porte di rotazione multicontrollate mcrx, mcry e mcrz come porta generale u3 non sono supportate dall'implementazione del codice grigio

  • Chimica: Supporto ROHF a guscio aperto

    • Supportato per tutti i driver: Gaussian16, PyQuante, PySCF e PSI4
    • HartreeFock stato iniziale, forma variazionale UCCSD e riduzione a due qubit per la mappatura della parità ora supportano diversi numeri di particelle alfa e beta per il supporto della shell aperta
  • Chimica: Supporto UHF a guscio aperto

    • Supportato per tutti i driver: Gaussian16, PyQuante, PySCF e PSI4
    • QMolecule esteso per includere integrali, coefficienti ecc. per beta separate
  • Chimica: QMolecule esteso con gli integrali in base agli orbitali atomici per facilitare l'accesso comune a questi per la sperimentazione

    • Supportato per tutti i driver: Gaussian16, PyQuante, PySCF e PSI4
  • Chimica: Configurazione aggiuntiva dei driver PyQuante e PySCF

    • Controllo della tolleranza di convergenza e dell'iterazione massima di convergenza.
    • Per PySCF scelta di ipotesi iniziale
  • Chimica: Aggiunto al log di debug l'output di elaborazione dei calcoli di PyQuante e PySCF (gli output di Gaussian16 e PSI4 erano già stati aggiunti al log di debug)

  • Chimica: Unita qiskit-chimica in qiskit-aqua

  • Aggiungere le classi MatrixOperator, WeightedPauliOperator e TPBGroupedPauliOperator .

  • Aggiungere la funzione evolution_instruction per ottenere un'istruzione senza registro dell'evoluzione temporale.

  • Aggiungere il modulo op_converter per unificare il luogo incaricato di convertire diversi tipi di operatori.

  • Aggiungere la classe Z2Symmetries per incapsulare le informazioni sulle simmetrie di Z2 e avere metodi di aiuto per rastremare un Operatore.

  • Stima dell'ampiezza: aggiunta la postelaborazione della massima verosimiglianza e il calcolo dell'intervallo di confidenza.

  • Stima dell'ampiezza a massima verosimiglianza (MLAE): Implementato un nuovo algoritmo per la stima dell'ampiezza basato sulla stima della massima verosimiglianza, che riduce il numero di qubit necessari e la profondità del circuito.

  • Aggiunta di circuiti di Pauli-rotazione a controllo lineare e polinomiale.

  • Aggiungere q_equation_of_motion per studiare lo stato eccitato di una molecola e aggiungere due algoritmi per preparare lo stato di riferimento.

Modificato

  • Migliorare la modalità mct' 'basic' utilizzando porte Toffoli a fase relativa per costruire risultati intermedi.
  • Adattatevi alla nuova classe di Qiskit Terra Qubit .
  • Impedisce a QPE/IQPE di modificare gli oggetti Operator in ingresso.
  • La dipendenza da PyEDA è stata rimossa; le operazioni logiche sottostanti agli oracoli corrispondenti sono ora gestite da SymPy.
  • Riformulare la classe Operator , ogni rappresentazione ha la sua classe MatrixOperator, WeightedPauliOperator e TPBGroupedPauliOperator.
  • Il sito power in evolution_instruction è stato applicato al theta sul gate CRZ direttamente, la nuova versione ripete i circuiti per implementare la potenza.
  • CircuitCache è disattivato per impostazione predefinita e può essere impostato tramite la variabile d'ambiente ora QISKIT_AQUA_CIRCUIT_CACHE.

Correzioni di bug

  • Un bug per cui TruthTableOracle costruiva circuiti non corretti per tabelle di verità con un solo valore 1 .
  • Un bug causato dall'indeterminismo di PyEDA.
  • Un bug nel calcolo della traslazione e dell'allungamento di QPE/IQPE.
  • Chimica: Mappatura di Bravyi-Kitaev corretta quando il numero di qubit non era una potenza di 2
  • Impostare initial_layout in QuantumInstance tramite un elenco.

Rimosso

  • La porta di rotazione generale multicontrollata mcu3 viene rimossa e sostituita dalle porte di rotazione multicontrollata mcrx, mcry, e mcrz

Obsoleto

  • La classe Operator è deprecata, in favore dell'uso di MatrixOperator, WeightedPauliOperator e TPBGroupedPauliOperator.

IBM Q Fornitore 0.3

Nessuna modifica

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