


'''simple docstring'''







import os
import random
from pathlib import Path
from typing import List

import numpy as np
import torch
from torch.cuda.amp import GradScaler

from .utils import (
    MODEL_NAME,
    OPTIMIZER_NAME,
    RNG_STATE_NAME,
    SCALER_NAME,
    SCHEDULER_NAME,
    get_pretty_name,
    is_tpu_available,
    is_xpu_available,
    save,
)


if is_tpu_available(check_device=False):
  import torch_xla.core.xla_model as xm

from .logging import get_logger
from .state import PartialState


a__  : Optional[Any]				=	get_logger(__name__)




def _UpperCamelCase	(					__A				,      __A				,      __A				,      __A				,      __A				,      __A = None				,      )							->		Dict:


      '''simple docstring'''



      for i, state in enumerate(_UpperCAmelCase   ):
            UpperCamelCase__  =    F'''{MODEL_NAME}.bin''' if i == 0 else F'''{MODEL_NAME}_{i}.bin'''
            UpperCamelCase__  =    os.path.join(_UpperCAmelCase				,      _UpperCAmelCase   )
            save(_UpperCAmelCase				,      _UpperCAmelCase   )
            logger.info(F'''Model weights saved in {output_model_file}'''   )
      # Optimizer states
      for i, opt in enumerate(_UpperCAmelCase   ):
            UpperCamelCase__  =    opt.state_dict()
            UpperCamelCase__  =    F'''{OPTIMIZER_NAME}.bin''' if i == 0 else F'''{OPTIMIZER_NAME}_{i}.bin'''
            UpperCamelCase__  =    os.path.join(_UpperCAmelCase				,      _UpperCAmelCase   )
            save(_UpperCAmelCase				,      _UpperCAmelCase   )
            logger.info(F'''Optimizer state saved in {output_optimizer_file}'''   )
      # Scheduler states
      for i, scheduler in enumerate(_UpperCAmelCase   ):
            UpperCamelCase__  =    scheduler.state_dict()
            UpperCamelCase__  =    F'''{SCHEDULER_NAME}.bin''' if i == 0 else F'''{SCHEDULER_NAME}_{i}.bin'''
            UpperCamelCase__  =    os.path.join(_UpperCAmelCase				,      _UpperCAmelCase   )
            save(_UpperCAmelCase				,      _UpperCAmelCase   )
            logger.info(F'''Scheduler state saved in {output_scheduler_file}'''   )
      # GradScaler state
      if scaler is not None:
            UpperCamelCase__  =    scaler.state_dict()
            UpperCamelCase__  =    os.path.join(_UpperCAmelCase				,      _UpperCAmelCase   )
            torch.save(_UpperCAmelCase				,      _UpperCAmelCase   )
            logger.info(F'''Gradient scaler state saved in {output_scaler_file}'''   )
      # Random number generator states
      UpperCamelCase__  =    {}
      UpperCamelCase__  =    F'''{RNG_STATE_NAME}_{process_index}.pkl'''
      UpperCamelCase__  =    random.getstate()
      UpperCamelCase__  =    np.random.get_state()
      UpperCamelCase__  =    torch.get_rng_state()
      if is_xpu_available():
            UpperCamelCase__  =    torch.xpu.get_rng_state_all()
      else:
            UpperCamelCase__  =    torch.cuda.get_rng_state_all()
      if is_tpu_available():
            UpperCamelCase__  =    xm.get_rng_state()
      UpperCamelCase__  =    os.path.join(_UpperCAmelCase				,      _UpperCAmelCase   )
      torch.save(_UpperCAmelCase				,      _UpperCAmelCase   )
      logger.info(F'''Random states saved in {output_states_file}'''   )
      return output_dir




