


"""simple docstring"""



import gc
import unittest

import numpy as np
import torch
from transformers import CLIPTextConfig, CLIPTextModel, CLIPTokenizer

from diffusers import TransformeraDModel, VQDiffusionPipeline, VQDiffusionScheduler, VQModel
from diffusers.pipelines.vq_diffusion.pipeline_vq_diffusion import LearnedClassifierFreeSamplingEmbeddings
from diffusers.utils import load_numpy, slow, torch_device
from diffusers.utils.testing_utils import require_torch_gpu


lowercase_							=							False







class    __a						( unittest.TestCase							):







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					super().tearDown()
					gc.collect()
					torch.cuda.empty_cache()







				@property
				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					return 12







				@property
				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					return 12







				@property
				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					return 32







				@property
				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					torch.manual_seed(0   )
					lowerCAmelCase_      							=			VQModel(
					    block_out_channels=[32, 64]      ,	in_channels=3      ,	out_channels=3      ,	down_block_types=['''DownEncoderBlock2D''', '''DownEncoderBlock2D''']      ,	up_block_types=['''UpDecoderBlock2D''', '''UpDecoderBlock2D''']      ,	latent_channels=3      ,	num_vq_embeddings=self.num_embed      ,	vq_embed_dim=3      ,	)
					return model







				@property
				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''   )
					return tokenizer







				@property
				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					torch.manual_seed(0   )
					lowerCAmelCase_      							=			CLIPTextConfig(
					    bos_token_id=0      ,	eos_token_id=2      ,	hidden_size=self.text_embedder_hidden_size      ,	intermediate_size=37      ,	layer_norm_eps=1E-0_5      ,	num_attention_heads=4      ,	num_hidden_layers=5      ,	pad_token_id=1      ,	vocab_size=1000      ,	)
					return CLIPTextModel(UpperCAmelCase   )







				@property
				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					torch.manual_seed(0   )

					lowerCAmelCase_      							=			12
					lowerCAmelCase_      							=			12

					lowerCAmelCase_      							=			{
					    '''attention_bias''': True,
					    '''cross_attention_dim''': 32,
					    '''attention_head_dim''': height * width,
					    '''num_attention_heads''': 1,
					    '''num_vector_embeds''': self.num_embed,
					    '''num_embeds_ada_norm''': self.num_embeds_ada_norm,
					    '''norm_num_groups''': 32,
					    '''sample_size''': width,
					    '''activation_fn''': '''geglu-approximate''',
					}

					lowerCAmelCase_      							=			TransformeraDModel(**UpperCAmelCase   )
					return model







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			'''cpu'''

					lowerCAmelCase_      							=			self.dummy_vqvae
					lowerCAmelCase_      							=			self.dummy_text_encoder
					lowerCAmelCase_      							=			self.dummy_tokenizer
					lowerCAmelCase_      							=			self.dummy_transformer
					lowerCAmelCase_      							=			VQDiffusionScheduler(self.num_embed   )
					lowerCAmelCase_      							=			LearnedClassifierFreeSamplingEmbeddings(learnable=UpperCAmelCase   )

					lowerCAmelCase_      							=			VQDiffusionPipeline(
					    vqvae=UpperCAmelCase      ,	text_encoder=UpperCAmelCase      ,	tokenizer=UpperCAmelCase      ,	transformer=UpperCAmelCase      ,	scheduler=UpperCAmelCase      ,	learned_classifier_free_sampling_embeddings=UpperCAmelCase      ,	)
					lowerCAmelCase_      							=			pipe.to(UpperCAmelCase   )
					pipe.set_progress_bar_config(disable=UpperCAmelCase   )

					lowerCAmelCase_      							=			'''teddy bear playing in the pool'''

					lowerCAmelCase_      							=			torch.Generator(device=UpperCAmelCase   ).manual_seed(0   )
					lowerCAmelCase_      							=			pipe([prompt]      ,	generator=UpperCAmelCase      ,	num_inference_steps=2      ,	output_type='''np'''   )
					lowerCAmelCase_      							=			output.images

					lowerCAmelCase_      							=			torch.Generator(device=UpperCAmelCase   ).manual_seed(0   )
					lowerCAmelCase_      							=			pipe(
					    [prompt]      ,	generator=UpperCAmelCase      ,	output_type='''np'''      ,	return_dict=UpperCAmelCase      ,	num_inference_steps=2   )[0]

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

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

					lowerCAmelCase_      							=			np.array([0.6_5_5_1, 0.6_1_6_8, 0.5_0_0_8, 0.5_6_7_6, 0.5_6_5_9, 0.4_2_9_5, 0.6_0_7_3, 0.5_5_9_9, 0.4_9_9_2]   )

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







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			'''cpu'''

					lowerCAmelCase_      							=			self.dummy_vqvae
					lowerCAmelCase_      							=			self.dummy_text_encoder
					lowerCAmelCase_      							=			self.dummy_tokenizer
					lowerCAmelCase_      							=			self.dummy_transformer
					lowerCAmelCase_      							=			VQDiffusionScheduler(self.num_embed   )
					lowerCAmelCase_      							=			LearnedClassifierFreeSamplingEmbeddings(
					    learnable=UpperCAmelCase      ,	hidden_size=self.text_embedder_hidden_size      ,	length=tokenizer.model_max_length   )

					lowerCAmelCase_      							=			VQDiffusionPipeline(
					    vqvae=UpperCAmelCase      ,	text_encoder=UpperCAmelCase      ,	tokenizer=UpperCAmelCase      ,	transformer=UpperCAmelCase      ,	scheduler=UpperCAmelCase      ,	learned_classifier_free_sampling_embeddings=UpperCAmelCase      ,	)
					lowerCAmelCase_      							=			pipe.to(UpperCAmelCase   )
					pipe.set_progress_bar_config(disable=UpperCAmelCase   )

					lowerCAmelCase_      							=			'''teddy bear playing in the pool'''

					lowerCAmelCase_      							=			torch.Generator(device=UpperCAmelCase   ).manual_seed(0   )
					lowerCAmelCase_      							=			pipe([prompt]      ,	generator=UpperCAmelCase      ,	num_inference_steps=2      ,	output_type='''np'''   )
					lowerCAmelCase_      							=			output.images

					lowerCAmelCase_      							=			torch.Generator(device=UpperCAmelCase   ).manual_seed(0   )
					lowerCAmelCase_      							=			pipe(
					    [prompt]      ,	generator=UpperCAmelCase      ,	output_type='''np'''      ,	return_dict=UpperCAmelCase      ,	num_inference_steps=2   )[0]

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

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

					lowerCAmelCase_      							=			np.array([0.6_6_9_3, 0.6_0_7_5, 0.4_9_5_9, 0.5_7_0_1, 0.5_5_8_3, 0.4_3_3_3, 0.6_1_7_1, 0.5_6_8_4, 0.4_9_8_8]   )

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







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







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					super().tearDown()
					gc.collect()
					torch.cuda.empty_cache()







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			load_numpy(
					    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
					    '''/vq_diffusion/teddy_bear_pool_classifier_free_sampling.npy'''   )

					lowerCAmelCase_      							=			VQDiffusionPipeline.from_pretrained('''microsoft/vq-diffusion-ithq'''   )
					lowerCAmelCase_      							=			pipeline.to(UpperCAmelCase   )
					pipeline.set_progress_bar_config(disable=UpperCAmelCase   )

					# requires GPU generator for gumbel softmax
					# don't use GPU generator in tests though
					lowerCAmelCase_      							=			torch.Generator(device=UpperCAmelCase   ).manual_seed(0   )
					lowerCAmelCase_      							=			pipeline(
					    '''teddy bear playing in the pool'''      ,	num_images_per_prompt=1      ,	generator=UpperCAmelCase      ,	output_type='''np'''      ,	)

					lowerCAmelCase_      							=			output.images[0]

					assert image.shape == (256, 256, 3)
					assert np.abs(expected_image - image   ).max() < 2.0



