



import torch
from torch import nn



class 	lowerCamelCase      (						nn.Module  ):







					'''simple docstring'''







					def __init__(			self    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase=1    ,	lowerCAmelCase=False     ):
							super().__init__()

							UpperCAmelCase_						=				n_token
							UpperCAmelCase_						=				d_embed
							UpperCAmelCase_						=				d_proj

							UpperCAmelCase_						=				cutoffs + [n_token]
							UpperCAmelCase_						=				[0] + self.cutoffs
							UpperCAmelCase_						=				div_val

							UpperCAmelCase_						=				self.cutoffs[0]
							UpperCAmelCase_						=				len(self.cutoffs     ) - 1
							UpperCAmelCase_						=				self.shortlist_size + self.n_clusters

							if self.n_clusters > 0:
									UpperCAmelCase_						=				nn.Parameter(torch.zeros(self.n_clusters    ,	self.d_embed     )     )
									UpperCAmelCase_						=				nn.Parameter(torch.zeros(self.n_clusters     )     )

							UpperCAmelCase_						=				nn.ModuleList()
							UpperCAmelCase_						=				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(lowerCAmelCase    ,	lowerCAmelCase     )     )     )
											else:
													self.out_projs.append(lowerCAmelCase     )

									self.out_layers.append(nn.Linear(lowerCAmelCase    ,	lowerCAmelCase     )     )
							else:
									for i in range(len(self.cutoffs     )     ):
											UpperCAmelCase_					,						UpperCAmelCase_						=				self.cutoff_ends[i], self.cutoff_ends[i + 1]
											UpperCAmelCase_						=				d_embed // (div_val**i)

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

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

							UpperCAmelCase_						=				keep_order



					def    A__		(			self    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase     ):
							if proj is None:
									UpperCAmelCase_						=				nn.functional.linear(lowerCAmelCase    ,	lowerCAmelCase    ,	bias=lowerCAmelCase     )
							else:
									# if CUDA_MAJOR <= 9 and CUDA_MINOR <= 1:
									UpperCAmelCase_						=				nn.functional.linear(lowerCAmelCase    ,	proj.t().contiguous()     )
									UpperCAmelCase_						=				nn.functional.linear(lowerCAmelCase    ,	lowerCAmelCase    ,	bias=lowerCAmelCase     )
									# else:
									#     logit = torch.einsum('bd,de,ev->bv', (hidden, proj, weight.t()))
									#     if bias is not None:
									#         logit = logit + bias

							return logit



					def    A__		(			self    ,	lowerCAmelCase    ,	lowerCAmelCase=None    ,	lowerCAmelCase=False     ):

							if labels is not None:
									# Shift so that tokens < n predict n
									UpperCAmelCase_						=				hidden[..., :-1, :].contiguous()
									UpperCAmelCase_						=				labels[..., 1:].contiguous()
									UpperCAmelCase_						=				hidden.view(-1    ,	hidden.size(-1     )     )
									UpperCAmelCase_						=				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_						=				hidden.view(-1    ,	hidden.size(-1     )     )

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

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

											weights.append(lowerCAmelCase     )
											biases.append(lowerCAmelCase     )

									UpperCAmelCase_					,						UpperCAmelCase_					,						UpperCAmelCase_						=				weights[0], biases[0], self.out_projs[0]

									UpperCAmelCase_						=				self._compute_logit(lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase     )
									UpperCAmelCase_						=				nn.functional.log_softmax(lowerCAmelCase    ,	dim=1     )

									if labels is None:
											UpperCAmelCase_						=				hidden.new_empty((head_logit.size(0     ), self.n_token)     )
									else:
											UpperCAmelCase_						=				torch.zeros_like(lowerCAmelCase    ,	dtype=hidden.dtype    ,	device=hidden.device     )

									UpperCAmelCase_						=				0
									UpperCAmelCase_						=				[0] + self.cutoffs
									for i in range(len(lowerCAmelCase     ) - 1     ):
											UpperCAmelCase_					,						UpperCAmelCase_						=				cutoff_values[i], cutoff_values[i + 1]

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

													if indices_i.numel() == 0:
															continue

													UpperCAmelCase_						=				labels.index_select(0    ,	lowerCAmelCase     ) - l_idx
													UpperCAmelCase_						=				head_logprob.index_select(0    ,	lowerCAmelCase     )
													UpperCAmelCase_						=				hidden.index_select(0    ,	lowerCAmelCase     )
											else:
													UpperCAmelCase_						=				hidden

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

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

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

							return out



					def    A__		(			self    ,	lowerCAmelCase     ):
							if self.n_clusters == 0:
									UpperCAmelCase_						=				self._compute_logit(lowerCAmelCase    ,	self.out_layers[0].weight    ,	self.out_layers[0].bias    ,	self.out_projs[0]     )
									return nn.functional.log_softmax(lowerCAmelCase    ,	dim=-1     )
							else:
									# construct weights and biases
									UpperCAmelCase_					,						UpperCAmelCase_						=				[], []
									for i in range(len(self.cutoffs     )     ):
											if self.div_val == 1:
													UpperCAmelCase_					,						UpperCAmelCase_						=				self.cutoff_ends[i], self.cutoff_ends[i + 1]
													UpperCAmelCase_						=				self.out_layers[0].weight[l_idx:r_idx]
													UpperCAmelCase_						=				self.out_layers[0].bias[l_idx:r_idx]
											else:
													UpperCAmelCase_						=				self.out_layers[i].weight
													UpperCAmelCase_						=				self.out_layers[i].bias

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

											weights.append(lowerCAmelCase     )
											biases.append(lowerCAmelCase     )

									UpperCAmelCase_					,						UpperCAmelCase_					,						UpperCAmelCase_						=				weights[0], biases[0], self.out_projs[0]
									UpperCAmelCase_						=				self._compute_logit(lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase     )

									UpperCAmelCase_						=				hidden.new_empty((head_logit.size(0     ), self.n_token)     )
									UpperCAmelCase_						=				nn.functional.log_softmax(lowerCAmelCase    ,	dim=1     )

									UpperCAmelCase_						=				[0] + self.cutoffs
									for i in range(len(lowerCAmelCase     ) - 1     ):
											UpperCAmelCase_					,						UpperCAmelCase_						=				cutoff_values[i], cutoff_values[i + 1]

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

													UpperCAmelCase_						=				self._compute_logit(lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase     )
													UpperCAmelCase_						=				nn.functional.log_softmax(lowerCAmelCase    ,	dim=1     )

													UpperCAmelCase_						=				head_logprob[:, -i] + tail_logprob_i
													UpperCAmelCase_						=				logprob_i

									return out






