
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

lowerCamelCase__     :		int        = logging.get_logger(__name__)

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

# fmt: off
lowerCamelCase__     :		Dict        = [
    1, 2, 7, 8, 9, 1_0, 1_4, 2_5,
    2_6, 2_7, 2_8, 2_9, 3_1, 5_8, 5_9, 6_0, 6_1, 6_2,
    6_3, 9_0, 9_1, 9_2, 9_3, 3_5_7, 3_6_6, 4_3_8, 5_3_2, 6_8_5,
    7_0_5, 7_9_6, 9_3_0, 1_0_5_8, 1_2_2_0, 1_2_6_7, 1_2_7_9, 1_3_0_3, 1_3_4_3, 1_3_7_7,
    1_3_9_1, 1_6_3_5, 1_7_8_2, 1_8_7_5, 2_1_6_2, 2_3_6_1, 2_4_8_8, 3_4_6_7, 4_0_0_8, 4_2_1_1,
    4_6_0_0, 4_8_0_8, 5_2_9_9, 5_8_5_5, 6_3_2_9, 7_2_0_3, 9_6_0_9, 9_9_5_9, 1_0_5_6_3, 1_0_7_8_6,
    1_1_4_2_0, 1_1_7_0_9, 1_1_9_0_7, 1_3_1_6_3, 1_3_6_9_7, 1_3_7_0_0, 1_4_8_0_8, 1_5_3_0_6, 1_6_4_1_0, 1_6_7_9_1,
    1_7_9_9_2, 1_9_2_0_3, 1_9_5_1_0, 2_0_7_2_4, 2_2_3_0_5, 2_2_9_3_5, 2_7_0_0_7, 3_0_1_0_9, 3_0_4_2_0, 3_3_4_0_9,
    3_4_9_4_9, 4_0_2_8_3, 4_0_4_9_3, 4_0_5_4_9, 4_7_2_8_2, 4_9_1_4_6, 5_0_2_5_7, 5_0_3_5_9, 5_0_3_6_0, 5_0_3_6_1
]
lowerCamelCase__     :		str        = [
    1, 2, 7, 8, 9, 1_0, 1_4, 2_5,
    2_6, 2_7, 2_8, 2_9, 3_1, 5_8, 5_9, 6_0, 6_1, 6_2,
    6_3, 9_0, 9_1, 9_2, 9_3, 3_5_9, 5_0_3, 5_2_2, 5_4_2, 8_7_3,
    8_9_3, 9_0_2, 9_1_8, 9_2_2, 9_3_1, 1_3_5_0, 1_8_5_3, 1_9_8_2, 2_4_6_0, 2_6_2_7,
    3_2_4_6, 3_2_5_3, 3_2_6_8, 3_5_3_6, 3_8_4_6, 3_9_6_1, 4_1_8_3, 4_6_6_7, 6_5_8_5, 6_6_4_7,
    7_2_7_3, 9_0_6_1, 9_3_8_3, 1_0_4_2_8, 1_0_9_2_9, 1_1_9_3_8, 1_2_0_3_3, 1_2_3_3_1, 1_2_5_6_2, 1_3_7_9_3,
    1_4_1_5_7, 1_4_6_3_5, 1_5_2_6_5, 1_5_6_1_8, 1_6_5_5_3, 1_6_6_0_4, 1_8_3_6_2, 1_8_9_5_6, 2_0_0_7_5, 2_1_6_7_5,
    2_2_5_2_0, 2_6_1_3_0, 2_6_1_6_1, 2_6_4_3_5, 2_8_2_7_9, 2_9_4_6_4, 3_1_6_5_0, 3_2_3_0_2, 3_2_4_7_0, 3_6_8_6_5,
    4_2_8_6_3, 4_7_4_2_5, 4_9_8_7_0, 5_0_2_5_4, 5_0_2_5_8, 5_0_3_6_0, 5_0_3_6_1, 5_0_3_6_2
]



