

from ...configuration_utils import PretrainedConfig
from ...utils import logging
from ...utils.backbone_utils import BackboneConfigMixin, get_aligned_output_features_output_indices


A									=  logging.get_logger(__name__)

A									=  {
    'google/bit-50': 'https://huggingface.co/google/bit-50/resolve/main/config.json',
}


class SCREAMING_SNAKE_CASE	(		__snake_case				,    __snake_case				):






			"""simple docstring"""




			__A    	=	"""bit"""
			__A    	=	["""preactivation""", """bottleneck"""]
			__A    	=	["""SAME""", """VALID"""]


			def __init__(     self			,					__UpperCamelCase=3			,					__UpperCamelCase=64			,					__UpperCamelCase=[2_56, 5_12, 10_24, 20_48]			,					__UpperCamelCase=[3, 4, 6, 3]			,					__UpperCamelCase="preactivation"			,					__UpperCamelCase="relu"			,					__UpperCamelCase=None			,					__UpperCamelCase=32			,					__UpperCamelCase=0.0			,					__UpperCamelCase=False			,					__UpperCamelCase=32			,					__UpperCamelCase=1			,					__UpperCamelCase=None			,					__UpperCamelCase=None			,					**__UpperCamelCase			,					):

				"""simple docstring"""


				super().__init__(**__UpperCamelCase				)
				if layer_type not in self.layer_types:
					raise ValueError(f"""layer_type={layer_type} is not one of {','.join(self.layer_types				)}"""				)
				if global_padding is not None:
					if global_padding.upper() in self.supported_padding:
						snake_case_   		=			global_padding.upper()
					else:
						raise ValueError(f"""Padding strategy {global_padding} not supported"""				)
				snake_case_   		=			num_channels
				snake_case_   		=			embedding_size
				snake_case_   		=			hidden_sizes
				snake_case_   		=			depths
				snake_case_   		=			layer_type
				snake_case_   		=			hidden_act
				snake_case_   		=			global_padding
				snake_case_   		=			num_groups
				snake_case_   		=			drop_path_rate
				snake_case_   		=			embedding_dynamic_padding
				snake_case_   		=			output_stride
				snake_case_   		=			width_factor

				snake_case_   		=			['stem'] + [f"""stage{idx}""" for idx in range(1			,					len(__UpperCamelCase				) + 1				)]
				snake_case_		,							snake_case_   		=			get_aligned_output_features_output_indices(
				    out_features=__UpperCamelCase			,					out_indices=__UpperCamelCase			,					stage_names=self.stage_names				)



import inspect
import unittest

from huggingface_hub import hf_hub_download

from transformers import ASTConfig
from transformers.testing_utils import require_torch, require_torchaudio, slow, torch_device
from transformers.utils import cached_property, is_torch_available, is_torchaudio_available

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
		import torch
		from torch import nn

		from transformers import ASTForAudioClassification, ASTModel
		from transformers.models.audio_spectrogram_transformer.modeling_audio_spectrogram_transformer import (
		    AUDIO_SPECTROGRAM_TRANSFORMER_PRETRAINED_MODEL_ARCHIVE_LIST,
		)


if is_torchaudio_available():
		import torchaudio

		from transformers import ASTFeatureExtractor


