def _decay_learning_rate(self, global_step: int, end_learning_rate: float, decay_steps: int) -> float:
        """
        Applies a square-root decay to the learning rate.

        :param global_step: Global step to use for the decay computation.
        :param end_learning_rate: The minimal end learning rate.
        :param decay_steps: Number of decayed steps.
        :return: The decayed learning rate
        """
        learn_rate = self.learning_rate - end_learning_rate
        decayed_learning_rate = learn_rate * (1 - global_step / decay_steps) ** 0.5 + end_learning_rate

        return decayed_learning_rate

        Applies a square-root decay to the learning rate.

        :param global_step: Global step to use for the decay computation.
        :param end_learning_rate: The minimal end learning rate.
        :param decay_steps: Number of decayed steps.
        :return: The decayed learning rate
        
art/attacks/evasion/elastic_net.py