

"""simple docstring"""





from typing import List, Optional, Union

import numpy as np
import torch
import torchaudio.compliance.kaldi as ta_kaldi

from ...feature_extraction_sequence_utils import SequenceFeatureExtractor
from ...feature_extraction_utils import BatchFeature
from ...utils import TensorType, logging


_SCREAMING_SNAKE_CASE       :  Union[str, Any]        = logging.get_logger(__name__)

class     __a   (      snake_case__    ):

   """simple docstring"""

   SCREAMING_SNAKE_CASE_						     =						['input_values', 'attention_mask']






   def __init__(							self     :					List[str]						,  lowercase_     :					Tuple=1						,  lowercase_     :					Optional[int]=1_6000						,  lowercase_     :					Any=128						,  lowercase_     :					Tuple=1024						,  lowercase_     :					str=0.0						,  lowercase_     :					Union[str, Any]=True						,  lowercase_     :					str=-4.2_6_7_7_3_9_3						,  lowercase_     :					List[str]=4.5_6_8_9_9_7_4						,  lowercase_     :					Optional[Any]=False						,  **lowercase_     :					Optional[Any]						,  ):
        super().__init__(feature_size=lowercase_						,  sampling_rate=lowercase_						,  padding_value=lowercase_						,  **lowercase_						)
        UpperCamelCase__		:    Optional[int]         =num_mel_bins
        UpperCamelCase__		:    Tuple         =max_length
        UpperCamelCase__		:    Tuple         =do_normalize
        UpperCamelCase__		:    str         =mean
        UpperCamelCase__		:    int         =std
        UpperCamelCase__		:    str         =return_attention_mask






   def    _lowerCAmelCase			(							self     :					int						,  lowercase_     :					np.ndarray						,  lowercase_     :					int						,  ):
        UpperCamelCase__		:    Tuple         =torch.from_numpy(lowercase_						).unsqueeze(0						)
        UpperCamelCase__		:    Dict         =ta_kaldi.fbank(
            lowercase_						,  htk_compat=lowercase_						,  sample_frequency=self.sampling_rate						,  use_energy=lowercase_						,  window_type='''hanning'''						,  num_mel_bins=self.num_mel_bins						,  dither=0.0						,  frame_shift=10						,  )

        UpperCamelCase__		:    List[Any]         =fbank.shape[0]
        UpperCamelCase__		:    Tuple         =max_length - n_frames

        # pad or truncate, depending on difference
        if difference > 0:
             UpperCamelCase__		:    Any         =torch.nn.ZeroPadad((0, 0, 0, difference)						)
             UpperCamelCase__		:    List[str]         =pad_module(lowercase_						)
        elif difference < 0:
             UpperCamelCase__		:    str         =fbank[0:max_length, :]

        UpperCamelCase__		:    str         =fbank.numpy()

        return fbank






   def    _lowerCAmelCase			(							self     :					Dict						,  lowercase_     :					np.ndarray						):
        return (input_values - (self.mean)) / (self.std * 2)






   def __call__(							self     :					Dict						,  lowercase_     :					Union[np.ndarray, List[float], List[np.ndarray], List[List[float]]]						,  lowercase_     :					Optional[int] = None						,  lowercase_     :					Optional[Union[str, TensorType]] = None						,  **lowercase_     :					List[Any]						,  ):

        if sampling_rate is not None:
             if sampling_rate != self.sampling_rate:
                  raise ValueError(
                      f'''The model corresponding to this feature extractor: {self} was trained using a sampling rate of'''
                      f''' {self.sampling_rate}. Please make sure that the provided `raw_speech` input was sampled with'''
                      f''' {self.sampling_rate} and not {sampling_rate}.'''						)
        else:
             logger.warning(
                 '''It is strongly recommended to pass the `sampling_rate` argument to this function. '''
                 '''Failing to do so can result in silent errors that might be hard to debug.'''						)

        UpperCamelCase__		:    Dict         =isinstance(lowercase_						,  np.ndarray						) and len(raw_speech.shape						) > 1
        if is_batched_numpy and len(raw_speech.shape						) > 2:
             raise ValueError(f'''Only mono-channel audio is supported for input to {self}'''						)
        UpperCamelCase__		:    Optional[int]         =is_batched_numpy or (
            isinstance(lowercase_						,  (list, tuple)						) and (isinstance(raw_speech[0]						,  (np.ndarray, tuple, list)						))
        )

        if is_batched:
             UpperCamelCase__		:    Optional[int]         =[np.asarray(lowercase_						,  dtype=np.floataa						) for speech in raw_speech]
        elif not is_batched and not isinstance(lowercase_						,  np.ndarray						):
             UpperCamelCase__		:    Union[str, Any]         =np.asarray(lowercase_						,  dtype=np.floataa						)
        elif isinstance(lowercase_						,  np.ndarray						) and raw_speech.dtype is np.dtype(np.floataa						):
             UpperCamelCase__		:    Tuple         =raw_speech.astype(np.floataa						)

        # always return batch
        if not is_batched:
             UpperCamelCase__		:    Dict         =[raw_speech]

        # extract fbank features and pad/truncate to max_length
        UpperCamelCase__		:    Union[str, Any]         =[self._extract_fbank_features(lowercase_						,  max_length=self.max_length						) for waveform in raw_speech]

        # convert into BatchFeature
        UpperCamelCase__		:    List[Any]         =BatchFeature({'''input_values''': features}						)

        # make sure list is in array format
        UpperCamelCase__		:    Dict         =padded_inputs.get('''input_values'''						)
        if isinstance(input_values[0]						,  lowercase_						):
             UpperCamelCase__		:    Dict         =[np.asarray(lowercase_						,  dtype=np.floataa						) for feature in input_values]

        # normalization
        if self.do_normalize:
             UpperCamelCase__		:    int         =[self.normalize(lowercase_						) for feature in input_values]

        if return_tensors is not None:
             UpperCamelCase__		:    Optional[Any]         =padded_inputs.convert_to_tensors(lowercase_						)

        return padded_inputs





