


'''simple docstring'''

# Lint as: python3
import os
import re
import urllib.parse
from pathlib import Path
from typing import Callable, List, Optional, Union
from zipfile import ZipFile

from ..utils.file_utils import cached_path, hf_github_url
from ..utils.logging import get_logger
from ..utils.version import Version


a_						:       Dict      			=				get_logger(__name__)





class   snake_case					:





  """simple docstring"""




  _lowerCamelCase						=						"dummy_data"
  _lowerCamelCase						=						"datasets"
  _lowerCamelCase						=						False






  def __init__(					self    ,						UpperCamelCase    ,						UpperCamelCase    ,						UpperCamelCase    ,						UpperCamelCase = None    ,						UpperCamelCase = False    ,						UpperCamelCase = True    ,						UpperCamelCase = None    ,						):







   """simple docstring"""
   lowerCamelCase_  				=						0
   lowerCamelCase_  				=						dataset_name
   lowerCamelCase_  				=						cache_dir
   lowerCamelCase_  				=						use_local_dummy_data
   lowerCamelCase_  				=						config
   # download_callbacks take a single url as input
   lowerCamelCase_  				=						download_callbacks or []
   # if False, it doesn't load existing files and it returns the paths of the dummy files relative
   # to the dummy_data zip file root
   lowerCamelCase_  				=						load_existing_dummy_data

   # TODO(PVP, QL) might need to make this more general
   lowerCamelCase_  				=						str(UpperCamelCase  )
   # to be downloaded
   lowerCamelCase_  				=						None
   lowerCamelCase_  				=						None






  @property
  def 						snake_case	(					self  ):







   """simple docstring"""
   if self._dummy_file is None:
    lowerCamelCase_  				=						self.download_dummy_data()
   return self._dummy_file






  @property
  def 						snake_case	(					self  ):







   """simple docstring"""
   if self.config is not None:
    # structure is dummy / config_name / version_name
    return os.path.join("dummy"    ,						self.config.name    ,						self.version_name  )
   # structure is dummy / version_name
   return os.path.join("dummy"    ,						self.version_name  )






  @property
  def 						snake_case	(					self  ):







   """simple docstring"""
   return os.path.join(self.dummy_data_folder    ,						"dummy_data.zip"  )






  def 						snake_case	(					self  ):







   """simple docstring"""
   lowerCamelCase_  				=						(
       self.local_path_to_dummy_data if self.use_local_dummy_data is True else self.github_path_to_dummy_data
   )

   lowerCamelCase_  				=						cached_path(
       UpperCamelCase    ,						cache_dir=self.cache_dir    ,						extract_compressed_file=UpperCamelCase    ,						force_extract=UpperCamelCase  )

   return os.path.join(UpperCamelCase    ,						self.dummy_file_name  )






  @property
  def 						snake_case	(					self  ):







   """simple docstring"""
   return os.path.join(self.datasets_scripts_dir    ,						self.dataset_name    ,						self.dummy_zip_file  )






  @property
  def 						snake_case	(					self  ):







   """simple docstring"""
   if self._bucket_url is None:
    lowerCamelCase_  				=						hf_github_url(self.dataset_name    ,						self.dummy_zip_file.replace(os.sep    ,						"/"  )  )
   return self._bucket_url






  @property
  def 						snake_case	(					self  ):







   """simple docstring"""
   # return full path if its a dir
   if os.path.isdir(self.dummy_file  ):
    return self.dummy_file
   # else cut off path to file -> example `xsum`.
   return "/".join(self.dummy_file.replace(os.sep    ,						"/"  ).split("/"  )[:-1]  )






  def 						snake_case	(					self    ,						UpperCamelCase    ,						*UpperCamelCase  ):







   """simple docstring"""
   if self.load_existing_dummy_data:
    # dummy data is downloaded and tested
    lowerCamelCase_  				=						self.dummy_file
   else:
    # dummy data cannot be downloaded and only the path to dummy file is returned
    lowerCamelCase_  				=						self.dummy_file_name

   # special case when data_url is a dict
   if isinstance(UpperCamelCase    ,						UpperCamelCase  ):
    return self.create_dummy_data_dict(UpperCamelCase    ,						UpperCamelCase  )
   elif isinstance(UpperCamelCase    ,						(list, tuple)  ):
    return self.create_dummy_data_list(UpperCamelCase    ,						UpperCamelCase  )
   else:
    return self.create_dummy_data_single(UpperCamelCase    ,						UpperCamelCase  )






  def 						snake_case	(					self    ,						UpperCamelCase    ,						*UpperCamelCase  ):







   """simple docstring"""
   return self.download_and_extract(UpperCamelCase  )






  def 						snake_case	(					self    ,						UpperCamelCase    ,						UpperCamelCase  ):







   """simple docstring"""
   return self.download_and_extract(UpperCamelCase  )






  def 						snake_case	(					self    ,						UpperCamelCase    ,						*UpperCamelCase    ,						**UpperCamelCase  ):







   """simple docstring"""
   return path






  def 						snake_case	(					self  ):







   """simple docstring"""
   return {}






  def 						snake_case	(					self    ,						UpperCamelCase    ,						UpperCamelCase  ):







   """simple docstring"""
   lowerCamelCase_  				=						{}
   for key, single_urls in data_url.items():
    for download_callback in self.download_callbacks:
     if isinstance(UpperCamelCase    ,						UpperCamelCase  ):
      for single_url in single_urls:
       download_callback(UpperCamelCase  )
     else:
      lowerCamelCase_  				=						single_urls
      download_callback(UpperCamelCase  )
            # we force the name of each key to be the last file / folder name of the url path
            # if the url has arguments, we need to encode them with urllib.parse.quote_plus
    if isinstance(UpperCamelCase    ,						UpperCamelCase  ):
     lowerCamelCase_  				=						[os.path.join(UpperCamelCase    ,						urllib.parse.quote_plus(Path(UpperCamelCase  ).name  )  ) for x in single_urls]
    else:
     lowerCamelCase_  				=						single_urls
     lowerCamelCase_  				=						os.path.join(UpperCamelCase    ,						urllib.parse.quote_plus(Path(UpperCamelCase  ).name  )  )
    lowerCamelCase_  				=						value

   # make sure that values are unique
   if all(isinstance(UpperCamelCase    ,						UpperCamelCase  ) for i in dummy_data_dict.values()  ) and len(set(dummy_data_dict.values()  )  ) < len(
       dummy_data_dict.values()  ):
    # append key to value to make its name unique
    lowerCamelCase_  				=						{key: value + key for key, value in dummy_data_dict.items()}

   return dummy_data_dict






  def 						snake_case	(					self    ,						UpperCamelCase    ,						UpperCamelCase  ):







   """simple docstring"""
   lowerCamelCase_  				=						[]
   # trick: if there are many shards named like `data.txt-000001-of-00300`, only use the first one
   lowerCamelCase_  				=						all(bool(re.findall("[0-9]{3,}-of-[0-9]{3,}"    ,						UpperCamelCase  )  ) for url in data_url  )
   lowerCamelCase_  				=						all(
       url.startswith("https://ftp.ncbi.nlm.nih.gov/pubmed/baseline/pubmed"  ) for url in data_url  )
   if data_url and (is_tf_records or is_pubmed_records):
    lowerCamelCase_  				=						[data_url[0]] * len(UpperCamelCase  )
   for single_url in data_url:
    for download_callback in self.download_callbacks:
     download_callback(UpperCamelCase  )
    # we force the name of each key to be the last file / folder name of the url path
    # if the url has arguments, we need to encode them with urllib.parse.quote_plus
    lowerCamelCase_  				=						os.path.join(UpperCamelCase    ,						urllib.parse.quote_plus(single_url.split("/"  )[-1]  )  )
    dummy_data_list.append(UpperCamelCase  )
   return dummy_data_list






  def 						snake_case	(					self    ,						UpperCamelCase    ,						UpperCamelCase  ):







   """simple docstring"""
   for download_callback in self.download_callbacks:
    download_callback(UpperCamelCase  )
   # we force the name of each key to be the last file / folder name of the url path
   # if the url has arguments, we need to encode them with urllib.parse.quote_plus
   lowerCamelCase_  				=						os.path.join(UpperCamelCase    ,						urllib.parse.quote_plus(data_url.split("/"  )[-1]  )  )
   if os.path.exists(UpperCamelCase  ) or not self.load_existing_dummy_data:
    return value
   else:
    # Backward compatibility, maybe deprecate at one point.
    # For many datasets with single url calls to dl_manager.download_and_extract,
    # the dummy_data.zip file is actually the zipped downloaded file
    # while now we expected the dummy_data.zip file to be a directory containing
    # the downloaded file.
    return path_to_dummy_data






  def 						snake_case	(					self  ):







   """simple docstring"""
   pass






  def 						snake_case	(					self  ):







   """simple docstring"""
   pass






  def 						snake_case	(					self    ,						UpperCamelCase  ):







   """simple docstring"""
   def _iter_archive_members(UpperCamelCase  ):
    # this preserves the order of the members inside the ZIP archive
    lowerCamelCase_  				=						Path(self.dummy_file  ).parent
    lowerCamelCase_  				=						path.relative_to(UpperCamelCase  )
    with ZipFile(self.local_path_to_dummy_data  ) as zip_file:
     lowerCamelCase_  				=						zip_file.namelist()
    for member in members:
     if member.startswith(relative_path.as_posix()  ):
      yield dummy_parent_path.joinpath(UpperCamelCase  )

   lowerCamelCase_  				=						Path(UpperCamelCase  )
   lowerCamelCase_  				=						_iter_archive_members(UpperCamelCase  ) if self.use_local_dummy_data else path.rglob("*"  )
   for file_path in file_paths:
    if file_path.is_file() and not file_path.name.startswith((".", "__")  ):
     yield file_path.relative_to(UpperCamelCase  ).as_posix(), file_path.open("rb"  )







  def 						snake_case	(					self    ,						UpperCamelCase  ):







   """simple docstring"""
   if not isinstance(UpperCamelCase    ,						UpperCamelCase  ):
    lowerCamelCase_  				=						[paths]
   for path in paths:
    if os.path.isfile(UpperCamelCase  ):
     if os.path.basename(UpperCamelCase  ).startswith((".", "__")  ):
      return
     yield path
    else:
     for dirpath, dirnames, filenames in os.walk(UpperCamelCase  ):
      if os.path.basename(UpperCamelCase  ).startswith((".", "__")  ):
       continue
      dirnames.sort()
      for filename in sorted(UpperCamelCase  ):
       if filename.startswith((".", "__")  ):
        continue
       yield os.path.join(UpperCamelCase    ,						UpperCamelCase  )







