

"""simple docstring"""



from sklearn.metrics import fa_score

import datasets


SCREAMING_SNAKE_CASE_					:	str							  =						'\nThe F1 score is the harmonic mean of the precision and recall. It can be computed with the equation:\nF1 = 2 * (precision * recall) / (precision + recall)\n'


SCREAMING_SNAKE_CASE_					:	Optional[Any]							  =						'\nArgs:\n    predictions (`list` of `int`): Predicted labels.\n    references (`list` of `int`): Ground truth labels.\n    labels (`list` of `int`): The set of labels to include when `average` is not set to `\'binary\'`, and the order of the labels if `average` is `None`. Labels present in the data can be excluded, for example to calculate a multiclass average ignoring a majority negative class. Labels not present in the data will result in 0 components in a macro average. For multilabel targets, labels are column indices. By default, all labels in `predictions` and `references` are used in sorted order. Defaults to None.\n    pos_label (`int`): The class to be considered the positive class, in the case where `average` is set to `binary`. Defaults to 1.\n    average (`string`): This parameter is required for multiclass/multilabel targets. If set to `None`, the scores for each class are returned. Otherwise, this determines the type of averaging performed on the data. Defaults to `\'binary\'`.\n\n        - \'binary\': Only report results for the class specified by `pos_label`. This is applicable only if the classes found in `predictions` and `references` are binary.\n        - \'micro\': Calculate metrics globally by counting the total true positives, false negatives and false positives.\n        - \'macro\': Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.\n        - \'weighted\': Calculate metrics for each label, and find their average weighted by support (the number of true instances for each label). This alters `\'macro\'` to account for label imbalance. This option can result in an F-score that is not between precision and recall.\n        - \'samples\': Calculate metrics for each instance, and find their average (only meaningful for multilabel classification).\n    sample_weight (`list` of `float`): Sample weights Defaults to None.\n\nReturns:\n    f1 (`float` or `array` of `float`): F1 score or list of f1 scores, depending on the value passed to `average`. Minimum possible value is 0. Maximum possible value is 1. Higher f1 scores are better.\n\nExamples:\n\n    Example 1-A simple binary example\n        >>> f1_metric = datasets.load_metric("f1")\n        >>> results = f1_metric.compute(references=[0, 1, 0, 1, 0], predictions=[0, 0, 1, 1, 0])\n        >>> print(results)\n        {\'f1\': 0.5}\n\n    Example 2-The same simple binary example as in Example 1, but with `pos_label` set to `0`.\n        >>> f1_metric = datasets.load_metric("f1")\n        >>> results = f1_metric.compute(references=[0, 1, 0, 1, 0], predictions=[0, 0, 1, 1, 0], pos_label=0)\n        >>> print(round(results[\'f1\'], 2))\n        0.67\n\n    Example 3-The same simple binary example as in Example 1, but with `sample_weight` included.\n        >>> f1_metric = datasets.load_metric("f1")\n        >>> results = f1_metric.compute(references=[0, 1, 0, 1, 0], predictions=[0, 0, 1, 1, 0], sample_weight=[0.9, 0.5, 3.9, 1.2, 0.3])\n        >>> print(round(results[\'f1\'], 2))\n        0.35\n\n    Example 4-A multiclass example, with different values for the `average` input.\n        >>> predictions = [0, 2, 1, 0, 0, 1]\n        >>> references = [0, 1, 2, 0, 1, 2]\n        >>> results = f1_metric.compute(predictions=predictions, references=references, average="macro")\n        >>> print(round(results[\'f1\'], 2))\n        0.27\n        >>> results = f1_metric.compute(predictions=predictions, references=references, average="micro")\n        >>> print(round(results[\'f1\'], 2))\n        0.33\n        >>> results = f1_metric.compute(predictions=predictions, references=references, average="weighted")\n        >>> print(round(results[\'f1\'], 2))\n        0.27\n        >>> results = f1_metric.compute(predictions=predictions, references=references, average=None)\n        >>> print(results)\n        {\'f1\': array([0.8, 0. , 0. ])}\n'


SCREAMING_SNAKE_CASE_					:	Tuple							  =						'\n@article{scikit-learn,\n    title={Scikit-learn: Machine Learning in {P}ython},\n    author={Pedregosa, F. and Varoquaux, G. and Gramfort, A. and Michel, V.\n           and Thirion, B. and Grisel, O. and Blondel, M. and Prettenhofer, P.\n           and Weiss, R. and Dubourg, V. and Vanderplas, J. and Passos, A. and\n           Cournapeau, D. and Brucher, M. and Perrot, M. and Duchesnay, E.},\n    journal={Journal of Machine Learning Research},\n    volume={12},\n    pages={2825--2830},\n    year={2011}\n}\n'