class    _snake_case (						UpperCAmelCase_				):
 __lowerCAmelCase	:  List[str]	   =      'whisper'
 __lowerCAmelCase	:  str	   =      ['past_key_values']
 __lowerCAmelCase	:  Optional[int]	   =      {'num_attention_heads': 'encoder_attention_heads', 'hidden_size': 'd_model'}


 def __init__(       self       ,	SCREAMING_SNAKE_CASE_=5_18_65       ,	SCREAMING_SNAKE_CASE_=80       ,	SCREAMING_SNAKE_CASE_=6       ,	SCREAMING_SNAKE_CASE_=4       ,	SCREAMING_SNAKE_CASE_=6       ,	SCREAMING_SNAKE_CASE_=4       ,	SCREAMING_SNAKE_CASE_=15_36       ,	SCREAMING_SNAKE_CASE_=15_36       ,	SCREAMING_SNAKE_CASE_=0.0       ,	SCREAMING_SNAKE_CASE_=0.0       ,	SCREAMING_SNAKE_CASE_=5_02_57       ,	SCREAMING_SNAKE_CASE_=True       ,	SCREAMING_SNAKE_CASE_=True       ,	SCREAMING_SNAKE_CASE_="gelu"       ,	SCREAMING_SNAKE_CASE_=2_56       ,	SCREAMING_SNAKE_CASE_=0.0       ,	SCREAMING_SNAKE_CASE_=0.0       ,	SCREAMING_SNAKE_CASE_=0.0       ,	SCREAMING_SNAKE_CASE_=0.0_2       ,	SCREAMING_SNAKE_CASE_=False       ,	SCREAMING_SNAKE_CASE_=15_00       ,	SCREAMING_SNAKE_CASE_=4_48       ,	SCREAMING_SNAKE_CASE_=5_02_56       ,	SCREAMING_SNAKE_CASE_=5_02_56       ,	SCREAMING_SNAKE_CASE_=5_02_56       ,	SCREAMING_SNAKE_CASE_=None       ,	SCREAMING_SNAKE_CASE_=[2_20, 5_02_56]       ,	SCREAMING_SNAKE_CASE_=False       ,	SCREAMING_SNAKE_CASE_=2_56       ,	SCREAMING_SNAKE_CASE_=False       ,	SCREAMING_SNAKE_CASE_=0.0_5       ,	SCREAMING_SNAKE_CASE_=10       ,	SCREAMING_SNAKE_CASE_=2       ,	SCREAMING_SNAKE_CASE_=0.0       ,	SCREAMING_SNAKE_CASE_=10       ,	SCREAMING_SNAKE_CASE_=0       ,	SCREAMING_SNAKE_CASE_=7       ,	**SCREAMING_SNAKE_CASE_       ,	):


   '''simple docstring'''




   lowercase__	: str     		=   vocab_size
   lowercase__	: Tuple     		=   num_mel_bins
   lowercase__	: int     		=   d_model
   lowercase__	: str     		=   encoder_layers
   lowercase__	: str     		=   encoder_attention_heads
   lowercase__	: Any     		=   decoder_layers
   lowercase__	: Optional[int]     		=   decoder_attention_heads
   lowercase__	: List[str]     		=   decoder_ffn_dim
   lowercase__	: Dict     		=   encoder_ffn_dim
   lowercase__	: Dict     		=   dropout
   lowercase__	: Dict     		=   attention_dropout
   lowercase__	: List[str]     		=   activation_dropout
   lowercase__	: List[str]     		=   activation_function
   lowercase__	: Dict     		=   init_std
   lowercase__	: int     		=   encoder_layerdrop
   lowercase__	: List[str]     		=   decoder_layerdrop
   lowercase__	: List[str]     		=   use_cache
   lowercase__	: Tuple     		=   encoder_layers
   lowercase__	: List[Any]     		=   scale_embedding  # scale factor will be sqrt(d_model) if True
   lowercase__	: int     		=   max_source_positions
   lowercase__	: Tuple     		=   max_target_positions

   # Audio Classification-specific parameters. Feel free to ignore for other classes.
   lowercase__	: Tuple     		=   classifier_proj_size
   lowercase__	: Optional[int]     		=   use_weighted_layer_sum

   # fine-tuning config parameters for SpecAugment: https://arxiv.org/abs/1904.08779
   lowercase__	: Optional[int]     		=   apply_spec_augment
   lowercase__	: Any     		=   mask_time_prob
   lowercase__	: str     		=   mask_time_length
   lowercase__	: int     		=   mask_time_min_masks
   lowercase__	: List[Any]     		=   mask_feature_prob
   lowercase__	: List[Any]     		=   mask_feature_length
   lowercase__	: Optional[int]     		=   mask_feature_min_masks

   lowercase__	: Dict     		=   median_filter_width

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



