Descripción general

El módulo cost_functions convierte las salidas brutas devueltas por los funcionales en valores escalares únicos que los optimizadores pueden minimizar. Cada función de coste inspecciona el FunctionalResult producido por un backend y evalúa una métrica específica del problema, como el valor esperado de un observable o la energía de un modelo de optimización abstracto.

Las funciones de coste se utilizan para:

Interfaz CostFunction

La clase base abstracta CostFunction expone un único método público, compute_cost(). Este despacha según el tipo concreto del resultado funcional y llama al gancho protegido apropiado:

  • Despacha según el contenido del FunctionalResult, inspeccionando los resultados de lectura disponibles (muestras, valores esperados, estado final) para calcular el coste.

Si su flujo de trabajo introduce nuevos tipos de resultados funcionales, puede crear subclases de CostFunction y registrar manejadores adicionales en self._handlers o sobreescribir los métodos protegidos anteriores. Las implementaciones personalizadas deben devolver un número real o complejo que represente la puntuación que desea optimizar.

Funciones de coste en programas variacionales

Los flujos de trabajo variacionales combinan un Functional parametrizado, un optimizador clásico y una CostFunction. En cada iteración del optimizador, el backend ejecuta el funcional, obtiene un objeto FunctionalResult y lo introduce en la función de coste configurada para obtener el escalar que impulsa el bucle de optimización.

from qilisdk.backends import QiliSim
from qilisdk.cost_functions import ModelCostFunction
from qilisdk.functionals import VariationalProgram, DigitalPropagation
from qilisdk.readout import Readout
from qilisdk.optimizers import SciPyOptimizer
from qilisdk.digital import Circuit, RX
from qilisdk.core import Parameter, BinaryVariable, Model

param = Parameter("a", 0.3)
ansatz = Circuit(1)
ansatz.add(RX(0, theta=param))

# Build a toy knapsack-like model
b0 = BinaryVariable("b0")
model = Model("toy")
model.set_objective(2 * b0, label="obj")

variational_program = VariationalProgram(
    functional=DigitalPropagation(ansatz),
    optimizer=SciPyOptimizer(method="Powell"),
    cost_function=ModelCostFunction(model),
)

backend = QiliSim()
result = backend.execute(variational_program, readout=Readout().with_sampling(nshots=1000))
print("Optimal parameters:", result.optimal_parameters)
print("Optimal cost:", result.optimal_cost)

Cambiar la función de coste le permite explorar definiciones alternativas del objetivo sin modificar el funcional en sí. Por ejemplo, puede comenzar con ObservableCostFunction para reproducir una expectativa de energía inspirada en la física y luego probar ModelCostFunction para incluir penalizaciones por restricciones de un problema combinatorio.