




from argparse import ArgumentParser

from . import BaseTransformersCLICommand







def lowerCamelCase__       (      _lowercase				):

     '''simple docstring'''


     return DownloadCommand(args.model			,						args.cache_dir			,						args.force			,						args.trust_remote_code				)



class   __a(					_a       ):






    """simple docstring"""





    @staticmethod
    def 							a__				(				_SCREAMING_SNAKE_CASE  )			->		Optional[Any]:
         UpperCAmelCase_      :							List[Any]       =      parser.add_parser('''download'''  )
         download_parser.add_argument(
             '''--cache-dir'''       ,type=_SCREAMING_SNAKE_CASE       ,default=_SCREAMING_SNAKE_CASE       ,help='''Path to location to store the models'''  )
         download_parser.add_argument(
             '''--force'''       ,action='''store_true'''       ,help='''Force the model to be download even if already in cache-dir'''  )
         download_parser.add_argument(
             '''--trust-remote-code'''       ,action='''store_true'''       ,help='''Whether or not to allow for custom models defined on the Hub in their own modeling files. Use only if you\'ve reviewed the code as it will execute on your local machine'''       ,)
         download_parser.add_argument('''model'''       ,type=_SCREAMING_SNAKE_CASE       ,help='''Name of the model to download'''  )
         download_parser.set_defaults(func=_SCREAMING_SNAKE_CASE  )





    def __init__(				self       ,_SCREAMING_SNAKE_CASE       ,_SCREAMING_SNAKE_CASE       ,_SCREAMING_SNAKE_CASE       ,_SCREAMING_SNAKE_CASE  )			->		Any:
         UpperCAmelCase_      :							int       =      model
         UpperCAmelCase_      :							Optional[Any]       =      cache
         UpperCAmelCase_      :							List[str]       =      force
         UpperCAmelCase_      :							Union[str, Any]       =      trust_remote_code





    def 							a__				(				self  )			->		List[Any]:
         from ..models.auto import AutoModel, AutoTokenizer

         AutoModel.from_pretrained(
             self._model       ,cache_dir=self._cache       ,force_download=self._force       ,trust_remote_code=self._trust_remote_code  )
         AutoTokenizer.from_pretrained(
             self._model       ,cache_dir=self._cache       ,force_download=self._force       ,trust_remote_code=self._trust_remote_code  )





import re

import jax.numpy as jnp
from flax.traverse_util import flatten_dict, unflatten_dict
from jax.random import PRNGKey

from ..utils import logging


__a          =			logging.get_logger(__name__)







def lowerCamelCase__       (      _lowercase				):

     '''simple docstring'''


     UpperCAmelCase_      :							str       =      r'''\w+[.]\d+'''
     UpperCAmelCase_      :							int       =      re.findall(_lowercase			,						_lowercase				)
     for pat in pats:
          UpperCAmelCase_      :							List[Any]       =      key.replace(_lowercase			,						'''_'''.join(pat.split('''.'''				)				)				)
     return key







def lowerCamelCase__       (      _lowercase			,						_lowercase			,						_lowercase				):

     '''simple docstring'''


     UpperCAmelCase_      :							Dict       =      pt_tuple_key[:-1] + ('''scale''',)
     if (
         any('''norm''' in str_ for str_ in pt_tuple_key				)
         and (pt_tuple_key[-1] == "bias")
         and (pt_tuple_key[:-1] + ("bias",) not in random_flax_state_dict)
         and (pt_tuple_key[:-1] + ("scale",) in random_flax_state_dict)
     ):
          UpperCAmelCase_      :							List[Any]       =      pt_tuple_key[:-1] + ('''scale''',)
          return renamed_pt_tuple_key, pt_tensor
     elif pt_tuple_key[-1] in ["weight", "gamma"] and pt_tuple_key[:-1] + ("scale",) in random_flax_state_dict:
          UpperCAmelCase_      :							Any       =      pt_tuple_key[:-1] + ('''scale''',)
          return renamed_pt_tuple_key, pt_tensor

     # embedding
     if pt_tuple_key[-1] == "weight" and pt_tuple_key[:-1] + ("embedding",) in random_flax_state_dict:
          UpperCAmelCase_      :							Tuple       =      pt_tuple_key[:-1] + ('''embedding''',)
          return renamed_pt_tuple_key, pt_tensor

     # conv layer
     UpperCAmelCase_      :							List[Any]       =      pt_tuple_key[:-1] + ('''kernel''',)
     if pt_tuple_key[-1] == "weight" and pt_tensor.ndim == 4:
          UpperCAmelCase_      :							List[Any]       =      pt_tensor.transpose(2			,						3			,						1			,						0				)
          return renamed_pt_tuple_key, pt_tensor

     # linear layer
     UpperCAmelCase_      :							Dict       =      pt_tuple_key[:-1] + ('''kernel''',)
     if pt_tuple_key[-1] == "weight":
          UpperCAmelCase_      :							Tuple       =      pt_tensor.T
          return renamed_pt_tuple_key, pt_tensor

     # old PyTorch layer norm weight
     UpperCAmelCase_      :							Any       =      pt_tuple_key[:-1] + ('''weight''',)
     if pt_tuple_key[-1] == "gamma":
          return renamed_pt_tuple_key, pt_tensor

     # old PyTorch layer norm bias
     UpperCAmelCase_      :							Tuple       =      pt_tuple_key[:-1] + ('''bias''',)
     if pt_tuple_key[-1] == "beta":
          return renamed_pt_tuple_key, pt_tensor

     return pt_tuple_key, pt_tensor







def lowerCamelCase__       (      _lowercase			,						_lowercase			,						_lowercase=42				):

     '''simple docstring'''


     UpperCAmelCase_      :							Union[str, Any]       =      {k: v.numpy() for k, v in pt_state_dict.items()}

     # Step 2: Since the model is stateless, get random Flax params
     UpperCAmelCase_      :							str       =      flax_model.init_weights(PRNGKey(_lowercase				)				)

     UpperCAmelCase_      :							List[Any]       =      flatten_dict(_lowercase				)
     UpperCAmelCase_      :							int       =      {}

     # Need to change some parameters name to match Flax names
     for pt_key, pt_tensor in pt_state_dict.items():
          UpperCAmelCase_      :							Optional[int]       =      rename_key(_lowercase				)
          UpperCAmelCase_      :							List[str]       =      tuple(renamed_pt_key.split('''.'''				)				)

          # Correctly rename weight parameters
          UpperCAmelCase_,   UpperCAmelCase_      :							Any       =      rename_key_and_reshape_tensor(_lowercase			,						_lowercase			,						_lowercase				)

          if flax_key in random_flax_state_dict:
               if flax_tensor.shape != random_flax_state_dict[flax_key].shape:
                    raise ValueError(
                        f'''PyTorch checkpoint seems to be incorrect. Weight {pt_key} was expected to be of shape '''
                        f'''{random_flax_state_dict[flax_key].shape}, but is {flax_tensor.shape}.'''				)

        # also add unexpected weight so that warning is thrown
          UpperCAmelCase_      :							int       =      jnp.asarray(_lowercase				)

     return unflatten_dict(_lowercase				)