def _UpperCamelCase	(					__A				,      __A				,      __A				,      __A				,      __A				,      __A=None				,      __A=None				,      **__A				,      )							->		Tuple:


      '''simple docstring'''



      if map_location not in [None, "cpu", "on_device"]:
            raise TypeError(
                "Unsupported optimizer map location passed, please choose one of `None`, `'cpu'`, or `'on_device'`"   )
      if map_location is None:
            UpperCamelCase__  =    "cpu"
      elif map_location == "on_device":
            UpperCamelCase__  =    PartialState().device
      # Model states
      for i, model in enumerate(_UpperCAmelCase   ):
            UpperCamelCase__  =    F'''{MODEL_NAME}.bin''' if i == 0 else F'''{MODEL_NAME}_{i}.bin'''
            UpperCamelCase__  =    os.path.join(_UpperCAmelCase				,      _UpperCAmelCase   )
            models[i].load_state_dict(torch.load(_UpperCAmelCase				,      map_location=_UpperCAmelCase   )				,      **_UpperCAmelCase   )
      logger.info("All model weights loaded successfully"   )

      # Optimizer states
      for i, opt in enumerate(_UpperCAmelCase   ):
            UpperCamelCase__  =    F'''{OPTIMIZER_NAME}.bin''' if i == 0 else F'''{OPTIMIZER_NAME}_{i}.bin'''
            UpperCamelCase__  =    os.path.join(_UpperCAmelCase				,      _UpperCAmelCase   )
            UpperCamelCase__  =    torch.load(_UpperCAmelCase				,      map_location=_UpperCAmelCase   )
            optimizers[i].load_state_dict(_UpperCAmelCase   )
      logger.info("All optimizer states loaded successfully"   )

      # Scheduler states
      for i, scheduler in enumerate(_UpperCAmelCase   ):
            UpperCamelCase__  =    F'''{SCHEDULER_NAME}.bin''' if i == 0 else F'''{SCHEDULER_NAME}_{i}.bin'''
            UpperCamelCase__  =    os.path.join(_UpperCAmelCase				,      _UpperCAmelCase   )
            scheduler.load_state_dict(torch.load(_UpperCAmelCase   )   )
      logger.info("All scheduler states loaded successfully"   )

      # GradScaler state
      if scaler is not None:
            UpperCamelCase__  =    os.path.join(_UpperCAmelCase				,      _UpperCAmelCase   )
            scaler.load_state_dict(torch.load(_UpperCAmelCase   )   )
            logger.info("GradScaler state loaded successfully"   )

      # Random states
      try:
            UpperCamelCase__  =    torch.load(os.path.join(_UpperCAmelCase				,      F'''{RNG_STATE_NAME}_{process_index}.pkl'''   )   )
            random.setstate(states["random_state"]   )
            np.random.set_state(states["numpy_random_seed"]   )
            torch.set_rng_state(states["torch_manual_seed"]   )
            if is_xpu_available():
                  torch.xpu.set_rng_state_all(states["torch_xpu_manual_seed"]   )
            else:
                  torch.cuda.set_rng_state_all(states["torch_cuda_manual_seed"]   )
            if is_tpu_available():
                  xm.set_rng_state(states["xm_seed"]   )
            logger.info("All random states loaded successfully"   )
      except Exception:
            logger.info("Could not load random states"   )




def _UpperCamelCase	(					__A				,      __A				,      __A = 0   )							->		int:


      '''simple docstring'''



      UpperCamelCase__  =    Path(_UpperCAmelCase   ) / F'''custom_checkpoint_{index}.pkl'''
      logger.info(F'''Saving the state of {get_pretty_name(_UpperCAmelCase   )} to {save_location}'''   )
      torch.save(obj.state_dict()				,      _UpperCAmelCase   )




def _UpperCamelCase	(					__A				,      __A				,      __A = 0   )							->		Tuple:


      '''simple docstring'''



      UpperCamelCase__  =    F'''{path}/custom_checkpoint_{index}.pkl'''
      logger.info(F'''Loading the state of {get_pretty_name(_UpperCAmelCase   )} from {load_location}'''   )
      obj.load_state_dict(torch.load(_UpperCAmelCase				,      map_location="cpu"   )   )









'''simple docstring'''







import json
import os
import shutil
import tempfile
import unittest

from transformers import is_speech_available, is_torch_available
from transformers.models.speechta import SpeechTaTokenizer
from transformers.testing_utils import get_tests_dir, require_torch
from transformers.utils import FEATURE_EXTRACTOR_NAME


if is_speech_available() and is_torch_available():
  from transformers import SpeechTaFeatureExtractor, SpeechTaProcessor

  from .test_feature_extraction_speechta import floats_list


