



"""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   a_	(			__a      ):
     A__				=   '''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=2048      ):
                    f.write(__a      )



def   a_	(			):
     A__				=   VivitConfig()

     A__				=   400
     A__				=   '''huggingface/label-files'''
     A__				=   '''kinetics400-id2label.json'''

     A__				=   json.load(open(hf_hub_download(__a		,							__a		,							repo_type='''dataset'''      )		,							'''r'''      )      )
     A__				=   {int(__a      ): v for k, v in idalabel.items()}
     A__				=   idalabel
     A__				=   {v: k for k, v in idalabel.items()}
     return config



def   a_	(			):
     A__				=   hf_hub_download(
         repo_id='''hf-internal-testing/spaghetti-video'''		,							filename='''eating_spaghetti_32_frames.npy'''		,							repo_type='''dataset'''      )
     A__				=   np.load(__a      )
     return list(__a      )



def   a_	(			__a      ):
     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   a_	(			__a      ):
     return current.flatten()



def   a_	(			__a      ):
     return np.reshape(__a		,							(current.shape[0], current.shape[1] * current.shape[2])      ).T



def   a_	(			__a      ):
     return np.reshape(__a		,							(current.shape[0] * current.shape[1], current.shape[2])      ).T



def   a_	(			__a		,							__a      ):
     A__				=   state_dict['''optimizer''']['''target''']['''Transformer'''][f'''encoderblock_{i}''']

     A__				=   f'''encoder.layer.{i}.'''
     A__				=   {
         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   a_	(			__a      ):
     return sum([1 if '''encoderblock_''' in k else 0 for k in state_dict['''optimizer''']['''target''']['''Transformer'''].keys()]      )



def   a_	(			__a		,							__a=False      ):
     A__				=   get_n_layers(__a      )

     A__				=   OrderedDict()

     A__				=   state_dict['''optimizer''']['''target''']['''Transformer''']['''encoder_norm''']['''bias''']
     A__				=   state_dict['''optimizer''']['''target''']['''Transformer''']['''encoder_norm''']['''scale''']

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

     A__				=   state_dict['''optimizer''']['''target''']['''cls''']
     A__				=   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:
          A__				=   {'''vivit.''' + k: v for k, v in new_state.items()}
          A__				=   np.transpose(state_dict['''optimizer''']['''target''']['''output_projection''']['''kernel''']      )
          A__				=   np.transpose(state_dict['''optimizer''']['''target''']['''output_projection''']['''bias''']      )

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



def   a_	(			):
     A__				=   VivitImageProcessor()

     assert extractor.do_resize is True
     assert extractor.size == {"shortest_edge": 256}
     assert extractor.do_center_crop is True
     assert extractor.crop_size == {"width": 224, "height": 224}
     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 / 255

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

     return extractor



def   a_	(			__a      ):
     A__				=   '''checkpoint'''

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

     A__				=   restore_checkpoint(__a		,							__a      )
     A__				=   transform_state(__a		,							classification_head=__a      )

     A__				=   get_vivit_config()

     assert config.image_size == 224
     assert config.num_frames == 32

     A__				=   VivitForVideoClassification(__a      )
     model.load_state_dict(__a      )
     model.eval()

     A__				=   get_processor()

     A__				=   prepare_video()
     A__				=   extractor(__a		,							return_tensors='''pt'''      )

     A__				=   model(**__a      )

     A__				=   torch.Size([1, 400]      )
     A__				=   torch.tensor([-1.05_43, 2.07_64, -0.21_04, 0.44_39, -0.96_58]      )

     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__":
 __snake_case	:				List[Any]  					=			argparse.ArgumentParser()

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

 __snake_case	:				Tuple  					=			parser.parse_args()
 convert(args.output_model_name)








"""simple docstring"""







from math import factorial



def   a_	(			__a		,							__a      ):
     return factorial(__a      ) / (factorial(__a      ) * factorial(n - r      ))



def   a_	(			):
     A__				=   0

     for i in range(1		,							101      ):
          for j in range(1		,							i + 1      ):
               if combinations(__a		,							__a      ) > 1e6:
                    total += 1
     return total


if __name__ == "__main__":
 print(solution())



