Notas de la versión de Qiskit 0.12
0.12.0
Terra 0.9
Preludio
La versión 0.9 incluye muchas novedades y correcciones de errores. Los cambios más importantes de esta versión son las nuevas funciones de depuración de PassManagers. Esto incluye una función para visualizar un PassManager, la posibilidad de añadir una función de devolución de llamada a un PassManager, y el registro de los pases ejecutados en el PassManager. Además, esta versión estandariza la forma en que puede establecer un diseño inicial para su circuito. Así que ahora puedes aprovechar initial_layout el parámetro kwarg en qiskit.compiler.transpile() y qiskit.execute() y los qubits en el circuito se colocarán en los qubits deseados en el dispositivo. La visualización de circuitos ahora también mostrará esto claramente al visualizar un circuito que ha sido transpilado con un diseño.
Nuevas funciones
-
Un objeto
DAGCircuit(es decir, la representación gráfica de un QuantumCircuit en la que las dependencias de las operaciones son explícitas) puede visualizarse ahora con el método.draw(). Esto responde a la filosofía de Qiskit de facilitar la visualización. Otros objetos que admiten el método.draw()sonQuantumCircuit,PassManagerySchedule. -
Añadida una nueva función de visualización
qiskit.visualization.plot_error_map()para trazar el mapa de errores de un backend determinado. Toma un objeto backend del qiskit-ibmq-provider y trazará el mapa de errores actual para ese dispositivo. -
Tanto
qiskit.QuantumCircuit.draw()comoqiskit.visualization.circuit_drawer()soportan ahora la anotación de los qubits en la visualización con información de disposición. Si el objetoQuantumCircuitque se está dibujando incluye metadatos de diseño (que normalmente sólo se establecen en la salida del circuito de las llamadas atranspile()), entonces por defecto se mostrará ese diseño en el diagrama. Esto se hace para todos los backends de cajones de circuitos. Por ejemplo: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')producirá un diagrama como:
┌──────────┐┌──────────┐┌───┐┌──────────┐┌──────────────────┐┌─┐ (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 ═════════════════════════════════════════════════════════════════╩═Si no desea que se muestre el trazado en los circuitos transpilados (o en cualquier otro circuito con un trazado establecido) existe un nuevo kwarg booleano para ambas funciones,
with_layout(que por defecto esTrue), que cuando se estableceFalsedesactivará la anotación del trazado en los circuitos de salida. -
Se ha añadido un nuevo pase de análisis
CountOpsLongestpara recuperar el número de operaciones en el camino más largo del DAGCircuit. Cuando se utilice, añadirá una clavecount_ops_longest_pathal diccionario de conjuntos de propiedades. Puedes añadirlo a tu a passmanager con algo como:from qiskit.transpiler.passes import CountOpsLongestPath from qiskit.transpiler.passes import CxCancellation from qiskit.transpiler import PassManager pm = PassManager() pm.append(CountOpsLongestPath())y luego acceder a la ruta más larga a través del valor del conjunto de propiedades con algo como:
pm.append( CxCancellation(), condition=lambda property_set: property_set[ 'count_ops_longest_path'] < 5)que establecerá una condición en esa pasada basada en el camino más largo.
-
Se han añadido dos nuevas funciones,
sech()ysech_deriv()al móduloqiskit.pulse.pulse_libde la biblioteca de impulsos para crear un objetoSamplePulsesecante hiperbólica no normalizada y un objetoSamplePulsederviativo secante hiperbólica no normalizada respectivamente. -
Se ha añadido una nueva opción kwarg
vertical_compressional métodoQuantumCircuit.draw()y a la funciónqiskit.visualization.circuit_drawer(). Esta opción sólo funciona con el backendtext. Esta opción puede establecerse enhigh,medium(por defecto) olowpara ajustar la cantidad de espacio vertical utilizado por la visualización de salida. -
Se ha añadido una nueva opción booleana kwarg
idle_wiresal métodoQuantumCircuit.draw()y a la funciónqiskit.visualization.circuit_drawer(). Funciona para todos los backends de cajones. Cuandoidle_wiresestá en False en una llamada de cajón, el cajón no dibujará ningún bit que no tenga ningún elemento de circuito en la visualización del circuito cuántico de salida. -
Se ha añadido una nueva función de visualización PassManager
qiskit.visualization.pass_mamanger_drawer(). Esta función toma un objeto PassManager y generará un diagrama de control de flujo de todos los pases ejecutados en PassManager. -
Al crear un PassManager ahora puede especificar una función de devolución de llamada que, si se especifica, se ejecutará después de que se ejecute cada pasada. A esta función se le pasa un conjunto de kwargs en cada llamada con el estado del gestor de pases después de cada ejecución del pase. Actualmente estos kwargs son:
pass_(Pass): el pase que se ejecutadag(DAGCircuit): la salida dag del pasetime(float): el tiempo para ejecutar el paseproperty_set(PropertySet): el conjunto de propiedadescount(int): el índice para la ejecución del pase
Sin embargo, hay que tener en cuenta que aunque estos argumentos están definidos para la versión 0.9, exponen los aspectos internos del gestor de pases y están sujetos a cambios en futuras versiones.
Por ejemplo, puede utilizar esto para crear una función de devolución de llamada que visualizará la salida del circuito después de que se ejecute cada pasada:
from qiskit.transpiler import PassManager def my_callback(**kwargs): print(kwargs['dag']) pm = PassManager(callback=my_callback)Además, puede especificar la función de devolución de llamada cuando utilice
qiskit.compiler.transpile():from qiskit.compiler import transpile def my_callback(**kwargs): print(kwargs['pass']) transpile(circ, callback=my_callback) -
Se ha añadido un nuevo método
filter()a la claseqiskit.pulse.Schedule. Permite filtrar las instrucciones de una programación. Por ejemplo, filtrar por tipo de instrucción: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]) -
Métodos de descomposición adicionales para varios tipos de compuertas. Estos métodos utilizarán diferentes técnicas de descomposición para descomponer una puerta en una secuencia de CNOTs y puertas de qubit único. Se añaden los métodos siguientes:
MétodoDescripciónQuantumCircuit.iso()Añade una isometría arbitraria de m a n qubits a un circuito. Esto permite acoplar unitarios arbitrarios en n qubits (m=n) o preparar cualquier estado de n qubits ( m=0 ) QuantumCircuit.diag_gate()Añade una puerta diagonal al circuito QuantumCircuit.squ()Descomponga un unitario arbitrario 2x2 en tres puertas de rotación y añádalo a un circuito QuantumCircuit.ucg()Conectar una puerta controlada uniformemente (también llamada puerta multiplexada) a un circuito QuantumCircuit.ucx()Conectar una puerta de rotación Rx uniformemente controlada (también llamada multiplexada) a un circuito QuantumCircuit.ucy()Conectar una puerta de rotación Ry uniformemente controlada (también llamada multiplexada) a un circuito QuantumCircuit.ucz()Conecte una puerta de rotación Rz uniformemente controlada (también llamada multiplexada) a un circuito -
Adición de los algoritmos Gray-Synth y Patel-Markov-Hayes para la síntesis de circuitos lineales CNOT-Phase y CNOT-only. Estas funciones permiten sintetizar circuitos que constan únicamente de puertas CNOT dada una función lineal o un circuito que consta únicamente de puertas CNOT y de fase dada una descripción matricial.
-
Se ha añadido una nueva función
random_circuital móduloqiskit.circuit.random. Esta función generará un circuito aleatorio de un tamaño especificado seleccionando aleatoriamente diferentes puertas y añadiéndolas al circuito. Por ejemplo, puedes utilizarlo para generar un circuito de 5 qubits con una profundidad de 10 utilizando:from qiskit.circuit.random import random_circuit circ = random_circuit(5, 10) -
Se ha añadido un nuevo kwarg
output_namesa la funciónqiskit.compiler.transpile(). Este kwarg toma una cadena o una lista de cadenas y las utiliza como valor del nombre del circuito para los circuitos de salida que devuelve la llamada atranspile(). Por ejemplo:from qiskit.compiler import transpile my_circs = [circ_a, circ_b] tcirc_a, tcirc_b = transpile(my_circs, output_names=['Circuit A', 'Circuit B'])el atributo
nameen tcirc_a y tcirc_b será'Circuit A'y'Circuit B'respectivamente. -
Se ha añadido un nuevo método
equiv()a las clasesqiskit.quantum_info.Operatoryqiskit.quantum_info.Statevector. Estos métodos se utilizan para comprobar si un segundo objetoOperatoroStatevectores equivalente hasta la fase global. -
El archivo de configuración del usuario tiene varias opciones nuevas:
- El campo
circuit_draweracepta ahora un valor automático. Cuando se establece como valor para el campocircuit_drawerel backend por defecto del cajón será mpl si está disponible, en caso contrario se utilizará el backend de texto. - Se puede utilizar un nuevo campo
circuit_mpl_stylepara establecer el estilo por defecto utilizado por el cajón de circuitos de matplotlib. Los valores válidos para este campo sonbwydefaultpara establecer por defecto un estilo en blanco y negro o el estilo de color por defecto respectivamente. - Se puede utilizar un nuevo campo
transpile_optimization_levelpara establecer el nivel de optimización del transpilador por defecto que se utilizará para las llamadas aqiskit.compiler.transpile(). El valor puede ser 0, 1, 2 ó 3.
- El campo
-
Introducido un nuevo comando de pulso
Delayque puede ser insertado en un pulsoSchedule. Este comando acepta undurationy puede añadirse a cualquierChannel. No se pueden programar otros comandos en un canal durante un retardo.El retardo puede añadirse como cualquier otra orden de impulso. Por ejemplo:
from qiskit import pulse drive_channel = pulse.DriveChannel(0) delay = pulse.Delay(20) sched = pulse.Schedule() sched += delay(drive_channel)
Notas de actualización
-
Se ha eliminado el módulo
qiskit._util, anteriormente obsoleto.qiskit.utilen su lugar. -
El método
QuantumCircuit.count_ops()devuelve ahora un objetoOrderedDicten lugar dedict. Esto debería ser compatible para la mayoría de los casos de uso, ya queOrderedDictes una subclase dedict. Sin embargo, puede que sea necesario actualizar las comprobaciones de tipo y otras comprobaciones de clase. -
El método
DAGCircuit.width()devuelve ahora el número total de bits cuánticos y bits clásicos. Antes sólo devolvía el número de bits cuánticos. Si sólo necesita el número de bits cuánticos, puede utilizarDAGCircuit.num_qubits(). -
Se ha eliminado la función
DAGCircuit.num_cbits(). En su lugar, puede utilizarDAGCircuit.num_clbits(). -
Los bits cuánticos individuales y los bits clásicos ya no se representan como tuplas
(register, index). Ahora son instancias de las clases Qubit y Clbit. Si estás tratando con bits individuales asegúrate de actualizar cualquier comprobación de uso o tipo para buscar estas nuevas clases en lugar de tuplas. -
Se han eliminado las clases de gestores de pases preestablecidos
qiskit.transpiler.preset_passmanagers.default_pass_manageryqiskit.transpiler.preset_passmanagers.default_pass_manager_simulator(que eran los gestores de pases predeterminados anteriores para las llamadas aqiskit.compiler.transpile()). Si utilizaba manualmente estos gestores de pases, cambie al nuevo valor predeterminado,qiskit.transpile.preset_passmanagers.level1_pass_manager. -
Se ha eliminado el pase
LegacySwap. Si lo estaba utilizando en un gestor de pases personalizado, su uso puede sustituirse por el paseStochasticSwap, que es una versión más rápida y estable. Todos los gestores de pases preestablecidos se han actualizado para utilizarStochasticSwappass en lugar deLegacySwap. -
Se han eliminado los siguientes métodos obsoletos de
qiskit.dagcircuit.DAGCircuit:-
DAGCircuit.get_qubits()- UtiliceDAGCircuit.qubits()en su lugar -
DAGCircuit.get_bits()- UtiliceDAGCircuit.clbits()en su lugar -
DAGCircuit.qasm()- Utilice una combinación deqiskit.converters.dag_to_circuit()yQuantumCircuit.qasm(). Por ejemplo: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()- UtiliceDAGCircuit.op_nodes()en su lugar. Observe que el tipo de retorno es una lista de objetosDAGNodeparaop_nodes()en lugar de la lista de tuplas devuelta anteriormente porget_op_nodes(). -
DAGCircuit.get_gate_nodes()- UtiliceDAGCircuit.gate_nodes()en su lugar. Observe que el tipo de retorno es una lista de objetosDAGNodeparagate_nodes()en lugar de la lista de tuplas devuelta anteriormente porget_gate_nodes(). -
DAGCircuit.get_named_nodes()- UtiliceDAGCircuit.named_nodes()en su lugar. Observe que el tipo de retorno es una lista de objetosDAGNodeparanamed_nodes()en lugar de la lista de node_ids devuelta anteriormente porget_named_nodes(). -
DAGCircuit.get_2q_nodes()- UtiliceDAGCircuit.twoQ_gates()en su lugar. Observe que el tipo de retorno es una lista de objetosDAGNodeparatwoQ_gates()en lugar de la lista de data_dicts devuelta anteriormente porget_2q_nodes(). -
DAGCircuit.get_3q_or_more_nodes()- UtiliceDAGCircuit.threeQ_or_more_gates()en su lugar. Observe que el tipo de retorno es una lista de objetosDAGNodeparathreeQ_or_more_gates()en lugar de la lista de tuplas devuelta anteriormente porget_3q_or_more_nodes().
-
-
Los siguientes métodos de
qiskit.dagcircuit.DAGCircuittenían soporte obsoleto para aceptar unnode_idcomo parámetro. Esto se ha eliminado y ahora sólo se aceptan como entrada objetos deDAGNode: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()
-
Se ha eliminado el método
qiskit.dagcircuit.DAGCircuitrename_register(). Esto no fue utilizado por todo el código qiskit. Si dependías de ella externamente tendrás que reimplementarla es una función externa. -
Se ha eliminado la propiedad
qiskit.dagcircuit.DAGCircuitmulti_graph. Ya no es posible acceder directamente al objeto subyacentenetworkxmulti_graph. En su lugar, debe utilizarse la API proporcionada por la claseDAGCircuit. -
Se ha eliminado la clase de excepción obsoleta
qiskit.qiskiterror.QiskitError. En su lugar, debe utilizarqiskit.exceptions.QiskitError. -
Se han eliminado los kwargs booleanos,
ignore_requiresyignore_preservesdel constructorqiskit.transpiler.PassManager. Estas opciones ya no son válidas. -
Se ha retirado el módulo
qiskit.tools.logging. Este módulo no era utilizado por nada y no añadía nada sobre las interfaces que proporciona el módulologgingde la biblioteca estándar de Python. Si desea establecer un formateador personalizado para el registro, utilice el módulologgingde la biblioteca estándar. -
Se ha eliminado la clase
CompositeGate. En su lugar, debes crear directamente un objeto de instrucción a partir de un circuito y añadirlo a tu circuito. Por ejemplo, puedes ejecutar algo comocustom_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() -
Los kwargs anteriormente obsoletos,
seedyconfigparaqiskit.compiler.assemble()han sido eliminados, en su lugar utiliceseed_simulatoryrun_configrespectivamente. -
Se han eliminado los convertidores anteriormente obsoletos
qiskit.converters.qobj_to_circuits()yqiskit.converters.circuits_to_qobj(). Utilice en su lugarqiskit.assembler.disassemble()yqiskit.compiler.assemble()respectivamente. -
El anteriormente obsoleto kwarg
seed_mapperparaqiskit.compiler.transpile()ha sido eliminado. En su lugar, debe utilizarseed_transpiler -
Se han eliminado los kwargs anteriormente obsoletos
seed,seed_mapper,config, ycircuitspara la funciónqiskit.execute(). Utilice en su lugar los argumentosseed_simulator,seed_transpiler,run_config, yexperimentsrespectivamente. -
El módulo
qiskit.tools.qcvv, anteriormente obsoleto, ha sido eliminado. Utiliza qiskit-ignis en su lugar. -
Las funciones anteriormente obsoletas
qiskit.transpiler.transpile()yqiskit.transpiler.transpile_dag()han sido eliminadas. En su lugar, debe utilizarqiskit.compiler.transpile. Si utilizabatranspile_dag(), puede sustituirlo por correr:circ = qiskit.converters.dag_to_circuit(dag) out_circ = qiskit.compiler.transpile(circ) qiskit.converters.circuit_to_dag(out_circ) -
La función anteriormente obsoleta
qiskit.compile()ha sido eliminada, en su lugar debe utilizarqiskit.compiler.transpile()yqiskit.compiler.assemble(). -
La magia de celda jupyter
%%qiskit_progress_bardeqiskit.tools.jupyterse ha cambiado por una magia de línea. Esto se hizo para reflejar mejor cómo se utiliza la magia y cómo funciona. Si estaba utilizando la magia de celda%%qiskit_progress_baren un cuaderno existente, tendrá que actualizarla para que sea una magia de línea cambiándola por%qiskit_progress_baren su lugar. Todo lo demás debería comportarse de forma idéntica. -
Se ha eliminado la función obsoleta
qiskit.tools.qi.qi.random_unitary_matrix(). En su lugar, debe utilizar la funciónqiskit.quantum_info.random.random_unitary(). -
Se ha eliminado la función obsoleta
qiskit.tools.qi.qi.random_density_matrix(). En su lugar, debe utilizar la funciónqiskit.quantum_info.random.random_density_matrix(). -
Se ha eliminado la función obsoleta
qiskit.tools.qi.qi.purity(). En su lugar, debería utilizar la funciónqiskit.quantum_info.purity(). -
Se ha eliminado el método obsoleto
QuantumCircuit._attach(). Debería utilizarQuantumCircuit.append()en su lugar. -
Se ha eliminado el método
qiskit.qasm.Qasmget_filename(). En su lugar, puede utilizar el métodoreturn_filename(). -
Se ha eliminado el módulo obsoleto
qiskit.mapper. La lista de funciones y clases con sus alternativas son:qiskit.mapper.CouplingMapqiskit.transpiler.CouplingMap.qiskit.mapper.Layout:qiskit.transpiler.Layoutdebe utilizarse en su lugarqiskit.mapper.compiling.euler_angles_1q():qiskit.quantum_info.synthesis.euler_angles_1q()debe utilizarse en su lugarqiskit.mapper.compiling.two_qubit_kak()qiskit.quantum_info.synthesis.two_qubit_cnot_decompose().
Las clases de excepción obsoletas
qiskit.mapper.exceptions.CouplingErroryqiskit.mapper.exceptions.LayoutErrorno tienen alternativa, ya que no sirven para nada sin el móduloqiskit.mapper. -
El módulo
qiskit.pulse.samplersse ha trasladado aqiskit.pulse.pulse_lib.samplers. Deberá actualizar las importaciones deqiskit.pulse.samplersaqiskit.pulse.pulse_lib.samplers. -
seaborn es ahora una dependencia de la función
qiskit.visualization.plot_state_qsphere(). Es necesario para generar mapas de color angulares adecuados para la visualización. El objetivo de instalación de extrasqiskit-terra[visualization]se ha actualizado para instalarseaborn>=0.9.0. Si utiliza visualizaciones y, en concreto, la funciónplot_state_qsphere(), puede utilizarla para instalarseaborno simplemente ejecutar manualmentepip install seaborn>=0.9.0 -
Las funciones anteriormente obsoletas
qiksit.visualization.plot_stateyqiskit.visualization.iplot_statehan sido eliminadas. En su lugar, debe utilizar la función específica para cada tipo de parcela. Puede consultar las tablas siguientes para asignar las funciones obsoletas a sus equivalentes nuevas:Qiskit Terra 0.6Qiskit Terra 0.7 +plot_state(rho) plot_state_city(rho) plot_state(rho, method='ciudad') plot_state_city(rho) plot_state(rho, method='paulivec') plot_state_paulivec(rho) plot_state(rho, method='qsphere') plot_state_qsphere(rho) plot_state(rho, method='bloch') plot_bloch_multivector(rho) plot_state(rho, method='hinton') plot_state\hinton(rho) -
Las dependencias de
pylatexencypillowpara los backends de cajones de circuitoslatexylatex_sourceya no figuran como requisitos. Si vas a utilizar los cajones del circuito latex asegúrate de tener instalados ambos paquetes o utiliza los extras setuptools para instalarlo junto con qiskit-terra:pip install qiskit-terra[visualization] -
La raíz del espacio de nombres
qiskitemitirá ahora una advertencia en la importación si no se ha podido configurarqiskit.IBMQoqiskit.Aer. Esto ocurrirá siempre que se importe cualquier cosa del espacio de nombresqiskit. Estas advertencias se añadieron para dejar claro a los usuarios por adelantado si están ejecutando qiskit y los paquetes qiskit-aer y qiskit-ibmq-provider no se pudieron encontrar. No siempre está claro si faltan paquetes o si python packaging/pip instaló un elemento incorrectamente hasta que vas a utilizarlos y obtienes unImportErrorvacío. Estas advertencias deberían dejar claro desde el principio si faltan estos alias de uso común.Sin embargo, para los usuarios que decidan no utilizar ni qiskit-aer ni qiskit-ibmq-provider, esto podría causar ruido adicional. Para estos usuarios, estas advertencias pueden suprimirse fácilmente utilizando la biblioteca estándar de Python
warnings. Los usuarios pueden suprimir las advertencias poniendo estas dos líneas antes de cualquier importación desde qiskit:import warnings warnings.filterwarnings('ignore', category=RuntimeWarning, module='qiskit')Esto suprimirá las advertencias emitidas por no tener qiskit-aer o qiskit-ibmq-provider instalados, pero conservará cualquier otra advertencia emitida por qiskit o cualquier otro paquete.
Notas sobre características en desuso
-
Las puertas
UyCXhan quedado obsoletas. Si estás usando estas puertas en tu código, deberías actualizarlas para usaru3ycxen su lugar. Por ejemplo, si utiliza las funciones de puerta de circuitocircuit.u_base()ycircuit.cx_base(), deberá actualizarlas acircuit.u3()ycircuit.cx()respectivamente. -
La puerta
u0ha quedado obsoleta en favor del uso de múltiples puertasideny será eliminada en el futuro. Si está utilizando la puertau0en su circuito debe actualizar sus llamadas para utilizariden. Por ejemplo, si antes utilizabascircuit.u0(2)en tu circuito, deberás actualizarlo:circuit.iden() circuit.iden()en su lugar.
-
La clase
qiskit.pulse.DeviceSpecificationha quedado obsoleta. En su lugar, debe utilizarqiskit.pulse.PulseChannelSpec. -
El acceso a una clase
qiskit.circuit.Qubit,qiskit.circuit.Clbit, oqiskit.circuit.Bitpor índice está obsoleto (por compatibilidad con las tuplas(register, index)que estas clases sustituyeron). En su lugar, debe utilizar los atributosregisteryindex. -
Pasar un bit al método
qiskit.QuantumCircuitappendcomo una tupla(register, index)está obsoleto. En su lugar, deben utilizarse directamente objetos de bits. -
El acceso a los elementos de un objeto
qiskit.transpiler.Layoutcon una tupla(register, index)está obsoleto. En su lugar debe utilizarse directamente un objeto bit. -
El método constructor
qiskit.transpiler.Layoutqiskit.transpiler.Layout.from_tuplelist()está obsoleto. En su lugar debe utilizarse el constructorqiskit.transpiler.Layout.from_qubit_list(). -
El módulo
qiskit.pulse.opsha quedado obsoleto. Todas las funciones que ofrecía:unionflattenshiftinsertappend
tienen métodos equivalentes disponibles directamente en las clases
qiskit.pulse.Scheduleyqiskit.pulse.Instruction. Esos métodos deben utilizarse en su lugar. -
El método
qiskit.qasm.Qasmget_tokens()está obsoleto. En su lugar, debe utilizar el métodogenerate_tokens(). -
El método
qiskit.qasm.qasmparser.QasmParserget_tokens()está obsoleto. En su lugar, debe utilizar el métodoread_tokens(). -
El método
as_dict()para la clase Qobj ha sido obsoleto y será eliminado en el futuro. En su lugar, debería sustituir las llamadas a la misma porto_dict().
Corrección de errores
-
Se ha modificado la definición de
CU3Gatepara que sea equivalente a la definición canónica de unU3Gatecontrolado. -
Se ha normalizado el tratamiento de la presentación en el gestor de pases. Esto corrige varios problemas reportados con el manejo de la disposición. El parámetro
initial_layoutkwarg enqiskit.compiler.transpile()yqiskit.execute()ahora colocará tus qubits del circuito en los qubits deseados en el dispositivo al transpilar circuitos. -
Se ha añadido soporte para n-qubit unitarios al simulador BasicAer y
unitary(puertas unitarias arbitrarias) al conjunto de puertas base para los simuladores -
La página
qiskit.visualization.plost_state_qsphere()se ha actualizado para solucionar varios problemas. Ahora la visualización de la Esfera Q de salida se generará correctamente y se han actualizado los siguientes aspectos:
Otras notas
-
La dirección PassManager por defecto para
qiskit.compiler.transpile()yqiskit.execute()se ha cambiado por el gestor de pases de nivel de optimización 1 definido enqiskit.transpile.preset_passmanagers.level1_pass_manager. -
Todos los backends del dibujante de circuitos expresarán ahora los parámetros de puerta en un circuito como fracciones comunes de pi en la visualización de salida. Si el valor de un parámetro puede expresarse como una fracción de pi, se utilizará en lugar de su equivalente numérico.
-
Cuando se utiliza
qiskit.assembler.assemble_schedules()si usted no proporciona el número de memory_slots a utilizar el número será inferido basado en el número de adquisiciones en los horarios de entrada. -
Se ha eliminado el aviso de obsoleto de la propiedad
qiskit.dagcircuit.DAGCircuitnode_counter. El cambio de comportamiento sobre el que se advierte entró en vigor cuando se añadió la advertencia, por lo que avisar de que había cambiado no servía de nada. -
Las llamadas a
PassManager.run()ahora emitirán mensajes de registro de python en el nivel INFO para cada ejecución de pase. Estos mensajes incluirán el nombre del pase y el tiempo total de ejecución del mismo. Python porque permite que el registro de Qiskit-Terra se integre de forma estándar con otras aplicaciones y bibliotecas. Todos los registros del transpilador se producen en el espacio de nombresqiskit.transpiler, tal como se utiliza enlogging.getLogger('qiskit.transpiler). Por ejemplo, para activar el registro de nivel DEBUG para el transpilador puede ejecutar:import logging logging.basicConfig() logging.getLogger('qiskit.transpiler').setLevel(logging.DEBUG)que establecerá el nivel de registro del transpilador en DEBUG y configurará esos mensajes para que se impriman en stderr.
Aer 0.3
- Existe un nuevo Simulador de Matriz de Densidad de alto rendimiento que puede utilizarse junto con nuestros modelos de ruido, para simular mejor los escenarios del mundo real.
- Hemos añadido un simulador Matrix Product State (MPS). MPS permite la simulación eficiente de varias clases de circuitos cuánticos, incluso en presencia de fuertes correlaciones y estados altamente enredados. En los casos susceptibles de MPS, pueden simularse exactamente circuitos con varios cientos de qubits o más, por ejemplo, para obtener valores de expectativas de observables.
- Las instantáneas pueden realizarse en todos nuestros simuladores.
- Ahora también podemos medir circuitos de muestreo con errores de lectura, no sólo circuitos ideales.
- Hemos aumentado algunas optimizaciones de circuitos con presencia de ruido.
- Se han incluido mejores aproximaciones de error de 2 qubits.
- Se han incluido algunas herramientas para facilitar la elaboración de determinadas simulaciones ruidosas y acelerar su simulación.
- Mayor rendimiento con simulaciones que requieren menos precisión numérica en coma flotante.
Ignis 0.2
Nuevas funciones
- Módulo de registro
- Pureza RB
- RB intercalado
- Código de repetición para la verificación
- Los valores de las semillas ahora se pueden añadir arbitrariamente a RB (no sólo en orden)
- Soporte para añadir múltiples resultados a la mitigación de la medición
- RB Fitters ahora permite proporcionar valores supuestos
Corrección de errores
- Corregido un error de ajuste de RB
- Se ha corregido un error en el ajustador de caracterización al seleccionar un índice de qubit para ajustar
Otras notas
- La atenuación de las mediciones funciona ahora en paralelo cuando se aplica a varios resultados
- Se mejoran los valores supuestos para los montadores de RB
Aqua 0.6
Añadido
-
Puertas de Toffoli en fase relativa
rccx(con 2 controles) yrcccx(con 3 controles). -
Forma variacional
RYCRX -
Un nuevo modo
'basic-no-ancilla'amct. -
Las puertas de rotación multicontrolada
mcrx,mcry, ymcrzcomo puerta generalu3no son compatibles con la implementación del código gris -
Química: Soporte de cáscara abierta ROHF
- Compatible con todos los controladores: Gaussian16, PyQuante, PySCF y PSI4
- HartreeFock el estado inicial, la forma variacional UCCSD y la reducción de dos qubits para el mapeo de paridad ahora admiten diferentes números de partículas alfa y beta para el soporte de cáscara abierta
-
Química: Soporte de cáscara abierta UHF
- Compatible con todos los controladores: Gaussian16, PyQuante, PySCF y PSI4
- QMolecule ampliado para incluir integrales, coeficientes, etc. para beta independientes
-
Química: QMolecule ampliado con integrales en base orbital atómica para facilitar el acceso común a éstas para la experimentación
- Compatible con todos los controladores: Gaussian16, PyQuante, PySCF y PSI4
-
Química: Configuración adicional de los controladores PyQuante y PySCF
- Controles de tolerancia de convergencia e iteración de convergencia máxima.
- Para PySCF elección de conjetura inicial
-
Química: Salida de procesamiento añadida al registro de depuración de los cálculos de PyQuante y PySCF (las salidas de Gaussian16 y PSI4 ya estaban añadidas al registro de depuración)
-
Química: Fusionado qiskit-química en qiskit-acuática
-
Añade las clases
MatrixOperator,WeightedPauliOperatoryTPBGroupedPauliOperator. -
Añade la función
evolution_instructionpara obtener la instrucción sin registro de la evolución temporal. -
Añadir
op_convertermódulo para unificar el lugar encargado de convertir los diferentes tipos de operadores. -
Añade la clase
Z2Symmetriespara encapsular la información de las simetrías de Z2 y tiene métodos de ayuda para estrechar un Operador. -
Estimación de la amplitud: se ha añadido el postprocesamiento de máxima verosimilitud y el cálculo del intervalo de confianza.
-
Estimación de amplitud por máxima verosimilitud (MLAE): Implementación de un nuevo algoritmo para la estimación de la amplitud basado en la estimación de máxima verosimilitud, que reduce el número de qubits necesarios y la profundidad del circuito.
-
Circuitos de Pauli-rotación (a trozos) controlados linealmente y polinomialmente.
-
Añadir
q_equation_of_motionpara estudiar el estado excitado de una molécula, y añadir dos algoritmos para preparar el estado de referencia.
Cambiado
- Mejorar el modo
'basic'demctutilizando puertas Toffoli de fase relativa para construir resultados intermedios. - Adáptate a la nueva clase
Qubitde Qiskit Terra. - Impida que
QPE/IQPEmodifique los objetos de entradaOperator. - Se ha eliminado la dependencia de PyEDA; las operaciones lógicas subyacentes de los oráculos correspondientes se gestionan ahora en SymPy.
- Refactorizar la clase
Operator, cada representación tiene su propia claseMatrixOperator,WeightedPauliOperatoryTPBGroupedPauliOperator. - El
powerenevolution_instructionse aplicó en el theta en la puerta CRZ directamente, la nueva versión repite los circuitos para aplicar el poder. - CircuitCache está desactivado por defecto y se puede configurar mediante la variable de entorno
QISKIT_AQUA_CIRCUIT_CACHE.
Corrección de errores
- Un error donde
TruthTableOracleconstruiría circuitos incorrectos para tablas de verdad con un solo valor1. - Un error causado por el indeterminismo de
PyEDA. - Problema con el cálculo de traslación y estiramiento de
QPE/IQPE. - Química: Mapeado Bravyi-Kitaev corregido cuando el número de qubits no era una potencia de 2
- Configure
initial_layoutenQuantumInstancea través de una lista.
Eliminado
- La puerta de rotación multicontrolada general
mcu3se suprime y se sustituye por las puertas de rotación multicontroladamcrx,mcry, ymcrz
En desuso
- La clase
Operatorestá obsoleta, en favor del uso deMatrixOperator,WeightedPauliOperatoryTPBGroupedPauliOperator.
IBM Proveedor Q 0.3
No cambia