'''simple docstring'''

from collections import OrderedDict
from typing import TYPE_CHECKING, Any, Mapping, Optional, Union

from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfig, OnnxSeqaSeqConfigWithPast
from ...utils import logging


if TYPE_CHECKING:
     from ...feature_extraction_utils import FeatureExtractionMixin
     from ...tokenization_utils_base import PreTrainedTokenizerBase
     from ...utils import TensorType

a_						:       Optional[int]      			=				logging.get_logger(__name__)

a_						:       Optional[int]      			=				{
    """openai/whisper-base""": """https://huggingface.co/openai/whisper-base/resolve/main/config.json""",
}

# fmt: off
a_						:       List[str]      			=				[
    1, 2, 7, 8, 9, 10, 14, 25,
    26, 27, 28, 29, 31, 58, 59, 60, 61, 62,
    63, 90, 91, 92, 93, 357, 366, 438, 532, 685,
    705, 796, 930, 1058, 1220, 1267, 1279, 1303, 1343, 1377,
    1391, 1635, 1782, 1875, 2162, 2361, 2488, 3467, 4008, 4211,
    4600, 4808, 5299, 5855, 6329, 7203, 9609, 9959, 10563, 10786,
    11420, 11709, 11907, 13163, 13697, 13700, 14808, 15306, 16410, 16791,
    17992, 19203, 19510, 20724, 22305, 22935, 27007, 30109, 30420, 33409,
    34949, 40283, 40493, 40549, 47282, 49146, 50257, 50359, 50360, 50361
]
a_						:       Tuple      			=				[
    1, 2, 7, 8, 9, 10, 14, 25,
    26, 27, 28, 29, 31, 58, 59, 60, 61, 62,
    63, 90, 91, 92, 93, 359, 503, 522, 542, 873,
    893, 902, 918, 922, 931, 1350, 1853, 1982, 2460, 2627,
    3246, 3253, 3268, 3536, 3846, 3961, 4183, 4667, 6585, 6647,
    7273, 9061, 9383, 10428, 10929, 11938, 12033, 12331, 12562, 13793,
    14157, 14635, 15265, 15618, 16553, 16604, 18362, 18956, 20075, 21675,
    22520, 26130, 26161, 26435, 28279, 29464, 31650, 32302, 32470, 36865,
    42863, 47425, 49870, 50254, 50258, 50360, 50361, 50362
]





