Gestor de contraseñas
qiskit.passmanager
Visión general
El gestor de pases Qiskit se inspira en cierta medida en el compilador LLVM, pero está diseñado para tomar como entrada un objeto Python en lugar de código fuente plano.
El gestor de pases convierte el objeto de entrada Python en una representación intermedia (RI), y puede optimizarse y rebajarse con una variedad de transformaciones a lo largo de múltiples pases. El marco del gestor de pases puede emplear múltiples IR con pases de conversión intercalados, dependiendo del contexto de la optimización.
Actualmente no hay ningún uso/diseño real de múltiples IRs en los gestores de pases incorporados de Qiskit. La implementación del módulo passmanager es agnóstica a los tipos reales del IR (es decir, no se realiza una comprobación de tipo estricta), y el gestor de pases funciona siempre que el IR implemente todos los métodos requeridos por los pases posteriores. Es posible que en una futura versión se ofrezca un diseño concreto para el uso de múltiples IR.
Los pases pueden consumir las restricciones de hardware que el backend Qiskit puede proporcionar. Por último, el IR se convierte de nuevo en algún objeto de Python. Tenga en cuenta que el tipo de entrada y el tipo de salida no son necesariamente iguales.
La compilación en el gestor de pases es una cadena de ejecuciones de Task que toman una RI y dan como resultado una nueva RI con alguna optimización o análisis de datos. Una tarea atómica es un pase que es una subclase de GenericPass que implementa un método run() que realiza algún trabajo sobre el IR recibido. Un conjunto de pases puede formar un controlador de flujo, que es una subclase de BaseControllerque puede implementar una lógica arbitraria dependiente del estado de compilación para decidir qué pase se ejecutará a continuación. Comparte datos intermedios a través del objeto PropertySet que es un diccionario de forma libre. Un pase puede rellenar el diccionario de conjuntos de propiedades durante la ejecución de la tarea. Un controlador de flujo también puede consumir el conjunto de propiedades para controlar la ejecución del pase, pero este acceso debe ser de sólo lectura. El conjunto de propiedades es portátil y se transfiere de una pasada a otra durante la ejecución. Además del conjunto de propiedades, las tareas también reciben una WorkflowStatus estructura de datos. Este objeto se inicializa cuando se ejecuta el gestor de pases y se entrega a las tareas subyacentes. El estado se actualiza después de cada pasada, y contiene información sobre el estado de la tubería (número de pasadas ejecutadas, estado de fallo, etc.) en contraposición a la función PropertySetque contiene información sobre el IR que se está optimizando.
Un gestor de pases es una envoltura del controlador de flujo, con responsabilidades de
- Programación de tareas de optimización,
- Conversión de un objeto de entrada Python a un IR Qiskit determinado,
- Inicialización de un conjunto de propiedades y estado del flujo de trabajo,
- Ejecución de tareas programadas para aplicar una serie de transformaciones a la IR,
- Conversión de la IR en un objeto de salida Python.
Esto indica que el controlador de flujo en sí es agnóstico en cuanto al tipo, y que un desarrollador debe implementar una subclase del controlador de flujo BasePassManager para gestionar los pasos de conversión de datos. Este velo de ignorancia nos permite elegir la representación de datos más eficiente para una determinada tarea de gestión de pases, al tiempo que podemos reutilizar la maquinaria de control de flujo para distintos tipos de entrada y salida.
Un controlador de flujo único siempre toma un único objeto IR y devuelve un único objeto IR. El paralelismo para múltiples objetos de entrada se soporta BasePassManager mediante la difusión del controlador de flujo a través de la función parallel_map() función
Ejemplos
Analizamos una tarea de optimización sencilla, que consiste en preparar una serie de números y eliminar un dígito si el número es cinco. Esta tarea se puede realizar fácilmente convirtiendo los números de entrada en cadenas de caracteres. Aquí utilizamos el marco de gestión de pases; dejando de lado por un momento la eficiencia, vamos a aprender a crear un compilador personalizado de Qiskit.
from qiskit.passmanager import BasePassManager, GenericPass, ConditionalController
class ToyPassManager(BasePassManager):
def _passmanager_frontend(self, input_program: int, **kwargs) -> str:
return str(input_program)
def _passmanager_backend(self, passmanager_ir: str, in_program: int, **kwargs) -> int:
return int(passmanager_ir)Este gestor de pasadas introduce y extrae un número entero, mientras que realiza las tareas de optimización sobre los datos de una cadena. Por lo tanto, los tipos de entrada, IR y salida son entero, cadena y entero, respectivamente. El método _passmanager_frontend() define la conversión de los datos de entrada a IR, y _passmanager_backend() define la conversión de IR a datos de salida. El backend del gestor de pases también recibe un parámetro in_program que contiene el input_program original del front end, para referenciar cualquier metadato original del programa de entrada para la conversión final.
A continuación, implementamos un pase que elimina un dígito cuando el número es cinco.
class RemoveFive(GenericPass):
def run(self, passmanager_ir: str):
return passmanager_ir.replace("5", "")
task = RemoveFive()Por último, creamos una instancia del gestor de pases y programamos la tarea con él. Al ejecutar el gestor de contraseñas con una secuencia aleatoria de números, se obtienen nuevos números que no contienen el cinco.
pm = ToyPassManager()
pm.append(task)
pm.run([123456789, 45654, 36785554])Salida:
[12346789, 464, 36784]Consideremos ahora el caso de la ejecución condicional. Evitamos la ejecución de la tarea "eliminar cinco" cuando el número de entrada tiene seis dígitos o menos. Este control puede realizarse mediante un regulador de caudal. Partimos de un paso de análisis que proporciona al controlador de flujo información sobre el número de dígitos.
class CountDigits(GenericPass):
def run(self, passmanager_ir: str):
self.property_set["ndigits"] = len(passmanager_ir)
analysis_task = CountDigits()A continuación, envolvemos la tarea remove five con el comando ConditionalController que ejecuta las tareas almacenadas sólo cuando se cumple la condición.
def digit_condition(property_set):
# Return True when condition is met.
return property_set["ndigits"] > 6
conditional_task = ConditionalController(
tasks=[RemoveFive()],
condition=digit_condition,
)Como antes, programamos estos pases con el gestor de pases y a correr.
pm = ToyPassManager()
pm.append(analysis_task)
pm.append(conditional_task)
pm.run([123456789, 45654, 36785554])Salida:
[12346789, 45654, 36784]La tarea "eliminar cinco" sólo se activa para los valores de entrada primero y tercero, que tienen más de seis dígitos.
Gracias al marco de trabajo del gestor de pasadas, un desarrollador puede personalizar con flexibilidad la tarea de optimización combinando varias pasadas y controladores de flujo. Consulte los detalles en la siguiente documentación de la API de la clase.
Interfaz
clases base
BasePassManager([tareas, max_iteración] ) | Clase base del gestor de pases. |
BaseController([opciones] ) | Clase base del controlador. |
GenericPass() | Clase base de una tarea de gestión de una sola pasada. |
Controladores de flujo
FlowControllerLinear([tareas, opciones] ) | Un controlador de flujo estándar que ejecuta las tareas una tras otra. |
ConditionalController([tareas, condición,...] ) | Un controlador de flujo ejecuta la canalización una vez si la condición es verdadera, o no hace nada si la condición es falsa. |
DoWhileController([tareas, do_while, opciones] ) | Ejecute las tareas dadas en un bucle hasta que la condición do_while en el conjunto de propiedades se convierta en False. |
Estado de compilación
PropertySet | Un objeto tipo diccionario por defecto. |
WorkflowStatus([count, completed_passes,...] ) | Recopilación del estado de compilación del flujo de trabajo, es decir, ejecución del gestor de pases. |
PassManagerState(workflow_status, property_set) | Un objeto contenedor portátil que pasa tareas de gestión se comunican a través de generador. |
Excepciones
PassManagerError
exception qiskit.passmanager.PassManagerError(*message)
Bases: QiskitError
Error del gestor de pases.
Configura el mensaje de error.