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()sonoQuantumCircuit,PassManagereSchedule. -
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()cheqiskit.visualization.circuit_drawer()supportano ora l'annotazione dei qubit nella visualizzazione con informazioni sul layout. Se l'oggettoQuantumCircuitche si sta disegnando include metadati di layout (che di solito sono impostati solo sul circuito in uscita dalle chiamate atranspile()), 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 predefinitoTrue), che, se impostatoFalse, disabilita l'annotazione del layout nei circuiti di uscita. -
È stato aggiunto un nuovo passaggio di analisi
CountOpsLongestper recuperare il numero di operazioni sul percorso più lungo del DAGCircuit. Quando viene utilizzato, aggiunge una chiavecount_ops_longest_pathal 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()esech_deriv(), sono state aggiunte al moduloqiskit.pulse.pulse_libdella libreria degli impulsi per creare rispettivamente un oggettoSamplePulsesecante iperbolico non normalizzato e un oggettoSamplePulsederviante secante iperbolico non normalizzato. -
È stata aggiunta una nuova opzione kwarg
vertical_compressional metodoQuantumCircuit.draw()e alla funzioneqiskit.visualization.circuit_drawer(). Questa opzione funziona solo con il backendtext. Questa opzione può essere impostata suhigh,medium(il valore predefinito) olowper regolare la quantità di spazio verticale utilizzato dalla visualizzazione di output. -
È stata aggiunta una nuova opzione kwarg booleana
idle_wiresal metodoQuantumCircuit.draw()e alla funzioneqiskit.visualization.circuit_drawer(). Funziona per tutti i backend dei cassetti. Quandoidle_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 eseguitodag(DAGCircuit): l'uscita dag del passaggiotime(float): il tempo di esecuzione del passaggioproperty_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 classeqiskit.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:
MetodoDescrizioneQuantumCircuit.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_circuital moduloqiskit.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_namesalla funzioneqiskit.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 atranspile(). 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
namesu tcirc_a e tcirc_b sarà rispettivamente'Circuit A'e'Circuit B'. -
È stato aggiunto un nuovo metodo
equiv()alle classiqiskit.quantum_info.Operatoreqiskit.quantum_info.Statevector. Questi metodi vengono utilizzati per verificare se un secondo oggettoOperatoroStatevectorè equivalente fino alla fase globale. -
Il file di configurazione utente presenta diverse nuove opzioni:
- Il campo
circuit_draweraccetta ora un valore automatico. Quando viene impostato come valore per il campocircuit_drawer, il backend del cassetto predefinito sarà mpl, se disponibile, altrimenti verrà utilizzato il backend del testo. - Un nuovo campo
circuit_mpl_stylepuò essere utilizzato per impostare lo stile predefinito utilizzato dal cassetto dei circuiti di matplotlib. I valori validi per questo campo sonobwedefaultper impostare rispettivamente lo stile predefinito in bianco e nero o lo stile di colore predefinito. - Un nuovo campo
transpile_optimization_levelpuò essere usato per impostare il livello di ottimizzazione predefinito del transpiler da usare per le chiamate aqiskit.compiler.transpile(). Il valore può essere impostato a 0, 1, 2 o 3.
- Il campo
-
Introdotto un nuovo comando ad impulsi
Delayche può essere inserito in un impulsoSchedule. Questo comando accetta unduratione può essere aggiunto a qualsiasiChannel. 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.utildovrebbe essere utilizzato al suo posto. -
Il metodo
QuantumCircuit.count_ops()ora restituisce un oggettoOrderedDictinvece di undict. Questo dovrebbe essere compatibile per la maggior parte dei casi d'uso, dato cheOrderedDictè una sottoclasse didict. 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 utilizzareDAGCircuit.num_qubits(). -
La funzione
DAGCircuit.num_cbits()è stata rimossa. Si può invece utilizzareDAGCircuit.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_managereqiskit.transpiler.preset_passmanagers.default_pass_manager_simulator(che erano i precedenti passmanager predefiniti per le chiamate aqiskit.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 passStochasticSwap, che è una versione più veloce e stabile. Tutti i passmanager preimpostati sono stati aggiornati per utilizzareStochasticSwappass al posto diLegacySwap. -
I seguenti metodi deprecati di
qiskit.dagcircuit.DAGCircuitsono stati rimossi:-
DAGCircuit.get_qubits()- Utilizzare inveceDAGCircuit.qubits() -
DAGCircuit.get_bits()- Utilizzare inveceDAGCircuit.clbits() -
DAGCircuit.qasm()- Utilizzare una combinazione diqiskit.converters.dag_to_circuit()eQuantumCircuit.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 inveceDAGCircuit.op_nodes(). Si noti che il tipo di ritorno è un elenco di oggettiDAGNodeperop_nodes()invece dell'elenco di tuple precedentemente restituito daget_op_nodes(). -
DAGCircuit.get_gate_nodes()- Utilizzare inveceDAGCircuit.gate_nodes(). Si noti che il tipo di ritorno è un elenco di oggettiDAGNodepergate_nodes()invece dell'elenco di tuple precedentemente restituito daget_gate_nodes(). -
DAGCircuit.get_named_nodes()- Utilizzare inveceDAGCircuit.named_nodes(). Si noti che il tipo di ritorno è una lista di oggettiDAGNodepernamed_nodes()invece della lista di node_ids precedentemente restituita daget_named_nodes(). -
DAGCircuit.get_2q_nodes()- Utilizzare inveceDAGCircuit.twoQ_gates(). Si noti che il tipo di ritorno è un elenco di oggettiDAGNodepertwoQ_gates()invece dell'elenco di dati_dicati precedentemente restituito daget_2q_nodes(). -
DAGCircuit.get_3q_or_more_nodes()- Utilizzare inveceDAGCircuit.threeQ_or_more_gates(). Si noti che il tipo di ritorno è un elenco di oggettiDAGNodeperthreeQ_or_more_gates()invece dell'elenco di tuple precedentemente restituito daget_3q_or_more_nodes().
-
-
I seguenti metodi
qiskit.dagcircuit.DAGCircuitavevano un supporto deprecato per l'accettazione di unnode_idcome parametro. Questo è stato rimosso e ora solo gli oggettiDAGNodesono 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.DAGCircuitrename_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.DAGCircuitmulti_graphè stata rimossa. L'accesso diretto all'oggetto sottostantenetworkxmulti_graphnon è più supportato. Si deve invece utilizzare l'API fornita dalla classeDAGCircuit. -
La classe di eccezione deprecata
qiskit.qiskiterror.QiskitErrorè stata rimossa. Si dovrebbe invece utilizzareqiskit.exceptions.QiskitError. -
I kwarg booleani,
ignore_requireseignore_preservesdel costruttoreqiskit.transpiler.PassManagersono 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 modulologgingdella libreria standard di Python fornisce. Se si vuole impostare un formattatore personalizzato per il logging, utilizzare invece il modulologgingdella 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,
seedeconfigperqiskit.compiler.assemble(), sono stati rimossi e si utilizzano rispettivamenteseed_simulatorerun_config. -
I convertitori
qiskit.converters.qobj_to_circuits()eqiskit.converters.circuits_to_qobj(), precedentemente deprecati, sono stati rimossi. Utilizzare inveceqiskit.assembler.disassemble()eqiskit.compiler.assemble()rispettivamente. -
Il deprecato kwarg
seed_mapperperqiskit.compiler.transpile()è stato rimosso. Si dovrebbe invece utilizzareseed_transpiler -
I kwarg
seed,seed_mapper,configecircuitsper la funzioneqiskit.execute(), precedentemente deprecati, sono stati rimossi. Utilizzare invece gli argomentiseed_simulator,seed_transpiler,run_configeexperiments. -
Il modulo
qiskit.tools.qcvv, in precedenza deprecato, è stato rimosso. -
Le funzioni
qiskit.transpiler.transpile()eqiskit.transpiler.transpile_dag(), precedentemente deprecate, sono state rimosse. Si dovrebbe invece utilizzareqiskit.compiler.transpile. Se si utilizzavatranspile_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 utilizzareqiskit.compiler.transpile()eqiskit.compiler.assemble(). -
La magia della cella di jupyter
%%qiskit_progress_bardaqiskit.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_barin 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 funzioneqiskit.quantum_info.random.random_unitary(). -
La funzione deprecata
qiskit.tools.qi.qi.random_density_matrix()è stata rimossa. Si dovrebbe invece utilizzare la funzioneqiskit.quantum_info.random.random_density_matrix(). -
La funzione deprecata
qiskit.tools.qi.qi.purity()è stata rimossa. Si dovrebbe invece utilizzare la funzioneqiskit.quantum_info.purity(). -
Il metodo deprecato
QuantumCircuit._attach()è stato rimosso. Dovreste invece utilizzareQuantumCircuit.append(). -
Il metodo
qiskit.qasm.Qasmget_filename()è stato rimosso. È invece possibile utilizzare il metodoreturn_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.CouplingMapdovrebbe essere utilizzato al suo posto.qiskit.mapper.Layout:qiskit.transpiler.Layoutdovrebbe essere utilizzato al suo postoqiskit.mapper.compiling.euler_angles_1q():qiskit.quantum_info.synthesis.euler_angles_1q()dovrebbe essere utilizzato al suo postoqiskit.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.CouplingErroreqiskit.mapper.exceptions.LayoutErrornon hanno un'alternativa, poiché non servono a nulla senza il moduloqiskit.mapper. -
Il modulo
qiskit.pulse.samplersè stato spostato inqiskit.pulse.pulse_lib.samplers. È necessario aggiornare le importazioni diqiskit.pulse.samplersaqiskit.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 extraqiskit-terra[visualization]è stato aggiornato per installareseaborn>=0.9.0Se si usano le visualizzazioni e in particolare la funzioneplot_state_qsphere(), si può usare quella per installareseaborno semplicemente eseguire manualmentepip install seaborn>=0.9.0 -
Le funzioni
qiksit.visualization.plot_stateeqiskit.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.6Qiskit 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
pylatexencepillowper i backend dei cassetti dei circuitilatexelatex_sourcenon 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
qiskitora emette un avviso all'importazione se non è stato possibile impostareqiskit.IBMQoqiskit.Aer. Ciò si verifica ogni volta che viene importato qualcosa nello spazio dei nomiqiskit. 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 unImportErrorvuoto. 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
UeCXsono state deprecate. Se si utilizzano queste porte nel codice, è necessario aggiornarle per utilizzare inveceu3ecx. Ad esempio, se si utilizzano le funzioni di gate circuitalicircuit.u_base()ecircuit.cx_base(), è necessario aggiornarle rispettivamente comecircuit.u3()ecircuit.cx(). -
Il gate
u0è stato deprecato in favore dell'uso di più gateidene sarà rimosso in futuro. Se si utilizza il gateu0nel proprio circuito, è necessario aggiornare le chiamate per utilizzareiden. Ad esempio, se prima si utilizzavacircuit.u0(2)nel circuito, questo deve essere aggiornato:circuit.iden() circuit.iden()invece.
-
La classe
qiskit.pulse.DeviceSpecificationè ormai deprecata. Si dovrebbe invece utilizzareqiskit.pulse.PulseChannelSpec. -
L'accesso a una classe
qiskit.circuit.Qubit,qiskit.circuit.Clbitoqiskit.circuit.Bittramite indice è deprecato (per compatibilità con le tuple(register, index)che queste classi hanno sostituito). Si devono invece usare gli attributiregistereindex. -
Il passaggio di un bit al metodo
qiskit.QuantumCircuitappendcome tupla(register, index)è deprecato. Si devono invece utilizzare direttamente gli oggetti bit. -
L'accesso agli elementi di un oggetto
qiskit.transpiler.Layoutcon una tupla(register, index)è deprecato. Si deve invece utilizzare direttamente un oggetto bit. -
Il metodo del costruttore
qiskit.transpiler.Layoutqiskit.transpiler.Layout.from_tuplelist()è deprecato. Si deve invece utilizzare il costruttoreqiskit.transpiler.Layout.from_qubit_list(). -
Il modulo
qiskit.pulse.opsè stato deprecato. Tutte le funzioni fornite:unionflattenshiftinsertappend
hanno metodi equivalenti disponibili direttamente nelle classi
qiskit.pulse.Scheduleeqiskit.pulse.Instruction. Si dovrebbero invece utilizzare questi metodi. -
Il metodo
qiskit.qasm.Qasmget_tokens()è deprecato. Si deve invece utilizzare il metodogenerate_tokens(). -
Il metodo
qiskit.qasm.qasmparser.QasmParserget_tokens()è deprecato. Si deve invece utilizzare il metodoread_tokens(). -
Il metodo
as_dict()per la classe Qobj è stato deprecato e sarà rimosso in futuro. Dovreste invece sostituire i richiami conto_dict().
Correzioni di bug
-
La definizione di
CU3Gateè stata modificata in modo da essere equivalente alla definizione canonica diU3Gate. -
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_layoutsuqiskit.compiler.transpile()eqiskit.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:
Altre note
-
Il valore predefinito di PassManager per
qiskit.compiler.transpile()eqiskit.execute()è stato modificato in gestore di passaggi di ottimizzazione di livello 1 definito inqiskit.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.DAGCircuitnode_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 nomiqiskit.transpiler, utilizzato dalogging.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
- Modulo di registrazione
- Purezza RB
- RB interfogliato
- Codice di ripetizione per la verifica
- I valori dei semi possono ora essere aggiunti arbitrariamente a RB (non solo in ordine)
- Supporto per l'aggiunta di più risultati all'attenuazione della misura
- Gli installatori RB ora supportano la fornitura di valori indicativi
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) ercccx(con 3 controlli). -
Forma variazionale
RYCRX -
Una nuova modalità di
'basic-no-ancilla'amct. -
Le porte di rotazione multicontrollate
mcrx,mcryemcrzcome porta generaleu3non 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,WeightedPauliOperatoreTPBGroupedPauliOperator. -
Aggiungere la funzione
evolution_instructionper ottenere un'istruzione senza registro dell'evoluzione temporale. -
Aggiungere il modulo
op_converterper unificare il luogo incaricato di convertire diversi tipi di operatori. -
Aggiungere la classe
Z2Symmetriesper 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_motionper 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/IQPEdi modificare gli oggettiOperatorin 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 classeMatrixOperator,WeightedPauliOperatoreTPBGroupedPauliOperator. - Il sito
powerinevolution_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
TruthTableOraclecostruiva circuiti non corretti per tabelle di verità con un solo valore1. - 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_layoutinQuantumInstancetramite un elenco.
Rimosso
- La porta di rotazione generale multicontrollata
mcu3viene rimossa e sostituita dalle porte di rotazione multicontrollatamcrx,mcry, emcrz
Obsoleto
- La classe
Operatorè deprecata, in favore dell'uso diMatrixOperator,WeightedPauliOperatoreTPBGroupedPauliOperator.
IBM Q Fornitore 0.3
Nessuna modifica