class SCREAMING_SNAKE_CASE	:






			"""simple docstring"""




			def __init__(     self			,					__UpperCamelCase			,					__UpperCamelCase=13			,					__UpperCamelCase=2			,					__UpperCamelCase=24			,					__UpperCamelCase=16			,					__UpperCamelCase=True			,					__UpperCamelCase=True			,					__UpperCamelCase=32			,					__UpperCamelCase=5			,					__UpperCamelCase=4			,					__UpperCamelCase=37			,					__UpperCamelCase="gelu"			,					__UpperCamelCase=0.1			,					__UpperCamelCase=0.1			,					__UpperCamelCase=10			,					__UpperCamelCase=0.02			,					__UpperCamelCase=None			,					__UpperCamelCase=2			,					__UpperCamelCase=2			,					):

				"""simple docstring"""


				snake_case_   		=			parent
				snake_case_   		=			batch_size
				snake_case_   		=			patch_size
				snake_case_   		=			max_length
				snake_case_   		=			num_mel_bins
				snake_case_   		=			is_training
				snake_case_   		=			use_labels
				snake_case_   		=			hidden_size
				snake_case_   		=			num_hidden_layers
				snake_case_   		=			num_attention_heads
				snake_case_   		=			intermediate_size
				snake_case_   		=			hidden_act
				snake_case_   		=			hidden_dropout_prob
				snake_case_   		=			attention_probs_dropout_prob
				snake_case_   		=			type_sequence_label_size
				snake_case_   		=			initializer_range
				snake_case_   		=			scope
				snake_case_   		=			frequency_stride
				snake_case_   		=			time_stride

				# in AST, the seq length equals the number of patches + 2 (we add 2 for the [CLS] and distillation tokens)
				snake_case_   		=			(self.num_mel_bins - self.patch_size) // self.frequency_stride + 1
				snake_case_   		=			(self.max_length - self.patch_size) // self.time_stride + 1
				snake_case_   		=			frequency_out_dimension * time_out_dimension
				snake_case_   		=			num_patches + 2


			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				snake_case_   		=			floats_tensor([self.batch_size, self.max_length, self.num_mel_bins]				)

				snake_case_   		=			None
				if self.use_labels:
					snake_case_   		=			ids_tensor([self.batch_size]			,					self.type_sequence_label_size				)

				snake_case_   		=			self.get_config()

				return config, input_values, labels


			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				return ASTConfig(
				    patch_size=self.patch_size			,					max_length=self.max_length			,					num_mel_bins=self.num_mel_bins			,					hidden_size=self.hidden_size			,					num_hidden_layers=self.num_hidden_layers			,					num_attention_heads=self.num_attention_heads			,					intermediate_size=self.intermediate_size			,					hidden_act=self.hidden_act			,					hidden_dropout_prob=self.hidden_dropout_prob			,					attention_probs_dropout_prob=self.attention_probs_dropout_prob			,					is_decoder=__UpperCamelCase			,					initializer_range=self.initializer_range			,					frequency_stride=self.frequency_stride			,					time_stride=self.time_stride			,					)


			def       __lowerCAmelCase			(     self			,					__UpperCamelCase			,					__UpperCamelCase			,					__UpperCamelCase				):

				"""simple docstring"""


				snake_case_   		=			ASTModel(config=__UpperCamelCase				)
				model.to(__UpperCamelCase				)
				model.eval()
				snake_case_   		=			model(__UpperCamelCase				)
				self.parent.assertEqual(result.last_hidden_state.shape			,					(self.batch_size, self.seq_length, self.hidden_size)				)







			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				snake_case_   		=			self.prepare_config_and_inputs()
				(
				    (
				    snake_case_
				)		,							(
				    snake_case_
				)		,							(
				    snake_case_
				)		,							
				)   		=			config_and_inputs
				snake_case_   		=			{'input_values': input_values}
				return config, inputs_dict







