





'''simple docstring'''






import copy
import os
from typing import Union

from ...configuration_utils import PretrainedConfig
from ...utils import logging


A__							:  str    =logging.get_logger(__name__)

A__							:  List[str]    ={
    'google/pix2struct-textcaps-base': (
        'https://huggingface.co/google/pix2struct-textcaps-base/resolve/main/config.json'
    ),
}




class 					UpperCAmelCase	(     snake_case_  ):
      _lowercase:     Dict			=  '''pix2struct_text_model'''
      _lowercase:     List[str]			=  ['''past_key_values''']
      _lowercase:     Optional[Any]			=  {
          '''hidden_size''': '''hidden_size''',
          '''num_attention_heads''': '''num_heads''',
          '''num_hidden_layers''': '''num_layers''',
      }




      def __init__(     self     :					Optional[Any]     ,     __snake_case     :					List[Any]=5_02_44     ,     __snake_case     :					List[str]=7_68     ,     __snake_case     :					Optional[int]=64     ,     __snake_case     :					Dict=20_48     ,     __snake_case     :					Optional[int]=12     ,     __snake_case     :					int=12     ,     __snake_case     :					int=32     ,     __snake_case     :					List[str]=1_28     ,     __snake_case     :					Any=0.1     ,     __snake_case     :					List[Any]=1E-6     ,     __snake_case     :					Optional[Any]=1.0     ,     __snake_case     :					Optional[Any]="gelu_new"     ,     __snake_case     :					Optional[int]=0     ,     __snake_case     :					List[str]=False     ,     __snake_case     :					Dict=0     ,     __snake_case     :					int=1     ,     __snake_case     :					Union[str, Any]=False     ,     __snake_case     :					Tuple=True     ,     **__snake_case     :					List[Any]     ,     )							-> Optional[Any]:
            _lowerCAmelCase					=				vocab_size
            _lowerCAmelCase					=				hidden_size
            _lowerCAmelCase					=				d_kv
            _lowerCAmelCase					=				d_ff
            _lowerCAmelCase					=				num_layers
            _lowerCAmelCase					=				num_heads
            _lowerCAmelCase					=				relative_attention_num_buckets
            _lowerCAmelCase					=				relative_attention_max_distance
            _lowerCAmelCase					=				dropout_rate
            _lowerCAmelCase					=				layer_norm_epsilon
            _lowerCAmelCase					=				initializer_factor
            _lowerCAmelCase					=				use_cache

            _lowerCAmelCase					=				eos_token_id
            _lowerCAmelCase					=				decoder_start_token_id

            # for backwards compatibility
            _lowerCAmelCase					=				dense_act_fn

            super().__init__(
                pad_token_id=lowerCamelCase__     ,     eos_token_id=lowerCamelCase__     ,     decoder_start_token_id=lowerCamelCase__     ,     tie_word_embeddings=lowerCamelCase__     ,     is_decoder=lowerCamelCase__     ,     **lowerCamelCase__     ,     )




      @classmethod
      def 							lowercase__       (     cls     :					Dict     ,     __snake_case     :					Union[str, os.PathLike]     ,     **__snake_case     :					Tuple    )							-> List[str]:
            cls._set_token_in_kwargs(lowerCamelCase__    )

            _lowerCAmelCase					=				cls.get_config_dict(lowerCamelCase__     ,     **lowerCamelCase__    )

            # get the text config dict if we are loading from Pix2StructConfig
            if config_dict.get("""model_type"""    ) == "pix2struct":
                  _lowerCAmelCase					=				config_dict['text_config']

            if "model_type" in config_dict and hasattr(cls     ,     """model_type"""    ) and config_dict["model_type"] != cls.model_type:
                  logger.warning(
                      f"You are using a model of type {config_dict['model_type']} to instantiate a model of type "
                      f"{cls.model_type}. This is not supported for all configurations of models and can yield errors."    )

            return cls.from_dict(lowerCamelCase__     ,     **lowerCamelCase__    )