@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION,	_KWARGS_DESCRIPTION				)
class 					a						(       datasets.Metric				):



    """simple docstring"""



    def 				UpperCamelCase	(     self: Tuple       ):






         """simple docstring"""


         return datasets.MetricInfo(
             description=_DESCRIPTION    ,						citation=_CITATION    ,						inputs_description=_KWARGS_DESCRIPTION    ,						features=datasets.Features(
                 {
                     """predictions""": datasets.Sequence(datasets.Value("""int32"""       )       ),
                     """references""": datasets.Sequence(datasets.Value("""int32"""       )       ),
                 }
                 if self.config_name == """multilabel"""
                 else {
                     """predictions""": datasets.Value("""int32"""       ),
                     """references""": datasets.Value("""int32"""       ),
                 }       )    ,						reference_urls=["""https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html"""]    ,						)





    def 				UpperCamelCase	(     self: int    ,						UpperCamelCase: List[Any]    ,						UpperCamelCase: Optional[int]    ,						UpperCamelCase: int=None    ,						UpperCamelCase: List[str]=1    ,						UpperCamelCase: Optional[int]="binary"    ,						UpperCamelCase: Optional[Any]=None       ):






         """simple docstring"""


         A__										=  fa_score(
             UpperCamelCase    ,						UpperCamelCase    ,						labels=UpperCamelCase    ,						pos_label=UpperCamelCase    ,						average=UpperCamelCase    ,						sample_weight=UpperCamelCase       )
         return {"f1": float(UpperCamelCase       ) if score.size == 1 else score}









"""simple docstring"""



import argparse
from pathlib import Path
from typing import Dict, OrderedDict, Tuple

import torch
from audiocraft.models import MusicGen

from transformers import (
    AutoFeatureExtractor,
    AutoTokenizer,
    EncodecModel,
    MusicgenDecoderConfig,
    MusicgenForConditionalGeneration,
    MusicgenProcessor,
    TaEncoderModel,
)
from transformers.models.musicgen.modeling_musicgen import MusicgenForCausalLM
from transformers.utils import logging


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


SCREAMING_SNAKE_CASE_					:	Any							  =						['model.decoder.embed_positions.weights']





def  _snake_case     (    UpperCAmelCase_  :					Optional[int]			):
     if "emb" in name:
          A__										=  name.replace("""emb"""					,   """model.decoder.embed_tokens"""			)
     if "transformer" in name:
          A__										=  name.replace("""transformer"""					,   """model.decoder"""			)
     if "cross_attention" in name:
          A__										=  name.replace("""cross_attention"""					,   """encoder_attn"""			)
     if "linear1" in name:
          A__										=  name.replace("""linear1"""					,   """fc1"""			)
     if "linear2" in name:
          A__										=  name.replace("""linear2"""					,   """fc2"""			)
     if "norm1" in name:
          A__										=  name.replace("""norm1"""					,   """self_attn_layer_norm"""			)
     if "norm_cross" in name:
          A__										=  name.replace("""norm_cross"""					,   """encoder_attn_layer_norm"""			)
     if "norm2" in name:
          A__										=  name.replace("""norm2"""					,   """final_layer_norm"""			)
     if "out_norm" in name:
          A__										=  name.replace("""out_norm"""					,   """model.decoder.layer_norm"""			)
     if "linears" in name:
          A__										=  name.replace("""linears"""					,   """lm_heads"""			)
     if "condition_provider.conditioners.description.output_proj" in name:
          A__										=  name.replace("""condition_provider.conditioners.description.output_proj"""					,   """enc_to_dec_proj"""			)
     return name





def  _snake_case     (    UpperCAmelCase_  :					OrderedDict					,   UpperCAmelCase_  :					int			):
     A__										=  list(state_dict.keys()			)
     A__										=  {}
     for key in keys:
          A__										=  state_dict.pop(UpperCAmelCase_			)
          A__										=  rename_keys(UpperCAmelCase_			)
          if "in_proj_weight" in key:
               # split fused qkv proj
               A__										=  val[:hidden_size, :]
               A__										=  val[hidden_size : 2 * hidden_size, :]
               A__										=  val[-hidden_size:, :]
          elif "enc_to_dec_proj" in key:
               A__										=  val
          else:
               A__										=  val
     return state_dict, enc_dec_proj_state_dict





def  _snake_case     (    UpperCAmelCase_  :					str			):
     if checkpoint == "small":
          # default config values
          A__										=  1024
          A__										=  24
          A__										=  16
     elif checkpoint == "medium":
          A__										=  1536
          A__										=  48
          A__										=  24
     elif checkpoint == "large":
          A__										=  2048
          A__										=  48
          A__										=  32
     else:
          raise ValueError(F"""Checkpoint should be one of `['small', 'medium', 'large']`, got {checkpoint}."""			)
     A__										=  MusicgenDecoderConfig(
         hidden_size=UpperCAmelCase_					,   ffn_dim=hidden_size * 4					,   num_hidden_layers=UpperCAmelCase_					,   num_attention_heads=UpperCAmelCase_					,   )
     return config





