def METHOD_NAME(
    self,
    server_round: int,
    results: List[Tuple[ClientProxy, EvaluateRes]],
    failures: List[Union[Tuple[ClientProxy, EvaluateRes], BaseException]],
) -> Tuple[Optional[float], Dict[str, Scalar]]:
    """Aggregate evaluation losses using weighted average."""
    if not results:
        return None, {}
    # Check if enough results are available
    completion_rate = len(results) / (len(results) + len(failures))
    if completion_rate < self.completion_rate_evaluate:
        # Not enough results for aggregation
        return None, {}
    # Aggregate loss
    loss_aggregated = weighted_loss_avg(
        [
            (evaluate_res.num_examples, evaluate_res.loss)
            for _, evaluate_res in results
        ]
    )
    # Aggregate custom metrics if aggregation fn was provided
    metrics_aggregated = {}
    if self.evaluate_metrics_aggregation_fn:
        eval_metrics = [(res.num_examples, res.metrics) for _, res in results]
        metrics_aggregated = self.evaluate_metrics_aggregation_fn(eval_metrics)
    elif server_round == 1:  # Only log this warning once
        log(WARNING, "No evaluate_metrics_aggregation_fn provided")
    return loss_aggregated, metrics_aggregated