"""simple docstring"""




from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available


__lowerCamelCase									=	{"""configuration_visual_bert""": ["""VISUAL_BERT_PRETRAINED_CONFIG_ARCHIVE_MAP""", """VisualBertConfig"""]}

try:
				if not is_torch_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				__lowerCamelCase									=	[
				    """VISUAL_BERT_PRETRAINED_MODEL_ARCHIVE_LIST""",
				    """VisualBertForMultipleChoice""",
				    """VisualBertForPreTraining""",
				    """VisualBertForQuestionAnswering""",
				    """VisualBertForRegionToPhraseAlignment""",
				    """VisualBertForVisualReasoning""",
				    """VisualBertLayer""",
				    """VisualBertModel""",
				    """VisualBertPreTrainedModel""",
				]


if TYPE_CHECKING:
				from .configuration_visual_bert import VISUAL_BERT_PRETRAINED_CONFIG_ARCHIVE_MAP, VisualBertConfig

				try:
								if not is_torch_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_visual_bert import (
								    VISUAL_BERT_PRETRAINED_MODEL_ARCHIVE_LIST,
								    VisualBertForMultipleChoice,
								    VisualBertForPreTraining,
								    VisualBertForQuestionAnswering,
								    VisualBertForRegionToPhraseAlignment,
								    VisualBertForVisualReasoning,
								    VisualBertLayer,
								    VisualBertModel,
								    VisualBertPreTrainedModel,
								)


else:
				import sys

				__lowerCamelCase									=	_LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)











'''simple docstring'''
import argparse
import json
import os.path
from collections import OrderedDict

import numpy as np
import requests
import torch
from flax.training.checkpoints import restore_checkpoint
from huggingface_hub import hf_hub_download

from transformers import VivitConfig, VivitForVideoClassification, VivitImageProcessor
from transformers.image_utils import PILImageResampling
def 							snake_case_    (  a__						:      Any     ):



    """simple docstring"""




    __lowercase     							=		"""https://storage.googleapis.com/scenic-bucket/vivit/kinetics_400/vivit_base_16x2_unfactorized/checkpoint"""

    with open(a__       ,"""wb"""     ) as f:
        with requests.get(a__       ,stream=a__     ) as req:
            for chunk in req.iter_content(chunk_size=20_48     ):
                f.write(a__     )
def 							snake_case_    (  ):



    """simple docstring"""




    __lowercase     							=		VivitConfig()

    __lowercase     							=		4_00
    __lowercase     							=		"""huggingface/label-files"""
    __lowercase     							=		"""kinetics400-id2label.json"""

    __lowercase     							=		json.load(open(hf_hub_download(a__       ,a__       ,repo_type="""dataset"""     )       ,"""r"""     )     )
    __lowercase     							=		{int(a__     ): v for k, v in idalabel.items()}
    __lowercase     							=		idalabel
    __lowercase     							=		{v: k for k, v in idalabel.items()}
    return config
def 							snake_case_    (  ):



    """simple docstring"""




    __lowercase     							=		hf_hub_download(
        repo_id="""hf-internal-testing/spaghetti-video"""       ,filename="""eating_spaghetti_32_frames.npy"""       ,repo_type="""dataset"""     )
    __lowercase     							=		np.load(a__     )
    return list(a__     )
def 							snake_case_    (  a__						:      np.ndarray     ):



    """simple docstring"""




    if np.ndim(a__     ) == 2:
        return transform_attention_bias(a__     )

    elif np.ndim(a__     ) == 3:
        return transform_attention_kernel(a__     )

    else:
        raise Exception(f'Invalid number of dimesions: {np.ndim(a__     )}'     )
def 							snake_case_    (  a__						:      np.ndarray     ):



    """simple docstring"""




    return current.flatten()
def 							snake_case_    (  a__						:      np.ndarray     ):



    """simple docstring"""




    return np.reshape(a__       ,(current.shape[0], current.shape[1] * current.shape[2])     ).T
def 							snake_case_    (  a__						:      np.ndarray     ):



    """simple docstring"""




    return np.reshape(a__       ,(current.shape[0] * current.shape[1], current.shape[2])     ).T
def 							snake_case_    (  a__						:      Tuple       ,a__						:      Dict     ):



    """simple docstring"""




    __lowercase     							=		state_dict["""optimizer"""]["""target"""]["""Transformer"""][f'encoderblock_{i}']

    __lowercase     							=		f'encoder.layer.{i}.'
    __lowercase     							=		{
        prefix + """intermediate.dense.bias""": state["""MlpBlock_0"""]["""Dense_0"""]["""bias"""],
        prefix + """intermediate.dense.weight""": np.transpose(state["""MlpBlock_0"""]["""Dense_0"""]["""kernel"""]     ),
        prefix + """output.dense.bias""": state["""MlpBlock_0"""]["""Dense_1"""]["""bias"""],
        prefix + """output.dense.weight""": np.transpose(state["""MlpBlock_0"""]["""Dense_1"""]["""kernel"""]     ),
        prefix + """layernorm_before.bias""": state["""LayerNorm_0"""]["""bias"""],
        prefix + """layernorm_before.weight""": state["""LayerNorm_0"""]["""scale"""],
        prefix + """layernorm_after.bias""": state["""LayerNorm_1"""]["""bias"""],
        prefix + """layernorm_after.weight""": state["""LayerNorm_1"""]["""scale"""],
        prefix
        + """attention.attention.query.bias""": transform_attention(
            state["""MultiHeadDotProductAttention_0"""]["""query"""]["""bias"""]     ),
        prefix
        + """attention.attention.query.weight""": transform_attention(
            state["""MultiHeadDotProductAttention_0"""]["""query"""]["""kernel"""]     ),
        prefix
        + """attention.attention.key.bias""": transform_attention(state["""MultiHeadDotProductAttention_0"""]["""key"""]["""bias"""]     ),
        prefix
        + """attention.attention.key.weight""": transform_attention(
            state["""MultiHeadDotProductAttention_0"""]["""key"""]["""kernel"""]     ),
        prefix
        + """attention.attention.value.bias""": transform_attention(
            state["""MultiHeadDotProductAttention_0"""]["""value"""]["""bias"""]     ),
        prefix
        + """attention.attention.value.weight""": transform_attention(
            state["""MultiHeadDotProductAttention_0"""]["""value"""]["""kernel"""]     ),
        prefix + """attention.output.dense.bias""": state["""MultiHeadDotProductAttention_0"""]["""out"""]["""bias"""],
        prefix
        + """attention.output.dense.weight""": transform_attention_output_weight(
            state["""MultiHeadDotProductAttention_0"""]["""out"""]["""kernel"""]     ),
    }

    return new_state
