Código fuente para qilisdk.cost_functions.cost_function
# Copyright 2025 Qilimanjaro Quantum Tech
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations
from abc import ABC
from typing import TYPE_CHECKING, Callable, TypeVar, cast, overload
from qilisdk.functionals.functional_result import FunctionalResult
from qilisdk.functionals.sampling_result import SamplingResult
from qilisdk.functionals.time_evolution_result import TimeEvolutionResult
if TYPE_CHECKING:
from qilisdk.common.variables import Number
[documentos]
TResult = TypeVar("TResult", bound=FunctionalResult)
[documentos]
class CostFunction(ABC):
"""
Base class that maps functional results into scalar costs.
"""
def __init__(self) -> None:
self._handlers: dict[type[FunctionalResult], Callable[[FunctionalResult], Number]] = {
SamplingResult: lambda f: self._compute_cost_sampling(cast("SamplingResult", f)),
TimeEvolutionResult: lambda f: self._compute_cost_time_evolution(cast("TimeEvolutionResult", f)),
}
@overload
[documentos]
def compute_cost(self, results: SamplingResult) -> Number: ...
@overload
def compute_cost(self, results: TimeEvolutionResult) -> Number: ...
@overload
def compute_cost(self, results: FunctionalResult) -> Number: ...
def compute_cost(self, results: TResult) -> Number:
"""
Dispatch to the appropriate cost implementation based on the result type.
Args:
results (FunctionalResult): Output of a functional execution.
Returns:
Number: Scalar cost extracted from the results.
Raises:
NotImplementedError: If the concrete cost function does not support the given result type.
"""
try:
handler = self._handlers[type(results)]
except KeyError as exc:
raise NotImplementedError(
f"{type(self).__qualname__} does not support {type(results).__qualname__}"
) from exc
return handler(results)
def _compute_cost_sampling(self, results: SamplingResult) -> Number:
"""Compute the cost associated with a :class:`SamplingResult`."""
raise NotImplementedError
def _compute_cost_time_evolution(self, results: TimeEvolutionResult) -> Number:
"""Compute the cost associated with a :class:`TimeEvolutionResult`."""
raise NotImplementedError