from typing import Dict, List, Optional, Union

import numpy as np

from ...image_processing_utils import BaseImageProcessor, BatchFeature, get_size_dict
from ...image_transforms import (
    center_crop,
    get_resize_output_image_size,
    normalize,
    rescale,
    resize,
    to_channel_dimension_format,
)
from ...image_utils import (
    IMAGENET_STANDARD_MEAN,
    IMAGENET_STANDARD_STD,
    ChannelDimension,
    ImageInput,
    PILImageResampling,
    is_valid_image,
    to_numpy_array,
    valid_images,
)
from ...utils import TensorType, is_vision_available, logging


if is_vision_available():
			import PIL


SCREAMING_SNAKE_CASE     				=						logging.get_logger(__name__)







def snake_case__  (			__SCREAMING_SNAKE_CASE )		->							List[List[ImageInput]]:
		if isinstance(__SCREAMING_SNAKE_CASE			,     (list, tuple) ) and isinstance(videos[0]			,     (list, tuple) ) and is_valid_image(videos[0][0] ):
				return videos

		elif isinstance(__SCREAMING_SNAKE_CASE			,     (list, tuple) ) and is_valid_image(videos[0] ):
				return [videos]

		elif is_valid_image(__SCREAMING_SNAKE_CASE ):
				return [[videos]]

		raise ValueError(f'''Could not make batched video from {videos}''' )



