





'''simple docstring'''




import mpmath  # for roots of unity
import numpy as np


class 					SCREAMING_SNAKE_CASE       :


     def __init__(		self		,      _UpperCAmelCase=None		,      _UpperCAmelCase=None):

          '''simple docstring'''






          __A		:					List[Any]						=			list(poly_a or [0])[:]
          __A		:					Optional[int]						=			list(poly_b or [0])[:]

          # Remove leading zero coefficients
          while self.polyA[-1] == 0:
               self.polyA.pop()
          __A		:					Union[str, Any]						=			len(self.polyA)

          while self.polyB[-1] == 0:
               self.polyB.pop()
          __A		:					Optional[int]						=			len(self.polyB)

          # Add 0 to make lengths equal a power of 2
          __A		:					Optional[Any]						=			int(
              2 ** np.ceil(np.loga(len(self.polyA) + len(self.polyB) - 1)))

          while len(self.polyA) < self.c_max_length:
               self.polyA.append(0)
          while len(self.polyB) < self.c_max_length:
               self.polyB.append(0)
          # A complex root used for the fourier transform
          __A		:					str						=			complex(mpmath.root(x=1		,      n=self.c_max_length		,      k=1))

          # The product
          __A		:					Tuple						=			self.__multiply()


     def 				SCREAMING_SNAKE_CASE    (		self		,      _UpperCAmelCase):

          '''simple docstring'''






          __A		:					Optional[int]						=			[[x] for x in self.polyA] if which == 'A' else [[x] for x in self.polyB]
          # Corner case
          if len(_UpperCAmelCase) <= 1:
               return dft[0]
          #
          __A		:					Dict						=			self.c_max_length // 2
          while next_ncol > 0:
               __A		:					Optional[Any]						=			[[] for i in range(_UpperCAmelCase)]
               __A		:					Tuple						=			self.root**next_ncol

               # First half of next step
               __A		:					Optional[Any]						=			1
               for j in range(self.c_max_length // (next_ncol * 2)):
                    for i in range(_UpperCAmelCase):
                         new_dft[i].append(dft[i][j] + current_root * dft[i + next_ncol][j])
                    current_root *= root
               # Second half of next step
               __A		:					List[str]						=			1
               for j in range(self.c_max_length // (next_ncol * 2)):
                    for i in range(_UpperCAmelCase):
                         new_dft[i].append(dft[i][j] - current_root * dft[i + next_ncol][j])
                    current_root *= root
               # Update
               __A		:					Optional[int]						=			new_dft
               __A		:					Tuple						=			next_ncol // 2
          return dft[0]


     def 				SCREAMING_SNAKE_CASE    (		self):

          '''simple docstring'''






          __A		:					int						=			self.__dft('A')
          __A		:					Optional[Any]						=			self.__dft('B')
          __A		:					str						=			[[dft_a[i] * dft_b[i] for i in range(self.c_max_length)]]
          del dft_a
          del dft_b

          # Corner Case
          if len(inverce_c[0]) <= 1:
               return inverce_c[0]
          # Inverse DFT
          __A		:					Dict						=			2
          while next_ncol <= self.c_max_length:
               __A		:					Optional[int]						=			[[] for i in range(_UpperCAmelCase)]
               __A		:					Any						=			self.root ** (next_ncol // 2)
               __A		:					Tuple						=			1
               # First half of next step
               for j in range(self.c_max_length // next_ncol):
                    for i in range(next_ncol // 2):
                         # Even positions
                         new_inverse_c[i].append(
                             (
                                 inverce_c[i][j]
                                 + inverce_c[i][j + self.c_max_length // next_ncol]
                             )
                             / 2)
                         # Odd positions
                         new_inverse_c[i + next_ncol // 2].append(
                             (
                                 inverce_c[i][j]
                                 - inverce_c[i][j + self.c_max_length // next_ncol]
                             )
                             / (2 * current_root))
                    current_root *= root
               # Update
               __A		:					int						=			new_inverse_c
               next_ncol *= 2
          # Unpack
          __A		:					Optional[int]						=			[round(x[0].real		,      8) + round(x[0].imag		,      8) * 1j for x in inverce_c]

          # Remove leading 0's
          while inverce_c[-1] == 0:
               inverce_c.pop()
          return inverce_c


     def __str__(		self):

          '''simple docstring'''






          __A		:					int						=			'A = ' + ' + '.join(
              F'{coef}*x^{i}' for coef, i in enumerate(self.polyA[: self.len_A]))
          __A		:					Optional[Any]						=			'B = ' + ' + '.join(
              F'{coef}*x^{i}' for coef, i in enumerate(self.polyB[: self.len_B]))
          __A		:					str						=			'A*B = ' + ' + '.join(
              F'{coef}*x^{i}' for coef, i in enumerate(self.product))

          return F'{a}\n{b}\n{c}'


# Unit tests
if __name__ == "__main__":
  import doctest

  doctest.testmod()



'''simple docstring'''
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        lowerCAmelCase_  :






       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			,     )->      Tuple:
            _A				=							parent
            _A				=							batch_size
            _A				=							patch_size
            _A				=							max_length
            _A				=							num_mel_bins
            _A				=							is_training
            _A				=							use_labels
            _A				=							hidden_size
            _A				=							num_hidden_layers
            _A				=							num_attention_heads
            _A				=							intermediate_size
            _A				=							hidden_act
            _A				=							hidden_dropout_prob
            _A				=							attention_probs_dropout_prob
            _A				=							type_sequence_label_size
            _A				=							initializer_range
            _A				=							scope
            _A				=							frequency_stride
            _A				=							time_stride

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






       def   UpperCamelCase						( self   )->      int:
            _A				=							floats_tensor([self.batch_size, self.max_length, self.num_mel_bins]   )

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

            _A				=							self.get_config()

            return config, input_values, labels






       def   UpperCamelCase						( self   )->      int:
            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   UpperCamelCase						( self			,     _UpperCamelCase			,     _UpperCamelCase			,     _UpperCamelCase   )->      Optional[Any]:
            _A				=							ASTModel(config=_UpperCamelCase   )
            model.to(_UpperCamelCase   )
            model.eval()
            _A				=							model(_UpperCamelCase   )
            self.parent.assertEqual(result.last_hidden_state.shape			,     (self.batch_size, self.seq_length, self.hidden_size)   )






       def   UpperCamelCase						( self   )->      Any:
            _A				=							self.prepare_config_and_inputs()
            (
                (
                _A
            )		,				(
                _A
            )		,				(
                _A
            )		,				
            )				=							config_and_inputs
            _A				=							{'input_values': input_values}
            return config, inputs_dict






@require_torch
class        lowerCAmelCase_  (     UpperCAmelCase      ,							UpperCAmelCase      ,							unittest.TestCase	):
       __UpperCAmelCase					=(
           (
               ASTModel,
               ASTForAudioClassification,
           )
           if is_torch_available()
           else ()
       )
       __UpperCAmelCase					=(
           {'audio-classification': ASTForAudioClassification, 'feature-extraction': ASTModel}
           if is_torch_available()
           else {}
       )
       __UpperCAmelCase					=False
       __UpperCAmelCase					=False
       __UpperCAmelCase					=False
       __UpperCAmelCase					=False






       def   UpperCamelCase						( self			,     _UpperCamelCase			,     _UpperCamelCase			,     _UpperCamelCase			,     _UpperCamelCase			,     _UpperCamelCase   )->      Union[str, Any]:
            if pipeline_test_casse_name == "AudioClassificationPipelineTests":
                 return True

            return False






       def   UpperCamelCase						( self   )->      List[str]:
            _A				=							ASTModelTester(self   )
            _A				=							ConfigTester(self			,     config_class=_UpperCamelCase			,     has_text_modality=_UpperCamelCase			,     hidden_size=37   )






       def   UpperCamelCase						( self   )->      int:
            self.config_tester.run_common_tests()






       @unittest.skip(reason='AST does not use inputs_embeds'   )
       def   UpperCamelCase						( self   )->      List[Any]:
            pass






       def   UpperCamelCase						( self   )->      str:
            _A		,				_A				=							self.model_tester.prepare_config_and_inputs_for_common()

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






       def   UpperCamelCase						( self   )->      List[str]:
            _A		,				_A				=							self.model_tester.prepare_config_and_inputs_for_common()

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

                 _A				=							['input_values']
                 self.assertListEqual(arg_names[:1]			,     _UpperCamelCase   )






       def   UpperCamelCase						( self   )->      Optional[Any]:
            _A				=							self.model_tester.prepare_config_and_inputs()
            self.model_tester.create_and_check_model(*_UpperCamelCase   )






       @slow
       def   UpperCamelCase						( self   )->      Tuple:
            for model_name in AUDIO_SPECTROGRAM_TRANSFORMER_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
                 _A				=							ASTModel.from_pretrained(_UpperCamelCase   )
                 self.assertIsNotNone(_UpperCamelCase   )






def 					lowerCamelCase_ ( )					->	Union[str, Any]:







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

     _A		,				_A				=							torchaudio.load(__UpperCamelCase		)

     return audio, sampling_rate






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






       @cached_property
       def   UpperCamelCase						( self   )->      Dict:
            return (
                ASTFeatureExtractor.from_pretrained('MIT/ast-finetuned-audioset-10-10-0.4593'   )
                if is_torchaudio_available()
                else None
            )






       @slow
       def   UpperCamelCase						( self   )->      Any:
            _A				=							self.default_feature_extractor
            _A				=							ASTForAudioClassification.from_pretrained('MIT/ast-finetuned-audioset-10-10-0.4593'   ).to(_UpperCamelCase   )

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

            # forward pass
            with torch.no_grad():
                 _A				=							model(**_UpperCamelCase   )

            # verify the logits
            _A				=							torch.Size((1, 527)   )
            self.assertEqual(outputs.logits.shape			,     _UpperCamelCase   )

            _A				=							torch.tensor([-0.8760, -7.0042, -8.6602]   ).to(_UpperCamelCase   )

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





