

"""simple docstring"""





import tensorflow as tf

from ...tf_utils import shape_list







class 				SCREAMING_SNAKE_CASE					(		tf.keras.layers.Layer       ):






					"""simple docstring"""



					def __init__(       self			:				List[Any]   ,lowercase_			:				Tuple   ,lowercase_			:				List[Any]   ,lowercase_			:				List[str]   ,lowercase_			:				Optional[int]   ,lowercase_			:				str=1   ,lowercase_			:				Union[str, Any]=False   ,**lowercase_			:				Union[str, Any]		):
						super().__init__(**lowercase_		)

						lowerCAmelCase__	:						Any  				=	vocab_size
						lowerCAmelCase__	:						Tuple  				=	d_embed
						lowerCAmelCase__	:						Union[str, Any]  				=	d_proj

						lowerCAmelCase__	:						Union[str, Any]  				=	cutoffs + [vocab_size]
						lowerCAmelCase__	:						Optional[Any]  				=	[0] + self.cutoffs
						lowerCAmelCase__	:						int  				=	div_val

						lowerCAmelCase__	:						Optional[Any]  				=	self.cutoffs[0]
						lowerCAmelCase__	:						Tuple  				=	len(self.cutoffs		) - 1
						lowerCAmelCase__	:						Any  				=	self.shortlist_size + self.n_clusters
						lowerCAmelCase__	:						str  				=	keep_order

						lowerCAmelCase__	:						List[str]  				=	[]
						lowerCAmelCase__	:						List[str]  				=	[]







					def        __lowerCAmelCase (       self			:				Optional[int]   ,lowercase_			:				str		):
						if self.n_clusters > 0:
							lowerCAmelCase__	:						Optional[Any]  				=	self.add_weight(
							    shape=(self.n_clusters, self.d_embed)   ,initializer='''zeros'''   ,trainable=lowercase_   ,name='''cluster_weight'''		)
							lowerCAmelCase__	:						List[Any]  				=	self.add_weight(
							    shape=(self.n_clusters,)   ,initializer='''zeros'''   ,trainable=lowercase_   ,name='''cluster_bias'''		)

						if self.div_val == 1:
							for i in range(len(self.cutoffs		)		):
								if self.d_proj != self.d_embed:
									lowerCAmelCase__	:						Optional[Any]  				=	self.add_weight(
									    shape=(self.d_embed, self.d_proj)   ,initializer='''zeros'''   ,trainable=lowercase_   ,name=F'out_projs_._{i}'   ,)
									self.out_projs.append(lowercase_		)
								else:
									self.out_projs.append(lowercase_		)
								lowerCAmelCase__	:						Any  				=	self.add_weight(
								    shape=(self.vocab_size, self.d_embed)   ,initializer='''zeros'''   ,trainable=lowercase_   ,name=F'out_layers_._{i}_._weight'   ,)
								lowerCAmelCase__	:						Union[str, Any]  				=	self.add_weight(
								    shape=(self.vocab_size,)   ,initializer='''zeros'''   ,trainable=lowercase_   ,name=F'out_layers_._{i}_._bias'   ,)
								self.out_layers.append((weight, bias)		)
						else:
							for i in range(len(self.cutoffs		)		):
								lowerCAmelCase__				,lowerCAmelCase__	:						Union[str, Any]  				=	self.cutoff_ends[i], self.cutoff_ends[i + 1]
								lowerCAmelCase__	:						int  				=	self.d_embed // (self.div_val**i)

								lowerCAmelCase__	:						Optional[Any]  				=	self.add_weight(
								    shape=(d_emb_i, self.d_proj)   ,initializer='''zeros'''   ,trainable=lowercase_   ,name=F'out_projs_._{i}'		)
								self.out_projs.append(lowercase_		)
								lowerCAmelCase__	:						str  				=	self.add_weight(
								    shape=(r_idx - l_idx, d_emb_i)   ,initializer='''zeros'''   ,trainable=lowercase_   ,name=F'out_layers_._{i}_._weight'   ,)
								lowerCAmelCase__	:						Optional[int]  				=	self.add_weight(
								    shape=(r_idx - l_idx,)   ,initializer='''zeros'''   ,trainable=lowercase_   ,name=F'out_layers_._{i}_._bias'   ,)
								self.out_layers.append((weight, bias)		)
						super().build(lowercase_		)







					@staticmethod
					def        __lowerCAmelCase (       lowercase_			:				List[str]   ,lowercase_			:				int   ,lowercase_			:				Tuple   ,lowercase_			:				List[Any]=None		):
						lowerCAmelCase__	:						Optional[Any]  				=	x
						if proj is not None:
							lowerCAmelCase__	:						Optional[Any]  				=	tf.einsum('''ibd,ed->ibe'''   ,lowercase_   ,lowercase_		)
						return tf.einsum('''ibd,nd->ibn'''   ,lowercase_   ,lowercase_		) + b







					@staticmethod
					def        __lowerCAmelCase (       lowercase_			:				int   ,lowercase_			:				Tuple		):
						lowerCAmelCase__	:						Optional[int]  				=	shape_list(lowercase_		)
						lowerCAmelCase__	:						Dict  				=	tf.range(lp_size[0]   ,dtype=target.dtype		)
						lowerCAmelCase__	:						str  				=	tf.stack([r, target]   ,1		)
						return tf.gather_nd(lowercase_   ,lowercase_		)







					def        __lowerCAmelCase (       self			:				Optional[int]   ,lowercase_			:				str   ,lowercase_			:				Dict   ,lowercase_			:				Dict=True   ,lowercase_			:				Dict=False		):
						lowerCAmelCase__	:						Optional[Any]  				=	0
						if self.n_clusters == 0:
							lowerCAmelCase__	:						Union[str, Any]  				=	self._logit(lowercase_   ,self.out_layers[0][0]   ,self.out_layers[0][1]   ,self.out_projs[0]		)
							if target is not None:
								lowerCAmelCase__	:						Any  				=	tf.nn.sparse_softmax_cross_entropy_with_logits(labels=lowercase_   ,logits=lowercase_		)
							lowerCAmelCase__	:						Any  				=	tf.nn.log_softmax(lowercase_   ,axis=-1		)
						else:
							lowerCAmelCase__	:						Optional[Any]  				=	shape_list(lowercase_		)
							lowerCAmelCase__	:						Union[str, Any]  				=	[]
							lowerCAmelCase__	:						int  				=	tf.zeros(hidden_sizes[:2]		)
							for i in range(len(self.cutoffs		)		):
								lowerCAmelCase__				,lowerCAmelCase__	:						Any  				=	self.cutoff_ends[i], self.cutoff_ends[i + 1]
								if target is not None:
									lowerCAmelCase__	:						int  				=	(target >= l_idx) & (target < r_idx)
									lowerCAmelCase__	:						List[Any]  				=	tf.where(lowercase_		)
									lowerCAmelCase__	:						Union[str, Any]  				=	tf.boolean_mask(lowercase_   ,lowercase_		) - l_idx

								if self.div_val == 1:
									lowerCAmelCase__	:						int  				=	self.out_layers[0][0][l_idx:r_idx]
									lowerCAmelCase__	:						Union[str, Any]  				=	self.out_layers[0][1][l_idx:r_idx]
								else:
									lowerCAmelCase__	:						Optional[Any]  				=	self.out_layers[i][0]
									lowerCAmelCase__	:						Optional[int]  				=	self.out_layers[i][1]

								if i == 0:
									lowerCAmelCase__	:						Union[str, Any]  				=	tf.concat([cur_W, self.cluster_weight]   ,0		)
									lowerCAmelCase__	:						Tuple  				=	tf.concat([cur_b, self.cluster_bias]   ,0		)

									lowerCAmelCase__	:						List[Any]  				=	self._logit(lowercase_   ,lowercase_   ,lowercase_   ,self.out_projs[0]		)
									lowerCAmelCase__	:						List[str]  				=	tf.nn.log_softmax(lowercase_		)
									out.append(head_logprob[..., : self.cutoffs[0]]		)
									if target is not None:
										lowerCAmelCase__	:						List[str]  				=	tf.boolean_mask(lowercase_   ,lowercase_		)
										lowerCAmelCase__	:						Union[str, Any]  				=	self._gather_logprob(lowercase_   ,lowercase_		)
								else:
									lowerCAmelCase__	:						int  				=	self._logit(lowercase_   ,lowercase_   ,lowercase_   ,self.out_projs[i]		)
									lowerCAmelCase__	:						Tuple  				=	tf.nn.log_softmax(lowercase_		)
									lowerCAmelCase__	:						Tuple  				=	self.cutoffs[0] + i - 1  # No probability for the head cluster
									lowerCAmelCase__	:						Optional[int]  				=	head_logprob[..., cluster_prob_idx, None] + tail_logprob
									out.append(lowercase_		)
									if target is not None:
										lowerCAmelCase__	:						Optional[Any]  				=	tf.boolean_mask(lowercase_   ,lowercase_		)
										lowerCAmelCase__	:						Dict  				=	tf.boolean_mask(lowercase_   ,lowercase_		)
										lowerCAmelCase__	:						str  				=	self._gather_logprob(lowercase_   ,lowercase_		)
										cur_logprob += cur_head_logprob[:, self.cutoff_ends[1] + i - 1]
								if target is not None:
									loss += tf.scatter_nd(lowercase_   ,-cur_logprob   ,shape_list(lowercase_		)		)
							lowerCAmelCase__	:						Optional[int]  				=	tf.concat(lowercase_   ,axis=-1		)

						if target is not None:
							if return_mean:
								lowerCAmelCase__	:						List[Any]  				=	tf.reduce_mean(lowercase_		)
							# Add the training-time loss value to the layer using `self.add_loss()`.
							self.add_loss(lowercase_		)

							# Log the loss as a metric (we could log arbitrary metrics,
							# including different metrics for training and inference.
							self.add_metric(lowercase_   ,name=self.name   ,aggregation='''mean''' if return_mean else ''''''		)

						return out






