




from io import BytesIO
from typing import List, Union

import requests

from ..utils import add_end_docstrings, is_decord_available, is_torch_available, logging, requires_backends
from .base import PIPELINE_INIT_ARGS, Pipeline


if is_decord_available():
      import numpy as np
      from decord import VideoReader


if is_torch_available():
      from ..models.auto.modeling_auto import MODEL_FOR_VIDEO_CLASSIFICATION_MAPPING

_lowerCamelCase     :		str								=       logging.get_logger(__name__)


@add_end_docstrings(UpperCAmelCase__					)
class     UpperCamelCase_   (			UpperCAmelCase__					):

    '''simple docstring'''






    def __init__(      self				:     Tuple ,			*UpperCAmelCase__				:     str ,			**UpperCAmelCase__				:     Dict)						->List[Any]:





           '''simple docstring'''

           super().__init__(*UpperCAmelCase__ ,			**UpperCAmelCase__)
           requires_backends(self ,			'''decord''')
           self.check_model_type(UpperCAmelCase__)


    def 	SCREAMING_SNAKE_CASE							(      self				:     int ,			UpperCAmelCase__				:     Dict=None ,			UpperCAmelCase__				:     str=None ,			UpperCAmelCase__				:     Dict=None)						->str:





           '''simple docstring'''

           A__							=   {}
           if frame_sampling_rate is not None:
                  A__							=   frame_sampling_rate
           if num_frames is not None:
                  A__							=   num_frames

           A__							=   {}
           if top_k is not None:
                  A__							=   top_k
           return preprocess_params, {}, postprocess_params


    def __call__(      self				:     Dict ,			UpperCAmelCase__				:     Union[str, List[str]] ,			**UpperCAmelCase__				:     List[Any])						->str:





           '''simple docstring'''

           return super().__call__(UpperCAmelCase__ ,			**UpperCAmelCase__)


    def 	SCREAMING_SNAKE_CASE							(      self				:     Optional[Any] ,			UpperCAmelCase__				:     int ,			UpperCAmelCase__				:     int=None ,			UpperCAmelCase__				:     Optional[Any]=1)						->Optional[Any]:





           '''simple docstring'''

           if num_frames is None:
                  A__							=   self.model.config.num_frames

           if video.startswith('''http://''') or video.startswith('''https://'''):
                  A__							=   BytesIO(requests.get(UpperCAmelCase__).content)

           A__							=   VideoReader(UpperCAmelCase__)
           videoreader.seek(0)

           A__							=   0
           A__							=   num_frames * frame_sampling_rate - 1
           A__							=   np.linspace(UpperCAmelCase__ ,			UpperCAmelCase__ ,			num=UpperCAmelCase__ ,			dtype=np.intaa)

           A__							=   videoreader.get_batch(UpperCAmelCase__).asnumpy()
           A__							=   list(UpperCAmelCase__)

           A__							=   self.image_processor(UpperCAmelCase__ ,			return_tensors=self.framework)
           return model_inputs


    def 	SCREAMING_SNAKE_CASE							(      self				:     Union[str, Any] ,			UpperCAmelCase__				:     int)						->Union[str, Any]:





           '''simple docstring'''

           A__							=   self.model(**UpperCAmelCase__)
           return model_outputs





    def 	SCREAMING_SNAKE_CASE							(      self				:     Optional[Any] ,			UpperCAmelCase__				:     str ,			UpperCAmelCase__				:     Optional[int]=5)						->int:





           '''simple docstring'''

           if top_k > self.model.config.num_labels:
                  A__							=   self.model.config.num_labels

           if self.framework == "pt":
                  A__							=   model_outputs.logits.softmax(-1)[0]
                  A__			,							A__							=   probs.topk(UpperCAmelCase__)
           else:
                  raise ValueError(f"""Unsupported framework: {self.framework}""")

           A__							=   scores.tolist()
           A__							=   ids.tolist()
           return [{"score": score, "label": self.model.config.idalabel[_id]} for score, _id in zip(UpperCAmelCase__ ,			UpperCAmelCase__)]








import argparse

from tax import checkpoints

from transformers import AutoConfig, FlaxAutoModelForSeqaSeqLM