@torch.no_grad()
def  _snake_case     (    UpperCAmelCase_  :					int					,   UpperCAmelCase_  :					List[Any]=None					,   UpperCAmelCase_  :					Tuple=None					,   UpperCAmelCase_  :					Any="cpu"			):
     A__										=  MusicGen.get_pretrained(UpperCAmelCase_					,   device=UpperCAmelCase_			)
     A__										=  decoder_config_from_checkpoint(UpperCAmelCase_			)

     A__										=  fairseq_model.lm.state_dict()
     A__			,				A__										=  rename_state_dict(
         UpperCAmelCase_					,   hidden_size=decoder_config.hidden_size			)

     A__										=  TaEncoderModel.from_pretrained("""t5-base"""			)
     A__										=  EncodecModel.from_pretrained("""facebook/encodec_32khz"""			)
     A__										=  MusicgenForCausalLM(UpperCAmelCase_			).eval()

     # load all decoder weights - expect that we'll be missing embeddings and enc-dec projection
     A__			,				A__										=  decoder.load_state_dict(UpperCAmelCase_					,   strict=UpperCAmelCase_			)

     for key in missing_keys.copy():
          if key.startswith(("""text_encoder""", """audio_encoder""")			) or key in EXPECTED_MISSING_KEYS:
               missing_keys.remove(UpperCAmelCase_			)

     if len(UpperCAmelCase_			) > 0:
          raise ValueError(F"""Missing key(s) in state_dict: {missing_keys}"""			)

     if len(UpperCAmelCase_			) > 0:
          raise ValueError(F"""Unexpected key(s) in state_dict: {unexpected_keys}"""			)

     # init the composite model
     A__										=  MusicgenForConditionalGeneration(text_encoder=UpperCAmelCase_					,   audio_encoder=UpperCAmelCase_					,   decoder=UpperCAmelCase_			)

     # load the pre-trained enc-dec projection (from the decoder state dict)
     model.enc_to_dec_proj.load_state_dict(UpperCAmelCase_			)

     # check we can do a forward pass
     A__										=  torch.arange(0					,   8					,   dtype=torch.long			).reshape(2					,   -1			)
     A__										=  input_ids.reshape(2 * 4					,   -1			)

     with torch.no_grad():
          A__										=  model(input_ids=UpperCAmelCase_					,   decoder_input_ids=UpperCAmelCase_			).logits

     if logits.shape != (8, 1, 2048):
          raise ValueError("""Incorrect shape for logits"""			)

     # now construct the processor
     A__										=  AutoTokenizer.from_pretrained("""t5-base"""			)
     A__										=  AutoFeatureExtractor.from_pretrained("""facebook/encodec_32khz"""					,   padding_side="""left"""			)

     A__										=  MusicgenProcessor(feature_extractor=UpperCAmelCase_					,   tokenizer=UpperCAmelCase_			)

     # set the appropriate bos/pad token ids
     A__										=  2048
     A__										=  2048

     # set other default generation config params
     A__										=  int(30 * audio_encoder.config.frame_rate			)
     A__										=  True
     A__										=  3.0

     if pytorch_dump_folder is not None:
          Path(UpperCAmelCase_			).mkdir(exist_ok=UpperCAmelCase_			)
          logger.info(F"""Saving model {checkpoint} to {pytorch_dump_folder}"""			)
          model.save_pretrained(UpperCAmelCase_			)
          processor.save_pretrained(UpperCAmelCase_			)

     if repo_id:
          logger.info(F"""Pushing model {checkpoint} to {repo_id}"""			)
          model.push_to_hub(UpperCAmelCase_			)
          processor.push_to_hub(UpperCAmelCase_			)


if __name__ == "__main__":
 SCREAMING_SNAKE_CASE_					:	int							  =						argparse.ArgumentParser()
 # Required parameters
 parser.add_argument(
     '--checkpoint',
     default='small',
     type=str,
     help='Checkpoint size of the MusicGen model you\'d like to convert. Can be one of: `[\'small\', \'medium\', \'large\']`.',
 )
 parser.add_argument(
     '--pytorch_dump_folder',
     required=True,
     default=None,
     type=str,
     help='Path to the output PyTorch model directory.',
 )
 parser.add_argument(
     '--push_to_hub', default=None, type=str, help='Where to upload the converted model on the 🤗 hub.'
 )
 parser.add_argument(
     '--device', default='cpu', type=str, help='Torch device to run the conversion, either cpu or cuda.'
 )

 SCREAMING_SNAKE_CASE_					:	Tuple							  =						parser.parse_args()
 convert_musicgen_checkpoint(args.checkpoint, args.pytorch_dump_folder, args.push_to_hub)






