
import string

import numpy
def  lowerCAmelCase__			(  SCREAMING_SNAKE_CASE_       ,							SCREAMING_SNAKE_CASE_     )				->		Any:
			return b if a == 0 else greatest_common_divisor(b % a       ,							_lowercase     )







class      A__							:
				lowercase			    =  string.ascii_uppercase + string.digits
				# This cipher takes alphanumerics into account
				# i.e. a total of 36 characters

				# take x and return x % len(key_string)
				lowercase			    =  numpy.vectorize(lambda __magic_name__	: x % 36	)

				lowercase			    =  numpy.vectorize(_lowerCAmelCase	)






				def __init__(						self					:      Optional[int]    ,     a					:      numpy.ndarray   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Optional[int]         =		self.modulus(a   )  # mod36 calc's on the encrypt key
							self.check_determinant()  # validate the determinant of the encryption key
							lowerCAmelCase__      :      Union[str, Any]         =		encrypt_key.shape[0]






				def 							_lowerCamelCase		(						self					:      Tuple    ,     a					:      str   ):






							'''simple docstring'''







							return self.key_string.index(a   )






				def 							_lowerCamelCase		(						self					:      Tuple    ,     a					:      int   ):






							'''simple docstring'''







							return self.key_string[round(a   )]






				def 							_lowerCamelCase		(						self					:      int   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Optional[Any]         =		round(numpy.linalg.det(self.encrypt_key   )   )

							if det < 0:
										lowerCAmelCase__      :      Any         =		det % len(self.key_string   )

							lowerCAmelCase__      :      Union[str, Any]         =		len(self.key_string   )
							if greatest_common_divisor(a    ,     len(self.key_string   )   ) != 1:
										lowerCAmelCase__      :      str         =		(
										    f'''determinant modular {req_l} of encryption key({det}) '''
										    f'''is not co prime w.r.t {req_l}.\nTry another key.'''
										)
										raise ValueError(a   )






				def 							_lowerCamelCase		(						self					:      Optional[int]    ,     a					:      str   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Union[str, Any]         =		[char for char in text.upper() if char in self.key_string]

							lowerCAmelCase__      :      Union[str, Any]         =		chars[-1]
							while len(a   ) % self.break_key != 0:
										chars.append(a   )

							return "".join(a   )






				def 							_lowerCamelCase		(						self					:      Dict    ,     a					:      str   ):






							'''simple docstring'''







							lowerCAmelCase__      :      List[str]         =		self.process_text(text.upper()   )
							lowerCAmelCase__      :      List[Any]         =		""""""

							for i in range(0    ,     len(a   ) - self.break_key + 1    ,     self.break_key   ):
										lowerCAmelCase__      :      int         =		text[i : i + self.break_key]
										lowerCAmelCase__      :      int         =		[self.replace_letters(a   ) for char in batch]
										lowerCAmelCase__      :      Optional[int]         =		numpy.array([vec]   ).T
										lowerCAmelCase__      :      Any         =		self.modulus(self.encrypt_key.dot(a   )   ).T.tolist()[
										    0
										]
										lowerCAmelCase__      :      Optional[Any]         =		"""""".join(
										    self.replace_digits(a   ) for num in batch_encrypted   )
										encrypted += encrypted_batch

							return encrypted






				def 							_lowerCamelCase		(						self					:      Union[str, Any]   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Dict         =		round(numpy.linalg.det(self.encrypt_key   )   )

							if det < 0:
										lowerCAmelCase__      :      List[Any]         =		det % len(self.key_string   )
							lowerCAmelCase__      :      Optional[int]         =		None
							for i in range(len(self.key_string   )   ):
										if (det * i) % len(self.key_string   ) == 1:
													lowerCAmelCase__      :      Dict         =		i
													break

							lowerCAmelCase__      :      Optional[int]         =		(
							    det_inv
							    * numpy.linalg.det(self.encrypt_key   )
							    * numpy.linalg.inv(self.encrypt_key   )
							)

							return self.to_int(self.modulus(a   )   )






				def 							_lowerCamelCase		(						self					:      Optional[Any]    ,     a					:      str   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Dict         =		self.make_decrypt_key()
							lowerCAmelCase__      :      Tuple         =		self.process_text(text.upper()   )
							lowerCAmelCase__      :      Optional[int]         =		""""""

							for i in range(0    ,     len(a   ) - self.break_key + 1    ,     self.break_key   ):
										lowerCAmelCase__      :      Tuple         =		text[i : i + self.break_key]
										lowerCAmelCase__      :      Dict         =		[self.replace_letters(a   ) for char in batch]
										lowerCAmelCase__      :      List[str]         =		numpy.array([vec]   ).T
										lowerCAmelCase__      :      Optional[Any]         =		self.modulus(decrypt_key.dot(a   )   ).T.tolist()[0]
										lowerCAmelCase__      :      int         =		"""""".join(
										    self.replace_digits(a   ) for num in batch_decrypted   )
										decrypted += decrypted_batch

							return decrypted






def  lowerCAmelCase__			(  )				->		Optional[int]:
			lowerCAmelCase__      :      Dict         =		int(input('Enter the order of the encryption key: '     )     )
			lowerCAmelCase__      :      Union[str, Any]         =		[]

			print('Enter each row of the encryption key with space separated integers'     )
			for _ in range(_lowercase     ):
						lowerCAmelCase__      :      Union[str, Any]         =		[int(_lowercase     ) for x in input().split()]
						hill_matrix.append(_lowercase     )

			lowerCAmelCase__      :      List[Any]         =		HillCipher(numpy.array(_lowercase     )     )

			print('Would you like to encrypt or decrypt some text? (1 or 2)'     )
			lowerCAmelCase__      :      int         =		input('\n1. Encrypt\n2. Decrypt\n'     )
			if option == "1":
						lowerCAmelCase__      :      Optional[Any]         =		input('What text would you like to encrypt?: '     )
						print('Your encrypted text is:'     )
						print(hc.encrypt(_lowercase     )     )
			elif option == "2":
						lowerCAmelCase__      :      Dict         =		input('What text would you like to decrypt?: '     )
						print('Your decrypted text is:'     )
						print(hc.decrypt(_lowercase     )     )


if __name__ == "__main__":
					import doctest

					doctest.testmod()

					main()




"""simple docstring"""
import argparse
import json
import os
from collections import OrderedDict

import numpy as np
import tensorflow as tf
import torch
def    A_  (			_lowercase	):







						'''simple docstring'''


						snake_case_ :Union[str, Any]						=			os.path.join(args.tf_model_dir,					"""parameters.json"""	)
						snake_case_ :Any						=			json.loads(open(_lowercase	).read()	)
						if not params:
												raise ValueError(
												    f"""It seems that the json file at {parameter_file} is empty. Make sure you have a correct json file."""	)
						if not args.output.endswith(""".pt"""	):
												snake_case_ :Optional[int]						=			args.output + """.pt"""
						snake_case_ :List[str]						=			OrderedDict()
						with tf.device("""/CPU:0"""	):
												snake_case_ :Dict						=			tf.train.load_checkpoint(args.tf_model_dir	)
												snake_case_ :str						=			reader.get_variable_to_shape_map()
												for key_name in shapes.keys():
																		snake_case_ :List[Any]						=			reader.get_tensor(_lowercase	).astype(np.floataa	)
																		if key_name.endswith("""/adam_m"""	) or key_name.endswith("""/adam_v"""	):
																								continue
																		if key_name.startswith("""pasts/"""	):
																								if key_name.startswith("""pasts/mlp"""	):
																														snake_case_ :Any						=			int(key_name[9]	)
																								elif key_name.startswith("""pasts/out"""	):
																														snake_case_ :Optional[int]						=			8
																								snake_case_ :List[str]						=			"""model.sqout.%d.weight""" % (player * 2)  # enter to nn.Sequencial with Tanh, so 2 at a time
																								snake_case_ :Optional[Any]						=			vnp.transpose([1, 0]	).copy()  # Mesh-Tensorflow is a diagonal matrix
																								snake_case_ :List[str]						=			torch.tensor(_lowercase	)
																		elif key_name.startswith("""model/moe"""	):
																								snake_case_ :Tuple						=			int(key_name[9:].split("""/"""	)[0]	)
																								if key_name.endswith("""/switch_gating/kernel"""	):
																														snake_case_ :Union[str, Any]						=			"""model.blocks.%d.feed_forward.mlp.router.classifier.weight""" % player
																														snake_case_ :Optional[Any]						=			vnp.transpose([1, 0]	).copy()  # Mesh-Tensorflow is a diagonal matrix
																														snake_case_ :Optional[Any]						=			torch.tensor(_lowercase	)
																								elif key_name.endswith("""/softmlp/kernel"""	):
																														snake_case_ :List[Any]						=			"""model.blocks.%d.feed_forward.soft_bypass_mlp.weight""" % player
																														snake_case_ :Optional[int]						=			vnp.transpose([1, 0]	).copy()  # Mesh-Tensorflow is a diagonal matrix
																														snake_case_ :Optional[Any]						=			torch.tensor(_lowercase	)
																								elif key_name.endswith("""/wo/kernel"""	) or key_name.endswith("""/wi/kernel"""	):
																														snake_case_ :Dict						=			key_name[-9:-7]
																														for i in range(16	):
																																				snake_case_ :str						=			"""model.blocks.%d.feed_forward.mlp.experts.expert_%d.%s.weight""" % (player, i, nlayer)
																																				snake_case_ :Tuple						=			(
																																				    vnp[i].transpose([1, 0]	).copy()
																																				)  # In Mesh-Tensorflow, it is one array, so it is divided
																																				snake_case_ :Optional[int]						=			torch.tensor(_lowercase	)
																		elif key_name.startswith("""model/mlp"""	):
																								snake_case_ :Optional[int]						=			int(key_name[9:].split("""/"""	)[0]	)
																								if key_name.endswith("""/p1/kernel"""	):
																														snake_case_ :Union[str, Any]						=			"""model.blocks.%d.feed_forward.mlp.wi.weight""" % player
																														snake_case_ :Dict						=			vnp.transpose([1, 0]	).copy()  # Mesh-Tensorflow is a diagonal matrix
																														snake_case_ :Optional[Any]						=			torch.tensor(_lowercase	)
																								elif key_name.endswith("""/p1/bias"""	):
																														snake_case_ :List[Any]						=			"""model.blocks.%d.feed_forward.mlp.wi.bias""" % player
																														snake_case_ :str						=			vnp.copy()  # same because it is one dimensional
																														snake_case_ :Optional[Any]						=			torch.tensor(_lowercase	)
																								elif key_name.endswith("""/p2/kernel"""	):
																														snake_case_ :Union[str, Any]						=			"""model.blocks.%d.feed_forward.mlp.wo.weight""" % player
																														snake_case_ :Dict						=			vnp.transpose([1, 0]	).copy()  # Mesh-Tensorflow is a diagonal matrix
																														snake_case_ :Tuple						=			torch.tensor(_lowercase	)
																								elif key_name.endswith("""/p2/bias"""	):
																														snake_case_ :Dict						=			"""model.blocks.%d.feed_forward.mlp.wo.bias""" % player
																														snake_case_ :Any						=			vnp.copy()  # same because it is one dimensional
																														snake_case_ :Optional[int]						=			torch.tensor(_lowercase	)
																		elif key_name.startswith("""model/ln"""	):
																								snake_case_ :Union[str, Any]						=			int(key_name[8:].split("""/"""	)[0]	)
																								if key_name.endswith("""/b"""	):
																														snake_case_ :str						=			"""model.blocks.%d.feed_forward.norm.bias""" % player
																														snake_case_ :Dict						=			vnp.copy()  # same because it is one dimensional
																														snake_case_ :int						=			torch.tensor(_lowercase	)
																								elif key_name.endswith("""/g"""	):
																														snake_case_ :Dict						=			"""model.blocks.%d.feed_forward.norm.weight""" % player
																														snake_case_ :Dict						=			vnp.copy()  # same because it is one dimensional
																														snake_case_ :Tuple						=			torch.tensor(_lowercase	)
																		elif key_name.startswith("""model/att"""	):
																								snake_case_ :List[str]						=			int(key_name[9:].split("""/"""	)[0]	)
																								if key_name.endswith("""/qkv/kernel"""	):
																														snake_case_ :Optional[int]						=			vnp.copy()  # Compute same dimension as Mesh-tensorflow using einsum
																														snake_case_ :Dict						=			state[:, 0, :, :]
																														snake_case_ :int						=			state[:, 1, :, :]
																														snake_case_ :List[str]						=			state[:, 2, :, :]
																														snake_case_ :str						=			(
																														    state_q.reshape([state_q.shape[0], state_q.shape[1] * state_q.shape[2]]	)
																														    .transpose([1, 0]	)
																														    .copy()
																														)  # Mesh-Tensorflow is a diagonal matrix
																														snake_case_ :Any						=			(
																														    state_k.reshape([state_k.shape[0], state_k.shape[1] * state_k.shape[2]]	)
																														    .transpose([1, 0]	)
																														    .copy()
																														)  # Mesh-Tensorflow is a diagonal matrix
																														snake_case_ :Optional[int]						=			(
																														    state_v.reshape([state_v.shape[0], state_v.shape[1] * state_v.shape[2]]	)
																														    .transpose([1, 0]	)
																														    .copy()
																														)  # Mesh-Tensorflow is a diagonal matrix
																														snake_case_ :int						=			"""model.blocks.%d.self_attn.self_attn.q_proj.weight""" % player
																														snake_case_ :int						=			torch.tensor(_lowercase	)
																														snake_case_ :Optional[Any]						=			"""model.blocks.%d.self_attn.self_attn.k_proj.weight""" % player
																														snake_case_ :Dict						=			torch.tensor(_lowercase	)
																														snake_case_ :Dict						=			"""model.blocks.%d.self_attn.self_attn.v_proj.weight""" % player
																														snake_case_ :Optional[Any]						=			torch.tensor(_lowercase	)
																								elif key_name.endswith("""/o/kernel"""	):
																														snake_case_ :str						=			"""model.blocks.%d.self_attn.self_attn.out_proj.weight""" % player
																														snake_case_ :str						=			(
																														    vnp.reshape([vnp.shape[0] * vnp.shape[1], vnp.shape[2]]	).transpose([1, 0]	).copy()
																														)  # Mesh-Tensorflow is a diagonal matrix
																														snake_case_ :Any						=			torch.tensor(_lowercase	)
																		elif key_name.startswith("""model/an"""	):
																								snake_case_ :Optional[int]						=			int(key_name[8:].split("""/"""	)[0]	)
																								if key_name.endswith("""/b"""	):
																														snake_case_ :Any						=			"""model.blocks.%d.self_attn.norm.bias""" % player
																														snake_case_ :Optional[int]						=			vnp.copy()  # same because it is one dimensional
																														snake_case_ :Tuple						=			torch.tensor(_lowercase	)
																								elif key_name.endswith("""/g"""	):
																														snake_case_ :Union[str, Any]						=			"""model.blocks.%d.self_attn.norm.weight""" % player
																														snake_case_ :Dict						=			vnp.copy()  # same because it is one dimensional
																														snake_case_ :Optional[int]						=			torch.tensor(_lowercase	)
																		elif (
																		    key_name.startswith("""model/wte"""	)
																		    or key_name.startswith("""model/wpe"""	)
																		    or key_name.startswith("""model/ete"""	)
																		):
																								snake_case_ :List[Any]						=			{"""wte""": """embed_tokens""", """wpe""": """position_embeddings""", """ete""": """extra_position_embeddings"""}[
																								    key_name[-3:]
																								]
																								snake_case_ :Optional[Any]						=			"""model.%s.weight""" % nlayer
																								snake_case_ :Any						=			vnp.copy()  # same in embedded
																								snake_case_ :List[Any]						=			torch.tensor(_lowercase	)
																								if key_name.startswith("""model/wte"""	):
																														snake_case_ :Tuple						=			"""lm_head.weight"""
																														snake_case_ :List[str]						=			vnp.copy()  # same in embedded
																														snake_case_ :List[Any]						=			torch.tensor(_lowercase	)
																		elif key_name.startswith("""model/wob"""	):
																								snake_case_ :str						=			"""final_logits_bias"""
																								snake_case_ :Any						=			vnp.copy()  # same in embedded
																								snake_case_ :List[Any]						=			state.reshape((1, -1)	)
																								snake_case_ :Union[str, Any]						=			torch.tensor(_lowercase	)
																		elif key_name == "model/dense/kernel":
																								snake_case_ :str						=			"""model.last_project.weight"""
																								snake_case_ :Dict						=			vnp.transpose([1, 0]	).copy()  # Mesh-Tensorflow is a diagonal matrix
																								snake_case_ :int						=			torch.tensor(_lowercase	)
																		elif key_name == "model/dense_1/bias":
																								snake_case_ :Optional[int]						=			"""model.last_project.bias"""
																								snake_case_ :Tuple						=			vnp.copy()  # same because it is one dimensional
																								snake_case_ :Any						=			torch.tensor(_lowercase	)
						torch.save(_lowercase,					args.output	)


if __name__ == "__main__":
						__a      =				argparse.ArgumentParser(
						    description="model converter.", formatter_class=argparse.ArgumentDefaultsHelpFormatter
						)
						parser.add_argument("--tf_model_dir", metavar="PATH", type=str, required=True, help="import model")
						parser.add_argument("--output", metavar="PATH", type=str, required=True, help="output model")
						__a      =				parser.parse_args()
						convert_tf_gptsan_to_pt(args)