"""simple docstring"""





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

from ... import PreTrainedTokenizer
from ...configuration_utils import PretrainedConfig
from ...file_utils import TensorType, is_torch_available
from ...onnx import OnnxConfig, OnnxConfigWithPast, OnnxSeqaSeqConfigWithPast
from ...onnx.utils import compute_effective_axis_dimension
from ...utils import logging


_SCREAMING_SNAKE_CASE       :  Any        = logging.get_logger(__name__)

_SCREAMING_SNAKE_CASE       :  Optional[int]        = {
    """facebook/blenderbot-3B""": """https://huggingface.co/facebook/blenderbot-3B/resolve/main/config.json""",
    # See all Blenderbot models at https://huggingface.co/models?filter=blenderbot
}

class     __a   (      snake_case__    ):

			"""simple docstring"""

			SCREAMING_SNAKE_CASE_						     =						'blenderbot'
			SCREAMING_SNAKE_CASE_						     =						['past_key_values']
			SCREAMING_SNAKE_CASE_						     =						{'num_attention_heads': 'encoder_attention_heads', 'hidden_size': 'd_model'}






			def __init__(							self     :					Dict						,  lowercase_     :					Any=8008						,  lowercase_     :					Dict=128						,  lowercase_     :					Tuple=2						,  lowercase_     :					List[Any]=1_0240						,  lowercase_     :					Optional[int]=32						,  lowercase_     :					Optional[Any]=24						,  lowercase_     :					str=1_0240						,  lowercase_     :					Tuple=32						,  lowercase_     :					Optional[int]=0.0						,  lowercase_     :					Optional[int]=0.0						,  lowercase_     :					str=True						,  lowercase_     :					List[str]=True						,  lowercase_     :					Union[str, Any]="gelu"						,  lowercase_     :					List[str]=2560						,  lowercase_     :					Any=0.1						,  lowercase_     :					List[Any]=0.0						,  lowercase_     :					Any=0.0						,  lowercase_     :					Union[str, Any]=0.0_2						,  lowercase_     :					Any=1						,  lowercase_     :					Optional[int]=False						,  lowercase_     :					int=0						,  lowercase_     :					Optional[int]=1						,  lowercase_     :					Any=2						,  lowercase_     :					Any=3						,  lowercase_     :					Dict=2						,  **lowercase_     :					Optional[int]						,  ):
								UpperCamelCase__		:    int         =vocab_size
								UpperCamelCase__		:    List[Any]         =max_position_embeddings
								UpperCamelCase__		:    List[Any]         =d_model
								UpperCamelCase__		:    Union[str, Any]         =encoder_ffn_dim
								UpperCamelCase__		:    Optional[Any]         =encoder_layers
								UpperCamelCase__		:    List[str]         =encoder_attention_heads
								UpperCamelCase__		:    Optional[Any]         =decoder_ffn_dim
								UpperCamelCase__		:    Dict         =decoder_layers
								UpperCamelCase__		:    int         =decoder_attention_heads
								UpperCamelCase__		:    List[Any]         =dropout
								UpperCamelCase__		:    Optional[int]         =attention_dropout
								UpperCamelCase__		:    List[Any]         =activation_dropout
								UpperCamelCase__		:    Dict         =activation_function
								UpperCamelCase__		:    Optional[int]         =init_std
								UpperCamelCase__		:    Optional[int]         =encoder_layerdrop
								UpperCamelCase__		:    Tuple         =decoder_layerdrop
								UpperCamelCase__		:    List[str]         =use_cache
								UpperCamelCase__		:    int         =encoder_layers
								UpperCamelCase__		:    str         =scale_embedding  # scale factor will be sqrt(d_model) if True

								super().__init__(
								    pad_token_id=lowercase_						,  bos_token_id=lowercase_						,  eos_token_id=lowercase_						,  is_encoder_decoder=lowercase_						,  decoder_start_token_id=lowercase_						,  encoder_no_repeat_ngram_size=lowercase_						,  forced_eos_token_id=lowercase_						,  **lowercase_						,  )