class    _snake_case (						UpperCAmelCase_				):


 @property
 def   lowercase__  (       self):


   '''simple docstring'''




   lowercase__	: int     		=   OrderedDict(
       [
           ("""input_features""", {0: """batch""", 1: """feature_size""", 2: """encoder_sequence"""}),
       ])
   if self.use_past:
     lowercase__	: List[str]     		=   {0: """batch"""}
   else:
     lowercase__	: int     		=   {0: """batch""", 1: """decoder_sequence"""}

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

   return common_inputs


 def   lowercase__  (       self       ,	SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_ = -1       ,	SCREAMING_SNAKE_CASE_ = -1       ,	SCREAMING_SNAKE_CASE_ = False       ,	SCREAMING_SNAKE_CASE_ = None       ,	SCREAMING_SNAKE_CASE_ = 2_20_50       ,	SCREAMING_SNAKE_CASE_ = 5.0       ,	SCREAMING_SNAKE_CASE_ = 2_20       ,	):


   '''simple docstring'''




   lowercase__	: str     		=   OrderedDict()
   lowercase__	: List[Any]     		=   OnnxConfig.generate_dummy_inputs(
       self       ,	preprocessor=preprocessor.feature_extractor       ,	batch_size=SCREAMING_SNAKE_CASE_       ,	framework=SCREAMING_SNAKE_CASE_       ,	sampling_rate=SCREAMING_SNAKE_CASE_       ,	time_duration=SCREAMING_SNAKE_CASE_       ,	frequency=SCREAMING_SNAKE_CASE_       ,	)
   lowercase__	: Dict     		=   encoder_inputs["""input_features"""].shape[2]
   lowercase__	: List[Any]     		=   encoder_sequence_length // 2 if self.use_past else seq_length

   lowercase__	: Optional[Any]     		=   super().generate_dummy_inputs(
       preprocessor.tokenizer       ,	SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_)

   lowercase__	: List[str]     		=   encoder_inputs.pop("""input_features""")
   lowercase__	: Optional[Any]     		=   decoder_inputs.pop("""decoder_input_ids""")

   if "past_key_values" in decoder_inputs:
     lowercase__	: Dict     		=   decoder_inputs.pop("""past_key_values""")

   return dummy_inputs



 @property
 def   lowercase__  (       self):


   '''simple docstring'''




   return 1E-3








import torch

from diffusers import DDPMScheduler

from .test_schedulers import SchedulerCommonTest



