


'''simple docstring'''
from pickle import UnpicklingError

import jax
import jax.numpy as jnp
import numpy as np
from flax.serialization import from_bytes
from flax.traverse_util import flatten_dict

from ..utils import logging


__snake_case							   =  logging.get_logger(__name__)


def     a   (    __a				,      __a     )						->			Any:



					'''simple docstring'''






					try:
										with open(__a				,      '''rb'''     ) as flax_state_f:
															UpperCamelCase__     :Any							      =				from_bytes(__a				,      flax_state_f.read()     )
					except UnpicklingError as e:
										try:
															with open(__a     ) as f:
																				if f.read().startswith('''version'''     ):
																									raise OSError(
																									    '''You seem to have cloned a repository without having git-lfs installed. Please'''
																									    ''' install git-lfs and run `git lfs install` followed by `git lfs pull` in the'''
																									    ''' folder you cloned.'''     )
																				else:
																									raise ValueError from e
										except (UnicodeDecodeError, ValueError):
															raise EnvironmentError(f'''Unable to convert {model_file} to Flax deserializable object. '''     )

					return load_flax_weights_in_pytorch_model(__a				,      __a     )







def     a   (    __a				,      __a     )						->			Dict:



					'''simple docstring'''






					try:
										import torch  # noqa: F401
					except ImportError:
										logger.error(
										    '''Loading Flax weights in PyTorch requires both PyTorch and Flax to be installed. Please see'''
										    ''' https://pytorch.org/ and https://flax.readthedocs.io/en/latest/installation.html for installation'''
										    ''' instructions.'''     )
										raise

					# check if we have bf16 weights
					UpperCamelCase__     :str							      =				flatten_dict(jax.tree_util.tree_map(lambda __a     : x.dtype == jnp.bfloataa				,      __a     )     ).values()
					if any(__a     ):
										# convert all weights to fp32 if they are bf16 since torch.from_numpy can-not handle bf16

										# and bf16 is not fully supported in PT yet.
										logger.warning(
										    '''Found ``bfloat16`` weights in Flax model. Casting all ``bfloat16`` weights to ``float32`` '''
										    '''before loading those in PyTorch model.'''     )
										UpperCamelCase__     :List[str]							      =				jax.tree_util.tree_map(
										    lambda __a     : params.astype(np.floataa     ) if params.dtype == jnp.bfloataa else params				,      __a     )

					UpperCamelCase__     :Optional[Any]							      =				''''''

					UpperCamelCase__     :Tuple							      =				flatten_dict(__a				,      sep='''.'''     )
					UpperCamelCase__     :Dict							      =				pt_model.state_dict()

					# keep track of unexpected & missing keys
					UpperCamelCase__     :Any							      =				[]
					UpperCamelCase__     :List[str]							      =				set(pt_model_dict.keys()     )

					for flax_key_tuple, flax_tensor in flax_state_dict.items():
										UpperCamelCase__     :Union[str, Any]							      =				flax_key_tuple.split('''.'''     )

										if flax_key_tuple_array[-1] == "kernel" and flax_tensor.ndim == 4:
															UpperCamelCase__     :Dict							      =				flax_key_tuple_array[:-1] + ['''weight''']
															UpperCamelCase__     :List[Any]							      =				jnp.transpose(__a				,      (3, 2, 0, 1)     )
										elif flax_key_tuple_array[-1] == "kernel":
															UpperCamelCase__     :int							      =				flax_key_tuple_array[:-1] + ['''weight''']
															UpperCamelCase__     :int							      =				flax_tensor.T
										elif flax_key_tuple_array[-1] == "scale":
															UpperCamelCase__     :Dict							      =				flax_key_tuple_array[:-1] + ['''weight''']

										if "time_embedding" not in flax_key_tuple_array:
															for i, flax_key_tuple_string in enumerate(__a     ):
																				UpperCamelCase__     :List[str]							      =				(
																				    flax_key_tuple_string.replace('''_0'''				,      '''.0'''     )
																				    .replace('''_1'''				,      '''.1'''     )
																				    .replace('''_2'''				,      '''.2'''     )
																				    .replace('''_3'''				,      '''.3'''     )
																				    .replace('''_4'''				,      '''.4'''     )
																				    .replace('''_5'''				,      '''.5'''     )
																				    .replace('''_6'''				,      '''.6'''     )
																				    .replace('''_7'''				,      '''.7'''     )
																				    .replace('''_8'''				,      '''.8'''     )
																				    .replace('''_9'''				,      '''.9'''     )
																				)

										UpperCamelCase__     :List[Any]							      =				'''.'''.join(__a     )

										if flax_key in pt_model_dict:
															if flax_tensor.shape != pt_model_dict[flax_key].shape:
																				raise ValueError(
																				    f'''Flax checkpoint seems to be incorrect. Weight {flax_key_tuple} was expected '''
																				    f'''to be of shape {pt_model_dict[flax_key].shape}, but is {flax_tensor.shape}.'''     )
															else:
																				# add weight to pytorch dict
																				UpperCamelCase__     :List[Any]							      =				np.asarray(__a     ) if not isinstance(__a				,      np.ndarray     ) else flax_tensor
																				UpperCamelCase__     :Optional[Any]							      =				torch.from_numpy(__a     )
																				# remove from missing keys
																				missing_keys.remove(__a     )
										else:
															# weight is not expected by PyTorch model
															unexpected_keys.append(__a     )

					pt_model.load_state_dict(__a     )

					# re-transform missing_keys to list
					UpperCamelCase__     :int							      =				list(__a     )

					if len(__a     ) > 0:
										logger.warning(
										    '''Some weights of the Flax model were not used when initializing the PyTorch model'''
										    f''' {pt_model.__class__.__name__}: {unexpected_keys}\n- This IS expected if you are initializing'''
										    f''' {pt_model.__class__.__name__} from a Flax model trained on another task or with another architecture'''
										    ''' (e.g. initializing a BertForSequenceClassification model from a FlaxBertForPreTraining model).\n- This'''
										    f''' IS NOT expected if you are initializing {pt_model.__class__.__name__} from a Flax model that you expect'''
										    ''' to be exactly identical (e.g. initializing a BertForSequenceClassification model from a'''
										    ''' FlaxBertForSequenceClassification model).'''     )
					if len(__a     ) > 0:
										logger.warning(
										    f'''Some weights of {pt_model.__class__.__name__} were not initialized from the Flax model and are newly'''
										    f''' initialized: {missing_keys}\nYou should probably TRAIN this model on a down-stream task to be able to'''
										    ''' use it for predictions and inference.'''     )

					return pt_model



