


import argparse

import torch

from transformers import BertForMaskedLM


if __name__ == "__main__":
 __lowerCAmelCase			=							argparse.ArgumentParser(
     description=(
         '''Extraction some layers of the full BertForMaskedLM or RObertaForMaskedLM for Transfer Learned'''
         ''' Distillation'''
     )
 )
 parser.add_argument('''--model_type''', default='''bert''', choices=['''bert'''])
 parser.add_argument('''--model_name''', default='''bert-base-uncased''', type=str)
 parser.add_argument('''--dump_checkpoint''', default='''serialization_dir/tf_bert-base-uncased_0247911.pth''', type=str)
 parser.add_argument('''--vocab_transform''', action='''store_true''')
 __lowerCAmelCase			=							parser.parse_args()

 if args.model_type == "bert":
  __lowerCAmelCase			=							BertForMaskedLM.from_pretrained(args.model_name)
  __lowerCAmelCase			=							'''bert'''
 else:
  raise ValueError('''args.model_type should be "bert".''')

 __lowerCAmelCase			=							model.state_dict()
 __lowerCAmelCase			=							{}

 for w in ["word_embeddings", "position_embeddings"]:
  __lowerCAmelCase			=							state_dict[F'''{prefix}.embeddings.{w}.weight''']
 for w in ["weight", "bias"]:
  __lowerCAmelCase			=							state_dict[F'''{prefix}.embeddings.LayerNorm.{w}''']

 __lowerCAmelCase			=							0
 for teacher_idx in [0, 2, 4, 7, 9, 11]:
  for w in ["weight", "bias"]:
   __lowerCAmelCase			=							state_dict[
       F'''{prefix}.encoder.layer.{teacher_idx}.attention.self.query.{w}'''
   ]
   __lowerCAmelCase			=							state_dict[
       F'''{prefix}.encoder.layer.{teacher_idx}.attention.self.key.{w}'''
   ]
   __lowerCAmelCase			=							state_dict[
       F'''{prefix}.encoder.layer.{teacher_idx}.attention.self.value.{w}'''
   ]

   __lowerCAmelCase			=							state_dict[
       F'''{prefix}.encoder.layer.{teacher_idx}.attention.output.dense.{w}'''
   ]
   __lowerCAmelCase			=							state_dict[
       F'''{prefix}.encoder.layer.{teacher_idx}.attention.output.LayerNorm.{w}'''
   ]

   __lowerCAmelCase			=							state_dict[
       F'''{prefix}.encoder.layer.{teacher_idx}.intermediate.dense.{w}'''
   ]
   __lowerCAmelCase			=							state_dict[
       F'''{prefix}.encoder.layer.{teacher_idx}.output.dense.{w}'''
   ]
   __lowerCAmelCase			=							state_dict[
       F'''{prefix}.encoder.layer.{teacher_idx}.output.LayerNorm.{w}'''
   ]
  std_idx += 1

 __lowerCAmelCase			=							state_dict['''cls.predictions.decoder.weight''']
 __lowerCAmelCase			=							state_dict['''cls.predictions.bias''']
 if args.vocab_transform:
  for w in ["weight", "bias"]:
   __lowerCAmelCase			=							state_dict[F'''cls.predictions.transform.dense.{w}''']
   __lowerCAmelCase			=							state_dict[F'''cls.predictions.transform.LayerNorm.{w}''']

 print(F'''N layers selected for distillation: {std_idx}''')
 print(F'''Number of params transferred for distillation: {len(compressed_sd.keys())}''')

 print(F'''Save transferred checkpoint to {args.dump_checkpoint}.''')
 torch.save(compressed_sd, args.dump_checkpoint)






from math import pow




def        snake_case_					(  snake_case      ,							snake_case      ,							snake_case      ,							snake_case      ,							snake_case      ,							)  ->    tuple[int, int]:
       if current_sum == needed_sum:
              # If the sum of the powers is equal to needed_sum, then we have a solution.
              solutions_count += 1
              return current_sum, solutions_count

       lowercase__:       int        =       int(pow(snake_case      ,							snake_case					)					)
       if current_sum + i_to_n <= needed_sum:
              # If the sum of the powers is less than needed_sum, then continue adding powers.
              current_sum += i_to_n
              lowercase__      ,						lowercase__:       Any        =       backtrack(
                  snake_case      ,							snake_case      ,							current_number + 1      ,							snake_case      ,							snake_case					)
              current_sum -= i_to_n
       if i_to_n < needed_sum:
              # If the power of i is less than needed_sum, then try with the next power.
              lowercase__      ,						lowercase__:       Optional[int]        =       backtrack(
                  snake_case      ,							snake_case      ,							current_number + 1      ,							snake_case      ,							snake_case					)
       return current_sum, solutions_count




def        snake_case_					(  snake_case      ,							snake_case					)  ->    int:
       if not (1 <= needed_sum <= 10_00 and 2 <= power <= 10):
              raise ValueError(
                  'Invalid input\n'
                  'needed_sum must be between 1 and 1000, power between 2 and 10.'					)

       return backtrack(snake_case      ,							snake_case      ,							1      ,							0      ,							0					)[1]  # Return the solutions_count


if __name__ == "__main__":
 import doctest

 doctest.testmod()


