Skip to main content
IBM Quantum Platform

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() son QuantumCircuit, PassManager y Schedule.

  • 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() como qiskit.visualization.circuit_drawer() soportan ahora la anotación de los qubits en la visualización con información de disposición. Si el objeto QuantumCircuit que se está dibujando incluye metadatos de diseño (que normalmente sólo se establecen en la salida del circuito de las llamadas a transpile() ), 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 es True), que cuando se establece False desactivará la anotación del trazado en los circuitos de salida.

  • Se ha añadido un nuevo pase de análisis CountOpsLongest para recuperar el número de operaciones en el camino más largo del DAGCircuit. Cuando se utilice, añadirá una clave count_ops_longest_path al 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() y sech_deriv() al módulo qiskit.pulse.pulse_lib de la biblioteca de impulsos para crear un objeto SamplePulse secante hiperbólica no normalizada y un objeto SamplePulse derviativo secante hiperbólica no normalizada respectivamente.

  • Se ha añadido una nueva opción kwarg vertical_compression al método QuantumCircuit.draw() y a la función qiskit.visualization.circuit_drawer() . Esta opción sólo funciona con el backend text . Esta opción puede establecerse en high, medium (por defecto) o low para ajustar la cantidad de espacio vertical utilizado por la visualización de salida.

  • Se ha añadido una nueva opción booleana kwarg idle_wires al método QuantumCircuit.draw() y a la función qiskit.visualization.circuit_drawer() . Funciona para todos los backends de cajones. Cuando idle_wires está 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 ejecuta
    • dag (DAGCircuit): la salida dag del pase
    • time (float): el tiempo para ejecutar el pase
    • property_set (PropertySet): el conjunto de propiedades
    • count (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 clase qiskit.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étodo
    Descripción
    QuantumCircuit.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_circuit al módulo qiskit.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_names a la función qiskit.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 a transpile() . 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 name en tcirc_a y tcirc_b será 'Circuit A' y 'Circuit B' respectivamente.

  • Se ha añadido un nuevo método equiv() a las clases qiskit.quantum_info.Operator y qiskit.quantum_info.Statevector . Estos métodos se utilizan para comprobar si un segundo objeto Operator o Statevector es equivalente hasta la fase global.

  • El archivo de configuración del usuario tiene varias opciones nuevas:

    • El campo circuit_drawer acepta ahora un valor automático. Cuando se establece como valor para el campo circuit_drawer el 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_style para establecer el estilo por defecto utilizado por el cajón de circuitos de matplotlib. Los valores válidos para este campo son bw y default para 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_level para establecer el nivel de optimización del transpilador por defecto que se utilizará para las llamadas a qiskit.compiler.transpile(). El valor puede ser 0, 1, 2 ó 3.
  • Introducido un nuevo comando de pulso Delay que puede ser insertado en un pulso Schedule. Este comando acepta un duration y puede añadirse a cualquier Channel. 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.util en su lugar.

  • El método QuantumCircuit.count_ops() devuelve ahora un objeto OrderedDict en lugar de dict. Esto debería ser compatible para la mayoría de los casos de uso, ya que OrderedDict es una subclase de dict . 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 utilizar DAGCircuit.num_qubits() .

  • Se ha eliminado la función DAGCircuit.num_cbits() . En su lugar, puede utilizar DAGCircuit.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_manager y qiskit.transpiler.preset_passmanagers.default_pass_manager_simulator (que eran los gestores de pases predeterminados anteriores para las llamadas a qiskit.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 pase StochasticSwap , que es una versión más rápida y estable. Todos los gestores de pases preestablecidos se han actualizado para utilizar StochasticSwap pass en lugar de LegacySwap.

  • Se han eliminado los siguientes métodos obsoletos de qiskit.dagcircuit.DAGCircuit :

    • DAGCircuit.get_qubits() - Utilice DAGCircuit.qubits() en su lugar

    • DAGCircuit.get_bits() - Utilice DAGCircuit.clbits() en su lugar

    • DAGCircuit.qasm() - Utilice una combinación de qiskit.converters.dag_to_circuit() y QuantumCircuit.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() - Utilice DAGCircuit.op_nodes() en su lugar. Observe que el tipo de retorno es una lista de objetos DAGNode para op_nodes() en lugar de la lista de tuplas devuelta anteriormente por get_op_nodes().

    • DAGCircuit.get_gate_nodes() - Utilice DAGCircuit.gate_nodes() en su lugar. Observe que el tipo de retorno es una lista de objetos DAGNode para gate_nodes() en lugar de la lista de tuplas devuelta anteriormente por get_gate_nodes().

    • DAGCircuit.get_named_nodes() - Utilice DAGCircuit.named_nodes() en su lugar. Observe que el tipo de retorno es una lista de objetos DAGNode para named_nodes() en lugar de la lista de node_ids devuelta anteriormente por get_named_nodes().

    • DAGCircuit.get_2q_nodes() - Utilice DAGCircuit.twoQ_gates() en su lugar. Observe que el tipo de retorno es una lista de objetos DAGNode para twoQ_gates() en lugar de la lista de data_dicts devuelta anteriormente por get_2q_nodes().

    • DAGCircuit.get_3q_or_more_nodes() - Utilice DAGCircuit.threeQ_or_more_gates() en su lugar. Observe que el tipo de retorno es una lista de objetos DAGNode para threeQ_or_more_gates() en lugar de la lista de tuplas devuelta anteriormente por get_3q_or_more_nodes().

  • Los siguientes métodos de qiskit.dagcircuit.DAGCircuit tenían soporte obsoleto para aceptar un node_id como parámetro. Esto se ha eliminado y ahora sólo se aceptan como entrada objetos de DAGNode :

    • 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.DAGCircuit rename_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.DAGCircuit multi_graph . Ya no es posible acceder directamente al objeto subyacente networkx multi_graph . En su lugar, debe utilizarse la API proporcionada por la clase DAGCircuit .

  • Se ha eliminado la clase de excepción obsoleta qiskit.qiskiterror.QiskitError . En su lugar, debe utilizar qiskit.exceptions.QiskitError.

  • Se han eliminado los kwargs booleanos, ignore_requires y ignore_preserves del constructor qiskit.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ódulo logging de la biblioteca estándar de Python. Si desea establecer un formateador personalizado para el registro, utilice el módulo logging de 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 como

    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()
  • Los kwargs anteriormente obsoletos, seed y config para qiskit.compiler.assemble() han sido eliminados, en su lugar utilice seed_simulator y run_config respectivamente.

  • Se han eliminado los convertidores anteriormente obsoletos qiskit.converters.qobj_to_circuits() y qiskit.converters.circuits_to_qobj() . Utilice en su lugar qiskit.assembler.disassemble() y qiskit.compiler.assemble() respectivamente.

  • El anteriormente obsoleto kwarg seed_mapper para qiskit.compiler.transpile() ha sido eliminado. En su lugar, debe utilizar seed_transpiler

  • Se han eliminado los kwargs anteriormente obsoletos seed, seed_mapper, config, y circuits para la función qiskit.execute() . Utilice en su lugar los argumentos seed_simulator, seed_transpiler, run_config, y experiments respectivamente.

  • El módulo qiskit.tools.qcvv , anteriormente obsoleto, ha sido eliminado. Utiliza qiskit-ignis en su lugar.

  • Las funciones anteriormente obsoletas qiskit.transpiler.transpile() y qiskit.transpiler.transpile_dag() han sido eliminadas. En su lugar, debe utilizar qiskit.compiler.transpile. Si utilizaba transpile_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 utilizar qiskit.compiler.transpile() y qiskit.compiler.assemble().

  • La magia de celda jupyter %%qiskit_progress_bar de qiskit.tools.jupyter se 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_bar en un cuaderno existente, tendrá que actualizarla para que sea una magia de línea cambiándola por %qiskit_progress_bar en 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ón qiskit.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ón qiskit.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ón qiskit.quantum_info.purity() .

  • Se ha eliminado el método obsoleto QuantumCircuit._attach() . Debería utilizar QuantumCircuit.append() en su lugar.

  • Se ha eliminado el método qiskit.qasm.Qasm get_filename() . En su lugar, puede utilizar el método return_filename() .

  • Se ha eliminado el módulo obsoleto qiskit.mapper . La lista de funciones y clases con sus alternativas son:

    • qiskit.mapper.CouplingMap qiskit.transpiler.CouplingMap .
    • qiskit.mapper.Layout: qiskit.transpiler.Layout debe utilizarse en su lugar
    • qiskit.mapper.compiling.euler_angles_1q(): qiskit.quantum_info.synthesis.euler_angles_1q() debe utilizarse en su lugar
    • qiskit.mapper.compiling.two_qubit_kak() qiskit.quantum_info.synthesis.two_qubit_cnot_decompose() .

    Las clases de excepción obsoletas qiskit.mapper.exceptions.CouplingError y qiskit.mapper.exceptions.LayoutError no tienen alternativa, ya que no sirven para nada sin el módulo qiskit.mapper .

  • El módulo qiskit.pulse.samplers se ha trasladado a qiskit.pulse.pulse_lib.samplers. Deberá actualizar las importaciones de qiskit.pulse.samplers a qiskit.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 extras qiskit-terra[visualization] se ha actualizado para instalar seaborn>=0.9.0 . Si utiliza visualizaciones y, en concreto, la función plot_state_qsphere() , puede utilizarla para instalar seaborn o simplemente ejecutar manualmente pip install seaborn>=0.9.0

  • Las funciones anteriormente obsoletas qiksit.visualization.plot_state y qiskit.visualization.iplot_state han 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.6
    Qiskit 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 pylatexenc y pillow para los backends de cajones de circuitos latex y latex_source ya 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 qiskit emitirá ahora una advertencia en la importación si no se ha podido configurar qiskit.IBMQ o qiskit.Aer . Esto ocurrirá siempre que se importe cualquier cosa del espacio de nombres qiskit . 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 un ImportError vací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 U y CX han quedado obsoletas. Si estás usando estas puertas en tu código, deberías actualizarlas para usar u3 y cx en su lugar. Por ejemplo, si utiliza las funciones de puerta de circuito circuit.u_base() y circuit.cx_base() , deberá actualizarlas a circuit.u3() y circuit.cx() respectivamente.

  • La puerta u0 ha quedado obsoleta en favor del uso de múltiples puertas iden y será eliminada en el futuro. Si está utilizando la puerta u0 en su circuito debe actualizar sus llamadas para utilizar iden. Por ejemplo, si antes utilizabas circuit.u0(2) en tu circuito, deberás actualizarlo:

    circuit.iden()
    circuit.iden()

    en su lugar.

  • La clase qiskit.pulse.DeviceSpecification ha quedado obsoleta. En su lugar, debe utilizar qiskit.pulse.PulseChannelSpec.

  • El acceso a una clase qiskit.circuit.Qubit, qiskit.circuit.Clbit, o qiskit.circuit.Bit por índice está obsoleto (por compatibilidad con las tuplas (register, index) que estas clases sustituyeron). En su lugar, debe utilizar los atributos register y index .

  • Pasar un bit al método qiskit.QuantumCircuit append como 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.Layout con una tupla (register, index) está obsoleto. En su lugar debe utilizarse directamente un objeto bit.

  • El método constructor qiskit.transpiler.Layout qiskit.transpiler.Layout.from_tuplelist() está obsoleto. En su lugar debe utilizarse el constructor qiskit.transpiler.Layout.from_qubit_list() .

  • El módulo qiskit.pulse.ops ha quedado obsoleto. Todas las funciones que ofrecía:

    • union
    • flatten
    • shift
    • insert
    • append

    tienen métodos equivalentes disponibles directamente en las clases qiskit.pulse.Schedule y qiskit.pulse.Instruction . Esos métodos deben utilizarse en su lugar.

  • El método qiskit.qasm.Qasm get_tokens() está obsoleto. En su lugar, debe utilizar el método generate_tokens() .

  • El método qiskit.qasm.qasmparser.QasmParser get_tokens() está obsoleto. En su lugar, debe utilizar el método read_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 por to_dict() .

Corrección de errores

  • Se ha modificado la definición de CU3Gate para que sea equivalente a la definición canónica de un U3Gate controlado.

  • 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_layout kwarg en qiskit.compiler.transpile() y qiskit.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:

    • Todos los estados básicos complementarios son antipodales

    • La fase se indica mediante el color de la línea y el marcador en la superficie de la esfera


    • La probabilidad se indica mediante la translucidez de la línea y el volumen del marcador en

      superficie de la esfera

Otras notas

  • La dirección PassManager por defecto para qiskit.compiler.transpile() y qiskit.execute() se ha cambiado por el gestor de pases de nivel de optimización 1 definido en qiskit.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.DAGCircuit node_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 nombres qiskit.transpiler , tal como se utiliza en logging.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

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) y rcccx (con 3 controles).

  • Forma variacional RYCRX

  • Un nuevo modo 'basic-no-ancilla' a mct.

  • Las puertas de rotación multicontrolada mcrx, mcry, y mcrz como puerta general u3 no 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, WeightedPauliOperator y TPBGroupedPauliOperator .

  • Añade la función evolution_instruction para obtener la instrucción sin registro de la evolución temporal.

  • Añadir op_converter módulo para unificar el lugar encargado de convertir los diferentes tipos de operadores.

  • Añade la clase Z2Symmetries para 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_motion para estudiar el estado excitado de una molécula, y añadir dos algoritmos para preparar el estado de referencia.

Cambiado

  • Mejorar el modo 'basic' de mctutilizando puertas Toffoli de fase relativa para construir resultados intermedios.
  • Adáptate a la nueva clase Qubit de Qiskit Terra.
  • Impida que QPE/IQPE modifique los objetos de entrada Operator .
  • 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 clase MatrixOperator, WeightedPauliOperator y TPBGroupedPauliOperator.
  • El power en evolution_instruction se 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 TruthTableOracle construiría circuitos incorrectos para tablas de verdad con un solo valor 1 .
  • 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_layout en QuantumInstance a través de una lista.

Eliminado

  • La puerta de rotación multicontrolada general mcu3 se suprime y se sustituye por las puertas de rotación multicontrolada mcrx, mcry, y mcrz

En desuso

  • La clase Operator está obsoleta, en favor del uso de MatrixOperator, WeightedPauliOperator y TPBGroupedPauliOperator.

IBM Proveedor Q 0.3

No cambia

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.