class     __a   (      snake_case__    ):

			"""simple docstring"""

			@property
			def    _lowerCAmelCase			(							self     :					List[Any]						):
								if self.task in ["default", "seq2seq-lm"]:
													UpperCamelCase__		:    List[str]         =OrderedDict(
													    [
													        ('''input_ids''', {0: '''batch''', 1: '''encoder_sequence'''}),
													        ('''attention_mask''', {0: '''batch''', 1: '''encoder_sequence'''}),
													    ]						)
													if self.use_past:
																		UpperCamelCase__		:    Any         ={0: '''batch'''}
																		UpperCamelCase__		:    Optional[Any]         ={0: '''batch''', 1: '''past_decoder_sequence + sequence'''}
													else:
																		UpperCamelCase__		:    Optional[Any]         ={0: '''batch''', 1: '''decoder_sequence'''}
																		UpperCamelCase__		:    List[str]         ={0: '''batch''', 1: '''decoder_sequence'''}
													if self.use_past:
																		self.fill_with_past_key_values_(lowercase_						,  direction='''inputs'''						)
								elif self.task == "causal-lm":
													UpperCamelCase__		:    Optional[Any]         =OrderedDict(
													    [
													        ('''input_ids''', {0: '''batch''', 1: '''encoder_sequence'''}),
													        ('''attention_mask''', {0: '''batch''', 1: '''encoder_sequence'''}),
													    ]						)
													if self.use_past:
																		UpperCamelCase__  ,			UpperCamelCase__		:    str         =self.num_layers
																		for i in range(lowercase_						):
																							UpperCamelCase__		:    Optional[int]         ={0: '''batch''', 2: '''past_sequence + sequence'''}
																							UpperCamelCase__		:    Dict         ={0: '''batch''', 2: '''past_sequence + sequence'''}
								else:
													UpperCamelCase__		:    Any         =OrderedDict(
													    [
													        ('''input_ids''', {0: '''batch''', 1: '''encoder_sequence'''}),
													        ('''attention_mask''', {0: '''batch''', 1: '''encoder_sequence'''}),
													        ('''decoder_input_ids''', {0: '''batch''', 1: '''decoder_sequence'''}),
													        ('''decoder_attention_mask''', {0: '''batch''', 1: '''decoder_sequence'''}),
													    ]						)

								return common_inputs






			@property
			# Copied from transformers.models.bart.configuration_bart.BartOnnxConfig.outputs
			def    _lowerCAmelCase			(							self     :					Tuple						):
								if self.task in ["default", "seq2seq-lm"]:
													UpperCamelCase__		:    List[Any]         =super().outputs
								else:
													UpperCamelCase__		:    List[str]         =super(lowercase_						,  self						).outputs
													if self.use_past:
																		UpperCamelCase__  ,			UpperCamelCase__		:    int         =self.num_layers
																		for i in range(lowercase_						):
																							UpperCamelCase__		:    Dict         ={0: '''batch''', 2: '''past_sequence + sequence'''}
																							UpperCamelCase__		:    Dict         ={0: '''batch''', 2: '''past_sequence + sequence'''}
								return common_outputs






			def    _lowerCAmelCase			(							self     :					Optional[int]						,  lowercase_     :					PreTrainedTokenizer						,  lowercase_     :					int = -1						,  lowercase_     :					int = -1						,  lowercase_     :					bool = False						,  lowercase_     :					Optional[TensorType] = None						,  ):
								UpperCamelCase__		:    List[Any]         =self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
								    lowercase_						,  lowercase_						,  lowercase_						,  lowercase_						,  lowercase_						)
								# Generate decoder inputs
								UpperCamelCase__		:    List[Any]         =seq_length if not self.use_past else 1
								UpperCamelCase__		:    int         =self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
								    lowercase_						,  lowercase_						,  lowercase_						,  lowercase_						,  lowercase_						)
								UpperCamelCase__		:    str         ={f'''decoder_{name}''': tensor for name, tensor in decoder_inputs.items()}
								UpperCamelCase__		:    str         =dict(**lowercase_						,  **lowercase_						)

								if self.use_past:
													if not is_torch_available():
																		raise ValueError('''Cannot generate dummy past_keys inputs without PyTorch installed.'''						)
													else:
																		import torch
													UpperCamelCase__  ,			UpperCamelCase__		:    Optional[int]         =common_inputs['''input_ids'''].shape
													UpperCamelCase__		:    Any         =common_inputs['''decoder_input_ids'''].shape[1]
													UpperCamelCase__  ,			UpperCamelCase__		:    Union[str, Any]         =self.num_attention_heads
													UpperCamelCase__		:    Any         =(
													    batch,
													    num_encoder_attention_heads,
													    encoder_seq_length,
													    self._config.hidden_size // num_encoder_attention_heads,
													)
													UpperCamelCase__		:    Tuple         =decoder_seq_length
													UpperCamelCase__		:    Optional[Any]         =(
													    batch,
													    num_decoder_attention_heads,
													    decoder_past_length,
													    self._config.hidden_size // num_decoder_attention_heads,
													)
													UpperCamelCase__		:    Union[str, Any]         =torch.cat(
													    [common_inputs['''decoder_attention_mask'''], torch.ones(lowercase_						,  lowercase_						)]						,  dim=1						)
													UpperCamelCase__		:    Any         =[]
													UpperCamelCase__  ,			UpperCamelCase__		:    Union[str, Any]         =self.num_layers

													for _ in range(lowercase_						):
																		common_inputs["past_key_values"].append(
																		    (
																		        torch.zeros(lowercase_						),
																		        torch.zeros(lowercase_						),
																		        torch.zeros(lowercase_						),
																		        torch.zeros(lowercase_						),
																		    )						)
								return common_inputs






			def    _lowerCAmelCase			(							self     :					Tuple						,  lowercase_     :					PreTrainedTokenizer						,  lowercase_     :					int = -1						,  lowercase_     :					int = -1						,  lowercase_     :					bool = False						,  lowercase_     :					Optional[TensorType] = None						,  ):
								UpperCamelCase__		:    str         =self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
								    lowercase_						,  lowercase_						,  lowercase_						,  lowercase_						,  lowercase_						)

								if self.use_past:
													if not is_torch_available():
																		raise ValueError('''Cannot generate dummy past_keys inputs without PyTorch installed.'''						)
													else:
																		import torch
													UpperCamelCase__  ,			UpperCamelCase__		:    Tuple         =common_inputs['''input_ids'''].shape
													UpperCamelCase__		:    List[Any]         =seqlen
													UpperCamelCase__  ,			UpperCamelCase__		:    Any         =self.num_layers
													UpperCamelCase__  ,			UpperCamelCase__		:    Tuple         =self.num_attention_heads
													UpperCamelCase__		:    Optional[int]         =(
													    batch,
													    num_encoder_attention_heads,
													    past_key_values_length,
													    self._config.hidden_size // num_encoder_attention_heads,
													)
													UpperCamelCase__		:    Union[str, Any]         =common_inputs['''attention_mask'''].dtype
													UpperCamelCase__		:    int         =torch.cat(
													    [common_inputs['''attention_mask'''], torch.ones(lowercase_						,  lowercase_						,  dtype=lowercase_						)]						,  dim=1						)
													UpperCamelCase__		:    List[str]         =[
													    (torch.zeros(lowercase_						), torch.zeros(lowercase_						)) for _ in range(lowercase_						)
													]
								return common_inputs






			def    _lowerCAmelCase			(							self     :					Tuple						,  lowercase_     :					PreTrainedTokenizer						,  lowercase_     :					int = -1						,  lowercase_     :					int = -1						,  lowercase_     :					bool = False						,  lowercase_     :					Optional[TensorType] = None						,  ):
								# Copied from OnnxConfig.generate_dummy_inputs
								# Did not use super(OnnxConfigWithPast, self).generate_dummy_inputs for code clarity.
								# If dynamic axis (-1) we forward with a fixed dimension of 2 samples to avoid optimizations made by ONNX
								UpperCamelCase__		:    str         =compute_effective_axis_dimension(
								    lowercase_						,  fixed_dimension=OnnxConfig.default_fixed_batch						,  num_token_to_add=0						)

								# If dynamic axis (-1) we forward with a fixed dimension of 8 tokens to avoid optimizations made by ONNX
								UpperCamelCase__		:    Union[str, Any]         =tokenizer.num_special_tokens_to_add(lowercase_						)
								UpperCamelCase__		:    str         =compute_effective_axis_dimension(
								    lowercase_						,  fixed_dimension=OnnxConfig.default_fixed_sequence						,  num_token_to_add=lowercase_						)

								# Generate dummy inputs according to compute batch and sequence
								UpperCamelCase__		:    Union[str, Any]         =[''' '''.join([tokenizer.unk_token]						) * seq_length] * batch_size
								UpperCamelCase__		:    Tuple         =dict(tokenizer(lowercase_						,  return_tensors=lowercase_						)						)
								return common_inputs






			def    _lowerCAmelCase			(							self     :					int						,  lowercase_     :					PreTrainedTokenizer						,  lowercase_     :					int = -1						,  lowercase_     :					int = -1						,  lowercase_     :					bool = False						,  lowercase_     :					Optional[TensorType] = None						,  ):
								if self.task in ["default", "seq2seq-lm"]:
													UpperCamelCase__		:    Tuple         =self._generate_dummy_inputs_for_default_and_seqaseq_lm(
													    lowercase_						,  batch_size=lowercase_						,  seq_length=lowercase_						,  is_pair=lowercase_						,  framework=lowercase_						)

								elif self.task == "causal-lm":
													UpperCamelCase__		:    Union[str, Any]         =self._generate_dummy_inputs_for_causal_lm(
													    lowercase_						,  batch_size=lowercase_						,  seq_length=lowercase_						,  is_pair=lowercase_						,  framework=lowercase_						)
								else:
													UpperCamelCase__		:    Optional[int]         =self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
													    lowercase_						,  batch_size=lowercase_						,  seq_length=lowercase_						,  is_pair=lowercase_						,  framework=lowercase_						)

								return common_inputs






			def    _lowerCAmelCase			(							self     :					List[str]						,  lowercase_     :					int						,  lowercase_     :					Union[str, Any]						,  lowercase_     :					Optional[Any]						,  lowercase_     :					List[Any]						):
								if self.task in ["default", "seq2seq-lm"]:
													UpperCamelCase__		:    Optional[int]         =super()._flatten_past_key_values_(lowercase_						,  lowercase_						,  lowercase_						,  lowercase_						)
								else:
													UpperCamelCase__		:    Optional[int]         =super(lowercase_						,  self						)._flatten_past_key_values_(
													    lowercase_						,  lowercase_						,  lowercase_						,  lowercase_						)






			def    _lowerCAmelCase			(							self     :					List[str]						,  lowercase_     :					Mapping[str, Mapping[int, str]]						,  lowercase_     :					str						):
								if direction not in ["inputs", "outputs"]:
													raise ValueError(f'''direction must either be "inputs" or "outputs", but {direction} was given'''						)

								UpperCamelCase__		:    Optional[int]         ='''past_key_values''' if direction == '''inputs''' else '''present'''
								UpperCamelCase__  ,			UpperCamelCase__		:    Optional[int]         =self.num_layers

								UpperCamelCase__		:    List[str]         ='''past_encoder_sequence'''
								UpperCamelCase__		:    Optional[int]         ='''past_decoder_sequence''' if direction == '''inputs''' else '''past_decoder_sequence + sequence'''

								for i in range(lowercase_						):
													UpperCamelCase__		:    Tuple         ={0: '''batch''', 2: decoder_sequence}
													UpperCamelCase__		:    Union[str, Any]         ={0: '''batch''', 2: decoder_sequence}
													UpperCamelCase__		:    str         ={0: '''batch''', 2: encoder_sequence}
													UpperCamelCase__		:    List[Any]         ={0: '''batch''', 2: encoder_sequence}


