Files
2026-07-13 13:17:40 +08:00

77 lines
2.2 KiB
Python

import abc
import logging
import os
from typing import Any, Dict
from ray.data import Dataset
from ray.rllib.policy import Policy
from ray.rllib.utils.annotations import DeveloperAPI, ExperimentalAPI
from ray.rllib.utils.typing import SampleBatchType
logger = logging.getLogger(__name__)
@DeveloperAPI
class OfflineEvaluator(abc.ABC):
"""Interface for an offline evaluator of a policy"""
@DeveloperAPI
def __init__(self, policy: Policy, **kwargs):
"""Initializes an OffPolicyEstimator instance.
Args:
policy: Policy to evaluate.
kwargs: forward compatibility placeholder.
"""
self.policy = policy
@abc.abstractmethod
@DeveloperAPI
def estimate(self, batch: SampleBatchType, **kwargs) -> Dict[str, Any]:
"""Returns the evaluation results for the given batch of episodes.
Args:
batch: The batch to evaluate.
kwargs: forward compatibility placeholder.
Returns:
The evaluation done on the given batch. The returned
dict can be any arbitrary mapping of strings to metrics.
"""
raise NotImplementedError
@DeveloperAPI
def train(self, batch: SampleBatchType, **kwargs) -> Dict[str, Any]:
"""Sometimes you need to train a model inside an evaluator. This method
abstracts the training process.
Args:
batch: SampleBatch to train on
kwargs: forward compatibility placeholder.
Returns:
Any optional metrics to return from the evaluator
"""
return {}
@ExperimentalAPI
def estimate_on_dataset(
self,
dataset: Dataset,
*,
n_parallelism: int = os.cpu_count(),
) -> Dict[str, Any]:
"""Calculates the estimate of the metrics based on the given offline dataset.
Typically, the dataset is passed through only once via n_parallel tasks in
mini-batches to improve the run-time of metric estimation.
Args:
dataset: The ray dataset object to do offline evaluation on.
n_parallelism: The number of parallelism to use for the computation.
Returns:
Dict[str, Any]: A dictionary of the estimated values.
"""