class 	lowerCamelCase      (						lowercase__  ):







					'''simple docstring'''







					lowerCAmelCase_				:    List[Any]									=  ['pixel_values']



					def __init__(			self    ,	lowerCAmelCase = True    ,	lowerCAmelCase = None    ,	lowerCAmelCase = PILImageResampling.BILINEAR    ,	lowerCAmelCase = True    ,	lowerCAmelCase = None    ,	lowerCAmelCase = True    ,	lowerCAmelCase = 1 / 255    ,	lowerCAmelCase = True    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	**lowerCAmelCase    ,	):
							super().__init__(**lowerCAmelCase     )
							UpperCAmelCase_						=				size if size is not None else {"shortest_edge": 224}
							UpperCAmelCase_						=				get_size_dict(lowerCAmelCase    ,	default_to_square=lowerCAmelCase     )
							UpperCAmelCase_						=				crop_size if crop_size is not None else {"height": 224, "width": 224}
							UpperCAmelCase_						=				get_size_dict(lowerCAmelCase    ,	param_name="crop_size"     )

							UpperCAmelCase_						=				do_resize
							UpperCAmelCase_						=				size
							UpperCAmelCase_						=				do_center_crop
							UpperCAmelCase_						=				crop_size
							UpperCAmelCase_						=				resample
							UpperCAmelCase_						=				do_rescale
							UpperCAmelCase_						=				rescale_factor
							UpperCAmelCase_						=				do_normalize
							UpperCAmelCase_						=				image_mean if image_mean is not None else IMAGENET_STANDARD_MEAN
							UpperCAmelCase_						=				image_std if image_std is not None else IMAGENET_STANDARD_STD



					def    A__		(			self    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase = PILImageResampling.BILINEAR    ,	lowerCAmelCase = None    ,	**lowerCAmelCase    ,	):
							UpperCAmelCase_						=				get_size_dict(lowerCAmelCase    ,	default_to_square=lowerCAmelCase     )
							if "shortest_edge" in size:
									UpperCAmelCase_						=				get_resize_output_image_size(lowerCAmelCase    ,	size["shortest_edge"]    ,	default_to_square=lowerCAmelCase     )
							elif "height" in size and "width" in size:
									UpperCAmelCase_						=				(size["height"], size["width"])
							else:
									raise ValueError(f'''Size must have \'height\' and \'width\' or \'shortest_edge\' as keys. Got {size.keys()}'''     )
							return resize(lowerCAmelCase    ,	size=lowerCAmelCase    ,	resample=lowerCAmelCase    ,	data_format=lowerCAmelCase    ,	**lowerCAmelCase     )



					def    A__		(			self    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase = None    ,	**lowerCAmelCase    ,	):
							UpperCAmelCase_						=				get_size_dict(lowerCAmelCase     )
							if "height" not in size or "width" not in size:
									raise ValueError(f'''Size must have \'height\' and \'width\' as keys. Got {size.keys()}'''     )
							return center_crop(lowerCAmelCase    ,	size=(size["height"], size["width"])    ,	data_format=lowerCAmelCase    ,	**lowerCAmelCase     )



					def    A__		(			self    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase = None    ,	**lowerCAmelCase    ,	):
							return rescale(lowerCAmelCase    ,	scale=lowerCAmelCase    ,	data_format=lowerCAmelCase    ,	**lowerCAmelCase     )



					def    A__		(			self    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase    ,	lowerCAmelCase = None    ,	**lowerCAmelCase    ,	):
							return normalize(lowerCAmelCase    ,	mean=lowerCAmelCase    ,	std=lowerCAmelCase    ,	data_format=lowerCAmelCase    ,	**lowerCAmelCase     )



					def    A__		(			self    ,	lowerCAmelCase    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = ChannelDimension.FIRST    ,	):
							if do_resize and size is None or resample is None:
									raise ValueError("Size and resample must be specified if do_resize is True."     )

							if do_center_crop and crop_size is None:
									raise ValueError("Crop size must be specified if do_center_crop is True."     )

							if do_rescale and rescale_factor is None:
									raise ValueError("Rescale factor must be specified if do_rescale is True."     )

							if do_normalize and (image_mean is None or image_std is None):
									raise ValueError("Image mean and std must be specified if do_normalize is True."     )

							# All transformations expect numpy arrays.
							UpperCAmelCase_						=				to_numpy_array(lowerCAmelCase     )

							if do_resize:
									UpperCAmelCase_						=				self.resize(image=lowerCAmelCase    ,	size=lowerCAmelCase    ,	resample=lowerCAmelCase     )

							if do_center_crop:
									UpperCAmelCase_						=				self.center_crop(lowerCAmelCase    ,	size=lowerCAmelCase     )

							if do_rescale:
									UpperCAmelCase_						=				self.rescale(image=lowerCAmelCase    ,	scale=lowerCAmelCase     )

							if do_normalize:
									UpperCAmelCase_						=				self.normalize(image=lowerCAmelCase    ,	mean=lowerCAmelCase    ,	std=lowerCAmelCase     )

							UpperCAmelCase_						=				to_channel_dimension_format(lowerCAmelCase    ,	lowerCAmelCase     )
							return image



					def    A__		(			self    ,	lowerCAmelCase    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = None    ,	lowerCAmelCase = ChannelDimension.FIRST    ,	**lowerCAmelCase    ,	):
							UpperCAmelCase_						=				do_resize if do_resize is not None else self.do_resize
							UpperCAmelCase_						=				resample if resample is not None else self.resample
							UpperCAmelCase_						=				do_center_crop if do_center_crop is not None else self.do_center_crop
							UpperCAmelCase_						=				do_rescale if do_rescale is not None else self.do_rescale
							UpperCAmelCase_						=				rescale_factor if rescale_factor is not None else self.rescale_factor
							UpperCAmelCase_						=				do_normalize if do_normalize is not None else self.do_normalize
							UpperCAmelCase_						=				image_mean if image_mean is not None else self.image_mean
							UpperCAmelCase_						=				image_std if image_std is not None else self.image_std

							UpperCAmelCase_						=				size if size is not None else self.size
							UpperCAmelCase_						=				get_size_dict(lowerCAmelCase    ,	default_to_square=lowerCAmelCase     )
							UpperCAmelCase_						=				crop_size if crop_size is not None else self.crop_size
							UpperCAmelCase_						=				get_size_dict(lowerCAmelCase    ,	param_name="crop_size"     )

							if not valid_images(lowerCAmelCase     ):
									raise ValueError(
									    "Invalid image type. Must be of type PIL.Image.Image, numpy.ndarray, "
									    "torch.Tensor, tf.Tensor or jax.ndarray."     )

							UpperCAmelCase_						=				make_batched(lowerCAmelCase     )

							UpperCAmelCase_						=				[
							    [
							        self._preprocess_image(
							            image=lowerCAmelCase    ,	do_resize=lowerCAmelCase    ,	size=lowerCAmelCase    ,	resample=lowerCAmelCase    ,	do_center_crop=lowerCAmelCase    ,	crop_size=lowerCAmelCase    ,	do_rescale=lowerCAmelCase    ,	rescale_factor=lowerCAmelCase    ,	do_normalize=lowerCAmelCase    ,	image_mean=lowerCAmelCase    ,	image_std=lowerCAmelCase    ,	data_format=lowerCAmelCase    ,	)
							        for img in video
							    ]
							    for video in videos
							]

							UpperCAmelCase_						=				{"pixel_values": videos}
							return BatchFeature(data=lowerCAmelCase    ,	tensor_type=lowerCAmelCase     )

