


'''simple docstring'''

import argparse
import json
from pathlib import Path

import torch
import torchaudio
from datasets import load_dataset
from huggingface_hub import hf_hub_download

from transformers import ASTConfig, ASTFeatureExtractor, ASTForAudioClassification
from transformers.utils import logging


logging.set_verbosity_info()
a_						:       str      			=				logging.get_logger(__name__)





def __snake_case      (   UpperCAmelCase_		:		List[Any]					):
 lowerCamelCase_  				=						ASTConfig()

 if "10-10" in model_name:
  pass
 elif "speech-commands" in model_name:
  lowerCamelCase_  				=						128
 elif "12-12" in model_name:
  lowerCamelCase_  				=						12
  lowerCamelCase_  				=						12
 elif "14-14" in model_name:
  lowerCamelCase_  				=						14
  lowerCamelCase_  				=						14
 elif "16-16" in model_name:
  lowerCamelCase_  				=						16
  lowerCamelCase_  				=						16
 else:
  raise ValueError("Model not supported"					)

 lowerCamelCase_  				=						"huggingface/label-files"
 if "speech-commands" in model_name:
  lowerCamelCase_  				=						35
  lowerCamelCase_  				=						"speech-commands-v2-id2label.json"
 else:
  lowerCamelCase_  				=						527
  lowerCamelCase_  				=						"audioset-id2label.json"

 lowerCamelCase_  				=						json.load(open(hf_hub_download(A_      ,       A_      ,       repo_type="dataset"					)      ,       "r"					)					)
 lowerCamelCase_  				=						{int(A_					): v for k, v in idalabel.items()}
 lowerCamelCase_  				=						idalabel
 lowerCamelCase_  				=						{v: k for k, v in idalabel.items()}

 return config





def __snake_case      (   UpperCAmelCase_		:		List[Any]					):





 if "module.v" in name:
  lowerCamelCase_  				=						name.replace("module.v"      ,       "audio_spectrogram_transformer"					)
 if "cls_token" in name:
  lowerCamelCase_  				=						name.replace("cls_token"      ,       "embeddings.cls_token"					)
 if "dist_token" in name:
  lowerCamelCase_  				=						name.replace("dist_token"      ,       "embeddings.distillation_token"					)
 if "pos_embed" in name:
  lowerCamelCase_  				=						name.replace("pos_embed"      ,       "embeddings.position_embeddings"					)
 if "patch_embed.proj" in name:
  lowerCamelCase_  				=						name.replace("patch_embed.proj"      ,       "embeddings.patch_embeddings.projection"					)
 # transformer blocks
 if "blocks" in name:
  lowerCamelCase_  				=						name.replace("blocks"      ,       "encoder.layer"					)
 if "attn.proj" in name:
  lowerCamelCase_  				=						name.replace("attn.proj"      ,       "attention.output.dense"					)
 if "attn" in name:
  lowerCamelCase_  				=						name.replace("attn"      ,       "attention.self"					)
 if "norm1" in name:
  lowerCamelCase_  				=						name.replace("norm1"      ,       "layernorm_before"					)
 if "norm2" in name:
  lowerCamelCase_  				=						name.replace("norm2"      ,       "layernorm_after"					)
 if "mlp.fc1" in name:
  lowerCamelCase_  				=						name.replace("mlp.fc1"      ,       "intermediate.dense"					)
 if "mlp.fc2" in name:
  lowerCamelCase_  				=						name.replace("mlp.fc2"      ,       "output.dense"					)
 # final layernorm
 if "audio_spectrogram_transformer.norm" in name:
  lowerCamelCase_  				=						name.replace("audio_spectrogram_transformer.norm"      ,       "audio_spectrogram_transformer.layernorm"					)
 # classifier head
 if "module.mlp_head.0" in name:
  lowerCamelCase_  				=						name.replace("module.mlp_head.0"      ,       "classifier.layernorm"					)
 if "module.mlp_head.1" in name:
  lowerCamelCase_  				=						name.replace("module.mlp_head.1"      ,       "classifier.dense"					)

 return name





def __snake_case      (   UpperCAmelCase_		:		Optional[Any]      ,       UpperCAmelCase_		:		List[str]					):





 for key in orig_state_dict.copy().keys():
  lowerCamelCase_  				=						orig_state_dict.pop(A_					)

  if "qkv" in key:
   lowerCamelCase_  				=						key.split("."					)
   lowerCamelCase_  				=						int(key_split[3]					)
   lowerCamelCase_  				=						config.hidden_size
   if "weight" in key:
    lowerCamelCase_  				=						val[:dim, :]
    lowerCamelCase_  				=						val[dim : dim * 2, :]
    lowerCamelCase_  				=						val[-dim:, :]
   else:
    lowerCamelCase_  				=						val[:dim]
    lowerCamelCase_  				=						val[dim : dim * 2]
    lowerCamelCase_  				=						val[-dim:]
  else:
   lowerCamelCase_  				=						val

 return orig_state_dict