"""simple docstring"""



from collections import Counter
from timeit import timeit
def      UpperCAmelCase     (       _lowercase :   str = ""			,   )						-> bool:


	"""simple docstring"""




	return sum(c % 2 for c in Counter(input_str.replace(''' '''			,   ''''''	).lower()	).values()	) < 2
def      UpperCAmelCase     (       _lowercase :   str = ""	)						-> bool:


	"""simple docstring"""




	if len(_lowercase	) == 0:
		return True
	lowerCAmelCase_      							=			input_str.replace(''' '''			,   ''''''	).lower()
	# character_freq_dict: Stores the frequency of every character in the input string
	lowerCAmelCase_      							=			{}

	for character in lower_case_input_str:
		lowerCAmelCase_      							=			character_freq_dict.get(_lowercase			,   0	) + 1
	lowerCAmelCase_      							=			0

	for character_count in character_freq_dict.values():
		if character_count % 2:
			odd_char += 1
	if odd_char > 1:
		return False
	return True
def      UpperCAmelCase     (       _lowercase :   str = ""	)						-> None:


	"""simple docstring"""




	print('''\nFor string = '''			,   _lowercase			,   ''':'''	)
	print(
	    '''> can_string_be_rearranged_as_palindrome_counter()'''			,   '''\tans ='''			,   can_string_be_rearranged_as_palindrome_counter(_lowercase	)			,   '''\ttime ='''			,   timeit(
	        '''z.can_string_be_rearranged_as_palindrome_counter(z.check_str)'''			,   setup='''import __main__ as z'''			,   )			,   '''seconds'''			,   )
	print(
	    '''> can_string_be_rearranged_as_palindrome()'''			,   '''\tans ='''			,   can_string_be_rearranged_as_palindrome(_lowercase	)			,   '''\ttime ='''			,   timeit(
	        '''z.can_string_be_rearranged_as_palindrome(z.check_str)'''			,   setup='''import __main__ as z'''			,   )			,   '''seconds'''			,   )


if __name__ == "__main__":
		lowercase_							=							input(
		    'Enter string to determine if it can be rearranged as a palindrome or not: '
		).strip()
		benchmark(check_str)
		lowercase_							=							can_string_be_rearranged_as_palindrome_counter(check_str)
		print(f"""{check_str} can {'' if status else 'not '}be rearranged as a palindrome""")