def 							snake_case_    (  a__						:      str     ):



    """simple docstring"""




    return sum([1 if """encoderblock_""" in k else 0 for k in state_dict["""optimizer"""]["""target"""]["""Transformer"""].keys()]     )
def 							snake_case_    (  a__						:      Any       ,a__						:      int=False     ):



    """simple docstring"""




    __lowercase     							=		get_n_layers(a__     )

    __lowercase     							=		OrderedDict()

    __lowercase     							=		state_dict["""optimizer"""]["""target"""]["""Transformer"""]["""encoder_norm"""]["""bias"""]
    __lowercase     							=		state_dict["""optimizer"""]["""target"""]["""Transformer"""]["""encoder_norm"""]["""scale"""]

    __lowercase     							=		np.transpose(
        state_dict["""optimizer"""]["""target"""]["""embedding"""]["""kernel"""]       ,(4, 3, 0, 1, 2)     )
    __lowercase     							=		state_dict["""optimizer"""]["""target"""]["""embedding"""]["""bias"""]

    __lowercase     							=		state_dict["""optimizer"""]["""target"""]["""cls"""]
    __lowercase     							=		state_dict["""optimizer"""]["""target"""]["""Transformer"""]["""posembed_input"""][
        """pos_embedding"""
    ]

    for i in range(a__     ):
        new_state.update(transform_state_encoder_block(a__       ,a__     )     )

    if classification_head:
        __lowercase     							=		{"""vivit.""" + k: v for k, v in new_state.items()}
        __lowercase     							=		np.transpose(state_dict["""optimizer"""]["""target"""]["""output_projection"""]["""kernel"""]     )
        __lowercase     							=		np.transpose(state_dict["""optimizer"""]["""target"""]["""output_projection"""]["""bias"""]     )

    return {k: torch.tensor(a__     ) for k, v in new_state.items()}
def 							snake_case_    (  ):



    """simple docstring"""




    __lowercase     							=		VivitImageProcessor()

    assert extractor.do_resize is True
    assert extractor.size == {"shortest_edge": 2_56}
    assert extractor.do_center_crop is True
    assert extractor.crop_size == {"width": 2_24, "height": 2_24}
    assert extractor.resample == PILImageResampling.BILINEAR

    # here: https://github.com/deepmind/dmvr/blob/master/dmvr/modalities.py
    # one can seen that add_image has default values for normalization_mean and normalization_std set to 0 and 1
    # which effectively means no normalization (and ViViT does not overwrite those when calling this func)
    assert extractor.do_normalize is False
    assert extractor.do_rescale is True
    assert extractor.rescale_factor == 1 / 2_55

    # zero-centering = True in original implementation
    assert extractor.do_zero_centering is True

    return extractor
def 							snake_case_    (  a__						:      str     ):



    """simple docstring"""




    __lowercase     							=		"""checkpoint"""

    if not os.path.exists(a__     ):
        download_checkpoint(a__     )

    __lowercase     							=		restore_checkpoint(a__       ,a__     )
    __lowercase     							=		transform_state(a__       ,classification_head=a__     )

    __lowercase     							=		get_vivit_config()

    assert config.image_size == 2_24
    assert config.num_frames == 32

    __lowercase     							=		VivitForVideoClassification(a__     )
    model.load_state_dict(a__     )
    model.eval()

    __lowercase     							=		get_processor()

    __lowercase     							=		prepare_video()
    __lowercase     							=		extractor(a__       ,return_tensors="""pt"""     )

    __lowercase     							=		model(**a__     )

    __lowercase     							=		torch.Size([1, 4_00]     )
    __lowercase     							=		torch.tensor([-1.0_5_4_3, 2.0_7_6_4, -0.2_1_0_4, 0.4_4_3_9, -0.9_6_5_8]     )

    assert outputs.logits.shape == expected_shape
    assert torch.allclose(outputs.logits[0, :5]       ,a__       ,atol=1e-4     ), outputs.logits[0, :5]

    model.save_pretrained(a__     )
    extractor.save_pretrained(a__     )


if __name__ == "__main__":
  A				: Union[str, Any]					      =			argparse.ArgumentParser()

  parser.add_argument("""--output_model_name""", """-o""", type=str, help="""Output path for the converted HuggingFace model""")

  A				: Optional[Any]					      =			parser.parse_args()
  convert(args.output_model_name)