def SCREAMING_SNAKE_CASE    (	lowercase_			,    lowercase_			,    lowercase_						)       ->	Tuple:



       """simple docstring"""

       A__							=   AutoConfig.from_pretrained(lowercase_						)
       A__							=   FlaxAutoModelForSeqaSeqLM.from_config(config=lowercase_						)
       A__							=   checkpoints.load_tax_checkpoint(lowercase_						)

       A__							=   '''wi_0''' in tax_model['''target''']['''encoder''']['''layers_0''']['''mlp''']

       if config.model_type == "t5":
              A__							=   '''SelfAttention'''
       if config.model_type == "longt5" and config.encoder_attention_type == "local":
              A__							=   '''LocalSelfAttention'''
       elif config.model_type == "longt5" and config.encoder_attention_type == "transient-global":
              A__							=   '''TransientGlobalSelfAttention'''
       else:
              raise ValueError(
                  '''Given config is expected to have `model_type=\'t5\'`, or `model_type=\'longt5` with `encoder_attention_type`'''
                  ''' attribute with a value from [\'local\', \'transient-global].'''						)

       # Encoder
       for layer_index in range(config.num_layers						):
              A__							=   f"""layers_{str(lowercase_						)}"""

              # Self-Attention
              A__							=   tax_model['''target''']['''encoder'''][layer_name]['''attention''']['''key''']['''kernel''']
              A__							=   tax_model['''target''']['''encoder'''][layer_name]['''attention''']['''out''']['''kernel''']
              A__							=   tax_model['''target''']['''encoder'''][layer_name]['''attention''']['''query''']['''kernel''']
              A__							=   tax_model['''target''']['''encoder'''][layer_name]['''attention''']['''value''']['''kernel''']

              # Global input layer norm
              if config.model_type == "longt5" and config.encoder_attention_type == "transient-global":
                     A__							=   tax_model['''target''']['''encoder'''][layer_name]['''attention''']['''T5LayerNorm_0''']['''scale''']

              # Layer Normalization
              A__							=   tax_model['''target''']['''encoder'''][layer_name]['''pre_attention_layer_norm''']['''scale''']

              if split_mlp_wi:
                     A__							=   tax_model['''target''']['''encoder'''][layer_name]['''mlp''']['''wi_0''']['''kernel''']
                     A__							=   tax_model['''target''']['''encoder'''][layer_name]['''mlp''']['''wi_1''']['''kernel''']
              else:
                     A__							=   tax_model['''target''']['''encoder'''][layer_name]['''mlp''']['''wi''']['''kernel''']

              A__							=   tax_model['''target''']['''encoder'''][layer_name]['''mlp''']['''wo''']['''kernel''']

              # Layer Normalization
              A__							=   tax_model['''target''']['''encoder'''][layer_name]['''pre_mlp_layer_norm''']['''scale''']

              # Assigning
              A__							=   flax_model.params['''encoder''']['''block'''][str(lowercase_						)]['''layer''']
              A__							=   tax_attention_key
              A__							=   tax_attention_out
              A__							=   tax_attention_query
              A__							=   tax_attention_value

              A__							=   tax_attention_layer_norm

              # Global input layer norm
              if config.model_type == "longt5" and config.encoder_attention_type == "transient-global":
                     A__							=   tax_global_layer_norm

              if split_mlp_wi:
                     A__							=   tax_mlp_wi_a
                     A__							=   tax_mlp_wi_a
              else:
                     A__							=   tax_mlp_wi

              A__							=   tax_mlp_wo
              A__							=   tax_mlp_layer_norm

              A__							=   flax_model_encoder_layer_block

       # Only for layer 0:
       A__							=   tax_model['''target''']['''encoder''']['''relpos_bias''']['''rel_embedding'''].T
       A__							=   tax_encoder_rel_embedding

       # Side/global relative position_bias + layer norm
       if config.model_type == "longt5" and config.encoder_attention_type == "transient-global":
              A__							=   tax_model['''target''']['''encoder''']['''side_relpos_bias''']['''rel_embedding'''].T
              A__							=   tax_encoder_global_rel_embedding

       # Assigning
       A__							=   tax_model['''target''']['''encoder''']['''encoder_norm''']['''scale''']
       A__							=   tax_encoder_norm

       # Decoder
       for layer_index in range(config.num_layers						):
              A__							=   f"""layers_{str(lowercase_						)}"""

              # Self-Attention
              A__							=   tax_model['''target''']['''decoder'''][layer_name]['''self_attention''']['''key''']['''kernel''']
              A__							=   tax_model['''target''']['''decoder'''][layer_name]['''self_attention''']['''out''']['''kernel''']
              A__							=   tax_model['''target''']['''decoder'''][layer_name]['''self_attention''']['''query''']['''kernel''']
              A__							=   tax_model['''target''']['''decoder'''][layer_name]['''self_attention''']['''value''']['''kernel''']

              # Layer Normalization
              A__							=   tax_model['''target''']['''decoder'''][layer_name]['''pre_self_attention_layer_norm'''][
                  '''scale'''
              ]

              # Encoder-Decoder-Attention
              A__							=   tax_model['''target''']['''decoder'''][layer_name]['''encoder_decoder_attention''']
              A__							=   tax_enc_dec_attention_module['''key''']['''kernel''']
              A__							=   tax_enc_dec_attention_module['''out''']['''kernel''']
              A__							=   tax_enc_dec_attention_module['''query''']['''kernel''']
              A__							=   tax_enc_dec_attention_module['''value''']['''kernel''']

              # Layer Normalization
              A__							=   tax_model['''target''']['''decoder'''][layer_name]['''pre_cross_attention_layer_norm''']['''scale''']

              # MLP
              if split_mlp_wi:
                     A__							=   tax_model['''target''']['''decoder'''][layer_name]['''mlp''']['''wi_0''']['''kernel''']
                     A__							=   tax_model['''target''']['''decoder'''][layer_name]['''mlp''']['''wi_1''']['''kernel''']
              else:
                     A__							=   tax_model['''target''']['''decoder'''][layer_name]['''mlp''']['''wi''']['''kernel''']

              A__							=   tax_model['''target''']['''decoder'''][layer_name]['''mlp''']['''wo''']['''kernel''']

              # Layer Normalization
              A__							=   tax_model['''target''']['''decoder'''][layer_name]['''pre_mlp_layer_norm''']['''scale''']

              # Assigning
              A__							=   flax_model.params['''decoder''']['''block'''][str(lowercase_						)]['''layer''']
              A__							=   tax_attention_key
              A__							=   tax_attention_out
              A__							=   tax_attention_query
              A__							=   tax_attention_value

              A__							=   tax_pre_attention_layer_norm

              A__							=   tax_enc_dec_attention_key
              A__							=   tax_enc_dec_attention_out
              A__							=   tax_enc_dec_attention_query
              A__							=   tax_enc_dec_attention_value

              A__							=   tax_cross_layer_norm

              if split_mlp_wi:
                     A__							=   tax_mlp_wi_a
                     A__							=   tax_mlp_wi_a
              else:
                     A__							=   tax_mlp_wi

              A__							=   tax_mlp_wo

              A__							=   txa_mlp_layer_norm

              A__							=   flax_model_decoder_layer_block

       # Decoder Normalization
       A__							=   tax_model['''target''']['''decoder''']['''decoder_norm''']['''scale''']
       A__							=   txa_decoder_norm

       # Only for layer 0:
       A__							=   tax_model['''target''']['''decoder''']['''relpos_bias''']['''rel_embedding'''].T
       A__							=   tax_decoder_rel_embedding

       # Token Embeddings
       A__							=   tax_model['''target''']['''token_embedder''']['''embedding''']
       A__							=   txa_token_embeddings

       # LM Head (only in v1.1 and LongT5 checkpoints)
       if "logits_dense" in tax_model["target"]["decoder"]:
              A__							=   tax_model['''target''']['''decoder''']['''logits_dense''']['''kernel''']

       flax_model.save_pretrained(lowercase_						)
       print('''T5X Model was sucessfully converted!'''						)


if __name__ == "__main__":
  _lowerCamelCase     :		Any								=       argparse.ArgumentParser()
  # Required parameters
  parser.add_argument(
      """--t5x_checkpoint_path""", default=None, type=str, required=True, help="""Path the T5X checkpoint."""
  )
  parser.add_argument("""--config_name""", default=None, type=str, required=True, help="""Config name of LongT5/T5 model.""")
  parser.add_argument(
      """--flax_dump_folder_path""", default=None, type=str, required=True, help="""Path to the output FLAX model."""
  )
  _lowerCamelCase     :		Tuple								=       parser.parse_args()
  convert_tax_checkpoint_to_flax(args.tax_checkpoint_path, args.config_name, args.flax_dump_folder_path)