def __snake_case      (   UpperCAmelCase_		:		Optional[Any]					):
 lowerCamelCase_  				=						[
     "module.v.head.weight",
     "module.v.head.bias",
     "module.v.head_dist.weight",
     "module.v.head_dist.bias",
 ]
 for k in ignore_keys:
  state_dict.pop(A_      ,       A_					)





@torch.no_grad()
def __snake_case      (   UpperCAmelCase_		:		List[Any]      ,       UpperCAmelCase_		:		Dict      ,       UpperCAmelCase_		:		Tuple=False					):
 lowerCamelCase_  				=						get_audio_spectrogram_transformer_config(A_					)

 lowerCamelCase_  				=						{
     "ast-finetuned-audioset-10-10-0.4593": (
         "https://www.dropbox.com/s/ca0b1v2nlxzyeb4/audioset_10_10_0.4593.pth?dl=1"
     ),
     "ast-finetuned-audioset-10-10-0.450": (
         "https://www.dropbox.com/s/1tv0hovue1bxupk/audioset_10_10_0.4495.pth?dl=1"
     ),
     "ast-finetuned-audioset-10-10-0.448": (
         "https://www.dropbox.com/s/6u5sikl4b9wo4u5/audioset_10_10_0.4483.pth?dl=1"
     ),
     "ast-finetuned-audioset-10-10-0.448-v2": (
         "https://www.dropbox.com/s/kt6i0v9fvfm1mbq/audioset_10_10_0.4475.pth?dl=1"
     ),
     "ast-finetuned-audioset-12-12-0.447": (
         "https://www.dropbox.com/s/snfhx3tizr4nuc8/audioset_12_12_0.4467.pth?dl=1"
     ),
     "ast-finetuned-audioset-14-14-0.443": (
         "https://www.dropbox.com/s/z18s6pemtnxm4k7/audioset_14_14_0.4431.pth?dl=1"
     ),
     "ast-finetuned-audioset-16-16-0.442": (
         "https://www.dropbox.com/s/mdsa4t1xmcimia6/audioset_16_16_0.4422.pth?dl=1"
     ),
     "ast-finetuned-speech-commands-v2": (
         "https://www.dropbox.com/s/q0tbqpwv44pquwy/speechcommands_10_10_0.9812.pth?dl=1"
     ),
 }

 # load original state_dict
 lowerCamelCase_  				=						model_name_to_url[model_name]
 lowerCamelCase_  				=						torch.hub.load_state_dict_from_url(A_      ,       map_location="cpu"					)
 # remove some keys
 remove_keys(A_					)
 # rename some keys
 lowerCamelCase_  				=						convert_state_dict(A_      ,       A_					)

 # load 🤗 model
 lowerCamelCase_  				=						ASTForAudioClassification(A_					)
 model.eval()

 model.load_state_dict(A_					)

 # verify outputs on dummy input
 # source: https://github.com/YuanGongND/ast/blob/79e873b8a54d0a3b330dd522584ff2b9926cd581/src/run.py#L62
 lowerCamelCase_  				=						-4.267_7393 if "speech-commands" not in model_name else -6.84_5978
 lowerCamelCase_  				=						4.568_9974 if "speech-commands" not in model_name else 5.565_4526
 lowerCamelCase_  				=						1024 if "speech-commands" not in model_name else 128
 lowerCamelCase_  				=						ASTFeatureExtractor(mean=A_      ,       std=A_      ,       max_length=A_					)

 if "speech-commands" in model_name:
  lowerCamelCase_  				=						load_dataset("speech_commands"      ,       "v0.02"      ,       split="validation"					)
  lowerCamelCase_  				=						dataset[0]["audio"]["array"]
 else:
  lowerCamelCase_  				=						hf_hub_download(
      repo_id="nielsr/audio-spectogram-transformer-checkpoint"      ,       filename="sample_audio.flac"      ,       repo_type="dataset"      ,       )

  lowerCamelCase_				,lowerCamelCase_  				=						torchaudio.load(A_					)
  lowerCamelCase_  				=						waveform.squeeze().numpy()

 lowerCamelCase_  				=						feature_extractor(A_      ,       sampling_rate=16000      ,       return_tensors="pt"					)

 # forward pass
 lowerCamelCase_  				=						model(**A_					)
 lowerCamelCase_  				=						outputs.logits

 if model_name == "ast-finetuned-audioset-10-10-0.4593":
  lowerCamelCase_  				=						torch.tensor([-0.8760, -7.0042, -8.6602]					)
 elif model_name == "ast-finetuned-audioset-10-10-0.450":
  lowerCamelCase_  				=						torch.tensor([-1.1986, -7.0903, -8.2718]					)
 elif model_name == "ast-finetuned-audioset-10-10-0.448":
  lowerCamelCase_  				=						torch.tensor([-2.6128, -8.0080, -9.4344]					)
 elif model_name == "ast-finetuned-audioset-10-10-0.448-v2":
  lowerCamelCase_  				=						torch.tensor([-1.5080, -7.4534, -8.8917]					)
 elif model_name == "ast-finetuned-audioset-12-12-0.447":
  lowerCamelCase_  				=						torch.tensor([-0.5050, -6.5833, -8.0843]					)
 elif model_name == "ast-finetuned-audioset-14-14-0.443":
  lowerCamelCase_  				=						torch.tensor([-0.3826, -7.0336, -8.2413]					)
 elif model_name == "ast-finetuned-audioset-16-16-0.442":
  lowerCamelCase_  				=						torch.tensor([-1.2113, -6.9101, -8.3470]					)
 elif model_name == "ast-finetuned-speech-commands-v2":
  lowerCamelCase_  				=						torch.tensor([6.1589, -8.0566, -8.7984]					)
 else:
  raise ValueError("Unknown model name"					)
 if not torch.allclose(logits[0, :3]      ,       A_      ,       atol=1E-4					):
  raise ValueError("Logits don't match"					)
 print("Looks ok!"					)

 if pytorch_dump_folder_path is not None:
  Path(A_					).mkdir(exist_ok=A_					)
  print(F'''Saving model {model_name} to {pytorch_dump_folder_path}'''					)
  model.save_pretrained(A_					)
  print(F'''Saving feature extractor to {pytorch_dump_folder_path}'''					)
  feature_extractor.save_pretrained(A_					)

 if push_to_hub:
  print("Pushing model and feature extractor to the hub..."					)
  model.push_to_hub(F'''MIT/{model_name}'''					)
  feature_extractor.push_to_hub(F'''MIT/{model_name}'''					)