import gc
import random
import unittest

import numpy as np
import torch
from transformers import XLMRobertaTokenizer

from diffusers import (
    AltDiffusionImgaImgPipeline,
    AutoencoderKL,
    PNDMScheduler,
    UNetaDConditionModel,
)
from diffusers.image_processor import VaeImageProcessor
from diffusers.pipelines.alt_diffusion.modeling_roberta_series import (
    RobertaSeriesConfig,
    RobertaSeriesModelWithTransformation,
)
from diffusers.utils import floats_tensor, load_image, load_numpy, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu


enable_full_determinism()







class 				lowercase		(					unittest.TestCase		):




							def  A__      (				self):
												# clean up the VRAM after each test
												super().tearDown()
												gc.collect()
												torch.cuda.empty_cache()




							@property
							def  A__      (				self):
												lowercase							=						1
												lowercase							=						3
												lowercase							=						(3_2, 3_2)

												lowercase							=						floats_tensor((batch_size, num_channels) + sizes   ,rng=random.Random(0)).to(A__)
												return image




							@property
							def  A__      (				self):
												torch.manual_seed(0)
												lowercase							=						UNetaDConditionModel(
												    block_out_channels=(3_2, 6_4)   ,layers_per_block=2   ,sample_size=3_2   ,in_channels=4   ,out_channels=4   ,down_block_types=('''DownBlock2D''', '''CrossAttnDownBlock2D''')   ,up_block_types=('''CrossAttnUpBlock2D''', '''UpBlock2D''')   ,cross_attention_dim=3_2   ,)
												return model




							@property
							def  A__      (				self):
												torch.manual_seed(0)
												lowercase							=						AutoencoderKL(
												    block_out_channels=[3_2, 6_4]   ,in_channels=3   ,out_channels=3   ,down_block_types=['''DownEncoderBlock2D''', '''DownEncoderBlock2D''']   ,up_block_types=['''UpDecoderBlock2D''', '''UpDecoderBlock2D''']   ,latent_channels=4   ,)
												return model




							@property
							def  A__      (				self):
												torch.manual_seed(0)
												lowercase							=						RobertaSeriesConfig(
												    hidden_size=3_2   ,project_dim=3_2   ,intermediate_size=3_7   ,layer_norm_eps=1E-05   ,num_attention_heads=4   ,num_hidden_layers=5   ,pad_token_id=1   ,vocab_size=5_0_0_6   ,)
												return RobertaSeriesModelWithTransformation(A__)




							@property
							def  A__      (				self):
												def extract(*A__   ,**A__):







																	class 				lowercase		:




																								def __init__(				self):
																													lowercase							=						torch.ones([0])





																								def  A__      (				self   ,A__):
																													self.pixel_values.to(A__)
																													return self


																	return Out()

												return extract




							def  A__      (				self):
												lowercase							=						'''cpu'''  # ensure determinism for the device-dependent torch.Generator
												lowercase							=						self.dummy_cond_unet
												lowercase							=						PNDMScheduler(skip_prk_steps=A__)
												lowercase							=						self.dummy_vae
												lowercase							=						self.dummy_text_encoder
												lowercase							=						XLMRobertaTokenizer.from_pretrained('''hf-internal-testing/tiny-xlm-roberta''')
												lowercase							=						7_7

												lowercase							=						self.dummy_image.to(A__)
												lowercase							=						init_image / 2 + 0.5

												# make sure here that pndm scheduler skips prk
												lowercase							=						AltDiffusionImgaImgPipeline(
												    unet=A__   ,scheduler=A__   ,vae=A__   ,text_encoder=A__   ,tokenizer=A__   ,safety_checker=A__   ,feature_extractor=self.dummy_extractor   ,)
												lowercase							=						VaeImageProcessor(vae_scale_factor=alt_pipe.vae_scale_factor   ,do_normalize=A__)
												lowercase							=						alt_pipe.to(A__)
												alt_pipe.set_progress_bar_config(disable=A__)

												lowercase							=						'''A painting of a squirrel eating a burger'''
												lowercase							=						torch.Generator(device=A__).manual_seed(0)
												lowercase							=						alt_pipe(
												    [prompt]   ,generator=A__   ,guidance_scale=6.0   ,num_inference_steps=2   ,output_type='''np'''   ,image=A__   ,)

												lowercase							=						output.images

												lowercase							=						torch.Generator(device=A__).manual_seed(0)
												lowercase							=						alt_pipe(
												    [prompt]   ,generator=A__   ,guidance_scale=6.0   ,num_inference_steps=2   ,output_type='''np'''   ,image=A__   ,return_dict=A__   ,)[0]

												lowercase							=						image[0, -3:, -3:, -1]
												lowercase							=						image_from_tuple[0, -3:, -3:, -1]

												assert image.shape == (1, 3_2, 3_2, 3)
												lowercase							=						np.array([0.4427, 0.3731, 0.4249, 0.4941, 0.4546, 0.4148, 0.4193, 0.4666, 0.4499])

												assert np.abs(image_slice.flatten() - expected_slice).max() < 5E-3
												assert np.abs(image_from_tuple_slice.flatten() - expected_slice).max() < 5E-3




							@unittest.skipIf(torch_device != '''cuda'''   ,'''This test requires a GPU''')
							def  A__      (				self):
												lowercase							=						self.dummy_cond_unet
												lowercase							=						PNDMScheduler(skip_prk_steps=A__)
												lowercase							=						self.dummy_vae
												lowercase							=						self.dummy_text_encoder
												lowercase							=						XLMRobertaTokenizer.from_pretrained('''hf-internal-testing/tiny-xlm-roberta''')
												lowercase							=						7_7

												lowercase							=						self.dummy_image.to(A__)

												# put models in fp16
												lowercase							=						unet.half()
												lowercase							=						vae.half()
												lowercase							=						bert.half()

												# make sure here that pndm scheduler skips prk
												lowercase							=						AltDiffusionImgaImgPipeline(
												    unet=A__   ,scheduler=A__   ,vae=A__   ,text_encoder=A__   ,tokenizer=A__   ,safety_checker=A__   ,feature_extractor=self.dummy_extractor   ,)
												lowercase							=						VaeImageProcessor(vae_scale_factor=alt_pipe.vae_scale_factor   ,do_normalize=A__)
												lowercase							=						alt_pipe.to(A__)
												alt_pipe.set_progress_bar_config(disable=A__)

												lowercase							=						'''A painting of a squirrel eating a burger'''
												lowercase							=						torch.manual_seed(0)
												lowercase							=						alt_pipe(
												    [prompt]   ,generator=A__   ,num_inference_steps=2   ,output_type='''np'''   ,image=A__   ,).images

												assert image.shape == (1, 3_2, 3_2, 3)





							@unittest.skipIf(torch_device != '''cuda'''   ,'''This test requires a GPU''')
							def  A__      (				self):
												lowercase							=						load_image(
												    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
												    '''/img2img/sketch-mountains-input.jpg''')
												# resize to resolution that is divisible by 8 but not 16 or 32
												lowercase							=						init_image.resize((7_6_0, 5_0_4))

												lowercase							=						'''BAAI/AltDiffusion'''
												lowercase							=						AltDiffusionImgaImgPipeline.from_pretrained(
												    A__   ,safety_checker=A__   ,)
												pipe.to(A__)
												pipe.set_progress_bar_config(disable=A__)
												pipe.enable_attention_slicing()

												lowercase							=						'''A fantasy landscape, trending on artstation'''

												lowercase							=						torch.manual_seed(0)
												lowercase							=						pipe(
												    prompt=A__   ,image=A__   ,strength=0.75   ,guidance_scale=7.5   ,generator=A__   ,output_type='''np'''   ,)
												lowercase							=						output.images[0]

												lowercase							=						image[2_5_5:2_5_8, 3_8_3:3_8_6, -1]

												assert image.shape == (5_0_4, 7_6_0, 3)
												lowercase							=						np.array([0.9358, 0.9397, 0.9599, 0.9901, 1.0000, 1.0000, 0.9882, 1.0000, 1.0000])

												assert np.abs(image_slice.flatten() - expected_slice).max() < 1E-2