@require_torch
class SCREAMING_SNAKE_CASE	(		__snake_case				,    __snake_case				,    unittest.TestCase				):






			"""simple docstring"""




			__A    	=	(
			    (
			        ASTModel,
			        ASTForAudioClassification,
			    )
			    if is_torch_available()
			    else ()
			)
			__A    	=	(
			    {"""audio-classification""": ASTForAudioClassification, """feature-extraction""": ASTModel}
			    if is_torch_available()
			    else {}
			)
			__A    	=	False
			__A    	=	False
			__A    	=	False
			__A    	=	False


			def       __lowerCAmelCase			(     self			,					__UpperCamelCase			,					__UpperCamelCase			,					__UpperCamelCase			,					__UpperCamelCase			,					__UpperCamelCase				):

				"""simple docstring"""


				if pipeline_test_casse_name == "AudioClassificationPipelineTests":
					return True

				return False


			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				snake_case_   		=			ASTModelTester(self				)
				snake_case_   		=			ConfigTester(self			,					config_class=__UpperCamelCase			,					has_text_modality=__UpperCamelCase			,					hidden_size=37				)


			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				self.config_tester.run_common_tests()


			@unittest.skip(reason='AST does not use inputs_embeds'				)
			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				pass


			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				snake_case_		,							snake_case_   		=			self.model_tester.prepare_config_and_inputs_for_common()

				for model_class in self.all_model_classes:
					snake_case_   		=			model_class(__UpperCamelCase				)
					self.assertIsInstance(model.get_input_embeddings()			,					(nn.Module)				)
					snake_case_   		=			model.get_output_embeddings()
					self.assertTrue(x is None or isinstance(__UpperCamelCase			,					nn.Linear				)				)


			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				snake_case_		,							snake_case_   		=			self.model_tester.prepare_config_and_inputs_for_common()

				for model_class in self.all_model_classes:
					snake_case_   		=			model_class(__UpperCamelCase				)
					snake_case_   		=			inspect.signature(model.forward				)
					# signature.parameters is an OrderedDict => so arg_names order is deterministic
					snake_case_   		=			[*signature.parameters.keys()]

					snake_case_   		=			['input_values']
					self.assertListEqual(arg_names[:1]			,					__UpperCamelCase				)


			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				snake_case_   		=			self.model_tester.prepare_config_and_inputs()
				self.model_tester.create_and_check_model(*__UpperCamelCase				)







			@slow
			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				for model_name in AUDIO_SPECTROGRAM_TRANSFORMER_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
					snake_case_   		=			ASTModel.from_pretrained(__UpperCamelCase				)
					self.assertIsNotNone(__UpperCamelCase				)







def a():





	'''simple docstring'''
	snake_case_   		=			hf_hub_download(
	    repo_id='nielsr/audio-spectogram-transformer-checkpoint'      ,			filename='sample_audio.flac'      ,			repo_type='dataset'						)

	snake_case_		,							snake_case_   		=			torchaudio.load(lowercase__						)

	return audio, sampling_rate






@require_torch
@require_torchaudio
class SCREAMING_SNAKE_CASE	(		unittest.TestCase				):






			"""simple docstring"""




			@cached_property
			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				return (
				    ASTFeatureExtractor.from_pretrained('MIT/ast-finetuned-audioset-10-10-0.4593'				)
				    if is_torchaudio_available()
				    else None
				)







			@slow
			def       __lowerCAmelCase			(     self				):

				"""simple docstring"""


				snake_case_   		=			self.default_feature_extractor
				snake_case_   		=			ASTForAudioClassification.from_pretrained('MIT/ast-finetuned-audioset-10-10-0.4593'				).to(__UpperCamelCase				)

				snake_case_   		=			self.default_feature_extractor
				snake_case_		,							snake_case_   		=			prepare_audio()
				snake_case_   		=			audio.squeeze().numpy()
				snake_case_   		=			feature_extractor(__UpperCamelCase			,					sampling_rate=__UpperCamelCase			,					return_tensors='pt'				).to(__UpperCamelCase				)

				# forward pass
				with torch.no_grad():
					snake_case_   		=			model(**__UpperCamelCase				)

				# verify the logits
				snake_case_   		=			torch.Size((1, 5_27)				)
				self.assertEqual(outputs.logits.shape			,					__UpperCamelCase				)

				snake_case_   		=			torch.tensor([-0.8760, -7.0042, -8.6602]				).to(__UpperCamelCase				)

				self.assertTrue(torch.allclose(outputs.logits[0, :3]			,					__UpperCamelCase			,					atol=1E-4				)				)