if __name__ == "__main__":
     a_						:       List[str]      			=				argparse.ArgumentParser()
     # Required parameters
     parser.add_argument(
         """--model_name""",
         default="""ast-finetuned-audioset-10-10-0.4593""",
         type=str,
         help="""Name of the Audio Spectrogram Transformer model you\'d like to convert.""",
     )
     parser.add_argument(
         """--pytorch_dump_folder_path""", default=None, type=str, help="""Path to the output PyTorch model directory."""
     )
     parser.add_argument(
         """--push_to_hub""", action="""store_true""", help="""Whether or not to push the converted model to the 🤗 hub."""
     )

     a_						:       Any      			=				parser.parse_args()
     convert_audio_spectrogram_transformer_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)







'''simple docstring'''

from __future__ import annotations





def __snake_case      (   UpperCAmelCase_		:		int      ,       UpperCAmelCase_		:		int	):
 if b == 0:
  return (1, 0)
 ((lowerCamelCase_)				,(lowerCamelCase_))  				=						extended_euclid(UpperCAmelCase_      ,       a % b	)
 lowerCamelCase_  				=						a // b
 return (y, x - k * y)





def __snake_case      (   UpperCAmelCase_		:		int      ,       UpperCAmelCase_		:		int      ,       UpperCAmelCase_		:		int      ,       UpperCAmelCase_		:		int	):
 ((lowerCamelCase_)				,(lowerCamelCase_))  				=						extended_euclid(UpperCAmelCase_      ,       UpperCAmelCase_	)
 lowerCamelCase_  				=						na * na
 lowerCamelCase_  				=						ra * x * na + ra * y * na
 return (n % m + m) % m





def __snake_case      (   UpperCAmelCase_		:		int      ,       UpperCAmelCase_		:		int	):
 ((lowerCamelCase_)				,(lowerCamelCase_))  				=						extended_euclid(UpperCAmelCase_      ,       UpperCAmelCase_	)
 if b < 0:
  lowerCamelCase_  				=						(b % n + n) % n
 return b





def __snake_case      (   UpperCAmelCase_		:		int      ,       UpperCAmelCase_		:		int      ,       UpperCAmelCase_		:		int      ,       UpperCAmelCase_		:		int	):
 lowerCamelCase_				,lowerCamelCase_  				=						invert_modulo(UpperCAmelCase_      ,       UpperCAmelCase_	), invert_modulo(UpperCAmelCase_      ,       UpperCAmelCase_	)
 lowerCamelCase_  				=						na * na
 lowerCamelCase_  				=						ra * x * na + ra * y * na
 return (n % m + m) % m


if __name__ == "__main__":
     from doctest import testmod

     testmod(name="""chinese_remainder_theorem""", verbose=True)
     testmod(name="""chinese_remainder_theorem2""", verbose=True)
     testmod(name="""invert_modulo""", verbose=True)
     testmod(name="""extended_euclid""", verbose=True)



