Notas de la versión de Qiskit 0.33
0.33.1
Terra 0.19.1
Preludio
Qiskit Terra 0.19.1 es una versión de corrección de errores, solucionando algunos problemas en 0.19.0 relativos a circuitos construidos por la interfaz del constructor de flujo de control, puertas condicionales y serialización QPY de objetos Terra más recientes.
Notas sobre características en desuso
-
Las funciones sueltas
qiskit.circuit.measure.measure()yqiskit.circuit.reset.reset()están obsoletas y se eliminarán en una futura versión. En su lugar, debe acceder a ellos como métodos enQuantumCircuit:from qiskit import QuantumCircuit circuit = QuantumCircuit(1, 1) # Replace this deprecated form ... from qiskit.circuit.measure import measure measure(circuit, 0, 0) # ... with either of the next two lines: circuit.measure(0, 0) QuantumCircuit.measure(circuit, 0, 0)
Corrección de errores
-
Corregido un error en las funciones de conversión de circuitos
circuit_to_gate()ycircuit_to_instruction()(y sus métodos de circuito asociadosQuantumCircuit.to_gate()yQuantumCircuit.to_instruction()) al actuar sobre un circuito con bits sin registro, o bits en más de un registro. Anteriormente, el número de bits necesarios para la puerta o instrucción creada se calculaba incorrectamente, lo que a menudo provocaba una excepción durante la conversión. -
Se ha corregido un problema por el que llamar a
QuantumCircuit.copy()en los circuitos "body" de una operación de flujo de control creada con la interfaz del constructor provocaba un error. Por ejemplo, esto antes era un error, pero ahora volverá con éxito:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.if_test((creg, 0)): circ.h(0) if_else_instruction, _, _ = circ.data[0] true_body = if_else_instruction.params[0] true_body.copy() -
La interfaz del constructor de flujo de control ahora admite el uso de
ClassicalRegistercomo condiciones en ámbitos de flujo de control anidados. Anteriormente, al hacer esto no se producía un error inmediato, pero los bloques del circuito interno no tenían definidos los registros correctos, por lo que la lógica posterior que trabajaba con los bloques internos fallaba.Por ejemplo, antes los cajones fallaban al intentar dibujar un bloque interior condicionado a un registro clásico, mientras que ahora lo conseguirán, como en este ejemplo:
from qiskit import QuantumCircuit from qiskit.circuit import QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.for_loop(range(10)) as a: circ.ry(a, 0) with circ.if_test((creg, 1)): circ.break_loop() print(circ.draw(cregbundle=False)) print(circ.data[0][0].blocks[0].draw(cregbundle=False)) -
Corregido el soporte de
qpy_serializationpara serializarQuantumCircuitque utilizanParameterVectoroParameterVectorElementcomo parámetros. Anteriormente, un parámetroParameterVectorElementse trataba simplemente como un parámetroParameterpara la serialización QPY, lo que significaba que el contextoParameterVectorse perdía en QPY y el orden de salida deparameterspodía ser incorrecto.Para solucionar este problema ha sido necesaria una nueva versión del formato QPY, la versión 3. Esta nueva versión del formato incluye una representación de la clase
ParameterVectorElementque se describe en la documentación deqpy_serializationen PARAMETER_VECTOR_ELEMENT. -
Corregido el soporte de
qpy_serializationpara serializar unPauliEvolutionGateobjeto. Anteriormente, elPauliEvolutionGatese trataba como una puerta personalizada para la serialización y se deserializaba como un objetoGateque tenía la misma definición y el mismo nombre que el objeto originalPauliEvolutionGate. Sin embargo, esto perdería el estado original delPauliEvolutionGate. Esto se ha corregido de modo que a partir de esta versión aPauliEvolutionGateen el circuito se conservará 1:1 a través de la serialización QPY ahora. La única limitación es que no admite clases personalizadasEvolutionSynthesispersonalizadas. Sólo las clases disponibles enqiskit.synthesispueden ser usadas conPauliEvolutionGatepara la serialización qpy.Para solucionar este problema ha sido necesaria una nueva versión del formato QPY, la versión 3. Esta nueva versión del formato incluye una representación de la
PauliEvolutionGateque se describe en la documentación deqpy_serializationen PAULI_EVOLUTION. -
Dos funciones sueltas
qiskit.circuit.measure.measure()yqiskit.circuit.reset.reset()fueron eliminadas accidentalmente sin un periodo de depreciación. Se han restablecido, pero están marcados como obsoletos en favor de los métodosQuantumCircuit.measure()yQuantumCircuit.reset()respectivamente, y se eliminarán en una futura versión.
Otras notas
-
La nueva interfaz del constructor de flujo de control utiliza varios gestores de contexto y objetos de ayuda para realizar su trabajo. No deben considerarse parte de la API pública y pueden modificarse o eliminarse sin previo aviso. El uso de la interfaz del constructor tiene garantías de estabilidad, en el sentido de que el comportamiento descrito por
QuantumCircuit.for_loop(),while_loop()yif_test()para la interfaz del constructor están sujetos a las políticas de depreciación estándar, pero los objetos reales utilizados para llevarlo a cabo no lo están. No debe confiar en que los objetos (comoIfContextoControlFlowBuilderBlock) existan en sus ubicaciones actuales o tengan métodos o atributos asociados a ellos.Esto no estaba claro en la versión de 0.19.0. Todos estos objetos tienen ahora una advertencia en sus cadenas de documentación que lo hace explícito. Es probable que en el futuro sus ubicaciones y aplicaciones de respaldo sean muy diferentes.
Aer 0.9.1
No cambia
Ignis 0.7.0
No cambia
IBM Proveedor Q 0.18.2
Corrección de errores
- Arreglo entregado en #1065 para el problema donde el trabajo seguía fallando cuando
Parameterera pasado en los metadatos del circuito. - Fix entregado en #1094 para el problema en el que
qiskit.providers.ibmq.runtime.RuntimeEncoderhace un extra decompose() si el circuito que se serializa es unBlueprintCircuit.
0.33.0
Esta versión marca oficialmente el fin del soporte del proyecto Qiskit Aqua en Qiskit. Originalmente fue obsoleto en la versión 0.25.0 y, como se documentó en esa versión, el paquete qiskit-aqua se ha eliminado del metapaquete Qiskit, lo que significa que pip install qiskit ya no incluirá qiskit-aqua. Sin embargo, debido a limitaciones en el empaquetado de python, no podemos eliminar automáticamente una instalación preexistente de qiskit-aqua al actualizar una versión anterior de Qiskit a esta versión (o a una futura) con pip install -U qiskit. Si está actualizando desde una versión anterior se recomienda que desinstale manualmente Qiskit Aqua con pip uninstall qiskit-aqua o instalar en un entorno python fresco.
Los módulos de aplicación que proporcionaba qiskit-aqua se han dividido en varios paquetes nuevos: qiskit-optimization, qiskit-nature, qiskit-machine-learning, y qiskit-finance. Estos paquetes pueden instalarse por sí mismos (mediante el comando estándar pip install, por ejemplo pip install qiskit-nature) o con el resto del metapaquete Qiskit como extras opcionales (p. ej. pip install 'qiskit[finance,optimization]' o pip install 'qiskit[all]'). Los algoritmos centrales y el flujo de operadores ya forman parte de Qiskit Terra en qiskit.algorithms y qiskit.opflow. Dependiendo del uso que hagas de Aqua, deberás utilizar los paquetes de la aplicación o los nuevos módulos de Qiskit Terra. Para más detalles sobre cómo migrar desde Qiskit Aqua puedes consultar la Guía de migración a Aqua.
Esta versión también deja oficialmente obsoleto el proyecto Qiskit Ignis. En consecuencia, en una futura versión el paquete qiskit-ignis se eliminará del metapaquete Qiskit, lo que significa que en esa futura versión pip install qiskit ya no incluirá qiskit-ignis. Qiskit Ignis ha sido sustituido por el proyecto Qiskit Experiments y el desarrollo activo ha cesado. A pesar de estar obsoleto, se seguirán realizando correcciones de errores críticos y correcciones de compatibilidad para proporcionar a los usuarios una oportunidad suficiente para migrar fuera de Ignis. Una vez transcurrido el periodo de obsoleto (que no será inferior a 3 meses a partir de esta versión), el proyecto se retirará y archivará. Puedes consultar la guía de migración para más detalles sobre cómo cambiar de Qiskit Ignis a Qiskit Experiments.
Terra 0.19.0
Preludio
Los aspectos más destacados del lanzamiento de Qiskit Terra 0.19 son:
- Una nueva versión de la interfaz abstracta Qiskit/hardware, en forma de
BackendV2que incluye una nueva estructura de datosTargetpara permitir a los backends modelar mejor sus restricciones para el transpilador. - Una interfaz de plugin extensible para el
UnitarySynthesistranspiler pass, permitiendo a los usuarios u otros paquetes extender las rutinas de síntesis de Qiskit Terra con nuevos métodos. - Instrucciones de flujo de control, para representar los bucles
forywhiley las sentenciasif/elseenQuantumCircuit. Los simuladores de Qiskit Aer pronto podrán trabajar con estas nuevas instrucciones, lo que permitirá escribir programas cuánticos más dinámicos. - Soporte preliminar para la especificación OpenQASM 3 en evolución. Puede utilizar el nuevo módulo
qiskit.qasm3para serializar susQuantumCircuits en OpenQASM 3, incluidas las nuevas construcciones de flujo de control.
Esta versión marca el fin de la compatibilidad con Python 3.6 en Qiskit. Esta versión de Qiskit Terra, y las posteriores versiones de corrección de errores de la serie 0.19.x, serán las últimas que funcionen con Python 3.6. A partir de la próxima versión menor ( 0.20.0 ) de Qiskit Terra, la versión mínima requerida de Python será 3.7.
Como siempre, hay muchas más funciones y correcciones en esta versión, que puedes consultar a continuación.
Nuevas funciones
-
QuantumCircuit.decompose()y su correspondiente pase de transpiladorDecomposeaceptan ahora opcionalmente un parámetro que contiene una colección de nombres de puertas. Si se indica este parámetro, sólo se descompondrán las puertas cuyos nombres coincidan. Admite coincidencias con comodines al estilo Unix-shell. Por ejemplo:qc.decompose(["h", "r[xz]"])descompondrá cualquier puerta
h,rxorz, pero dejará (por ejemplo) las puertasxintactas. -
Se ha añadido el argumento
termination_checkeralSPSAoptimizador. Esto permite al usuario implementar un criterio de terminación personalizado.import numpy as np from qiskit.algorithms.optimizers import SPSA def objective(x): return np.linalg.norm(x) + .04*np.random.rand(1) class TerminationChecker: def __init__(self, N : int): """ Callback to terminate optimization when the average decrease over the last N data points is smaller than the specified tolerance. """ self.N = N self.values = [] def __call__(self, nfev, parameters, value, stepsize, accepted) -> bool: """ Returns: True if the optimization loop should be terminated. """ self.values.append(value) if len(self.values) > self.N: last_values = self.values[-self.N:] pp = np.polyfit(range(self.N), last_values, 1) slope = pp[0] / self.N if slope > 0: return True return False maxiter = 400 spsa = SPSA(maxiter=maxiter, termination_checker=TerminationChecker(10)) parameters, value, niter = spsa.optimize(2, objective, initial_point=np.array([0.5, 0.5])) -
Se ha añadido una nueva versión de la
Backendinterfaz,BackendV2. Esta nueva versión supone un gran cambio con respecto a la anterior,BackendV1y cambia tanto el patrón de acceso del usuario a las propiedades del backend (como el número de qubits, etc) como la forma en que el backend representa sus restricciones al transpilador. La ejecución de los circuitos (a través delrun()método) permanece inalterada. Con unBackendV2backend en lugar de tener unconfiguration(),properties()ydefaults()métodos que construyenBackendConfiguration,BackendPropertiesyPulseDefaultsrespectivamente, como en la interfazBackendV1los atributos contenidos en esos objetos de salida son accesibles directamente como atributos del objetoBackendV2objeto. Por ejemplo, para obtener el número de qubits de un backend conBackendV1deberías hacer:num_qubits = backend.configuration().n_qubitsmientras que con
BackendV2lo es:num_qubits = backend.num_qubitsEl otro cambio es que el número de atributos expuestos en la clase abstracta
BackendV2está diseñado para ser un conjunto agnóstico de hardware/proveedor de los campos obligatorios u opcionales que el resto de Qiskit puede utilizar hoy en día con cualquier backend. Las subclases de la clase abstractaBackendV2pueden añadir soporte para atributos y métodos adicionales más allá de los definidos enBackendV2pero estos no serán soportados universalmente en todo Qiskit.El otro cambio crítico que es principalmente importante para los autores de proveedores es cómo un
BackendV2expone las propiedades de un backend concreto al transpilador. EnBackendV2esto se hace mediante unTargetobjeto. La direcciónTargetque se expone a través del atributotargetse utiliza para representar el conjunto de restricciones para la ejecución de circuitos en un backend concreto. Contiene el subconjunto de información previamente expuesto por elBackendConfiguration,BackendPropertiesyPulseDefaultsque el transpilador puede utilizar activamente. Al migrar un proveedor para utilizarBackendV2(o al crear un nuevo paquete de proveedores) la construcción de objetos backend girará principalmente en torno a la creación de un objetoTargetpara el backend. -
Se ha añadido una nueva clase
Targetal módulotranspilermódulo. La claseTargetestá diseñada para representar las restricciones del backend ante el compilador. La claseTargetestá pensada para ser utilizada con unBackendV2y es la forma en que los backends modelarán sus restricciones para el transpilador en el futuro. Combina los campos anteriormente distintos utilizados para controlar eltranspile()dispositivo de destino (por ejemplo,basis_gates,coupling_map,instruction_durations, etc.) en una única estructura de datos. También añade funciones adicionales a las disponibles anteriormente, como la representación de conjuntos de compuertas heterogéneos, la conectividad de compuertas multiqubit y las variantes sintonizadas de las mismas compuertas. En la actualidad, el transpilador no tiene en cuenta todas estas limitaciones, pero con el tiempo irá aprovechando las funciones adicionales. -
La clase
Optionstiene ahora soporte opcional para especificar validadores. Esto permiteBackenda los autores especificar opcionalmente una validación básica de los valores proporcionados por el usuario para los campos del objetoOptionsobjeto. Por ejemplo, si tuviera un objetoOptionsdefinido con:from qiskit.providers.Options options = Options(shots=1024)puedes establecer un validador en las tomas para que esté entre 1 y 4096 con:
options.set_validator('shots', (1, 4096))Con el validador activado, cualquier llamada al método
update_options()comprobará que, si se está actualizandoshots, el nuevo valor propuesto se encuentra dentro del intervalo válido. -
Añadido un nuevo pase de análisis del transpilador
ContainsInstructional móduloqiskit.transpiler.passesmódulo. Esta pasada se utiliza para determinar si un circuito contiene una instrucción específica. Toma un único parámetro en la inicialización, el nombre de la instrucción a comprobar y establece un booleano en el conjunto de propiedades si el circuito contiene esa instrucción o no. Por ejemplo:from qiskit.transpiler.passes import ContainsInstruction from qiskit.circuit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() property_set = {} # Contains Hadamard contains_h = ContainsInstruction("h") contains_h(circuit, property_set) assert property_set["contains_h"] == True # Not contains SX contains_sx = ContainsInstruction("sx") contains_sx(circuit, property_set) assert property_set["contains_sx"] == False -
Se ha añadido una función de utilidad
qiskit.utils.detach_prefix()que es una contrapartida deapply_prefix(). La nueva función devuelve una tupla de valor escalado y prefijo a partir de un valor float dado. Por ejemplo, un valor1.3e8se convertirá en(130, "M")que puede utilizarse para mostrar un valor en el formato fácil de usar, como130 MHz. -
Los valores
"gate_error"y"balanced"están ahora disponibles para la opciónobjectiveen la construcción del objetoBIPMapping, y"balanced"es ahora el valor por defecto.El objetivo
"gate_error"requiere pasar unaBackendPropertiesinstancia en el kwargbackend_prop, que contiene los errores de puerta 2q-gate utilizados en el cálculo de los objetivos. El objetivo"balanced"utilizará la instanciaBackendPropertiesinstancia si se da, pero en caso contrario asumirá una tasa de error CX como se da en el nuevo parámetrodefault_cx_error_rate. Los pesos relativos de los componentes de error de puerta y profundidad del objetivo equilibrado pueden controlarse con el nuevo parámetrodepth_obj_weight. -
Todos los atributos de la clase
VQEque se establece en la inicialización es ahora accesible con getters y setters. Además, los valores por defecto de los atributos VQEansatzyoptimizerpueden restablecerse asignándolesNone:vqe = VQE(my_ansatz, my_optimizer) vqe.ansatz = None # reset to default: RealAmplitudes ansatz vqe.optimizer = None # reset to default: SLSQP optimizer -
Añadido un nuevo método
PauliList.group_qubit_wise_commuting()que divide aPauliListen conjuntos de operadores mutuamente conmutables qubit-sabiosPaulimutuamente. Por ejemplo:from qiskit.quantum_info import PauliList, Pauli pauli_list = PauliList([Pauli("IY"), Pauli("XX"), Pauli("YY"), Pauli("YX")]) pauli_list.group_qubit_wise_commuting() -
Añadido un nuevo método constructor de mapa de acoplamiento
CouplingMap.from_hexagonal_lattice()para construir un mapa de acoplamiento de red hexagonal. Por ejemplo, para construir un mapa de acoplamiento de la red hexagonal 2x2 :from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_hexagonal_lattice(2, 2) cmap.draw() -
Las nuevas clases de backend falso están disponibles en
qiskit.test.mock. Se trata de versiones simuladas deibmq_brooklyn,ibmq_manila,ibmq_jakartayibmq_lagos. Al igual que los demás backends falsos, éstos incluyen instantáneas de los datos de calibración (es decir,backend.defaults()) y los datos de error (es decir,backend.properties()) tomados del sistema real, y pueden utilizarse para pruebas locales, compilación y simulación. -
Se ha añadido el método
OperatorBase.is_hermitian()para comprobar si el operador es hermitiano o no.NumPyEigensolveryNumPyMinimumEigensolverutilizareighoeigshpara resolver el problema de valores propios cuando el operador es hermitiano. -
Añadido un nuevo método constructor
PassManagerConfig.from_backend(). Construye unPassManagerConfigobjeto con las opciones del usuario y la configuración de un backend. Esta función facilita la creación de un gestor de pases predefinido. Por ejemplo:from qiskit.transpiler.passmanager_config import PassManagerConfig from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.test.mock import FakeMelbourne pass_manager = level_1_pass_manager( PassManagerConfig.from_backend(FakeMelbourne(), seed_transpiler=42) ) -
Se ha añadido un nuevo transpiler pass,
PulseGatesque extrae automáticamente las calibraciones proporcionadas por el usuario del mapa de programación de instrucciones y adjunta la programación de puertas al circuito cuántico dado (transpilado) como una puerta de impulsos.El
PulseGatesse aplica a todos los niveles de optimización de 0 a 3. No se actualiza ninguna implementación de puerta a menos que el usuario final anule explícitamente labackend.defaults().instruction_schedule_map. Este pase ahorra a los usuarios tener que llamar individualmenteQuantumCircuit.add_calibration()para cada circuito que se ejecuta en el hardware.Para complementar este nuevo pase, se añadió un horario a
InstructionScheduleMapy se actualiza implícitamente con un campo de metadatos"publisher". Las programaciones de puertas calibradas por el backend tienen un tipo de editor especial para evitar anular circuitos con calibraciones de programaciones ya conocidas. Normalmente, los usuarios finales no necesitan ocuparse de estos metadatos, ya que se aplican automáticamente. Puede llamar aInstructionScheduleMap.has_custom_gate()para comprobar si el mapa tiene calibración de puerta personalizada.Vea el siguiente ejemplo de código para aprender a aplicar la implementación de compuertas personalizadas para todos los circuitos en ejecución.
from qiskit.test.mock import FakeGuadalupe from qiskit import pulse, circuit, transpile backend = FakeGuadalupe() with pulse.build(backend, name="x") as x_q0: pulse.play(pulse.Constant(160, 0.1), pulse.drive_channel(0)) backend.defaults().instruction_schedule_map.add("x", (0,), x_q0) circs = [] for _ in range(100): circ = circuit.QuantumCircuit(1) circ.sx(0) circ.rz(1.57, 0) circ.x(0) circ.measure_active() circs.append(circ) circs = transpile(circs, backend) circs[0].calibrations # This returns calibration only for x gateTenga en cuenta que el mapa de programación de instrucciones es un objeto mutable. Si anula una de las entradas y utiliza ese backend para otros experimentos, puede actualizar accidentalmente la definición de la puerta.
backend = FakeGuadalupe() instmap = backend.defaults().instruction_schedule_map instmap.add("x", (0, ), my_x_gate_schedule) qc = QuantumCircuit(1, 1) qc.x(0) qc.measure(0, 0) qc = transpile(qc, backend) # This backend uses custom X gateSi quieres actualizar las definiciones de puerta de un experimento específico, primero tienes que hacer un deepcopy del mapa de programación de instrucciones y pasarlo directamente al transpilador.
-
Se ha introducido una nueva opción
qubit_subseten el constructor deBIPMapping. La opción nos permite especificar en una línea los qubits físicos que se utilizarán (encoupling_mapdel dispositivo) durante el mapeo:mapped_circ = BIPMapping( coupling_map=CouplingMap([[0, 1], [1, 2], [1, 3], [3, 4]]), qubit_subset=[1, 3, 4] )(circ)Antes, para hacer lo mismo, teníamos que suministrar un
coupling_mapreducido que contuviera sólo los qubits que se iban a utilizar, incrustar el circuito resultante en elcoupling_maporiginal y actualizar elQuantumCircuit._layouten consecuencia:reduced_coupling = coupling_map.reduce(qubit_to_use) mapped = BIPMapping(reduced_coupling)(circ) # skip the definition of fill_with_ancilla() # recover circuit on original coupling map layout = Layout({q: qubit_to_use[i] for i, q in enumerate(mapped.qubits)}) for reg in mapped.qregs: layout.add_register(reg) property_set = {"layout": fill_with_ancilla(layout)} recovered = ApplyLayout()(mapped, property_set) # recover layout overall_layout = Layout({v: qubit_to_use[q] for v, q in mapped._layout.get_virtual_bits().items()}) for reg in mapped.qregs: overall_layout.add_register(reg) recovered._layout = fill_with_ancilla(overall_layout) -
Añadidos los argumentos
ignore_pauli_phaseycopyal constructor deSparsePauliOp.ignore_pauli_phaseevita que se lea el atributophasede una entradaPauliListlo que es más eficaz si se sabe que el atributoPauliListya se sabe que tiene todas las fases como cero en la convención interna ZX.copypermite a los usuarios evitar la copia de los datos de entrada cuando establecen explícitamentecopy=False. -
Mejora del rendimiento de las siguientes
SparsePauliOpoperaciones:simplify()(véase #7122 )compose()(véase #7126 )_add()(ver #7138 )from_list()y__init__()(véase otra discusión en #7138 ).
-
Se ha añadido el método
SparsePauliOp.sum()para sumar muchosSparsePauliOps. Este método tiene un rendimiento significativamente mejor que sumar las instancias en un bucle. Por ejemplo, la forma anterior de sumar variosSparsePauliOps juntos sería hacerfrom qiskit.quantum_info import SparsePauliOp, random_pauli_list sparse_ops = [SparsePauliOp(random_pauli_list(10, 10)) for _ in [None]*1000] total = sparse_ops[0] for op in sparse_ops[1:]: total += opAhora puede hacerse de forma mucho más eficaz (tanto en velocidad como en mecanografía) como:
SparsePauliOp.sum(sparse_ops) -
Añadido un argumento
limit_amplitudeal constructor deParametricPulse, que es la clase base deGaussian,GaussianSquare,DragyConstantpara permitir desactivar el límite de amplitud de 1 pulso a pulso. Conlimit_amplitude=False, los impulsos individuales pueden tener una amplitud superior a la unidad sin elevar unPulseError. Véase #6544 para más detalles. -
Utilizando
QuantumCircuit.draw()ocircuit_drawer()con el cajónlatexgenerará ahora un archivo en un formato de imagen inferido de la extensión del nombre del archivo, por ejemplo:import qiskit circuit = qiskit.QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.draw('latex', filename='./file.jpg')Esto guardará el dibujo del circuito en formato JPEG. Antes, la imagen siempre estaba en formato PNG. Consulte el nº 6448 para más detalles.
Ahora, si encuentra una extensión de nombre de archivo que no es compatible, por ejemplo:
circuit.draw('latex', filename='./file.spooky')lanzará un mensaje
ValueErrorpara cambiar la extensión del nombre de archivo a un formato de imagen compatible. -
Se ha añadido el parámetro
filenameaplot_gate_map()yplot_coupling_map()que permite guardar las imágenes resultantes en un archivo. -
Se ha introducido un compilador cuántico aproximado y la correspondiente implementación de un plugin de síntesis unitaria. La clase principal de AQC es
AQCpara una versión independiente que compila una matriz unitaria en un circuito aproximado. El complemento puede invocarse mediantetranspile()cuando el argumentounitary_synthesis_methodse establece en'aqc'. Consulteqiskit.transpiler.synthesis.aqcpara más información. -
Se ha añadido un argumento
filter_functionaQuantumCircuit.depth()yQuantumCircuit.size()para analizar las operaciones del circuito según algunos criterios.Por ejemplo, para obtener el número de puertas de dos qubits, puedes hacer:
circuit.size(lambda x: x[0].num_qubits == 2)O para obtener la profundidad de las puertas T que actúan sobre el qubit zeroth:
circuit.depth(lambda x: x[0].name == 't' and circuit.qubits[0] in x[1]) -
Añadido un nuevo pase de transpilador
CollectMultiQBlocksal móduloqiskit.transpiler.passesmódulo. Este paso se utiliza para recoger secuencias de puertas ininterrumpidas que actúan sobre grupos de qubits. Ofrece una función similar a la delCollect2qBlocksexistente, pero mientras que ese pase está diseñado y optimizado para encontrar bloques de 2 qubits, este nuevo pase funcionará para encontrar bloques de cualquier tamaño. -
Existe una interfaz de construcción para las nuevas operaciones de flujo de control en
QuantumCircuitcomo el nuevoForLoopOp,IfElseOpyWhileLoopOp. La interfaz utiliza los mismos métodos de circuito, es decirQuantumCircuit.for_loop(),QuantumCircuit.if_test()yQuantumCircuit.while_loop()que están sobrecargados de modo que si no se proporciona el parámetrobody, devuelven un gestor de contexto. Al entrar en uno de estos gestores de contexto, se introduce un ámbito en el circuito y se capturan todas las llamadas a puertas (y otros ámbitos) y los recursos que utilizan, y se construye la operación correspondiente al final. Por ejemplo, ahora puedes hacer:qc = QuantumCircuit(2, 2) with qc.for_loop(range(5)) as i: qc.rx(i * math.pi / 4, 0)Esto producirá un
ForLoopOpenqc, que sabe que el qubit 0 es el único recurso utilizado dentro del cuerpo del bucle. Estos gestores de contexto pueden anidarse y determinarán correctamente su anchura. Puede utilizarQuantumCircuit.break_loop()yQuantumCircuit.continue_loop()dentro de un contexto, y se expandirá para tener el ancho correcto para el bucle que lo contiene, incluso si está anidado en más bloquesQuantumCircuit.if_test()bloques.El gestor de contexto
if_test()gestor de contexto proporciona un gestor encadenado que, si se desea, puede utilizarse para crear un bloqueelse, como por:qreg = QuantumRegister(2) creg = ClassicalRegister(2) qc = QuantumCircuit(qreg, creg) qc.h(0) qc.cx(0, 1) qc.measure(0, 0) with qc.if_test((creg, 0)) as else_: qc.x(1) with else_: qc.z(1)El gestor se asegurará de que los organismos
ifyelsese definan sobre el mismo conjunto de recursos. -
Introducido un nuevo transpiler pass
InverseCancellationque generaliza el paseCXCancellationpara cancelar cualquier puerta auto-inversa o pares puerta-inversa. Se puede utilizar inicializandoInverseCancellationy pasando una puerta para cancelar, por ejemplo:from qiskit.transpiler.passes import InverseCancellation from qiskit import QuantumCircuit from qiskit.circuit.library import HGate from qiskit.transpiler import PassManager qc = QuantumCircuit(2, 2) qc.h(0) qc.h(0) pass_ = InverseCancellation([HGate()]) pm = PassManager(pass_) new_circ = pm.run(qc) -
El constructor de
RZXCalibrationBuildertiene dos nuevos kwargsinstruction_schedule_mapyqubit_channel_mappingque toman unInstructionScheduleMapy una lista de nombres de canal para cada qubit respectivamente. Estos nuevos argumentos se utilizan para especificar directamente la información necesaria de un objetivo backend. Deben utilizarse en lugar de pasar unBaseBackenduBackendV1directamente al pase con el argumentobackend. -
Los
Statevectors de estados compuestos únicamente por qubits pueden dibujarse ahora en LaTeX en notación ket. En la notación ket, las entradas del vector de estado se procesan de forma que los factores exactos, como fracciones o raíces cuadradas de dos, se dibujan como tales. La convención concreta puede elegirse pasando el argumento de la palabra claveconventioncomo"ket"o"vector", según proceda:import math from qiskit.quantum_info import Statevector sv = Statevector([math.sqrt(0.5), 0, 0, -math.sqrt(0.5)]) sv.draw("latex", convention="ket") sv.draw("latex", convention="vector") -
Añadido un nuevo transpiler pass
EchoRZXWeylDecompositionque permite a los usuarios descomponer una puerta arbitraria de dos qubits en términos de puertas RZX con eco aprovechando la descomposición de Cartan. En combinación con otros pases del transpilador, esto se puede utilizar para transpilar circuitos arbitrarios a circuitos basados en puertas RZX y eficientes en pulsos que implementan el mismo unitario. -
En
SPSAyQNSPSAson ahora capaces de agrupar por lotes tantas evaluaciones de circuito como sea posible, tanto para las iteraciones como para las calibraciones iniciales. Esto puede aprovecharse estableciendo el kwargmax_evals_groupeden el constructor deVQEcuando se utilizaSPSAoQNSPSAcomo parámetro deoptimizer. Por ejemplo:from qiskit.circuit.library import TwoLocal from qiskit.algorithms import VQE from qiskit.algorithms.optimizers import QNSPSA from qiskit.test.mock import FakeMontreal backend = FakeMontreal() ansatz = TwoLocal(2, rotation_blocks=["ry", "rz"], entanglement_blocks="cz") qnspsa = QNSPSA(fidelity, maxiter=5) vqe = VQE( ansatz=ansatz, optimizer=qnspsa, max_evals_grouped=100, quantum_instance=backend, ) -
Esta versión introduce un método de descomposición para puertas de dos qubits que se dirige a conjuntos de puertas RZX definidos por el usuario. Los usuarios de Transpiler pueden activar la descomposición para {
RZX(pi/2),RZX(pi/4), andRZX(pi/6)} específicamente incluyendo'rzx'en su listabasis_gatesal llamar atranspile(). Los usuarios del paquete de información Quantum pueden encontrar el método en la claseXXDecomposerclase. -
Añadido un transpiler pass
Optimize1qGatesSimpleCommutationque optimiza un circuito según una estrategia de conmutación de puertas de un solo qubit para descubrir oportunidades de resíntesis. -
Se ha añadido un parámetro
max_job_triesaQuantumInstancepara limitar el número de veces que un trabajo intentará ejecutarse en un backend. Anteriormente, el envío y la obtención de resultados se intentaban infinitamente, incluso si el trabajo se cancelaba o se producía un error en el backend. El valor por defecto es ahora 50, y el comportamiento anterior puede conseguirse configurandomax_job_tries=-1. Correcciones #6872 y #6821. -
El método de salida
latexpara la funcióncircuit_drawer()y el métodoQuantumCircuit.draw()pueden ahora dibujar circuitos que contengan puertas con condición de bit único. Esto se añadió para la compatibilidad del cajón de látex con la nueva característica de soporte de condicionamiento clásico de puertas en bits clásicos individuales. -
El método de salida
"mpl"para la funcióncircuit_drawer()y el métodoQuantumCircuit.draw()pueden ahora dibujar circuitos que contengan puertas con condición de bit único. Esto se añadió para la compatibilidad del cajón"mpl"con la nueva característica de soporte de condicionamiento clásico de compuertas en bits clásicos individuales. -
El método de salida
textpara la funcióncircuit_drawer()y el métodoQuantumCircuit.draw()pueden ahora dibujar circuitos que contengan puertas con condición de bit único. Esto se añadió para la compatibilidad del cajón de texto con la nueva característica de soporte de condicionamiento clásico de puertas en bits clásicos individuales. -
Se ha añadido un nuevo pase de transpilador de análisis
GatesInBasisse ha añadido aqiskit.transpiler.passes. Este paso se utiliza para comprobar si elDAGCircuitque se está transpilando tiene todas las puertas del conjunto de bases configurado o no. Establecerá el atributo"all_gates_in_basis"en el conjunto de propiedades aTruesi todas las puertas en el conjunto de propiedadesDAGCircuitestán en el conjunto de bases configurado oFalsesi no lo están. Por ejemplo:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import GatesInBasis # Instatiate Pass basis_gates = ["cx", "h"] basis_check_pass = GatesInBasis(basis_gates) # Build circuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() # Run pass on circuit property_set = {} basis_check_pass(circuit, property_set=property_set) assert property_set["all_gates_in_basis"] -
Añadidos dos nuevos métodos constructores
from_heavy_hex()yfrom_heavy_square()a la claseCouplingMapclase. Estos métodos constructores se utilizan para crear unCouplingMapque son un grafo hexagonal pesado o cuadrado pesado como se describe en Chamberland et al., 2020.Por ejemplo:
from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_hex(5) cmap.draw()from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_square(5) cmap.draw() -
El algoritmo
HHLpuede ahora encontrar soluciones cuando su matriz tiene valores propios negativos. Para ello, el algoritmo añade ahora un qubit adicional para representar el signo del valor, y el algoritmo de ayudaExactReciprocalpara procesar esta nueva información. Ver #6971 para más detalles. -
Añadidas dos nuevas clases
CompleteMeasFitteryTensoredMeasFitteral móduloqiskit.utils.mitigationmódulo. Estas clases sólo pueden utilizarse como valores para el kwargmeasurement_error_mitigation_clsde la claseQuantumInstanceclase. La instanciación y el uso de estas clases (o cualquier otra cosa enqiskit.utils.mitigation) fuera del kwargmeasurement_error_mitigation_clsdebe tratarse como una API privada interna y no debe confiarse en ella. -
La clase
ListOpclase enqiskit.opflowtiene ahora un atributocoeffsque devuelve una lista de los coeficientes de la lista de operadores, con el coeficiente global (ListOp.coeff) distribuido multiplicativamente en la lista. Tenga en cuenta queListOppueden estar anidados (contenidos enoplistde un objetoListOpobjeto), y en estos casos se produce una excepción si se llama al método coeffs. El métodoListOp.coeffsconvenientemente contra el método de la propiedadcoeffsde la clase no anidadaPauliSumOpno anidada. -
La clase
Statevectores ahora subscriptible. El usuario puede ahora recuperar el enésimo coeficiente en unStatevectorpor índice comostatevec[n]. -
Se ha añadido el
Statevector.innerpara calcular productos internos deStatevectorinstancias. Por ejemplo:statevec_inner_other = statevec.inner(other)devolverá el producto interior de
statevecconother. Mientras questatevecdebe ser unStatevectorotherpuede ser cualquier cosa que pueda construirse como una matrizStatevectorcomo una matriz Numpy. -
Se ha añadido un nuevo parámetro,
add_bits, aQuantumCircuit.measure_all(). Por defecto se establece enTruepara mantener el comportamiento anterior de añadir un nuevoClassicalRegisterdel mismo tamaño que el número de qubits para almacenar las mediciones. Si se establece enFalse, las mediciones se almacenarán en los bits clásicos ya existentes. Por ejemplo, si creas un circuito con bits clásicos existentes como:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(2) cr = ClassicalRegister(2, "meas") circuit = QuantumCircuit(qr, cr)la llamada a
circuit.measure_all(add_bits=False)utilizará el registro clásico existentecrcomo destino de salida de los objetosMeasurementañadidos al circuito. -
ParameterExpressionahora delega sus conversiones numéricas a la biblioteca simbólica subyacente, incluso si hay parámetros potencialmente no vinculados. Esto permite convertir expresiones como>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> float(x - x + 2.3) 2.3donde la expresión subyacente tiene un valor fijo, pero el parámetro
xaún no está acotado. -
Se ha añadido un
Optimizer.minimize()a todos los optimizadores:Optimizery clases derivadas. Este método imita la firma de la función SciPy’sminimize()y devuelve un archivoOptimizerResult.Por ejemplo
import numpy as np from qiskit.algorithms.optimizers import COBYLA def loss(x): return -(x[0] - 1) ** 2 - (x[1] + 1) ** 3 initial_point = np.array([0, 0]) optimizer = COBYLA() result = optimizer.minimize(loss, initial_point) optimal_parameters = result.x minimum_value = result.fun num_function_evals = result.nfev -
Se ha añadido un
PauliEvolutionGatea la biblioteca de circuitos (qiskit.circuit.library) que define una puerta que realiza la evolución temporal de (sumas o sumas-de-sumas de)Paulis. La síntesis de esta puerta la realizaEvolutionSynthesisy está desacoplada de la propia puerta. Los métodos de síntesis disponibles actualmente son:LieTrottertrotterización de primer ordenSuzukiTrottertrotterización de orden superiorMatrixExponentialevolución exacta basada en matrices
Por ejemplo:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparsePauliOp from qiskit.synthesis import SuzukiTrotter operator = SparsePauliOp.from_list([ ("XIZ", 0.5), ("ZZX", 0.5), ("IYY", -1) ]) time = 0.12 # evolution time synth = SuzukiTrotter(order=4, reps=2) evo = PauliEvolutionGate(operator, time=time, synthesis=synth) circuit = QuantumCircuit(3) circuit.append(evo, range(3)) -
Se ha introducido una nueva función
plot_coupling_map()que amplía la funcionalidad de la función existenteplot_gate_map()aceptando tres parámetros:num_qubit,qubit_coordinates, ycoupling_map(en lugar debackend), para poder trazar un mapa de acoplamiento de qubits arbitrario. -
Qiskit Terra ahora tiene soporte inicial para serializar
QuantumCircuits a OpenQASM 3 :from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) print(qasm3.dumps(qc))Esta versión inicial tiene soporte limitado para registros con nombre, instrucciones básicas incorporadas (como medida, barrera y reset), puertas definidas por el usuario, instrucciones definidas por el usuario (como subrutinas), y las nuevas construcciones de flujo de control también introducidas en esta versión:
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 import math composite_circ_qreg = QuantumRegister(2) composite_circ = QuantumCircuit(composite_circ_qreg, name="composite_circ") composite_circ.h(0) composite_circ.x(1) composite_circ.cx(0, 1) composite_circ_gate = composite_circ.to_gate() qr = QuantumRegister(2, "qr") cr = ClassicalRegister(2, "cr") qc = QuantumCircuit(qr, cr) with qc.for_loop(range(4)) as i: qc.rx(i * math.pi / 4, 0) qc.cx(0, 1) qc.barrier() qc.append(composite_circ_gate, [0, 1]) qc.measure([0, 1], [0, 1]) print(qasm3.dumps(qc)) -
La clase
QDriftclase se reformuló como un método de síntesis paraPauliEvolutionGateque deriva deTrotterizationBase.from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.synthesis import QDrift from qiskit.opflow import X, Y, Z qdrift = QDrift(reps=2) operator = (X ^ 3) + (Y ^ 3) + (Z ^ 3) time = 2.345 # evolution time evolution_gate = PauliEvolutionGate(operator, time, synthesis=qdrift) circuit = QuantumCircuit(3) circuit.append(evolution_gate, range(3)) -
La serialización QPY es ahora capaz de representar
global_phaseatributos de unQuantumCircuitque son un objetoint,Parameterobjeto, oParameterExpressionobjeto. Las versiones anteriores de QPY sólo aceptaban unglobal_phaseque fuera unfloat.Esto requiere el formato QPY Versión 2 que se introdujo en esta versión para representar los tipos adicionales.
-
Se ha añadido un nuevo
find_bit()a la claseQuantumCircuitque permite consultar el índice y los registros de un circuito dadoBiten el circuito dado. El método devuelve unnamedtuplede dos elementos que contiene 0) el índice delBiten cualquiera de los dosqubits(para unQubit) oclbits(para aClbit) y 1) una lista de tuplas length-2 que contiene cada circuitoRegisterque contiene elBit, y el índice en eseRegisteren el que se puede encontrar elBit.Por ejemplo:
from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit reg1 = QuantumRegister(3, 'foo') qubit = Qubit() reg2 = QuantumRegister(2, 'bar') qc = QuantumCircuit(reg1, [qubit], reg2) print(qc.find_bit(reg1[2])) print(qc.find_bit(qubit))generaría:
BitLocations(index=2, registers=[(QuantumRegister(3, 'foo'), 2)]) BitLocations(index=3, registers=[]) -
Se han añadido tres nuevas
Instructionpara soportar operaciones de flujo de control en circuitos dinámicos:WhileLoopOp,ForLoopOpyIfElseOp. Además, dos subclases,BreakLoopOpyContinueLoopOpque permiten salir de un contexto de bucle y continuar con la siguiente iteración, respectivamente.Pueden crearse como
Instructiono añadirse a una instanciaQuantumCircuitmediante sus respectivos métodos,QuantumCircuit.while_loop(),for_loop(),if_test(),if_else(),break_loop()ycontinue_loop(). -
Se ha añadido la
BaseReadoutMitigatorclase base abstracta para implementar mitigadores de error de medición clásicos. Estos objetos están destinados a mitigar los errores de medición enCountsobjetos devueltos por la ejecución de circuitos en backends con errores de medición.Las clases de mitigador de lectura tienen dos métodos principales:
expectation_value()que calcula un valor de expectativa mitigado y un error estándar de un operador diagonal a partir de un objeto ruidosoCountsruidoso.quasi_probabilities()que calcula un error mitigadoQuasiDistributionincluido el error estándar, a partir de un objeto de recuento ruidoso.
Tenga en cuenta que actualmente el módulo
qiskit.algorithmsy la claseQuantumInstancetodavía utilizan los mitigadores heredados migrados de Qiskit Ignis enqiskit.utils.mitigation. Está previsto actualizar el módulo para que utilice las nuevas clases de mitigación y dejar obsoleto el código de mitigación heredado en una futura versión. -
Se ha añadido la clase
LocalReadoutMitigatorpara mitigar los errores locales de medición. Los errores de medición locales son aquellos que se describen mediante un tensor-producto de errores de medición de un solo qubit.Esta clase se puede inicializar con una lista de single-qubit de matrices de asignación de error de medición o desde un backend utilizando la información de error de lectura en las propiedades del backend.
La mitigación se implementa utilizando la inversión de la matriz de asignación local que tiene una complejidad de para la mitigación de -qubit de
QuasiDistributiony valores de expectativa. -
Se ha añadido la clase
CorrelatedReadoutMitigatorpara realizar la mitigación de errores de lectura de medición de errores de medición correlacionados. Esta clase puede inicializarse con una única matriz de asignación de errores de medición que describa las probabilidades de error. La mitigación se implementa mediante la inversión de la matriz de asignación que tiene una complejidad de mitigación de deQuasiDistributiony valores de expectativa. -
Se ha añadido un atributo
QuasiDistribution.stddev_upper_boundy un kwarg al constructor de la claseQuasiDistributionque se utiliza para almacenar errores estándar en estimaciones de cuasiprobabilidad. Se utiliza enBaseReadoutMitigatorclases para almacenar el error estándar en cuasiprobabilidades atenuadas. -
Se ha añadido un
shots()aqiskit.result.Countspara devolver la suma de todos los resultados en los recuentos. -
Cuando se ejecuta el
Groverclase de algoritmo si se conoce la potencia óptima y sólo se ejecuta un único circuito, laAmplificationProblem.is_good_statey la búsqueda Grover devolverá la cadena de bits más probable. Generalmente, si no se conoce la potencia óptima del operador Grover, el algoritmoGroveralgoritmo comprueba diferentes potencias (es decir, iteraciones) y aplica la funciónis_good_statepara comprobar si se ha medido una buena cadena de bits. Por ejemplo, ahora puedes ejecutar algo como:from qiskit.algorithms import Grover, AmplificationProblem from qiskit.providers.aer import AerSimulator from qiskit.quantum_info import Statevector # Fixed Grover power: 2. grover = Grover(iterations=2, quantum_instance=AerSimulator()) # The ``is_good_state`` argument not required here since Grover search # will be run only once, with a power of 2. problem = AmplificationProblem(Statevector.from_label("111")) # Run Grover search and print the best measurement result = grover.amplify(problem) print(result.top_measurement) # should print 111 -
Añadido método
remove_cregs()a la claseDAGCircuitpara soportar la eliminación clásica de registros. -
Añadido método
remove_clbits()a la claseDAGCircuitpara soportar la eliminación de bits clásicos ociosos. Cualquier registro clásico que haga referencia a un bit eliminado también se elimina. -
Añadido un nuevo método,
replace_block_with_op()a la claseDAGCircuitclase. Este método se utiliza para reemplazar un bloque de nodos en el DAG con una sola operación. El ejemplo canónico es el paseConsolidateBlocksque sustituye bloques de nodos por nodos equivalentes deUnitaryGate. -
Añadido un nuevo pase de transpilador de análisis
Collect1qRunsal móduloqiskit.transpiler.passesmódulo. Este paso se utiliza para encontrar secuencias de puertas ininterrumpidas que actúan sobre un único qubit. Es similar alCollect2qBlocksyCollectMultiQBlockspero optimizado para carreras de qubits individuales en lugar de bloques de qubits múltiples. -
Varios internos de transpilación ahora utilizan nuevas características en retworkx 0.10 cuando operan en la representación del circuito interno. Esto puede dar lugar a un aumento de la velocidad de las llamadas a
transpilede alrededor del 10-40%, con mayores efectos a mayores niveles de optimización. Consulte el nº 6302 para más detalles. -
El
UnitarySynthesistranspiler pass inqiskit.transpiler.passestiene un nuevo kwarg en el constructor,min_qubits. Cuando se especifica, puede establecerse en un valorint, que es el tamaño mínimo del objetoUnitaryGatesobre el que ejecutar la síntesis unitaria. Si unUnitaryGateen unQuantumCircuitutiliza menos qubits será omitido por esa instancia del pase. -
Las interfaces
EigensolveryMinimumEigensolveradmiten ahora el tipoDict[str, Optional[OperatorBase]]para el parámetroaux_operatorsen sus respectivos métodoscompute_eigenvalues()ycompute_minimum_eigenvalue(). En este caso, los valores propios auxiliares también se almacenan en un diccionario bajo las mismas claves proporcionadas por el diccionarioaux_operators. Las teclas que corresponden a un operador que no conmuta con el operador principal se descartan. -
En
BasisTranslator,GateDirectionyCheckGateDirectiontienen un nuevo kwargtargeten sus constructores, que puede utilizarse para establecer un objetoTargetcomo destino del pase. Si se establece, se utilizará en lugar detarget_basis(en el caso delBasisTranslatorpass) ocoupling_map(en el caso de los passGateDirectionyCheckGateDirectionpass). -
Permitir dos etapas de transpilador en el
QuantumInstanceuna para circuitos parametrizados y otra sólo para circuitos limitados (es decir, sin parámetros libres). Si una instancia cuántica con pases para circuitos no ligados y ligados se pasa a unCircuitSamplerel muestreador intentará aplicar el pase no ligado una vez en el circuito parametrizado, lo almacenará en caché y sólo aplicará el pase ligado para todas las evaluaciones futuras.Esto permite a los algoritmos variacionales como el
VQEejecutar un gestor de pases personalizado para circuitos parametrizados una vez y, además, otro el transpilador de nuevo con un gestor de pases personalizado diferente en los circuitos ligados en cada iteración. Poder ejecutar diferentes gestores de pases es importante porque no todos los pases admiten circuitos parametrizados (por ejemploOptimize1qGatesDecompositionsólo funciona con circuitos parametrizados).Por ejemplo, esta característica permite utilizar la descomposición CX de pulso eficiente en el VQE, como
from qiskit.algorithms import VQE from qiskit.opflow import Z from qiskit.circuit.library.standard_gates.equivalence_library import StandardEquivalenceLibrary as std_eqlib from qiskit.transpiler import PassManager, PassManagerConfig, CouplingMap from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.transpiler.passes import ( Collect2qBlocks, ConsolidateBlocks, Optimize1qGatesDecomposition, RZXCalibrationBuilderNoEcho, UnrollCustomDefinitions, BasisTranslator ) from qiskit.transpiler.passes.optimization.echo_rzx_weyl_decomposition import EchoRZXWeylDecomposition from qiskit.test.mock import FakeBelem from qiskit.utils import QuantumInstance # Replace by a real backend! If not ensure qiskit-aer is installed to simulate the backend backend = FakeBelem() # Build the pass manager for the parameterized circuit rzx_basis = ['rzx', 'rz', 'x', 'sx'] coupling_map = CouplingMap(backend.configuration().coupling_map) config = PassManagerConfig(basis_gates=rzx_basis, coupling_map=coupling_map) pre = level_1_pass_manager(config) # Build a pass manager for the CX decomposition (works only on bound circuits) post = PassManager([ # Consolidate consecutive two-qubit operations. Collect2qBlocks(), ConsolidateBlocks(basis_gates=['rz', 'sx', 'x', 'rxx']), # Rewrite circuit in terms of Weyl-decomposed echoed RZX gates. EchoRZXWeylDecomposition(backend), # Attach scaled CR pulse schedules to the RZX gates. RZXCalibrationBuilderNoEcho(backend), # Simplify single-qubit gates. UnrollCustomDefinitions(std_eqlib, rzx_basis), BasisTranslator(std_eqlib, rzx_basis), Optimize1qGatesDecomposition(rzx_basis), ]) quantum_instance = QuantumInstance(backend, pass_manager=pre, bound_pass_manager=post) vqe = VQE(quantum_instance=quantum_instance) result = vqe.compute_minimum_eigenvalue(Z ^ Z) -
Se ha introducido una nueva interfaz de plugin de síntesis unitaria que se utiliza para permitir el uso de técnicas de síntesis alternativas incluidas en paquetes externos sin problemas con el
UnitarySynthesistranspilador. Los usuarios pueden seleccionar un complemento para utilizarlo al llamar atranspile()estableciendo el kwargunitary_synthesis_methodcon el nombre del complemento. Puede encontrar una lista completa de los plugins instalados utilizando la funciónqiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names()función. Por ejemplo, si instalas un paquete que incluye un plugin de síntesis llamadospecial_synthpodrías utilizarlo con:from qiskit import transpile transpile(qc, unitary_synthesis_method='special_synth', optimization_level=3)Esto reemplazará todos los usos del método
UnitarySynthesispor el método incluido en el paquete externo que exporta el pluginspecial_synth.La interfaz del plugin está construida alrededor de puntos de entrada setuptools que permiten a los paquetes externos a Qiskit anunciar que incluyen un plugin de síntesis. Para más información sobre cómo crear un nuevo plugin, consulte la documentación del módulo
qiskit.transpiler.passes.synthesis.plugindocumentación del módulo. -
Añadido un nuevo pase de transpilador,
VF2Layout. Este paso modela el problema de asignación de distribución como un problema de isomorfismo de subgrafos y utiliza la implementación del algoritmo VF2 en rustworkx para encontrar una distribución perfecta (una distribución que no requiera enrutamiento adicional) si existe. La funcionalidad expuesta por este nuevo pase es muy similar a la existenteCSPLayoutperoVF2Layoutes significativamente más rápida.
Problemas conocidos
-
La convención
"ket"en el cajón"latex"deStatevector.draw()sólo es válida para estados formados exclusivamente por qubits. Si utiliza estados con algunos espacios de dimensión superior a dos, deberá pasarconvention="vector", o utilizar un cajón diferente. -
Las capacidades de exportación de OpenQASM 3 están en estado beta, y algunas características de Qiskit Terra's
QuantumCircuitaún no son compatibles. En particular, es posible que se produzcan errores si intenta exportar subrutinas personalizadas con parámetros clásicos, y aún no está previsto exportar operaciones calibradas por impulsos a OpenPulse. -
Cuando se ejecuta el programa
BasisTranslatorde forma aislada con el argumentotargetestablecido en un objetoTargetdonde algunas puertas single-qubit sólo pueden aplicarse a conjuntos no solapados de qubits, el circuito de salida podría incluir incorrectamente operaciones sobre un qubit que no están permitidas por el argumentoTarget. Por ejemplo, si corres:from qiskit.circuit import QuantumCircuit, Parameter from qiskit.circuit.library import UGate, RZGate, XGate, SXGate, CXGate from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel from qiskit.transpiler import PassManager, Target, InstructionProperties from qiskit.transpiler.passes import BasisTranslator gmap = Target() # U gate in qubit 0. theta = Parameter('theta') phi = Parameter('phi') lam = Parameter('lambda') u_props = { (0,): InstructionProperties(duration=5.23e-8, error=0.00038115), } gmap.add_instruction(UGate(theta, phi, lam), u_props) # Rz gate in qubit 1. phi = Parameter("phi") rz_props = { (1,): InstructionProperties(duration=0.0, error=0), } gmap.add_instruction(RZGate(phi), rz_props) # X gate in qubit 1. x_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(XGate(), x_props) # SX gate in qubit 1. sx_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(SXGate(), sx_props) cx_props = { (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115), (1, 0): InstructionProperties(duration=4.52e-7, error=0.00132115), } gmap.add_instruction(CXGate(), cx_props) bt_pass = BasisTranslator(sel, target_basis=None, target=gmap) qc = QuantumCircuit(2) qc.iswap(0, 1) output = bt_pass(qc)outputtendráRZGateySXGateen el qubit 0, aunque esté prohibido. Para corregirlo, normalmente puede ejecutar el traductor de bases una segunda vez (es deciroutput = bt_pass(output)en el ejemplo anterior) para corregirlo. Esto no debería afectar a la salida de la ejecución de la funcióntranspile()y sólo es un problema si ejecuta el pase por sí mismo.
Notas de actualización
-
A partir de esta versión,
from qiskit import *no importará submódulos, sino sólo una lista seleccionada de objetos. Esto podría romper el código existente que utilizafrom qiskit import *y hace referencia a objetos que no forman parte del espacio de nombres actual. Como recordatorio,import *se considera una mala práctica y no debe utilizarse en código de producción. Qiskit establece__all__enqiskit/__init__.pycomo forma de mitigar los efectos de dichas malas prácticas. Si su código muestraname '<something>' is not defined, añadafrom qiskit import <something>e inténtelo de nuevo. -
Los gestores de pases preestablecidos para los niveles de optimización 0, 1, 2 y 3 que se generan mediante
level_0_pass_manager(),level_1_pass_manager(),level_2_pass_manager()ylevel_3_pass_manager()respectivamente, ya no ejecutarán incondicionalmente la funciónTimeUnitConversion. Anteriormente, los gestores de pases preestablecidos siempre ejecutaban este pase independientemente de las entradas del transpilador y del circuito. Ahora este pase sólo se ejecutará si se establece un parámetroscheduling_methodo el circuito contiene unaDelayy el parámetroinstruction_durationsestá activado. Este cambio se realizó en interés del rendimiento en tiempo de ejecución, ya que en algunos casos se ejecuta en circuitos con un gran número de puertas y no se utilizan retardos, temporización o programacióntranspile()en circuitos con un gran número de puertas y sin utilizar retardos, temporización o programación laTimeUnitConversionpodría ser el mayor cuello de botella en la transpilación. -
El método por defecto para
BIPMappinges ahorabalanceden lugar dedepth. Este nuevo objetivo suele dar mejores resultados, ya que tiene en cuenta tanto la profundidad del circuito como el error de puerta. -
La dirección
sort_parameters_by_namede la claseVQEha sido eliminada, tras su desaparición en Qiskit Terra 0.18. No se proporciona ninguna alternativa, ya que el nuevo orden de los parámetros es el más natural. -
Los cajones del circuito
QuantumCircuit.draw()ycircuit_drawer()con la opciónlatexguardarán ahora sus imágenes en un formato determinado la extensión del archivo (si se proporciona un nombre de archivo). Antes, siempre se guardaban en formato PNG. Ahora aparecen enValueErrorsi no se conoce el formato de la imagen. Esto se hizo para facilitar el guardado de la imagen en distintos formatos. -
El requisito de versión de la dependencia principal
retworkxha pasado de 0.9 a 0.10.1. Esto permite varias mejoras de rendimiento en diferentes pases de transpilación. -
El anteriormente obsoleto
conditionkwarg, que fue obsoleto como parte de la versión 0.15.0, ha sido eliminado deDAGCircuit.apply_operation_back()yDAGCircuit.apply_operation_front(). En su lugar, establezca el atributoconditionen lasInstructionque se añaden a la instanciaDAGCircuitutilizandoInstruction.c_if(). -
Se ha eliminado el método
DAGCircuit.extend_back(). Originalmente fue obsoleto en la versión 0.13.0. En su lugar, puede utilizar el métodoDAGCircuit.compose()que es más general y ofrece la misma funcionalidad. -
Se ha eliminado el método
DAGCircuit.compose_back(). Originalmente fue obsoleto en la versión 0.13.0. En su lugar, puede utilizar el métodoDAGCircuit.compose()que es más general y ofrece la misma funcionalidad. -
El
edge_mapkwarg delDAGCircuitmétodocompose()se ha eliminado. Originalmente fue obsoleto en la versión 0.14.0. El método toma unqubitsyclbitskwargs para especificar el orden posicional de los bits a componer en lugar de usar un mapeo de diccionario queedge_mapproporcionaba previamente. -
Se ha eliminado el método
DAGCircuit.twoQ_gates(). Originalmente fue obsoleto en la versión 0.13.0. En su lugar,DAGCircuit.two_qubit_ops()debe utilizarse -
Se ha eliminado el método
DAGCircuit.threeQ_or_more_gates(). Originalmente fue obsoleto en la versión 0.13.0. En su lugar,DAGCircuit.multi_qubit_ops()debe utilizarse el método -
Se ha eliminado el acceso nombrado para el primer argumento posicional del constructor de la
SingleQubitUnitaryconu. Originalmente fue obsoleto en la versión 0.14.0. En su lugar, el primer argumento posicional se puede establecer utilizando el nombreunitary_matrix(o simplemente establecerlo posicionalmente en lugar de por su nombre). -
Acceso con nombre para el primer argumento posicional del método
QuantumCircuitmétodosquconu. Originalmente fue obsoleto en la versión 0.14.0. En su lugar, el primer argumento posicional se puede establecer utilizando el nombreunitary_matrix(o simplemente establecerlo posicionalmente en lugar de por su nombre). -
Se han eliminado los kwargs no utilizados
procynested_scopepara el métodoqasm()de las clases de nodos QASM en el móduloqiskit.qasm.node. Originalmente estaban obsoletos en la versión 0.15.0. -
Se han eliminado los kwargs no utilizados
procynested_scopepara el métodolatex()de las clases de nodos QASM en el móduloqiskit.qasm.node. Originalmente estaban obsoletos en la versión 0.15.0. -
Se han eliminado los kwargs no utilizados
procynested_scopepara el métodoreal()de las clases de nodos QASM en el móduloqiskit.qasm.node. Originalmente estaban obsoletos en la versión 0.15.0. -
La salida de
Statevector.draw()cuando se utiliza la salida"latex"es ahora la nueva convención"ket"si se traza un estado compuesto puramente de qubits. Esto se cambió para que la lectura de la salida fuera más clara, especialmente en contextos educativos, ya que muestra las etiquetas ket, y sólo muestra los elementos distintos de cero. -
Cuando se ejecuta
execute()con unBackendV1los valores por defecto de los kwargsshots,max_credits,meas_level,meas_returnymemory_slot_sizeserán ahora los valores por defecto establecidos en el atributooptionsdel backend de destino. Anteriormente, estos valores predeterminados se establecían para que coincidieran con los valores predeterminados al llamar aexecute()con un backend heredado deBaseBackend. Por ejemplo:from qiskit.test.mock import FakeMumbai from qiskit import QuantumCircuit, execute circuit = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() backend = FakeMumbai() backend.set_options(shots=4096) execute(qc, backend)se ejecutará ahora con
4096disparos. Mientras que en versiones anteriores se ejecutaba con1024. -
La versión mínima compatible de Matplotlib ha pasado de 2.1.0 a 3.3.0. Ahora necesitará tener instalado Matplotlib 3.3.0 si utiliza funciones de visualización basadas en Matplotlib, como el backend
'mpl'para la funcióncircuit_drawer()o la funciónplot_bloch_vector()función. Esto se hizo por dos razones, la primera es porque las versiones recientes de Matplotlib han dejado de utilizar las API en torno a las visualizaciones de 3D que eran compatibles con versiones anteriores y, en segundo lugar, la instalación de versiones anteriores de Matplotlib se estaba volviendo cada vez más difícil ya que las dependencias de matplotlib han causado incompatibilidades que hacían que las pruebas fueran más difíciles. -
El uso interno del generador de números aleatorios en
random_circuit()se ha ajustado, lo que cambiará la salida de las versiones anteriores, incluso con una semilla fija. Esto se hizo para mejorar enormemente el escalado del tiempo de ejecución con el número de qubits utilizados. Si usted dependía de una salida idéntica de una versión anterior, se recomienda que utiliceqpy_serialization.dump()para guardar el circuito aleatorio generado con una versión anterior y en lugar de volver a generarlo con la nueva versión, y en su lugar sólo utiliceqpy_serialization.load()para cargar ese circuito guardado. -
El uso de
*(__mul__) para el métododot()y@(__matmul__) para el métodocompose()deBaseOperator(que es el padre de todas las clases de operadores enqiskit.quantum_infoincluyendo clases comoOperatoryPauli) ya no se admite. El uso de estos operadores ya estaba obsoleto en la versión 0.17.0. En su lugar, debe utilizar las etiquetasdot()ycompose()directamente, o puede utilizarse el operador&(__and__) para los métodoscompose(). Por ejemplo, si antes utilizabas el operador como:from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a @ op_besto debería cambiarse por:
from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a.compose(op_b)o:
new_op = op_a & op_b -
Se han eliminado varios métodos de asignación de parámetros a operandos de instrucciones de programa de pulsos, que han quedado obsoletos en Qiskit Terra 0.17. Esto incluye:
- el método
assign()depulse.Instruction. - el método
assign()deChannel, que es la base deAcquireChannel,SnapshotChannel,MemorySlotyRegisterSlot. - los métodos
assign()yassign_parameters()deParametricPulse, que es la base depulse.Gaussian,pulse.GaussianSquare,pulse.Dragypulse.Constant.
Estos parámetros deben asignarse desde el programa de impulsos (
pulse.Scheduleypulse.ScheduleBlock) en lugar de operandos de la instrucción del programa de pulsos. - el método
-
El método
flatten()depulse.Instructionyqiskit.pulse.Scheduleha sido eliminado y ya no existe según el aviso de depreciación de Qiskit Terra 0.17. Esta transformación se define como una función independiente enqiskit.pulse.transforms.canonicalization.flatten(). -
qiskit.pulse.interfaces.ScheduleComponentha sido eliminado y ya no existe según el aviso de obsoleto de Qiskit Terra 0.15. No se proporcionará ninguna clase alternativa. -
Se han eliminado los argumentos heredados del cajón de pulsos de
pulse.Waveform.draw(),Schedule.draw()yScheduleBlock.draw()y ya no existen según el aviso de obsoleto de Qiskit Terra 0.16. Ahora estos métodos de dibujo sólo admiten argumentos de cajón de pulsos V2. Consulte la documentación de los métodos para más detalles. -
El módulo
qiskit.pulse.rescheduleha sido eliminado y esta ruta de importación ya no existe según el aviso de depreciación de Qiskit Terra 0.14. Utiliceqiskit.pulse.transformsen su lugar. -
Se ha eliminado un método protegido
Schedule._children()y se ha sustituido por una variable de instancia protegida de acuerdo con el aviso de desaprobación de Qiskit Terra 0.17. Ahora se proporciona como atributo públicoSchedule.children. -
Los métodos y propiedades relevantes para Timeslot han sido eliminados y ya no existen en
ScheduleBlockde acuerdo con el aviso de desaprobación de Qiskit Terra 0.17. Dado que esta representación no tiene noción del tiempo de instrucciónt0, la información sobre las franjas horarias estará disponible después de que se transforme a aSchedule. Los atributos correspondientes se han proporcionado después de esta conversión, pero ya no son compatibles. Se eliminan los siguientes atributos:timeslotsstart_timestop_timech_start_timech_stop_timeshiftinsert
-
Las transformaciones del programa de impulsos de alineación se han eliminado y ya no existen, según el aviso de obsoleto de Qiskit Terra 0.17. Estas transformaciones se integran y aplican en el contexto
AlignmentKinddel bloque de programación. Se eliminan las siguientes funciones de transformación explícitas:qiskit.pulse.transforms.align_equispacedqiskit.pulse.transforms.align_funcqiskit.pulse.transforms.align_leftqiskit.pulse.transforms.align_rightqiskit.pulse.transforms.align_sequential
-
Los comandos redundantes del generador de impulsos se han eliminado y ya no existen, de acuerdo con el aviso de desaprobación de Qiskit Terra 0.17.
pulse.builder.call_scheduleypulse.builder.call_circuitse han integrado enpulse.builder.call(). -
Se ha eliminado un filtro interno que hacía que se mostraran todas las advertencias de depreciación de Qiskit. Esto significa que el comportamiento ahora volverá al comportamiento estándar de Python para las depreciaciones; sólo debería ver un
DeprecationWarningsi ha sido activado por código en el archivo de script principal, sesión de intérprete o cuaderno Jupyter. El usuario ya no será culpado con una advertencia si las funciones internas de Qiskit llaman a comportamientos obsoletos. Si escribes bibliotecas, de vez en cuando deberías ejecutarlas con los filtros de advertencia por defecto desactivados, o tener pruebas que siempre se ejecuten con ellos desactivados. Consulte la documentación de Python sobre advertencias y, en particular, la sección sobre pruebas de deprecación para obtener más información sobre cómo hacerlo. -
Algunas advertencias sólo se emitían una vez, aunque se activaran desde varios lugares. Este comportamiento se ha eliminado, por lo que es posible que si llama a funciones obsoletas, vea más advertencias que antes. Deberías cambiar cualquier llamada a funciones obsoletas a las versiones sugeridas, porque las formas obsoletas serán eliminadas en futuras versiones de Qiskit.
-
El módulo obsoleto
qiskit.schemasy el móduloqiskit.validationque construyen el validador jsonschema a partir de los esquemas han sido eliminados. Esta función quedó obsoleta en la versión 0.17.0 y ha sido sustituida por un repositorio específico para los esquemas de carga útil de la API Quantum IBM.Si confiaba en los archivos de esquema previamente empaquetados en
qiskit.schemaso en los validadores creados a partir de ellos, deberá utilizar ese repositorio y crear validadores a partir de los archivos de esquema que contiene. -
Las funciones
qiskit.qobj.validate_qobj_against_schemayqiskit.qobj.common.validatorjunto con el kwargvalidatede los métodosQasmQobj.to_dict(),PulseQobj.to_dict()yQobj.to_dict(). Se eliminaron en la versión 0.17.0. Si utilizaba estas funciones, tendrá que crear manualmente funciones de validación jsonschema para los objetosQobjutilizando los archivos jsonschema del repositorio dedicado a los esquemas de carga útil de la API IBM Quantum. -
Los paquetes
fastjsonschemayjsonschemaya no figuran en la lista de requisitos de qiskit-terra. Se ha eliminado el uso interno de jsonschema y ya no son necesarios para utilizar qiskit-terra. -
La excepción lanzada por la función
assemble()cuando se pasan parámetros no válidos para construir una funciónPulseQobjha cambiado deSchemaValidationErroraQiskitError. Esto era necesario porque la claseSchemaValidationErrorse eliminó junto con el resto de las clases obsoletasqiskit.schemasyqiskit.validation. Esto también lo hace más coherente con otras condiciones de error deassemble()que ya planteaban un errorQiskitError. -
El pase de enrutamiento y el pase de diseño predeterminados para el nivel de optimización 3 del transpilador han cambiado para utilizar
SabreSwapySabreLayoutrespectivamente. Esto se hizo para mejorar la calidad del resultado de salida, ya que el uso de los pases de sable produce mejores resultados que el uso deStochasticSwapyDenseLayoutque se utilizaban por defecto en versiones anteriores. Este cambio mejorará la calidad de los resultados al ejecutartranspile()oexecute()con el kwargoptimization_levelajustado a3. Aunque en general esto es una mejora, si por alguna razón necesita mantener el comportamiento anterior, puede hacerlo estableciendo explícitamenterouting_method="stochastic"ylayout_method="dense"al llamar atranspile()conoptimization_level=3. -
El tipo de retorno de
pauli_basis()cambiará dePauliTableaPauliListen una futura versión de Qiskit Terra. Para cambiar inmediatamente al nuevo comportamiento, pase el argumento de palabra clavepauli_list=True. -
El atributo
namede la claseSingleQubitUnitaryse ha cambiado deunitaryasqu. Esto era necesario para evitar un conflicto con el nombre de la claseUnitaryGateque también eraunitaryya que las 2 puertas no son lo mismo y no tienen la misma implementación (y no se pueden utilizar indistintamente). -
La versión mínima de Symengine necesaria para la instalación se ha aumentado a 0.8.0. Esto era necesario para solucionar algunos problemas con el manejo de
numpy.float16ynumpy.float32valores cuando se ejecutabind()para enlazar parámetros en un archivoParameterExpression. -
Se ha añadido un nuevo estibador dependiente a la lista de requisitos. Esto es requerido por qiskit-terra, ya que se utiliza para construir la interfaz de plugin de síntesis unitaria.
Notas sobre características en desuso
-
El atributo
gatey el parámetro de inicialización deqiskit.transpiler.passes.Decomposeestá obsoleto y se eliminará en una futura versión. En lugar de esta única puerta, debe pasar una lista de nombres de puertas al nuevo parámetrogates_to_decompose. Esto se ha hecho porque el nuevo formulario permite seleccionar más de una compuerta como objetivo de descomposición, lo que es más flexible, y no es necesario volver a ejecutar el pase varias veces para descomponer un conjunto de compuertas. -
Se ha producido una importante reorganización del paso del transpilador en lo que respecta a las calibraciones. Las vías de importación:
from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilder from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilderNoEchoestán obsoletos y se eliminarán en una futura versión. La ruta de importación:
from qiskit.transpiler.passes.scheduling.rzx_templates import rzx_templatestambién está obsoleto y se eliminará en una futura versión. Debe utilizar las nuevas rutas de importación:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.transpiler.passes import RZXCalibrationBuilderNoEcho from qiskit.transpiler.passes.calibration.rzx_templates import rzx_templates -
La clase
DAGNodeha quedado obsoleta como clase independiente y en el futuro sólo se utilizará como clase padre de las clasesDAGOpNode,DAGInNodeyDAGOutNode. Como parte de esta eliminación, los siguientes kwargs y atributos asociados enDAGNodetambién quedan obsoletos:type,op, ywire. -
Para el constructor de
RZXCalibrationBuilderpasar un backend como primer argumento posicional o con el kwargbackendestá obsoleto y dejará de funcionar en futuras versiones. En su lugar, debe pasarse unInstructionScheduleMapdebe pasarse directamente al kwarginstruction_schedule_mapy una lista de listas de nombres de canales para cada qubit debe pasarse directamente aqubit_channel_mapping. Por ejemplo, si llamaras al pase como:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() cal_pass = RZXCalibrationBuilder(backend)en vez de eso deberías llamarlo como:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() inst_map = backend.defaults().instruction_schedule_map channel_map = self.backend.configuration().qubit_channel_mapping cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, )Este cambio es necesario porque como regla general los objetos backend no son serializables en pickle y se rompería cuando se usara con múltiples procesos dentro de
transpile()al compilar varios circuitos a la vez. -
La propiedad
labelde la claseMCMTy subclaseMCMTVChainha quedado obsoleta y se eliminará en una futura versión. En consecuencia, el kwarglabeldel constructor de ambas clases también queda obsoleto, junto con el kwarglabeldel métodoMCMT.control(). Actualmente, la propiedadlabelse utiliza para nombrar el objetivo controlado cuando se compone de más de un qubit objetivo, sin embargo, esto nunca fue pensado para ser especificable por el usuario, y puede resultar en una puerta MCMT incorrecta si se utiliza el nombre de una operación bien conocida. Una vez obsoleta, la propiedadlabelya no podrá ser especificada por el usuario. Sin embargo, puede obtener el nombre generado del objetivo controlado medianteMCMT.data[0][0].base_gate.name -
El método
subgraph()de la claseCouplingMapestá obsoleto y se eliminará en una futura versión. En su lugar debe utilizarse el métodoreduce()que hace lo mismo excepto que preserva el orden de la lista de nodos para la salidaCouplingMap(mientras quesubgraph()no conserva el orden de la lista). -
La creación de una instancia de
InstructionSetcon el argumentocircuit_cregsestá obsoleto. En general, estas clases nunca necesitan ser construidas por los usuarios (pero se utilizan internamente), pero si lo necesita, debe pasar un callable como argumento de la palabra claveresource_requester. Por ejemplo:from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet from qiskit.circuit.exceptions import CircuitError def my_requester(bits, registers): bits_set = set(bits) bits_flat = tuple(bits) registers_set = set(registers) def requester(specifier): if isinstance(specifer, Clbit) and specifier in bits_set: return specifier if isinstance(specifer, ClassicalRegster) and specifier in register_set: return specifier if isinstance(specifier, int) and 0 <= specifier < len(bits_flat): return bits_flat[specifier] raise CircuitError(f"Unknown resource: {specifier}") return requester my_bits = [Clbit() for _ in [None]*5] my_registers = [ClassicalRegister(n) for n in range(3)] InstructionSet(resource_requester=my_requester(my_bits, my_registers)) -
El uso de las clases de mitigación de medidas
qiskit.ignis.mitigation.CompleteMeasFitteryqiskit.ignis.mitigation.TensoredMeasFitterdeqiskit-igniscomo valores para el kwargmeasurement_error_mitigation_clsdel constructor de la claseQuantumInstanceestá obsoleto y se eliminará en una futura versión. En su lugar, las clases equivalentes deqiskit.utils.mitigation,CompleteMeasFitteryTensoredMeasFitter. Esto era necesario, ya que el proyectoqiskit-ignisha quedado obsoleto y dejará de recibir apoyo en un futuro próximo. Cabe señalar que, a diferencia de las clases equivalentes deqiskit-ignis, las versiones deqiskit.utils.mitigationsólo se admiten en su uso conQuantumInstance(es decir, como clase y no como instancia con el kwargmeasurement_error_mitigation_cls) y no están pensadas para un uso independiente. -
El método
Optimizer.optimize()para todos los optimizadores (Optimizery clases derivadas) está obsoleto y se eliminará en una futura versión. En su lugar, debe utilizarse el métodoOptimizer.minimize()que imita la firma de la función SciPy’sminimize().Para sustituir la actual llamada a optimizar por minimizar puedes sustituir
xopt, fopt, nfev = optimizer.optimize( num_vars, objective_function, gradient_function, variable_bounds, initial_point, )con
result = optimizer.minimize( fun=objective_function, x0=initial_point, jac=gradient_function, bounds=variable_bounds, ) xopt, fopt, nfev = result.x, result.fun, result.nfev -
Al importar el módulo
qiskit.utilahora se emitirá unDeprecationWarning. En su lugar, los usuarios deberían importar toda la misma funcionalidad deqiskit.utils. El móduloutilestá obsoleto desde Terra 0.17, pero antes no emitía ninguna advertencia. Se eliminará en Terra 0.20. -
La propiedad
tableestá obsoleta y se eliminará en una futura versión. Esto se debe a queSparsePauliOpse ha actualizado para utilizar internamentePauliListen lugar dePauliTable. El objetivo es mejorar considerablemente el rendimiento. Ahora debería acceder a losPauliListutilizando el atributoSparsePauliOp.paulisatributo.
Corrección de errores
-
Se ha corregido un error por el que muchos métodos de diseño ignoraban las puertas de 3 o más qubits, lo que provocaba decisiones inesperadas sobre la distribución del diseño. El pase de transpilador
Unroll3qOrMorese ejecuta ahora antes que el pase de maquetación en todos los gestores de pases predefinidos cuando se llama atranspile()se llama. Corregido #7156. -
Los circuitos desmontados heredan ahora las calibraciones de los montados
QasmQobjy experimentos. Correcciones #5348. -
Se ha corregido la configuración de los atributos
ansatzooptimizerde una instancia aVQEaNone, lo que provocaba un error de comportamiento. Véase el nº 7093 para más detalles. -
Corregida la adición de
PauliLists conqargs. El método utilizado para lanzar un error en tiempo de ejecución si los operandos tenían diferentes números de qubits. -
Se ha corregido un problema que provocaba un error al intentar calcular un gradiente con la clase
CircuitGradientpara una puerta que no era compatible. Esta corrección de errores transpila una puerta dada al conjunto de puertas admitidas para un método de gradiente solicitado. Correcciones #6918. -
Eliminados los resultados de calibración al utilizar la mitigación de errores con el
execute()método deQuantumInstance. Corrige #7129. -
Se ha corregido una advertencia de obsoleto que se emitía al ejecutar
QuantumCircuit.draw()ocircuit_drawer()con Sympy 1.9 instalado, mencionando la función de Sympyexpr_free_symbols(). Los dibujantes de circuitos utilizaron anteriormente este método para encontrar instancias de constantes simbólicas. -
Se ha solucionado un problema por el que el kwarg de
axy la opciónfigwidthdel kwarg destylepara el cajón del circuitomplno se escalaban correctamente. Los usuarios pueden ahora pasar unaxdesde una subparcela Matplotlib al cajón de circuitosmply el circuito se dibujará dentro de los límites de esa subparcela. Alternativamente, los usuarios pueden establecer elfigwidthen pulgadas en elstyledict kwarg y el dibujo se escalará a la anchura en pulgadas que se estableció. Corregido #6367. -
Se ha solucionado un problema con la función
circuit_drawer()y el métododraw()deQuantumCircuit. Al mostrar una instrucciónmeasuredirigida a un bit clásico en lugar de a un registro, utilizando la opción de cajónlatex, el cajón fallaba. -
Se ha solucionado un problema con la función
circuit_drawer()y el métododraw()deQuantumCircuit. Con cualquiera de las 3 opciones de cajón,mpl,latex, otext, si se encontrara una puerta con una condición clásica condicionada a un bit clásico sin registro, el cajón fallaría. -
Se ha solucionado un problema con la función
circuit_drawer()y el métododraw()deQuantumCircuit. Con cualquiera de las 3 opciones de cajón,mpl,latex, otext, si una puerta con una condición clásica estuviera condicionada al mismo bit clásico que unmeasurey el bit al que se dirigiera la medida no tuviera un registro, el cajón fallaría. -
C3SXGatetiene ahora una descomposición y una representación matricial correctas. Antes equivalía aSdgXGate().control(3), en lugar de la pretendidaSXGate().control(3). -
El miembro
namedeqiskit.test.mock.utils.ConfigurableFakeBackendse ha cambiado abackend_name. Esto se hizo para evitar un conflicto con el métodoname()heredado de la clase abstractaBackendV1padre. Esto hace queConfigurableFakeBackendsea compatible con cualquier cosa que espere unBackendV1objeto. Sin embargo, si antes utilizaba el atributonamedirectamente, ahora tendrá que llamarlo como método o acceder al atributobackend_nameen su lugar. -
Se ha corregido un problema por el que al llamar a
QuantumCircuit.decompose()en un circuito que contenía unInstructioncuyo atributodefinitionestaba vacío dejaba la instrucción en su lugar, en lugar de descomponerla en cero operaciones. Por ejemplo, con un circuito:from qiskit.circuit import QuantumCircuit empty = QuantumCircuit(1, name="decompose me!") circuit = QuantumCircuit(1) circuit.append(empty.to_gate(), [0])Antes, llamar a
circuit.decompose()no cambiaba el circuito. Ahora, la descomposición correcta descompondráemptyen cero instrucciones. Ver #6997 para más información. -
Se ha solucionado un problema con la función
circuit_drawer()y el métododraw()deQuantumCircuit. Al visualizar una instrucciónmeasureque contenía unaconditionclásica utilizando las opcionesmplolatex, la informaciónconditionsobrescribía a veces la visualizaciónmeasure. -
Se ha solucionado un problema con la función
circuit_drawer()y el métododraw()deQuantumCircuit. El cajónmplutiliza la notación hexadecimal para mostrar el valorcondition, mientras que los cajonestextylatexutilizan la notación decimal. Ahora los tres cajones utilizan notación hexadecimal. -
Se ha corregido un error en el paso de transpilación del optimizador Hoare por el que podía intentar eliminar una puerta dos veces si se podía combinar por separado tanto con su predecesora como con su sucesora para formar la identidad. Consulte el nº 7271 para más detalles.
-
Hacer que una instrucción sea condicional con el método estándar
InstructionSet.c_if()con índices enteros es ahora coherente con el esquema de numeración utilizado por las instruccionesQuantumCircuitdel que forman parte las instrucciones. Anteriormente, si había dosClassicalRegisters conClbits, la numeración sería incorrecta. Ver #7246 para más detalles. -
Si se condiciona una instrucción con el método estándar
InstructionSet.c_if()tendrá ahora éxito, incluso si no hayClassicalRegisters en el circuito. Ver #7250 para más detalles. -
Condicionar una instrucción con el método estándar
InstructionSet.c_if()cuando se utiliza una instrucciónClbitque está contenido en unClassicalRegisterde tamaño uno creará ahora correctamente una condición sobre el bit, no sobre el registro. Ver #7255 para más detalles. -
Si se intenta condicionar una instrucción con el método estándar
InstructionSet.c_if()dará lugar a un error si el recurso clásico no está presente en el circuito. Ver #7255 para más detalles. -
Se ha solucionado un problema de compatibilidad con Matplotlib 3.5, por el que la esfera Bloch no se renderizaba si tenía algún vector adjunto, como por ejemplo al utilizar
plot_bloch_vector. Ver #7272 para más detalles. -
Se ha corregido un problema por el que el método
NLocal.add_layer()añadía capas incorrectamente si el objetoNLocalya había sido creado. -
Solucionado un problema con el decapado
InstructionScheduleMapcuando se utiliza Python 3.6. Consulte el nº 6944 para más detalles. -
Se ha corregido la asignación de parámetros de pulso de valor complejo con symengine. Por ejemplo:
from qiskit import circuit, pulse import numpy as np amp = circuit.Parameter("amp") phase = circuit.Parameter("phase") with pulse.build() as sched: pulse.play(pulse.Gaussian(160, amp * np.exp(1j * phase), 40), pulse.DriveChannel(0)) sched.assign_parameters({amp: 0.1, phase: 1.57}, inplace=True)La amplitud asignada se ha mostrado como
ParameterExpression(0.1*exp(1.57*I))después de que se introdujera el uso desymengineen la versión 0.18.0. Ahora se evalúa correctamente y se muestra como7.96327e-05 + 0.0999999683j. -
Se ha solucionado un problema por el que
QAOA.construct_circuit()con diferentes operadores con el mismo número de qubits generaba el mismo circuito cada vez. Ver #7223 para más detalles. -
Se ha corregido un problema por el que
QAOAAnsatztenía un número incorrecto de parámetros si se daban identidades dePauliSumOp, por ejemplo,PauliSumOp.from_list([("III", 1)]). Ver #7225 para más detalles. -
Se ha corregido un error por el que el método
QuantumCircuit.qasm()podía devolver OpenQASM 2 instrucciones con identificadores no válidos. El mismo error se ha corregido enUnitaryGate. -
Se ha solucionado un problema por el que al intentar mostrar bits sin registro se producía un fallo en
mply en los cajones del circuitolatex. Se ha eliminado un_inicial de la visualización de los números de bits sin registro en el cajóntext. Corregido #6732. -
Para los registros de un bit, todos los cajones de circuito muestran ahora sólo el nombre del registro y ya no muestran el subíndice
0. Corregido #5784. -
Corregidas las colisiones de nombres de registros implícitos en
QuantumCircuit.qasmcuando se trata de qubits y clbits sin registro. Anteriormente, los qubits y clbits sin registro se colocaban en los correspondientesqregycreg, ambos llamadosregless, a pesar de la colisión. Ahora tendrán nombres separados, generados de forma determinista, que no entrarán en conflicto con ningún nombre de registro definido por el usuario en el circuito. -
Se ha solucionado un problema en la programación de circuitos con operaciones clbits, por ejemplo, mediciones, puertas condicionales, actualización
ASAPSchedule,ALAPScheduleyAlignMeasures. Los planificadores actualizados asumen que todas las operaciones de E/S en clbits no llevan tiempo,measureescribe el valor medido en un clbit al final, yc_iflee el valor condicional en clbit(s) al principio. Corregido #7006. -
La llamada a
transpileen una lista vacía ahora devolverá correctamente una lista vacía sin emitir una advertencia. Corregido #7287. -
Se ha corregido un problema en
PiecewiseChebyshevcuando la función a aproximar era constante. En estos casos, ahora debe pasar la constante directamente como el argumentof_x, en lugar de utilizar una función, como:from qiskit.circuit.library.arithmetic import PiecewiseChebyshev PiecewiseChebyshev(1.0, degree=3)Ver #6707 para más detalles.
-
Si una instancia del algoritmo
HHLse construyera sin una propiedadQuantumInstance(por defecto), los intentos de utilizar las propiedades getter y setter para leer o establecer una instancia más tarde fallarían. Los getters y setters ahora funcionan como se esperaba. -
El método
QuantumCircuit.qasm()edita ahora los nombres de las copias de las instrucciones presentes en el circuito, no las instrucciones originales que viven encircuit.data. Consulte el nº 6952 para más detalles. -
Se ha corregido un error en
PauliSumOp.permute()que provocaba el error:QiskitError: 'Pauli string label "" is not valid.'si la permutación tuviera el mismo número de términos de Pauli. La llamada a
permute([2, 1, 0])enX ^ Y ^ Zya no produce un error, y ahora devuelveZ ^ Y ^ X. -
Se ha corregido un error por el que los límites de los parámetros del mezclador en la ventana
QAOAAnsatzno se establecían. -
Determinación fija de las operaciones finales (barreras y medidas) en pass
RemoveFinalMeasurementsy en métodoremove_final_measurements()de la claseQuantumCircuitque antes sólo consideraba los nodos inmediatamente anteriores a un nodo de salida. -
Determinación fija de las operaciones finales en pass
RemoveFinalMeasurementsy en el métodoremove_final_measurements()de la claseQuantumCircuitque podía considerar erróneamente una barrera como final, incluso si otras operaciones del circuito la seguían. -
Corregida la eliminación de registros clásicos multibit en pass
RemoveFinalMeasurementsy en el métodoremove_final_measurements()de la claseQuantumCircuitdonde los registros clásicos no se eliminaban aunque otros bits estuvieran ociosos, a menos que se hiciera una medida final en todos y cada uno de los bits. Ahora, los registros clásicos que quedan inactivos como resultado de la eliminación de las medidas finales y las barreras se eliminan siempre. Los bits clásicos se eliminan si son referenciados sólo por los registros eliminados o no son referenciados en absoluto y se vuelven ociosos debido a la eliminación. Esta corrección también añade una gestión adecuada de los registros con bits subyacentes compartidos. -
Se ha corregido un problema con
RemoveFinalMeasurementsque podía provocar que elDAGCircuitresultante no fuera válida. Consulte el nº 7196 para obtener más información. -
Solucionado un problema con el método
remove_final_measurements()de la claseQuantumCircuitque provocaba queQuantumCircuit.clbitsfuera incorrecto después de la invocación. Consulte el nº 7089 para más detalles. -
Al estrechar un operador cero vacío en
qiskit.opflowel código, al detectar que era cero, registraba una advertencia y devolvía el operador original. Tales operadores se encuentran comúnmente en los operadores auxiliares, cuando se utiliza Qiskit Nature, y el comportamiento anterior causó queVQElanzara una excepción ya que los operadores cónicos distintos de cero eran un número diferente de qubits de los operadores cónicos cero (ya que el cónico ha devuelto el operador de entrada sin cambios). Ahora, el código reducirá correctamente un operador cero de forma que el número de qubits se reduzca según lo esperado y coincidirá con los operadores cónicos distintos de cero, por ejemplo,`0*"IIII"`cuando reduzcamos 3 qubits se convertirá en0*"I". -
Se ha corregido un problema con el método
draw()y la funcióncircuit_drawer()por el que un estilo personalizado establecido a través del archivo de configuración del usuario (es decir,settings.conf) ignoraría el valor establecido del campocircuit_mpl_stylesi el kwargstylede la función/método no estuviera establecido.
Otras notas
-
La cadena lanzada para
qiskit.circuit.ParameterExpressionya no tiene precisión total. Esto elimina el final 0s cuando se imprimen parámetros que están vinculados a flotadores. Esto tiene consecuencias para la serialización QASM y el cajón de texto del circuito:>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> str(x.bind({x:0.5})) '0.5' # instead of '0.500000000000000' -
El sitio
QAOAAnsatzse ha actualizado para utilizar el símbolo de parámetroγpara el operador de coste yβpara el operador mezclador, como es la notación estándar en la literatura de QAOA.
Aer 0.9.1
No cambia
Ignis 0.7.0
Preludio
Esta versión deja obsoleto el proyecto Qiskit Ignis, que ha sido sustituido por el proyecto Qiskit Experiments y cuyo desarrollo activo ha cesado. A pesar de estar obsoleto, se seguirán realizando correcciones de errores críticos y correcciones de compatibilidad para proporcionar a los usuarios una oportunidad suficiente para migrar fuera de Ignis. Una vez transcurrido el periodo de obsoleto (que no será inferior a 3 meses a partir de esta versión), el proyecto se retirará y archivará.
Nuevas funciones
-
Actualizado el protocolo de acreditación para utilizar la rutina de adaptación de https://arxiv.org/abs/2103.06603.
AccreditationFittertiene ahora los métodos FullAccreditation (protocolo anterior) y MeanAccreditation (nuevo protocolo). Además, la introducción de datos se ha modificado para utilizar el objeto de resultado AppendResult o una lista de cadenas AppendStrings.qiskit.ignis.verification.QOTPCorrectString()también se añadió. -
Se ha añadido la opción de generación analítica rápida de gráficos de síndrome. El
RepetitionCodetiene ahora un nuevo argumento boolbrute, que permite seguir utilizando el método de fuerza bruta. Clase auxiliarRepetitionCodeSyndromeGeneratorañadida para facilitarlo. -
RepetitionCodetiene ahora argumentos de palabra claveresetsydelay. El primero determina si se insertan compuertas de reset tras la medición. Este último permite especificar un tiempo (en dt) para un retardo después de cada medición (y puesta a cero, si procede).El método
syndrome_measurement()deRepetitionCodetiene ahora argumentos de palabra clavefinalydelay. El primero determina si hay que añadir puertas de reinicio de acuerdo con el globalresets, o sobrescribirlo con un comportamiento apropiado para la ronda final de mediciones del síndrome. Este último permite especificar un tiempo (en dt) para un retardo después de cada medición (y puesta a cero, si procede). -
La clase
RepetitionCodesoporta ahora la codificación con estados base x. Se puede utilizar estableciendo el argumento de la palabra clavexbasisal construir un objetoRepetitionCode.
Notas de actualización
-
Se ha eliminado la palabra clave
resetdel métodosyndrome_measurement()deRepetitionCode. Se sustituye por el argumento de palabra clave globalresetspara la clase, así como por el argumento de palabra clavefinalparasyndrome_measurement. En los casos en los que anteriormente se añadía la ronda de medición final utilizandoreset=Falsepara evitar las puertas de reinicio final, ahora se debe utilizarfinal=True. -
Elimine
ParametrizedScheduledeupdate_u_gates().ParametrizedSchedulefue obsoleto como parte de Qiskit-terra 0.17.0 y será eliminado en la próxima versión. La función actualiza ahora las puertas u con programasScheduleque implican objetosParameterno asignados.
Notas sobre características en desuso
-
Métodos obsoletos en
AccreditationFittera saber bound_variation_distance y single_protocol__run -
El proyecto Qiskit Ignis en su conjunto ha quedado obsoleto y el proyecto será retirado y archivado en el futuro. Aunque está obsoleto, sólo se realizarán correcciones de compatibilidad y correcciones de errores críticos en el proyecto. En lugar de utilizar Qiskit Ignis debe migrar a utilizar Qiskit Experimentos en su lugar. Puede consultar la guía de migración:
https://github.com/qiskit-community/qiskit-ignis#migration-guide