'''simple docstring'''
import torch
from torch import nn
class      lowercase			(							nn.Module      ):

		"""simple docstring"""

		def __init__(	self					,     UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_=1					,     UpperCamelCase_=False							):

							'''simple docstring'''


							super().__init__()

							UpperCamelCase__     :Dict							      =				n_token
							UpperCamelCase__     :List[Any]							      =				d_embed
							UpperCamelCase__     :Dict							      =				d_proj

							UpperCamelCase__     :Dict							      =				cutoffs + [n_token]
							UpperCamelCase__     :Union[str, Any]							      =				[0] + self.cutoffs
							UpperCamelCase__     :Any							      =				div_val

							UpperCamelCase__     :int							      =				self.cutoffs[0]
							UpperCamelCase__     :List[Any]							      =				len(self.cutoffs							) - 1
							UpperCamelCase__     :List[Any]							      =				self.shortlist_size + self.n_clusters

							if self.n_clusters > 0:
												UpperCamelCase__     :Any							      =				nn.Parameter(torch.zeros(self.n_clusters					,     self.d_embed							)							)
												UpperCamelCase__     :Optional[Any]							      =				nn.Parameter(torch.zeros(self.n_clusters							)							)

							UpperCamelCase__     :Union[str, Any]							      =				nn.ModuleList()
							UpperCamelCase__     :str							      =				nn.ParameterList()

							if div_val == 1:
												for i in range(len(self.cutoffs							)							):
																	if d_proj != d_embed:
																						self.out_projs.append(nn.Parameter(torch.FloatTensor(UpperCamelCase_					,     UpperCamelCase_							)							)							)
																	else:
																						self.out_projs.append(UpperCamelCase_							)

												self.out_layers.append(nn.Linear(UpperCamelCase_					,     UpperCamelCase_							)							)
							else:
												for i in range(len(self.cutoffs							)							):
																	UpperCamelCase__      ,       UpperCamelCase__     :List[str]							      =				self.cutoff_ends[i], self.cutoff_ends[i + 1]
																	UpperCamelCase__     :Dict							      =				d_embed // (div_val**i)

																	self.out_projs.append(nn.Parameter(torch.FloatTensor(UpperCamelCase_					,     UpperCamelCase_							)							)							)

																	self.out_layers.append(nn.Linear(UpperCamelCase_					,     r_idx - l_idx							)							)

							UpperCamelCase__     :Tuple							      =				keep_order




		def 					lowerCAmelCase__       (	self					,     UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_							):

							'''simple docstring'''


							if proj is None:
												UpperCamelCase__     :List[str]							      =				nn.functional.linear(UpperCamelCase_					,     UpperCamelCase_					,     bias=UpperCamelCase_							)
							else:
												# if CUDA_MAJOR <= 9 and CUDA_MINOR <= 1:
												UpperCamelCase__     :Any							      =				nn.functional.linear(UpperCamelCase_					,     proj.t().contiguous()							)
												UpperCamelCase__     :Union[str, Any]							      =				nn.functional.linear(UpperCamelCase_					,     UpperCamelCase_					,     bias=UpperCamelCase_							)
												# else:
												#     logit = torch.einsum('bd,de,ev->bv', (hidden, proj, weight.t()))
												#     if bias is not None:
												#         logit = logit + bias

							return logit




		def 					lowerCAmelCase__       (	self					,     UpperCamelCase_					,     UpperCamelCase_=None					,     UpperCamelCase_=False							):

							'''simple docstring'''


							if labels is not None:
												# Shift so that tokens < n predict n
												UpperCamelCase__     :Optional[Any]							      =				hidden[..., :-1, :].contiguous()
												UpperCamelCase__     :Optional[Any]							      =				labels[..., 1:].contiguous()
												UpperCamelCase__     :Optional[Any]							      =				hidden.view(-1					,     hidden.size(-1							)							)
												UpperCamelCase__     :str							      =				labels.view(-1							)
												if hidden.size(0							) != labels.size(0							):
																	raise RuntimeError('''Input and labels should have the same size in the batch dimension.'''							)
							else:
												UpperCamelCase__     :int							      =				hidden.view(-1					,     hidden.size(-1							)							)

							if self.n_clusters == 0:
												UpperCamelCase__     :Optional[int]							      =				self._compute_logit(UpperCamelCase_					,     self.out_layers[0].weight					,     self.out_layers[0].bias					,     self.out_projs[0]							)
												if labels is not None:
																	UpperCamelCase__     :int							      =				labels != -100
																	UpperCamelCase__     :List[Any]							      =				torch.zeros_like(UpperCamelCase_					,     dtype=hidden.dtype					,     device=hidden.device							)
																	UpperCamelCase__     :str							      =				(
																	    -nn.functional.log_softmax(UpperCamelCase_					,     dim=-1							)[mask].gather(1					,     labels[mask].unsqueeze(1							)							).squeeze(1							)
																	)
												else:
																	UpperCamelCase__     :Dict							      =				nn.functional.log_softmax(UpperCamelCase_					,     dim=-1							)
							else:
												# construct weights and biases
												UpperCamelCase__      ,       UpperCamelCase__     :Dict							      =				[], []
												for i in range(len(self.cutoffs							)							):
																	if self.div_val == 1:
																						UpperCamelCase__      ,       UpperCamelCase__     :Union[str, Any]							      =				self.cutoff_ends[i], self.cutoff_ends[i + 1]
																						UpperCamelCase__     :str							      =				self.out_layers[0].weight[l_idx:r_idx]
																						UpperCamelCase__     :Optional[int]							      =				self.out_layers[0].bias[l_idx:r_idx]
																	else:
																						UpperCamelCase__     :Optional[Any]							      =				self.out_layers[i].weight
																						UpperCamelCase__     :Optional[int]							      =				self.out_layers[i].bias

																	if i == 0:
																						UpperCamelCase__     :str							      =				torch.cat([weight_i, self.cluster_weight]					,     dim=0							)
																						UpperCamelCase__     :List[str]							      =				torch.cat([bias_i, self.cluster_bias]					,     dim=0							)

																	weights.append(UpperCamelCase_							)
																	biases.append(UpperCamelCase_							)

												UpperCamelCase__      ,       UpperCamelCase__      ,       UpperCamelCase__     :Optional[Any]							      =				weights[0], biases[0], self.out_projs[0]

												UpperCamelCase__     :str							      =				self._compute_logit(UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_							)
												UpperCamelCase__     :List[Any]							      =				nn.functional.log_softmax(UpperCamelCase_					,     dim=1							)

												if labels is None:
																	UpperCamelCase__     :Union[str, Any]							      =				hidden.new_empty((head_logit.size(0							), self.n_token)							)
												else:
																	UpperCamelCase__     :Any							      =				torch.zeros_like(UpperCamelCase_					,     dtype=hidden.dtype					,     device=hidden.device							)

												UpperCamelCase__     :Any							      =				0
												UpperCamelCase__     :str							      =				[0] + self.cutoffs
												for i in range(len(UpperCamelCase_							) - 1							):
																	UpperCamelCase__      ,       UpperCamelCase__     :Optional[int]							      =				cutoff_values[i], cutoff_values[i + 1]

																	if labels is not None:
																						UpperCamelCase__     :Any							      =				(labels >= l_idx) & (labels < r_idx)
																						UpperCamelCase__     :int							      =				mask_i.nonzero().squeeze()

																						if indices_i.numel() == 0:
																											continue

																						UpperCamelCase__     :Tuple							      =				labels.index_select(0					,     UpperCamelCase_							) - l_idx
																						UpperCamelCase__     :str							      =				head_logprob.index_select(0					,     UpperCamelCase_							)
																						UpperCamelCase__     :int							      =				hidden.index_select(0					,     UpperCamelCase_							)
																	else:
																						UpperCamelCase__     :Dict							      =				hidden

																	if i == 0:
																						if labels is not None:
																											UpperCamelCase__     :Any							      =				head_logprob_i.gather(1					,     target_i[:, None]							).squeeze(1							)
																						else:
																											UpperCamelCase__     :List[str]							      =				head_logprob[:, : self.cutoffs[0]]
																	else:
																						UpperCamelCase__      ,       UpperCamelCase__      ,       UpperCamelCase__     :Dict							      =				weights[i], biases[i], self.out_projs[i]

																						UpperCamelCase__     :str							      =				self._compute_logit(UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_							)
																						UpperCamelCase__     :Union[str, Any]							      =				nn.functional.log_softmax(UpperCamelCase_					,     dim=1							)
																						UpperCamelCase__     :Any							      =				self.cutoffs[0] + i - 1  # No probability for the head cluster
																						if labels is not None:
																											UpperCamelCase__     :List[Any]							      =				head_logprob_i[:, cluster_prob_idx] + tail_logprob_i.gather(
																											    1					,     target_i[:, None]							).squeeze(1							)
																						else:
																											UpperCamelCase__     :List[str]							      =				head_logprob[:, cluster_prob_idx, None] + tail_logprob_i
																											UpperCamelCase__     :Dict							      =				logprob_i

																	if labels is not None:
																						if (hasattr(self					,     '''keep_order'''							) and self.keep_order) or keep_order:
																											out.index_copy_(0					,     UpperCamelCase_					,     -logprob_i							)
																						else:
																											out[offset : offset + logprob_i.size(0							)].copy_(-logprob_i							)
																						offset += logprob_i.size(0							)

							return out




		def 					lowerCAmelCase__       (	self					,     UpperCamelCase_							):

							'''simple docstring'''


							if self.n_clusters == 0:
												UpperCamelCase__     :Optional[Any]							      =				self._compute_logit(UpperCamelCase_					,     self.out_layers[0].weight					,     self.out_layers[0].bias					,     self.out_projs[0]							)
												return nn.functional.log_softmax(UpperCamelCase_					,     dim=-1							)
							else:
												# construct weights and biases
												UpperCamelCase__      ,       UpperCamelCase__     :List[Any]							      =				[], []
												for i in range(len(self.cutoffs							)							):
																	if self.div_val == 1:
																						UpperCamelCase__      ,       UpperCamelCase__     :Tuple							      =				self.cutoff_ends[i], self.cutoff_ends[i + 1]
																						UpperCamelCase__     :Union[str, Any]							      =				self.out_layers[0].weight[l_idx:r_idx]
																						UpperCamelCase__     :str							      =				self.out_layers[0].bias[l_idx:r_idx]
																	else:
																						UpperCamelCase__     :List[Any]							      =				self.out_layers[i].weight
																						UpperCamelCase__     :List[Any]							      =				self.out_layers[i].bias

																	if i == 0:
																						UpperCamelCase__     :Dict							      =				torch.cat([weight_i, self.cluster_weight]					,     dim=0							)
																						UpperCamelCase__     :Optional[Any]							      =				torch.cat([bias_i, self.cluster_bias]					,     dim=0							)

																	weights.append(UpperCamelCase_							)
																	biases.append(UpperCamelCase_							)

												UpperCamelCase__      ,       UpperCamelCase__      ,       UpperCamelCase__     :str							      =				weights[0], biases[0], self.out_projs[0]
												UpperCamelCase__     :Optional[int]							      =				self._compute_logit(UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_							)

												UpperCamelCase__     :int							      =				hidden.new_empty((head_logit.size(0							), self.n_token)							)
												UpperCamelCase__     :Union[str, Any]							      =				nn.functional.log_softmax(UpperCamelCase_					,     dim=1							)

												UpperCamelCase__     :int							      =				[0] + self.cutoffs
												for i in range(len(UpperCamelCase_							) - 1							):
																	UpperCamelCase__      ,       UpperCamelCase__     :Union[str, Any]							      =				cutoff_values[i], cutoff_values[i + 1]

																	if i == 0:
																						UpperCamelCase__     :str							      =				head_logprob[:, : self.cutoffs[0]]
																	else:
																						UpperCamelCase__      ,       UpperCamelCase__      ,       UpperCamelCase__     :Dict							      =				weights[i], biases[i], self.out_projs[i]

																						UpperCamelCase__     :List[str]							      =				self._compute_logit(UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_					,     UpperCamelCase_							)
																						UpperCamelCase__     :Tuple							      =				nn.functional.log_softmax(UpperCamelCase_					,     dim=1							)

																						UpperCamelCase__     :Optional[Any]							      =				head_logprob[:, -i] + tail_logprob_i
																						UpperCamelCase__     :Union[str, Any]							      =				logprob_i

												return out