Visió general

El mòdul cost_functions converteix les sortides brutes retornades pels funcionals en valors escalars únics que els optimitzadors poden minimitzar. Cada funció de cost inspecciona el FunctionalResult produït per un backend i avalua una mètrica específica del problema, com ara un valor d’expectació d’un observable o l’energia d’un model d’optimització abstracte.

Les funcions de cost s’utilitzen per a:

Interfície CostFunction

La classe base abstracta CostFunction exposa un únic mètode públic, compute_cost(). Distribueix sobre el tipus concret del resultat funcional i crida el ganxo protegit adequat:

  • Distribueix sobre el contingut del FunctionalResult, inspeccionant els resultats de lectura disponibles (mostres, valors d’expectació, estat final) per calcular el cost.

Si el vostre flux de treball introdueix nous tipus de resultat funcional, podeu subclassar CostFunction i registrar gestors addicionals a self._handlers o sobreescriure els mètodes protegits anteriors. Les implementacions personalitzades han de retornar un nombre real o complex que representa la puntuació que voleu optimitzar.

Funcions de cost en programes variacionals

Els fluxos de treball variacionals combinen un Functional parametritzat, un optimitzador clàssic i una CostFunction. A cada iteració de l’optimitzador, el backend executa el funcional, obté un objecte FunctionalResult, i l’introdueix a la funció de cost configurada per obtenir l’escalar que impulsa el bucle d’optimització.

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)

Canviar la funció de cost us permet explorar definicions d’objectiu alternatives sense tocar el funcional en si. Per exemple, podeu començar amb ObservableCostFunction per reproduir una expectació d’energia inspirada en la física i després provar ModelCostFunction per incloure penalitzacions de restriccions d’un problema combinatori.