El Blog de QPath
Uso de Q Provider Factory de QuantumPath® con programas cuánticos implementados con Ocean SDK
Q Provider Factory es una librería Python de QrEngineer APP que permite adaptar al ecosistema QuantumPath® programas cuánticos desarrollados con diferentes SDKs de los principales proveedores cuánticos con el objetivo de facilitar a los desarrolladores el uso de todas las funcionalidades y ventajas de QPath® sin que el usuario tenga que renunciar a trabajar con su SDK favorito [1].
Una de las tecnologías soportadas por Q Provider Factory es Ocean SDK, software de desarrollo Python proporcionado por D-Wave que permite resolver problemas de optimización en sus computadoras cuánticas annealing.
A continuación mostraremos, paso a paso, como usar Q Provider Factory para transpilar y ejecutar, a través de QuantumPath®, un programa cuántico implementado con Ocean SDK. El ejemplo escogido para el artículo es el problema de optimización “Nurse Scheduling”, cuyo código fuente puede encontrarse en el repositorio GitHub de D-Wave, donde hay un extenso catálogo de ejemplos de problemas de optimización implementados con este SDK.
Uso de Q Provider Factory
· Instalar QrEngineer SDK.
Para trabajar con Q Provider Factory, es necesario instalar QrEngineer SDK, para lo que es necesario ejecutar la siguiente instrucción en una consola de comandos:
pip install QrEngineerSDK
· Identificar el fichero principal del programa cuántico a integrar con QuantumPath®, en este caso nurse_scheduling.py.
…
# Off-diagonal terms in soft nurse constraint
# Include only the same nurse, across days
for nurse in range(n_nurses):
for day1 in range(n_days):
for day2 in range(day1 + 1, n_days):
ind1 = get_index(nurse, day1)
ind2 = get_index(nurse, day2)
Q[ind1, ind2] += 2 * lagrange_soft_nurse * preference ** 2
# Solve the problem, and use the offset to scale the energy
e_offset = (lagrange_hard_shift * n_days * workforce ** 2) +
(lagrange_soft_nurse * n_nurses * min_duty_days ** 2)
bqm = BinaryQuadraticModel.from_qubo(Q, offset=e_offset)
…
· Identificar la línea donde finaliza la creación del objeto Binay Quadratic Model con la representación matemática del problema.
…
# Solve the problem, and use the offset to scale the energy
e_offset = (lagrange_hard_shift * n_days * workforce ** 2) +
(lagrange_soft_nurse * n_nurses * min_duty_days ** 2)
bqm = BinaryQuadraticModel.from_qubo(Q, offset=e_offset)
…
· Añadir tras esa línea, el código de Q Provider Factory necesario para transpilar el circuito y ejecutarlo a través de QuantumPath®:
o Añadir una sentencia import a la clase QProviderFactory del SDK.
from QrEngineerSDK import QProviderFactory
o Instanciar el objeto QProviderFactory, indicando las credenciales de QuantumPath®
qprovider = QProviderFactory(user = ‘***qpath user***’,
passwordSHA256=’***sha-256 encrypted password***’)
o Transpilar el Binary Quadratic Model original a un circuito de annealing de QuantumPath®, usando la instrucción transpileDwaveBQM.
qpathCircuit = qProvider.transpileDwaveBQM(bqm)
o Lanzar la ejecución del circuito a través de QuantumPath®, proporcionando el identificador de la solución, el dispositivo cuántico, el namespace, el nombre del circuito y el número de ejecuciones o sampleos a realizar.
qpathSolutionID = 10742
qpathDeviceID = 7
qpathCircuitName = ‘NurseScheduling’
qpathNamespace = ‘TEST’
qpathNumRepeats = 100
result = qprovider.executeQPathCircuit(qpathSolutionID,qpathDeviceID,qpathCircuitName,
qpathNamespace,qpathNumRepeats,qpathCircuit)
o Comprobar el resultado de la ejecución y mostrarlo por pantalla:
if result.success:
print(«Execution result: » + str(result.histogram))
else:
print(«Error executing the circuit» + result.error)
Una vez finalizada la ejecución en Q Provider Factory, el usuario puede acceder a QuantumPath® y visualizar en la solución indicada, el circuito y el flujo generados automáticamente por el SDK, y comprobar el resultado de la ejecución en la plataforma.
Ilustración 1: Circuito generado con QrEngineer Python SDK, visto en QuantumPath®
Además, como se puede observar en las siguientes ilustraciones, se pueden realizar las tareas de desarrollo y ejecución que se estimen oportunas con el problema de optimización “Nurse Scheduling” adaptado a QPath®.
Ilustración 2: Edición del Hamiltoniano “Nurse Scheduling” con Q Assets Compositor® for Annealing
IIlustración 3: QuantumPath® Runtime Dashboard
Hecha la adaptación no solo dispondremos del código original refactorizado y totalmente operativo, sino que tendremos como ventajas adicionales:
· La posibilidad de lanzar el problema en todos aquellos dispositivos compatibles con tecnologías de optimización por annealing, que en QuantumPath® puede ser tanto QPU de otros proveedores como QPU basadas en puertas, mediante los servicios Q Agnostic QAOA® de la plataforma. Simplemente cambiando las cadenas de conexión y preparando la solución en el gestor de soluciones de QuantumPath®.
· El problema generado en el repositorio de activos de QuantumPath®. Lo que, de nuevo, proporciona una migración del problema a la plataforma “no code” y meter la solución dentro del ciclo de vida de soluciones del producto.
· Encapsular la solución resultado en soluciones que bajo los servicios de qSOA® puede ser explotados en aplicativos clásicos.
Uso de Q Provider Factory Web UI
Q Provider Factory Web UI permite acelerar el proceso anterior, automatizando la refactorización del código original del programa y escribiendo por el usuario el código de Q Provider Factory SDK necesario. Para ello el usuario deberá seguir los siguientes pasos:
· Acceder a la herramienta y autenticarse con sus credenciales de QuantumPath®.
· Crear un nuevo proyecto o acceder a uno ya existente.
Ilustración 4: Catálogo de proyectos de Q Provider Factory.
· Adjuntar el código fuente del circuito o programa cuántico
Ilustración 5: Formulario para añadir un circuito cuántico.
Ilustración 6: Código del circuito cuántico añadido a un proyecto.
· Desde la pestaña “Code migrations”, generar nuevo código de integración con QuantumPath®, indicando:
o Namespace y nombre del circuito a crear en QPath®.
o Solución de QPath® donde ubicar el circuito.
o Dispositivo cuántico donde lanzar la ejecución del circuito.
Ilustración 7: Formulario para generar el código de una nueva integración con QPath®.
· Del código fuente, seleccionar el fichero principal del programa y la línea donde se va a insertar el código de Q Provider Factory.
Ilustración 8: Selección de la ubicación donde se insertará el código de Q Provider Factory.
· Guardar el código generado y descargarlo para su ejecución localmente.
Ilustración 9: Código generado por la herramienta.
· Antes de ejecutarlo, el usuario deberá editarlo e insertar su password:
o Codificada en Base64:
qprovider = QProviderFactory(user = ‘***quantum path user***’,
passwordB64=’***Base64-encoded password***’)
o O encriptada en SHA256:
provider = QProviderFactory(user = ‘***quantum path user***’,
passwordSHA256=’***sha-256 encrypted password***’)
Al lanzar la ejecución del programa desde una consola de comandos local, se puede ver el resultado de la integración y ejecución contra QPath®:
Ilustración 10: Consola de comandos ejecutando el programa “Nurse scheduling” modificado.
Hecho lo anterior, al igual que se mostró en el apartado de Q Provider Factory, el desarrollador podrá acceder, visualizar y también trabajar con el problema de optimización “Nurse Scheduling” desde QuantumPath®.
Resumen
QuantumPath® es una plataforma Full-Stack para el desarrollo de software cuántico y el control del ciclo de vida de sistemas híbridos cuántico/clásicos: desde la creación del algoritmo cuántico, pasando por su desarrollo, prueba y aplicación, integración, hasta su despliegue y reutilización. Una plataforma concebida para hacer posible la ingeniería y el ciclo de vida del software cuántico híbrido.
Como hemos podido ver, gracias a los adaptadores de Q Provider Factory de QPath®, ha sido tarea de pocos pasos adaptar a QuantumPath® el programa “Nurse Scheduling”. Con esto los desarrolladores pueden disponer de un nuevo valor añadido al poder utilizar otras herramientas sobre su plataforma seleccionada, además de poder continuar utilizando el código y mantenerlo en su entorno original reutilizando los contenidos ganados en dicho entorno, en este caso Ocean SDK de D-Wave, que también puede utilizarse directamente desde QPath®.
Esta opción de trabajo abre un nuevo camino al desarrollador y al desarrollo del aplicativos cuánticos de una manera poco traumática si, haciendo posible la reutilización de los conocimiento y la intuición ganada, se desea migrar para poder utilizar algunas de las muchas funcionalidades propias de QPath®, a saber: agnóstica de la tecnología de un determinado fabricante, gestión de activos, herramientas de diseño Q Assets Compositor®, metalenguajes, compiladores, transpiladores, unidades de ejecución escalables bajo demanda, resultados unificados, adaptadores de integración, catálogo de servicios cuánticos por nombrar las funcionalidades más relevantes así como aprovechar la la arquitectura qSOA® para la integración dinámica de los programas con la IT clásica de las organizaciones, la gestión de los riesgos tecnológicos … En fin, poder utilizar toda la pila ALM orientada al desarrollo profesional de sistemas de software híbridos cuántico/clásicos.
Una vez adaptado el programa “Nurse Scheduling” a la plataforma entrará en el ciclo de vida, como un elemento ya nativo, del resto de las capacidades de QPath® (QAgnostic, QHybrid, QQuality, QManagement, QBusiness y QWorkforce). Este ecosistema ofrece otras posibilidades de explotación del desarrollo adaptado a QPath®, al poder utilizar en su ciclo de vida el amplio conjunto de herramientas, servicios, métodos y procesos de la plataforma diseñados desde la perspectiva de la Ingeniería del Software Cuántico.
[1] Martínez, A. Peterssen, G. Hevia, J.L. QrEngineer APP beta 1, herramienta de reingeniería de software cuántico (I). El Blog de QPath. Agosto 2023.