def step(self, new_model, updates=None):
        """
        One update of EMA which is done every self.config.ema_update_freq
        updates of the model.

        @param updates The current number of model updates done.
        Decay is set of 0 if model updates < ema_start_update, which means
        the model will be simply copied over to the EMA.
        When model updates >= ema_start_updates, then EMA is updated with
        a decay of self.config.ema_decay.
        """
        if updates is not None:
            self._set_decay(
                0 if updates < self.config.ema_start_update else self.config.ema_decay
            )
            if updates is not None and self.config.ema_update_freq > 1:
                self.update_freq_counter += 1
                if self.update_freq_counter >= self.config.ema_update_freq:
                    self._step_internal(new_model, updates)
                    self.update_freq_counter = 0
        else:
            self._step_internal(new_model, updates)

        One update of EMA which is done every self.config.ema_update_freq
        updates of the model.

        @param updates The current number of model updates done.
        Decay is set of 0 if model updates < ema_start_update, which means
        the model will be simply copied over to the EMA.
        When model updates >= ema_start_updates, then EMA is updated with
        a decay of self.config.ema_decay.
        
structured_prompting/fairseq-version/fairseq/fairseq/models/ema/ema.py