a__  : int				=	get_tests_dir('fixtures/test_sentencepiece_bpe_char.model')
@require_torch
class  lowercase_					(   unittest.TestCase       ):


    def        __a							(					self   ):
          UpperCamelCase__  =    tempfile.mkdtemp()

          UpperCamelCase__  =    SpeechTaTokenizer(a   )
          tokenizer.save_pretrained(self.tmpdirname   )

          UpperCamelCase__  =    {
              "feature_size": 1,
              "padding_value": 0.0,
              "sampling_rate": 1_60_00,
              "do_normalize": False,
              "num_mel_bins": 80,
              "hop_length": 16,
              "win_length": 64,
              "win_function": "hann_window",
              "fmin": 80,
              "fmax": 76_00,
              "mel_floor": 1e-10,
              "reduction_factor": 2,
              "return_attention_mask": True,
          }

          UpperCamelCase__  =    os.path.join(self.tmpdirname  , a   )
          with open(self.feature_extraction_file  , "w"  , encoding="utf-8"   ) as fp:
                fp.write(json.dumps(a   ) + "\n"   )


    def        __a							(					self  , **a   ):
          return SpeechTaTokenizer.from_pretrained(self.tmpdirname  , **a   )


    def        __a							(					self  , **a   ):
          return SpeechTaFeatureExtractor.from_pretrained(self.tmpdirname  , **a   )


    def        __a							(					self   ):
          shutil.rmtree(self.tmpdirname   )


    def        __a							(					self   ):
          UpperCamelCase__  =    self.get_tokenizer()
          UpperCamelCase__  =    self.get_feature_extractor()

          UpperCamelCase__  =    SpeechTaProcessor(tokenizer=a  , feature_extractor=a   )

          processor.save_pretrained(self.tmpdirname   )
          UpperCamelCase__  =    SpeechTaProcessor.from_pretrained(self.tmpdirname   )

          self.assertEqual(processor.tokenizer.get_vocab()  , tokenizer.get_vocab()   )
          self.assertIsInstance(processor.tokenizer  , a   )

          self.assertEqual(processor.feature_extractor.to_json_string()  , feature_extractor.to_json_string()   )
          self.assertIsInstance(processor.feature_extractor  , a   )


    def        __a							(					self   ):
          UpperCamelCase__  =    SpeechTaProcessor(tokenizer=self.get_tokenizer()  , feature_extractor=self.get_feature_extractor()   )
          processor.save_pretrained(self.tmpdirname   )

          UpperCamelCase__  =    self.get_tokenizer(bos_token="(BOS)"  , eos_token="(EOS)"   )
          UpperCamelCase__  =    self.get_feature_extractor(do_normalize=a  , padding_value=1.0   )

          UpperCamelCase__  =    SpeechTaProcessor.from_pretrained(
              self.tmpdirname  , bos_token="(BOS)"  , eos_token="(EOS)"  , do_normalize=a  , padding_value=1.0   )

          self.assertEqual(processor.tokenizer.get_vocab()  , tokenizer_add_kwargs.get_vocab()   )
          self.assertIsInstance(processor.tokenizer  , a   )

          self.assertEqual(processor.feature_extractor.to_json_string()  , feature_extractor_add_kwargs.to_json_string()   )
          self.assertIsInstance(processor.feature_extractor  , a   )


    def        __a							(					self   ):
          UpperCamelCase__  =    self.get_feature_extractor()
          UpperCamelCase__  =    self.get_tokenizer()

          UpperCamelCase__  =    SpeechTaProcessor(tokenizer=a  , feature_extractor=a   )

          UpperCamelCase__  =    floats_list((3, 10_00)   )

          UpperCamelCase__  =    feature_extractor(audio=a  , return_tensors="np"   )
          UpperCamelCase__  =    processor(audio=a  , return_tensors="np"   )

          for key in input_feat_extract.keys():
                self.assertAlmostEqual(input_feat_extract[key].sum()  , input_processor[key].sum()  , delta=1e-2   )


    def        __a							(					self   ):
          UpperCamelCase__  =    self.get_feature_extractor()
          UpperCamelCase__  =    self.get_tokenizer()

          UpperCamelCase__  =    SpeechTaProcessor(tokenizer=a  , feature_extractor=a   )

          UpperCamelCase__  =    floats_list((3, 10_00)   )

          UpperCamelCase__  =    feature_extractor(audio_target=a  , return_tensors="np"   )
          UpperCamelCase__  =    processor(audio_target=a  , return_tensors="np"   )

          for key in input_feat_extract.keys():
                self.assertAlmostEqual(input_feat_extract[key].sum()  , input_processor[key].sum()  , delta=1e-2   )


    def        __a							(					self   ):
          UpperCamelCase__  =    self.get_feature_extractor()
          UpperCamelCase__  =    self.get_tokenizer()

          UpperCamelCase__  =    SpeechTaProcessor(tokenizer=a  , feature_extractor=a   )

          UpperCamelCase__  =    "This is a test string"

          UpperCamelCase__  =    processor(text=a   )
          UpperCamelCase__  =    tokenizer(a   )

          for key in encoded_tok.keys():
                self.assertListEqual(encoded_tok[key]  , encoded_processor[key]   )


    def        __a							(					self   ):
          UpperCamelCase__  =    self.get_feature_extractor()
          UpperCamelCase__  =    self.get_tokenizer()

          UpperCamelCase__  =    SpeechTaProcessor(tokenizer=a  , feature_extractor=a   )

          UpperCamelCase__  =    "This is a test string"

          UpperCamelCase__  =    processor(text_target=a   )
          UpperCamelCase__  =    tokenizer(a   )

          for key in encoded_tok.keys():
                self.assertListEqual(encoded_tok[key]  , encoded_processor[key]   )


    def        __a							(					self   ):
          UpperCamelCase__  =    self.get_feature_extractor()
          UpperCamelCase__  =    self.get_tokenizer()

          UpperCamelCase__  =    SpeechTaProcessor(tokenizer=a  , feature_extractor=a   )

          UpperCamelCase__  =    [[1, 4, 5, 8, 1, 0, 8], [3, 4, 3, 1, 1, 8, 9]]

          UpperCamelCase__  =    processor.batch_decode(a   )
          UpperCamelCase__  =    tokenizer.batch_decode(a   )

          self.assertListEqual(a  , a   )


    def        __a							(					self   ):
          UpperCamelCase__  =    self.get_feature_extractor()
          UpperCamelCase__  =    self.get_tokenizer()

          UpperCamelCase__  =    SpeechTaProcessor(tokenizer=a  , feature_extractor=a   )

          self.assertListEqual(
              processor.model_input_names  , feature_extractor.model_input_names  , msg="`processor` and `feature_extractor` model input names do not match"  , )





