def METHOD_NAME(
    self,
    server_round: int,
    results: List[Tuple[ClientProxy, FitRes]],
    failures: List[Union[Tuple[ClientProxy, FitRes], BaseException]],
) -> Tuple[Optional[Parameters], Dict[str, Scalar]]:
    """Aggregate fit results using weighted average."""
    fedavg_parameters_aggregated, metrics_aggregated = super().METHOD_NAME(
        server_round=server_round, results=results, failures=failures
    )
    if fedavg_parameters_aggregated is None:
        return None, {}
    fedavg_weights_aggregate = parameters_to_ndarrays(fedavg_parameters_aggregated)
    # Adagrad
    delta_t: NDArrays = [
        x - y for x, y in zip(fedavg_weights_aggregate, self.current_weights)
    ]
    # m_t
    if not self.m_t:
        self.m_t = [np.zeros_like(x) for x in delta_t]
    self.m_t = [
        np.multiply(self.beta_1, x) + (1 - self.beta_1) * y
        for x, y in zip(self.m_t, delta_t)
    ]
    # v_t
    if not self.v_t:
        self.v_t = [np.zeros_like(x) for x in delta_t]
    self.v_t = [x + np.multiply(y, y) for x, y in zip(self.v_t, delta_t)]
    new_weights = [
        x + self.eta * y / (np.sqrt(z) + self.tau)
        for x, y, z in zip(self.current_weights, self.m_t, self.v_t)
    ]
    self.current_weights = new_weights
    return ndarrays_to_parameters(self.current_weights), metrics_aggregated