class 					UpperCAmelCase	(     snake_case_  ):
      _lowercase:     str			=  '''pix2struct_vision_model'''




      def __init__(     self     :					List[Any]     ,     __snake_case     :					Union[str, Any]=7_68     ,     __snake_case     :					Dict=7_68     ,     __snake_case     :					List[str]=20_48     ,     __snake_case     :					List[str]=64     ,     __snake_case     :					Union[str, Any]=12     ,     __snake_case     :					Tuple=12     ,     __snake_case     :					List[Any]="gelu_new"     ,     __snake_case     :					Any=1E-6     ,     __snake_case     :					Union[str, Any]=0.0     ,     __snake_case     :					Union[str, Any]=0.0     ,     __snake_case     :					Optional[Any]=1E-1_0     ,     __snake_case     :					int=1.0     ,     __snake_case     :					Optional[int]=40_96     ,     __snake_case     :					Dict=32     ,     __snake_case     :					List[Any]=1_28     ,     **__snake_case     :					Any     ,     )							-> Optional[int]:
            super().__init__(**lowerCamelCase__    )

            _lowerCAmelCase					=				hidden_size
            _lowerCAmelCase					=				patch_embed_hidden_size
            _lowerCAmelCase					=				d_ff
            _lowerCAmelCase					=				dropout_rate
            _lowerCAmelCase					=				num_hidden_layers
            _lowerCAmelCase					=				num_attention_heads
            _lowerCAmelCase					=				initializer_range
            _lowerCAmelCase					=				initializer_factor
            _lowerCAmelCase					=				attention_dropout
            _lowerCAmelCase					=				layer_norm_eps
            _lowerCAmelCase					=				dense_act_fn
            _lowerCAmelCase					=				seq_len
            _lowerCAmelCase					=				relative_attention_num_buckets
            _lowerCAmelCase					=				relative_attention_max_distance
            _lowerCAmelCase					=				d_kv




      @classmethod
      def 							lowercase__       (     cls     :					Dict     ,     __snake_case     :					Union[str, os.PathLike]     ,     **__snake_case     :					Any    )							-> Dict:
            cls._set_token_in_kwargs(lowerCamelCase__    )

            _lowerCAmelCase					=				cls.get_config_dict(lowerCamelCase__     ,     **lowerCamelCase__    )

            # get the vision config dict if we are loading from Pix2StructConfig
            if config_dict.get("""model_type"""    ) == "pix2struct":
                  _lowerCAmelCase					=				config_dict['vision_config']

            if "model_type" in config_dict and hasattr(cls     ,     """model_type"""    ) and config_dict["model_type"] != cls.model_type:
                  logger.warning(
                      f"You are using a model of type {config_dict['model_type']} to instantiate a model of type "
                      f"{cls.model_type}. This is not supported for all configurations of models and can yield errors."    )

            return cls.from_dict(lowerCamelCase__     ,     **lowerCamelCase__    )




class 					UpperCAmelCase	(     snake_case_  ):
      _lowercase:     List[str]			=  '''pix2struct'''
      _lowercase:     Any			=  True




      def __init__(     self     :					int     ,     __snake_case     :					int=None     ,     __snake_case     :					str=None     ,     __snake_case     :					Tuple=1.0     ,     __snake_case     :					Tuple=0.02     ,     __snake_case     :					Tuple=False     ,     __snake_case     :					Dict=False     ,     __snake_case     :					List[str]=True     ,     **__snake_case     :					str     ,     )							-> int:
            super().__init__(tie_word_embeddings=lowerCamelCase__     ,     is_encoder_decoder=lowerCamelCase__     ,     **lowerCamelCase__    )

            if text_config is None:
                  _lowerCAmelCase					=				{}
                  logger.info("""text_config is None. Initializing the Pix2StructTextConfig with default values."""    )

            if vision_config is None:
                  _lowerCAmelCase					=				{}
                  logger.info("""vision_config is None. Initializing the Pix2StructVisionConfig with default values."""    )

            _lowerCAmelCase					=				PixaStructTextConfig(**lowerCamelCase__    )
            _lowerCAmelCase					=				PixaStructVisionConfig(**lowerCamelCase__    )

            _lowerCAmelCase					=				self.text_config.decoder_start_token_id
            _lowerCAmelCase					=				self.text_config.pad_token_id
            _lowerCAmelCase					=				self.text_config.eos_token_id

            _lowerCAmelCase					=				initializer_factor
            _lowerCAmelCase					=				initializer_range

            _lowerCAmelCase					=				self.initializer_range
            _lowerCAmelCase					=				self.initializer_range

            _lowerCAmelCase					=				is_vqa




      @classmethod
      def 							lowercase__       (     cls     :					Optional[Any]     ,     __snake_case     :					PixaStructTextConfig     ,     __snake_case     :					PixaStructVisionConfig     ,     **__snake_case     :					List[str]    )							-> str:
            return cls(text_config=text_config.to_dict()     ,     vision_config=vision_config.to_dict()     ,     **lowerCamelCase__    )




      def 							lowercase__       (     self     :					Dict    )							-> str:
            _lowerCAmelCase					=				copy.deepcopy(self.__dict__    )
            _lowerCAmelCase					=				self.text_config.to_dict()
            _lowerCAmelCase					=				self.vision_config.to_dict()
            _lowerCAmelCase					=				self.__class__.model_type
            return output