class   snake_case					(					lowercase    ):





  """simple docstring"""




  _lowerCamelCase						=						"whisper"
  _lowerCamelCase						=						["past_key_values"]
  _lowerCamelCase						=						{"num_attention_heads": "encoder_attention_heads", "hidden_size": "d_model"}






  def __init__(					self    ,						UpperCamelCase=5_1865    ,						UpperCamelCase=80    ,						UpperCamelCase=6    ,						UpperCamelCase=4    ,						UpperCamelCase=6    ,						UpperCamelCase=4    ,						UpperCamelCase=1536    ,						UpperCamelCase=1536    ,						UpperCamelCase=0.0    ,						UpperCamelCase=0.0    ,						UpperCamelCase=5_0257    ,						UpperCamelCase=True    ,						UpperCamelCase=True    ,						UpperCamelCase="gelu"    ,						UpperCamelCase=256    ,						UpperCamelCase=0.0    ,						UpperCamelCase=0.0    ,						UpperCamelCase=0.0    ,						UpperCamelCase=0.02    ,						UpperCamelCase=False    ,						UpperCamelCase=1500    ,						UpperCamelCase=448    ,						UpperCamelCase=5_0256    ,						UpperCamelCase=5_0256    ,						UpperCamelCase=5_0256    ,						UpperCamelCase=None    ,						UpperCamelCase=[220, 5_0256]    ,						UpperCamelCase=False    ,						UpperCamelCase=256    ,						UpperCamelCase=False    ,						UpperCamelCase=0.05    ,						UpperCamelCase=10    ,						UpperCamelCase=2    ,						UpperCamelCase=0.0    ,						UpperCamelCase=10    ,						UpperCamelCase=0    ,						UpperCamelCase=7    ,						**UpperCamelCase    ,						):







   """simple docstring"""
   lowerCamelCase_  				=						vocab_size
   lowerCamelCase_  				=						num_mel_bins
   lowerCamelCase_  				=						d_model
   lowerCamelCase_  				=						encoder_layers
   lowerCamelCase_  				=						encoder_attention_heads
   lowerCamelCase_  				=						decoder_layers
   lowerCamelCase_  				=						decoder_attention_heads
   lowerCamelCase_  				=						decoder_ffn_dim
   lowerCamelCase_  				=						encoder_ffn_dim
   lowerCamelCase_  				=						dropout
   lowerCamelCase_  				=						attention_dropout
   lowerCamelCase_  				=						activation_dropout
   lowerCamelCase_  				=						activation_function
   lowerCamelCase_  				=						init_std
   lowerCamelCase_  				=						encoder_layerdrop
   lowerCamelCase_  				=						decoder_layerdrop
   lowerCamelCase_  				=						use_cache
   lowerCamelCase_  				=						encoder_layers
   lowerCamelCase_  				=						scale_embedding  # scale factor will be sqrt(d_model) if True
   lowerCamelCase_  				=						max_source_positions
   lowerCamelCase_  				=						max_target_positions

   # Audio Classification-specific parameters. Feel free to ignore for other classes.
   lowerCamelCase_  				=						classifier_proj_size
   lowerCamelCase_  				=						use_weighted_layer_sum

   # fine-tuning config parameters for SpecAugment: https://arxiv.org/abs/1904.08779
   lowerCamelCase_  				=						apply_spec_augment
   lowerCamelCase_  				=						mask_time_prob
   lowerCamelCase_  				=						mask_time_length
   lowerCamelCase_  				=						mask_time_min_masks
   lowerCamelCase_  				=						mask_feature_prob
   lowerCamelCase_  				=						mask_feature_length
   lowerCamelCase_  				=						mask_feature_min_masks

   lowerCamelCase_  				=						median_filter_width

   super().__init__(
       pad_token_id=UpperCamelCase    ,						bos_token_id=UpperCamelCase    ,						eos_token_id=UpperCamelCase    ,						is_encoder_decoder=UpperCamelCase    ,						decoder_start_token_id=UpperCamelCase    ,						suppress_tokens=UpperCamelCase    ,						begin_suppress_tokens=UpperCamelCase    ,						**UpperCamelCase    ,						)