@slow
@require_torch_gpu
class 				lowercase		(					unittest.TestCase		):




							def  A__      (				self):
												# clean up the VRAM after each test
												super().tearDown()
												gc.collect()
												torch.cuda.empty_cache()





							def  A__      (				self):
												lowercase							=						load_image(
												    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
												    '''/img2img/sketch-mountains-input.jpg''')
												lowercase							=						init_image.resize((7_6_8, 5_1_2))
												lowercase							=						load_numpy(
												    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/img2img/fantasy_landscape_alt.npy''')

												lowercase							=						'''BAAI/AltDiffusion'''
												lowercase							=						AltDiffusionImgaImgPipeline.from_pretrained(
												    A__   ,safety_checker=A__   ,)
												pipe.to(A__)
												pipe.set_progress_bar_config(disable=A__)
												pipe.enable_attention_slicing()

												lowercase							=						'''A fantasy landscape, trending on artstation'''

												lowercase							=						torch.manual_seed(0)
												lowercase							=						pipe(
												    prompt=A__   ,image=A__   ,strength=0.75   ,guidance_scale=7.5   ,generator=A__   ,output_type='''np'''   ,)
												lowercase							=						output.images[0]

												assert image.shape == (5_1_2, 7_6_8, 3)
												# img2img is flaky across GPUs even in fp32, so using MAE here
												assert np.abs(expected_image - image).max() < 1E-2




