Función de Coste de Observable
La clase ObservableCostFunction evalúa el valor esperado de un observable frente a un estado final (procedente de la evolución temporal) o la distribución de probabilidad de cadenas de bits muestreadas. Acepta tres representaciones intercambiables para el observable: un QTensor, un Hamiltonian simbólico, o un único PauliOperator. Internamente, todas las entradas se convierten a QTensor para que el mismo proceso numérico pueda reutilizarse tanto para resultados analógicos como digitales.
Ejemplo: valor esperado a partir de evolución analógica
import numpy as np
from qilisdk.analog import Schedule, X, Z, Y
from qilisdk.core import ket, tensor_prod
from qilisdk.core.interpolator import Interpolation
from qilisdk.backends import QiliSim
from qilisdk.functionals import AnalogEvolution
from qilisdk.readout import Readout
from qilisdk.cost_functions import ObservableCostFunction
# Define total time and timestep
T = 10.0
dt = 0.5
nqubits = 1
# Define Hamiltonians
Hx = sum(X(i) for i in range(nqubits))
Hz = sum(Z(i) for i in range(nqubits))
# Build a time-dependent schedule
schedule = Schedule(
hamiltonians={"driver": Hx, "problem": Hz},
coefficients={
"driver": {(0.0, T): lambda t: 1 - t / T},
"problem": {(0.0, T): lambda t: t / T},
},
dt=dt,
interpolation=Interpolation.LINEAR,
)
functional = AnalogEvolution(
schedule=schedule,
initial_state=(ket(0) - ket(1)).unit(),
)
backend = QiliSim()
evolution_result = backend.execute(functional, readout=Readout().with_sampling(nshots=1000))
cost_fn = ObservableCostFunction(Z(0))
energy = cost_fn.compute_cost(evolution_result)
print("Expectation value <Z> =", energy)
Para los flujos de trabajo de muestreo, la función de coste itera a través de la distribución de probabilidad expuesta por get_probabilities() y acumula el valor esperado en la base computacional.