class   snake_case					(					lowercase    ):





  """simple docstring"""




  @property
  def 						snake_case	(					self  ):







   """simple docstring"""
   lowerCamelCase_  				=						OrderedDict(
       [
           ("input_features", {0: "batch", 1: "feature_size", 2: "encoder_sequence"}),
       ]  )
   if self.use_past:
    lowerCamelCase_  				=						{0: "batch"}
   else:
    lowerCamelCase_  				=						{0: "batch", 1: "decoder_sequence"}

   if self.use_past:
    self.fill_with_past_key_values_(UpperCamelCase    ,						direction="inputs"  )

   return common_inputs






  def 						snake_case	(					self    ,						UpperCamelCase    ,						UpperCamelCase = -1    ,						UpperCamelCase = -1    ,						UpperCamelCase = False    ,						UpperCamelCase = None    ,						UpperCamelCase = 2_2050    ,						UpperCamelCase = 5.0    ,						UpperCamelCase = 220    ,						):







   """simple docstring"""
   lowerCamelCase_  				=						OrderedDict()
   lowerCamelCase_  				=						OnnxConfig.generate_dummy_inputs(
       self    ,						preprocessor=preprocessor.feature_extractor    ,						batch_size=UpperCamelCase    ,						framework=UpperCamelCase    ,						sampling_rate=UpperCamelCase    ,						time_duration=UpperCamelCase    ,						frequency=UpperCamelCase    ,						)
   lowerCamelCase_  				=						encoder_inputs["input_features"].shape[2]
   lowerCamelCase_  				=						encoder_sequence_length // 2 if self.use_past else seq_length

   lowerCamelCase_  				=						super().generate_dummy_inputs(
       preprocessor.tokenizer    ,						UpperCamelCase    ,						UpperCamelCase    ,						UpperCamelCase    ,						UpperCamelCase  )

   lowerCamelCase_  				=						encoder_inputs.pop("input_features"  )
   lowerCamelCase_  				=						decoder_inputs.pop("decoder_input_ids"  )

   if "past_key_values" in decoder_inputs:
    lowerCamelCase_  				=						decoder_inputs.pop("past_key_values"  )

   return dummy_inputs







  @property
  def 						snake_case	(					self  ):







   """simple docstring"""
   return 1e-3