'''simple docstring'''
import gc
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    StableDiffusionAttendAndExcitePipeline,
    UNetaDConditionModel,
)
from diffusers.utils import load_numpy, skip_mps, slow
from diffusers.utils.testing_utils import require_torch_gpu

from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_IMAGE_PARAMS, TEXT_TO_IMAGE_PARAMS
from ..test_pipelines_common import PipelineKarrasSchedulerTesterMixin, PipelineLatentTesterMixin, PipelineTesterMixin


snake_case_					:      Tuple    			=    False






@skip_mps
class 				lowercase__      (				lowercase		,   lowercase		,   lowercase		,   unittest.TestCase  ):
	lowercase__    							=     StableDiffusionAttendAndExcitePipeline
	lowercase__    							=     False
	lowercase__    							=     TEXT_TO_IMAGE_PARAMS
	lowercase__    							=     TEXT_TO_IMAGE_BATCH_PARAMS.union({"""token_indices"""}  )
	lowercase__    							=     TEXT_TO_IMAGE_IMAGE_PARAMS
	lowercase__    							=     TEXT_TO_IMAGE_IMAGE_PARAMS





	@classmethod
	def       UpperCamelCase_    (					cls   :							Any					):







							'''simple docstring'''
							super().setUpClass()
							torch.use_deterministic_algorithms(lowerCamelCase__					)





	@classmethod
	def       UpperCamelCase_    (					cls   :							List[Any]					):







							'''simple docstring'''
							super().tearDownClass()
							torch.use_deterministic_algorithms(lowerCamelCase__					)





	def       UpperCamelCase_    (					self   :							Dict					):







							'''simple docstring'''
							torch.manual_seed(0					)
							_UpperCamelCase   :						Union[str, Any]												=  UNetaDConditionModel(
							    block_out_channels=(32, 64)					,layers_per_block=1					,sample_size=32					,in_channels=4					,out_channels=4					,down_block_types=('DownBlock2D', 'CrossAttnDownBlock2D')					,up_block_types=('CrossAttnUpBlock2D', 'UpBlock2D')					,cross_attention_dim=32					,attention_head_dim=(2, 4)					,use_linear_projection=lowerCamelCase__					,)
							_UpperCamelCase   :						List[str]												=  DDIMScheduler(
							    beta_start=0.0_0_0_8_5					,beta_end=0.0_1_2					,beta_schedule='scaled_linear'					,clip_sample=lowerCamelCase__					,set_alpha_to_one=lowerCamelCase__					,)
							torch.manual_seed(0					)
							_UpperCamelCase   :						List[str]												=  AutoencoderKL(
							    block_out_channels=[32, 64]					,in_channels=3					,out_channels=3					,down_block_types=['DownEncoderBlock2D', 'DownEncoderBlock2D']					,up_block_types=['UpDecoderBlock2D', 'UpDecoderBlock2D']					,latent_channels=4					,sample_size=128					,)
							torch.manual_seed(0					)
							_UpperCamelCase   :						List[str]												=  CLIPTextConfig(
							    bos_token_id=0					,eos_token_id=2					,hidden_size=32					,intermediate_size=37					,layer_norm_eps=1E-05					,num_attention_heads=4					,num_hidden_layers=5					,pad_token_id=1					,vocab_size=1000					,hidden_act='gelu'					,projection_dim=512					,)
							_UpperCamelCase   :						List[str]												=  CLIPTextModel(lowerCamelCase__					)
							_UpperCamelCase   :						Any												=  CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip'					)

							_UpperCamelCase   :						str												=  {
							    'unet': unet,
							    'scheduler': scheduler,
							    'vae': vae,
							    'text_encoder': text_encoder,
							    'tokenizer': tokenizer,
							    'safety_checker': None,
							    'feature_extractor': None,
							}

							return components





	def       UpperCamelCase_    (					self   :							Tuple					,lowerCamelCase__   :							Tuple					,lowerCamelCase__   :							str=0					):







							'''simple docstring'''
							if str(lowerCamelCase__					).startswith('mps'					):
													_UpperCamelCase   :						Union[str, Any]												=  torch.manual_seed(lowerCamelCase__					)
							else:
													_UpperCamelCase   :						int												=  torch.Generator(device=lowerCamelCase__					).manual_seed(lowerCamelCase__					)
							_UpperCamelCase   :						Union[str, Any]												=  {
							    'prompt': 'a cat and a frog',
							    'token_indices': [2, 5],
							    'generator': generator,
							    'num_inference_steps': 1,
							    'guidance_scale': 6.0,
							    'output_type': 'numpy',
							    'max_iter_to_alter': 2,
							    'thresholds': {0: 0.7},
							}
							return inputs





	def       UpperCamelCase_    (					self   :							int					):







							'''simple docstring'''
							_UpperCamelCase   :						Any												=  'cpu'

							_UpperCamelCase   :						List[Any]												=  self.get_dummy_components()
							_UpperCamelCase   :						Union[str, Any]												=  self.pipeline_class(**lowerCamelCase__					)
							pipe.to(lowerCamelCase__					)
							pipe.set_progress_bar_config(disable=lowerCamelCase__					)

							_UpperCamelCase   :						Optional[Any]												=  self.get_dummy_inputs(lowerCamelCase__					)
							_UpperCamelCase   :						Optional[int]												=  pipe(**lowerCamelCase__					).images
							_UpperCamelCase   :						Union[str, Any]												=  image[0, -3:, -3:, -1]

							self.assertEqual(image.shape					,(1, 64, 64, 3)					)
							_UpperCamelCase   :						Union[str, Any]												=  np.array(
							    [0.6_3_9_0_5_3_6_4, 0.6_2_8_9_7_3_0_7, 0.4_8_5_9_9_0_1_7, 0.5_1_3_3_6_2_4, 0.5_5_5_0_0_4_8, 0.4_5_7_6_9_5_1_6, 0.5_0_3_2_6_9_7_3, 0.5_0_2_3_1_3_9, 0.4_5_3_8_4_4_9_6]					)
							_UpperCamelCase   :						Tuple												=  np.abs(image_slice.flatten() - expected_slice					).max()
							self.assertLessEqual(lowerCamelCase__					,1E-3					)





	def       UpperCamelCase_    (					self   :							List[str]					):







							'''simple docstring'''
							super().test_cpu_offload_forward_pass(expected_max_diff=5E-4					)





	def       UpperCamelCase_    (					self   :							Any					):







							'''simple docstring'''
							# NOTE: Larger batch sizes cause this test to timeout, only test on smaller batches
							self._test_inference_batch_consistent(batch_sizes=[1, 2]					)





	def       UpperCamelCase_    (					self   :							Tuple					):







							'''simple docstring'''
							self._test_inference_batch_single_identical(batch_size=2					,expected_max_diff=7E-4					)





	def       UpperCamelCase_    (					self   :							List[str]					):







							'''simple docstring'''
							super().test_dict_tuple_outputs_equivalent(expected_max_difference=3E-3					)





	def       UpperCamelCase_    (					self   :							Tuple					):







							'''simple docstring'''
							super().test_pt_np_pil_outputs_equivalent(expected_max_diff=5E-4					)





	def       UpperCamelCase_    (					self   :							int					):







							'''simple docstring'''
							super().test_save_load_local(expected_max_difference=5E-4					)





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







							'''simple docstring'''
							super().test_save_load_optional_components(expected_max_difference=4E-4					)






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





	@classmethod
	def       UpperCamelCase_    (					cls   :							Dict					):







							'''simple docstring'''
							super().setUpClass()
							torch.use_deterministic_algorithms(lowerCamelCase__					)





	@classmethod
	def       UpperCamelCase_    (					cls   :							Optional[Any]					):







							'''simple docstring'''
							super().tearDownClass()
							torch.use_deterministic_algorithms(lowerCamelCase__					)





	def       UpperCamelCase_    (					self   :							str					):







							'''simple docstring'''
							super().tearDown()
							gc.collect()
							torch.cuda.empty_cache()





	def       UpperCamelCase_    (					self   :							List[Any]					):







							'''simple docstring'''
							_UpperCamelCase   :						Optional[Any]												=  torch.manual_seed(51					)

							_UpperCamelCase   :						Optional[Any]												=  StableDiffusionAttendAndExcitePipeline.from_pretrained(
							    'CompVis/stable-diffusion-v1-4'					,safety_checker=lowerCamelCase__					,torch_dtype=torch.floataa					)
							pipe.to('cuda'					)

							_UpperCamelCase   :						Any												=  'a painting of an elephant with glasses'
							_UpperCamelCase   :						str												=  [5, 7]

							_UpperCamelCase   :						int												=  pipe(
							    prompt=lowerCamelCase__					,token_indices=lowerCamelCase__					,guidance_scale=7.5					,generator=lowerCamelCase__					,num_inference_steps=5					,max_iter_to_alter=5					,output_type='numpy'					,).images[0]

							_UpperCamelCase   :						Tuple												=  load_numpy(
							    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/attend-and-excite/elephant_glasses.npy'					)
							assert np.abs((expected_image - image).max()					) < 5E-1