class    _snake_case (						UpperCAmelCase_				):
 __lowerCAmelCase	:  int	   =      (DDPMScheduler,)


 def   lowercase__  (       self       ,	**SCREAMING_SNAKE_CASE_):


   '''simple docstring'''




   lowercase__	: Tuple     		=   {
       """num_train_timesteps""": 10_00,
       """beta_start""": 0.0_0_0_1,
       """beta_end""": 0.0_2,
       """beta_schedule""": """linear""",
       """variance_type""": """fixed_small""",
       """clip_sample""": True,
   }

   config.update(**SCREAMING_SNAKE_CASE_)
   return config


 def   lowercase__  (       self):


   '''simple docstring'''




   for timesteps in [1, 5, 1_00, 10_00]:
     self.check_over_configs(num_train_timesteps=SCREAMING_SNAKE_CASE_)


 def   lowercase__  (       self):


   '''simple docstring'''




   for beta_start, beta_end in zip([0.0_0_0_1, 0.0_0_1, 0.0_1, 0.1]       ,	[0.0_0_2, 0.0_2, 0.2, 2]):
     self.check_over_configs(beta_start=SCREAMING_SNAKE_CASE_       ,	beta_end=SCREAMING_SNAKE_CASE_)


 def   lowercase__  (       self):


   '''simple docstring'''




   for schedule in ["linear", "squaredcos_cap_v2"]:
     self.check_over_configs(beta_schedule=SCREAMING_SNAKE_CASE_)


 def   lowercase__  (       self):


   '''simple docstring'''




   for variance in ["fixed_small", "fixed_large", "other"]:
     self.check_over_configs(variance_type=SCREAMING_SNAKE_CASE_)


 def   lowercase__  (       self):


   '''simple docstring'''




   for clip_sample in [True, False]:
     self.check_over_configs(clip_sample=SCREAMING_SNAKE_CASE_)


 def   lowercase__  (       self):


   '''simple docstring'''




   self.check_over_configs(thresholding=SCREAMING_SNAKE_CASE_)
   for threshold in [0.5, 1.0, 2.0]:
     for prediction_type in ["epsilon", "sample", "v_prediction"]:
       self.check_over_configs(
           thresholding=SCREAMING_SNAKE_CASE_       ,	prediction_type=SCREAMING_SNAKE_CASE_       ,	sample_max_value=SCREAMING_SNAKE_CASE_       ,	)


 def   lowercase__  (       self):


   '''simple docstring'''




   for prediction_type in ["epsilon", "sample", "v_prediction"]:
     self.check_over_configs(prediction_type=SCREAMING_SNAKE_CASE_)


 def   lowercase__  (       self):


   '''simple docstring'''




   for t in [0, 5_00, 9_99]:
     self.check_over_forward(time_step=SCREAMING_SNAKE_CASE_)


 def   lowercase__  (       self):


   '''simple docstring'''




   lowercase__	: Union[str, Any]     		=   self.scheduler_classes[0]
   lowercase__	: Union[str, Any]     		=   self.get_scheduler_config()
   lowercase__	: List[Any]     		=   scheduler_class(**SCREAMING_SNAKE_CASE_)

   assert torch.sum(torch.abs(scheduler._get_variance(0) - 0.0)) < 1E-5
   assert torch.sum(torch.abs(scheduler._get_variance(4_87) - 0.0_0_9_7_9)) < 1E-5
   assert torch.sum(torch.abs(scheduler._get_variance(9_99) - 0.0_2)) < 1E-5


 def   lowercase__  (       self):


   '''simple docstring'''




   lowercase__	: Dict     		=   self.scheduler_classes[0]
   lowercase__	: str     		=   self.get_scheduler_config()
   lowercase__	: Tuple     		=   scheduler_class(**SCREAMING_SNAKE_CASE_)

   lowercase__	: int     		=   len(SCREAMING_SNAKE_CASE_)

   lowercase__	: Any     		=   self.dummy_model()
   lowercase__	: List[Any]     		=   self.dummy_sample_deter
   lowercase__	: str     		=   torch.manual_seed(0)

   for t in reversed(range(SCREAMING_SNAKE_CASE_)):
     # 1. predict noise residual
     lowercase__	: Dict     		=   model(SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_)

     # 2. predict previous mean of sample x_t-1
     lowercase__	: List[str]     		=   scheduler.step(SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_       ,	generator=SCREAMING_SNAKE_CASE_).prev_sample

     # if t > 0:
     #     noise = self.dummy_sample_deter
     #     variance = scheduler.get_variance(t) ** (0.5) * noise
     #
     # sample = pred_prev_sample + variance
     lowercase__	: str     		=   pred_prev_sample

   lowercase__	: Optional[int]     		=   torch.sum(torch.abs(SCREAMING_SNAKE_CASE_))
   lowercase__	: Optional[Any]     		=   torch.mean(torch.abs(SCREAMING_SNAKE_CASE_))

   assert abs(result_sum.item() - 2_5_8.9_6_0_6) < 1E-2
   assert abs(result_mean.item() - 0.3_3_7_2) < 1E-3


 def   lowercase__  (       self):


   '''simple docstring'''




   lowercase__	: List[Any]     		=   self.scheduler_classes[0]
   lowercase__	: Tuple     		=   self.get_scheduler_config(prediction_type="""v_prediction""")
   lowercase__	: Dict     		=   scheduler_class(**SCREAMING_SNAKE_CASE_)

   lowercase__	: Dict     		=   len(SCREAMING_SNAKE_CASE_)

   lowercase__	: Tuple     		=   self.dummy_model()
   lowercase__	: Union[str, Any]     		=   self.dummy_sample_deter
   lowercase__	: int     		=   torch.manual_seed(0)

   for t in reversed(range(SCREAMING_SNAKE_CASE_)):
     # 1. predict noise residual
     lowercase__	: List[Any]     		=   model(SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_)

     # 2. predict previous mean of sample x_t-1
     lowercase__	: int     		=   scheduler.step(SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_       ,	generator=SCREAMING_SNAKE_CASE_).prev_sample

     # if t > 0:
     #     noise = self.dummy_sample_deter
     #     variance = scheduler.get_variance(t) ** (0.5) * noise
     #
     # sample = pred_prev_sample + variance
     lowercase__	: Tuple     		=   pred_prev_sample

   lowercase__	: Union[str, Any]     		=   torch.sum(torch.abs(SCREAMING_SNAKE_CASE_))
   lowercase__	: int     		=   torch.mean(torch.abs(SCREAMING_SNAKE_CASE_))

   assert abs(result_sum.item() - 2_0_2.0_2_9_6) < 1E-2
   assert abs(result_mean.item() - 0.2_6_3_1) < 1E-3


 def   lowercase__  (       self):


   '''simple docstring'''




   lowercase__	: str     		=   self.scheduler_classes[0]
   lowercase__	: int     		=   self.get_scheduler_config()
   lowercase__	: str     		=   scheduler_class(**SCREAMING_SNAKE_CASE_)

   lowercase__	: List[str]     		=   [1_00, 87, 50, 1, 0]

   scheduler.set_timesteps(timesteps=SCREAMING_SNAKE_CASE_)

   lowercase__	: List[Any]     		=   scheduler.timesteps

   for i, timestep in enumerate(SCREAMING_SNAKE_CASE_):
     if i == len(SCREAMING_SNAKE_CASE_) - 1:
       lowercase__	: Optional[int]     		=   -1
     else:
       lowercase__	: Tuple     		=   timesteps[i + 1]

     lowercase__	: Any     		=   scheduler.previous_timestep(SCREAMING_SNAKE_CASE_)
     lowercase__	: int     		=   prev_t.item()

     self.assertEqual(SCREAMING_SNAKE_CASE_       ,	SCREAMING_SNAKE_CASE_)


 def   lowercase__  (       self):


   '''simple docstring'''




   lowercase__	: Optional[int]     		=   self.scheduler_classes[0]
   lowercase__	: List[Any]     		=   self.get_scheduler_config()
   lowercase__	: int     		=   scheduler_class(**SCREAMING_SNAKE_CASE_)

   lowercase__	: List[Any]     		=   [1_00, 87, 50, 51, 0]

   with self.assertRaises(SCREAMING_SNAKE_CASE_       ,	msg="""`custom_timesteps` must be in descending order."""):
     scheduler.set_timesteps(timesteps=SCREAMING_SNAKE_CASE_)


 def   lowercase__  (       self):


   '''simple docstring'''




   lowercase__	: Union[str, Any]     		=   self.scheduler_classes[0]
   lowercase__	: List[Any]     		=   self.get_scheduler_config()
   lowercase__	: int     		=   scheduler_class(**SCREAMING_SNAKE_CASE_)

   lowercase__	: int     		=   [1_00, 87, 50, 1, 0]
   lowercase__	: Union[str, Any]     		=   len(SCREAMING_SNAKE_CASE_)

   with self.assertRaises(SCREAMING_SNAKE_CASE_       ,	msg="""Can only pass one of `num_inference_steps` or `custom_timesteps`."""):
     scheduler.set_timesteps(num_inference_steps=SCREAMING_SNAKE_CASE_       ,	timesteps=SCREAMING_SNAKE_CASE_)



 def   lowercase__  (       self):


   '''simple docstring'''




   lowercase__	: Optional[int]     		=   self.scheduler_classes[0]
   lowercase__	: int     		=   self.get_scheduler_config()
   lowercase__	: Dict     		=   scheduler_class(**SCREAMING_SNAKE_CASE_)

   lowercase__	: str     		=   [scheduler.config.num_train_timesteps]

   with self.assertRaises(
       SCREAMING_SNAKE_CASE_       ,	msg="""`timesteps` must start before `self.config.train_timesteps`: {scheduler.config.num_train_timesteps}}"""       ,	):
     scheduler.set_timesteps(timesteps=SCREAMING_SNAKE_CASE_)






