Descripción general
El módulo functionals proporciona procedimientos de ejecución cuántica de alto nivel combinando herramientas de los módulos analog, digital y core. Actualmente incluye los siguientes functionals de ejecución:
Propagación Digital: Propaga un circuito cuántico digital a través del backend.
Evolución Analog: Simula la evolución temporal analog de uno o más Hamiltonianos según un schedule dependiente del tiempo.
Reservorios Cuánticos: Ejecuta un pipeline de quantum reservoir (preprocesamiento, dinámica del reservoir, postprocesamiento) a través de múltiples capas de entrada.
Además, proporciona functionals más complejos que se utilizan para ejecutar algoritmos más complejos:
Programas Variacionales: Construye un programa parametrizado para ser optimizado en un entorno híbrido cuántico-clásico.
Descripción General de la Arquitectura
Cada functional se ajusta a la interfaz abstracta Functional. Los functionals primitivos como DigitalPropagation y AnalogEvolution también heredan de PrimitiveFunctional, que incorpora el contrato Parameterizable. Esto permite que los backends consulten y actualicen parámetros simbólicos de forma coherente antes de la ejecución.
La lectura está desacoplada de los functionals: los detalles de medición (shots, observables, tomografía de estado) se especifican mediante objetos readout que se pasan al método execute() del backend. Todos los functionals primitivos devuelven un FunctionalResult unificado.
Objetos de Resultado
FunctionalResultEl tipo de resultado unificado para todos los functionals primitivos. Se accede a los resultados mediante:
samplespara los conteos de shots,probabilitiespara las probabilidades de medición,statepara el estado terminalQTensor(al usarwith_state_tomography()), yexpectation_valuespara los valores esperados (al usarwith_expectation()). Cuandostore_intermediate_results=True, los resultados intermedios están disponibles medianteintermediate_states,intermediate_samples,intermediate_probabilitieseintermediate_expectation_values.
VariationalProgramResultagrupa la trayectoria del optimizador (costo óptimo, parámetros, pasos intermedios) junto con el resultado funcional obtenido en la convergencia.
Estos objetos hacen que los flujos de trabajo de postprocesamiento sean ergonómicos. Por ejemplo, tras una propagación digital se pueden extraer los bitstrings más probables:
from qilisdk.digital import Circuit
from qilisdk.backends import QiliSim
from qilisdk.functionals import DigitalPropagation
from qilisdk.readout import Readout
backend = QiliSim()
circuit = Circuit(2)
result = backend.execute(DigitalPropagation(circuit), Readout().with_sampling(nshots=1_000))
print("Most likely outcomes:", result.get_probabilities())