




import gc
import random
import unittest

import numpy as np
import torch
from transformers import CLIPImageProcessor, CLIPVisionConfig, CLIPVisionModel

from diffusers import HeunDiscreteScheduler, PriorTransformer, ShapEImgaImgPipeline
from diffusers.pipelines.shap_e import ShapERenderer
from diffusers.utils import floats_tensor, load_image, load_numpy, slow
from diffusers.utils.testing_utils import require_torch_gpu, torch_device

from ..test_pipelines_common import PipelineTesterMixin, assert_mean_pixel_difference

class     __a(	_a							,		unittest.TestCase  ):






    """simple docstring"""





    lowerCAmelCase         = ShapEImgaImgPipeline
    lowerCAmelCase         = ['''image''']
    lowerCAmelCase         = ['''image''']
    lowerCAmelCase         = [
        '''num_images_per_prompt''',
        '''num_inference_steps''',
        '''generator''',
        '''latents''',
        '''guidance_scale''',
        '''frame_size''',
        '''output_type''',
        '''return_dict''',
    ]
    lowerCAmelCase         = False





    @property
    def 				a__ ( self    )					->						Optional[int]:
         return 32





    @property
    def 				a__ ( self    )					->						str:
         return 32





    @property
    def 				a__ ( self    )					->						Any:
         return self.time_input_dim * 4





    @property
    def 				a__ ( self    )					->						Tuple:
         return 8





    @property
    def 				a__ ( self    )					->						Any:
         torch.manual_seed(0    )
         UpperCAmelCase_     :				List[Any]  =     CLIPVisionConfig(
             hidden_size=self.text_embedder_hidden_size  ,image_size=64  ,projection_dim=self.text_embedder_hidden_size  ,intermediate_size=37  ,num_attention_heads=4  ,num_channels=3  ,num_hidden_layers=5  ,patch_size=1  ,)

         UpperCAmelCase_     :				str  =     CLIPVisionModel(_SCREAMING_SNAKE_CASE    )
         return model





    @property
    def 				a__ ( self    )					->						Tuple:
         UpperCAmelCase_     :				List[Any]  =     CLIPImageProcessor(
             crop_size=224  ,do_center_crop=_SCREAMING_SNAKE_CASE  ,do_normalize=_SCREAMING_SNAKE_CASE  ,do_resize=_SCREAMING_SNAKE_CASE  ,image_mean=[0.48_14_54_66, 0.4_57_82_75, 0.40_82_10_73]  ,image_std=[0.26_86_29_54, 0.26_13_02_58, 0.27_57_77_11]  ,resample=3  ,size=224  ,)

         return image_processor





    @property
    def 				a__ ( self    )					->						Optional[Any]:
         torch.manual_seed(0    )

         UpperCAmelCase_     :				Optional[Any]  =     {
             '''num_attention_heads''': 2,
             '''attention_head_dim''': 16,
             '''embedding_dim''': self.time_input_dim,
             '''num_embeddings''': 32,
             '''embedding_proj_dim''': self.text_embedder_hidden_size,
             '''time_embed_dim''': self.time_embed_dim,
             '''num_layers''': 1,
             '''clip_embed_dim''': self.time_input_dim * 2,
             '''additional_embeddings''': 0,
             '''time_embed_act_fn''': '''gelu''',
             '''norm_in_type''': '''layer''',
             '''embedding_proj_norm_type''': '''layer''',
             '''encoder_hid_proj_type''': None,
             '''added_emb_type''': None,
         }

         UpperCAmelCase_     :				str  =     PriorTransformer(**_SCREAMING_SNAKE_CASE    )
         return model





    @property
    def 				a__ ( self    )					->						Optional[int]:
         torch.manual_seed(0    )

         UpperCAmelCase_     :				List[str]  =     {
             '''param_shapes''': (
                 (self.renderer_dim, 93),
                 (self.renderer_dim, 8),
                 (self.renderer_dim, 8),
                 (self.renderer_dim, 8),
             ),
             '''d_latent''': self.time_input_dim,
             '''d_hidden''': self.renderer_dim,
             '''n_output''': 12,
             '''background''': (
                 0.1,
                 0.1,
                 0.1,
             ),
         }
         UpperCAmelCase_     :				List[str]  =     ShapERenderer(**_SCREAMING_SNAKE_CASE    )
         return model





    def 				a__ ( self    )					->						Optional[Any]:
         UpperCAmelCase_     :				str  =     self.dummy_prior
         UpperCAmelCase_     :				str  =     self.dummy_image_encoder
         UpperCAmelCase_     :				Union[str, Any]  =     self.dummy_image_processor
         UpperCAmelCase_     :				Tuple  =     self.dummy_renderer

         UpperCAmelCase_     :				Optional[Any]  =     HeunDiscreteScheduler(
             beta_schedule='''exp'''  ,num_train_timesteps=1_024  ,prediction_type='''sample'''  ,use_karras_sigmas=_SCREAMING_SNAKE_CASE  ,clip_sample=_SCREAMING_SNAKE_CASE  ,clip_sample_range=1.0  ,)
         UpperCAmelCase_     :				Optional[int]  =     {
             '''prior''': prior,
             '''image_encoder''': image_encoder,
             '''image_processor''': image_processor,
             '''renderer''': renderer,
             '''scheduler''': scheduler,
         }

         return components





    def 				a__ ( self  ,_SCREAMING_SNAKE_CASE  ,_SCREAMING_SNAKE_CASE=0    )					->						Any:
         UpperCAmelCase_     :				List[Any]  =     floats_tensor((1, 3, 64, 64)  ,rng=random.Random(_SCREAMING_SNAKE_CASE    )    ).to(_SCREAMING_SNAKE_CASE    )

         if str(_SCREAMING_SNAKE_CASE    ).startswith('''mps'''    ):
              UpperCAmelCase_     :				int  =     torch.manual_seed(_SCREAMING_SNAKE_CASE    )
         else:
              UpperCAmelCase_     :				List[str]  =     torch.Generator(device=_SCREAMING_SNAKE_CASE    ).manual_seed(_SCREAMING_SNAKE_CASE    )
         UpperCAmelCase_     :				int  =     {
             '''image''': input_image,
             '''generator''': generator,
             '''num_inference_steps''': 1,
             '''frame_size''': 32,
             '''output_type''': '''np''',
         }
         return inputs





    def 				a__ ( self    )					->						Tuple:
         UpperCAmelCase_     :				List[str]  =     '''cpu'''

         UpperCAmelCase_     :				int  =     self.get_dummy_components()

         UpperCAmelCase_     :				Union[str, Any]  =     self.pipeline_class(**_SCREAMING_SNAKE_CASE    )
         UpperCAmelCase_     :				List[Any]  =     pipe.to(_SCREAMING_SNAKE_CASE    )

         pipe.set_progress_bar_config(disable=_SCREAMING_SNAKE_CASE    )

         UpperCAmelCase_     :				Tuple  =     pipe(**self.get_dummy_inputs(_SCREAMING_SNAKE_CASE    )    )
         UpperCAmelCase_     :				Optional[Any]  =     output.images[0]
         UpperCAmelCase_     :				Tuple  =     image[0, -3:, -3:, -1]

         assert image.shape == (20, 32, 32, 3)

         UpperCAmelCase_     :				Dict  =     np.array(
             [
                 0.00_03_92_16,
                 0.00_03_92_16,
                 0.00_03_92_16,
                 0.00_03_92_16,
                 0.00_03_92_16,
                 0.00_03_92_16,
                 0.00_03_92_16,
                 0.00_03_92_16,
                 0.00_03_92_16,
             ]    )

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





    def 				a__ ( self    )					->						int:
         # NOTE: Larger batch sizes cause this test to timeout, only test on smaller batches
         self._test_inference_batch_consistent(batch_sizes=[1, 2]    )





    def 				a__ ( self    )					->						Optional[Any]:
         UpperCAmelCase_     :				List[Any]  =     torch_device == '''cpu'''
         UpperCAmelCase_     :				List[str]  =     True
         self._test_inference_batch_single_identical(
             batch_size=2  ,test_max_difference=_SCREAMING_SNAKE_CASE  ,relax_max_difference=_SCREAMING_SNAKE_CASE  ,)





    def 				a__ ( self    )					->						str:
         UpperCAmelCase_     :				List[str]  =     self.get_dummy_components()
         UpperCAmelCase_     :				Any  =     self.pipeline_class(**_SCREAMING_SNAKE_CASE    )
         UpperCAmelCase_     :				List[Any]  =     pipe.to(_SCREAMING_SNAKE_CASE    )
         pipe.set_progress_bar_config(disable=_SCREAMING_SNAKE_CASE    )

         UpperCAmelCase_     :				Any  =     1
         UpperCAmelCase_     :				Union[str, Any]  =     2

         UpperCAmelCase_     :				Optional[int]  =     self.get_dummy_inputs(_SCREAMING_SNAKE_CASE    )

         for key in inputs.keys():
              if key in self.batch_params:
                   UpperCAmelCase_     :				int  =     batch_size * [inputs[key]]

         UpperCAmelCase_     :				int  =     pipe(**_SCREAMING_SNAKE_CASE  ,num_images_per_prompt=_SCREAMING_SNAKE_CASE    )[0]

         assert images.shape[0] == batch_size * num_images_per_prompt


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






    """simple docstring"""





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





    def 				a__ ( self    )					->						str:
         UpperCAmelCase_     :				Union[str, Any]  =     load_image(
             '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main''' '''/shap_e/corgi.png'''    )
         UpperCAmelCase_     :				Any  =     load_numpy(
             '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
             '''/shap_e/test_shap_e_img2img_out.npy'''    )
         UpperCAmelCase_     :				str  =     ShapEImgaImgPipeline.from_pretrained('''openai/shap-e-img2img'''    )
         UpperCAmelCase_     :				Dict  =     pipe.to(_SCREAMING_SNAKE_CASE    )
         pipe.set_progress_bar_config(disable=_SCREAMING_SNAKE_CASE    )

         UpperCAmelCase_     :				Any  =     torch.Generator(device=_SCREAMING_SNAKE_CASE    ).manual_seed(0    )

         UpperCAmelCase_     :				str  =     pipe(
             _SCREAMING_SNAKE_CASE  ,generator=_SCREAMING_SNAKE_CASE  ,guidance_scale=3.0  ,num_inference_steps=64  ,frame_size=64  ,output_type='''np'''  ,).images[0]

         assert images.shape == (20, 64, 64, 3)

         assert_mean_pixel_difference(_SCREAMING_SNAKE_CASE  ,_SCREAMING_SNAKE_CASE    )





import json
import multiprocessing
import os
import re
from collections import defaultdict

import torch
from accelerate import Accelerator
from accelerate.utils import set_seed
from arguments import HumanEvalArguments
from datasets import load_dataset, load_metric
from torch.utils.data import IterableDataset
from torch.utils.data.dataloader import DataLoader
from tqdm import tqdm

import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer, HfArgumentParser, StoppingCriteria, StoppingCriteriaList


__a							     =					['\nclass', '\ndef', '\n#', '\n@', '\nprint', '\nif']

class     __a(	_a  ):






    """simple docstring"""





    def __init__( self  ,_SCREAMING_SNAKE_CASE  ,_SCREAMING_SNAKE_CASE  ,_SCREAMING_SNAKE_CASE=None  ,_SCREAMING_SNAKE_CASE=1    )					->						Dict:
         UpperCAmelCase_     :				List[Any]  =     tokenizer
         UpperCAmelCase_     :				int  =     dataset
         UpperCAmelCase_     :				Dict  =     len(_SCREAMING_SNAKE_CASE    ) if n_tasks is None else n_tasks
         UpperCAmelCase_     :				Optional[int]  =     n_copies





    def __iter__( self    )					->						Any:
         UpperCAmelCase_     :				List[Any]  =     []
         for task in range(self.n_tasks    ):
              # without strip, the model generate commented codes ...
              prompts.append(self.tokenizer.eos_token + self.dataset[task]['''prompt'''].strip()    )
         UpperCAmelCase_     :				Union[str, Any]  =     self.tokenizer(_SCREAMING_SNAKE_CASE  ,padding=_SCREAMING_SNAKE_CASE  ,return_tensors='''pt'''    )
         for task in range(self.n_tasks    ):
              for _ in range(self.n_copies    ):
                   yield {
                       "ids": outputs.input_ids[task],
                       "task_id": task,
                       "input_len": outputs.attention_mask[task].sum(),
                   }


class     __a(	_a  ):






    """simple docstring"""





    def __init__( self  ,_SCREAMING_SNAKE_CASE  ,_SCREAMING_SNAKE_CASE  ,_SCREAMING_SNAKE_CASE    )					->						List[Any]:
         UpperCAmelCase_     :				str  =     start_length
         UpperCAmelCase_     :				Optional[int]  =     eof_strings
         UpperCAmelCase_     :				str  =     tokenizer





    def __call__( self  ,_SCREAMING_SNAKE_CASE  ,_SCREAMING_SNAKE_CASE  ,**_SCREAMING_SNAKE_CASE    )					->						List[Any]:
         UpperCAmelCase_     :				Optional[Any]  =     self.tokenizer.batch_decode(input_ids[:, self.start_length :]    )
         UpperCAmelCase_     :				Optional[int]  =     []
         for decoded_generation in decoded_generations:
              done.append(any(stop_string in decoded_generation for stop_string in self.eof_strings    )    )
         return all(_SCREAMING_SNAKE_CASE    )







def lowerCamelCase__  (     _lowercase ):

     '''simple docstring'''


     UpperCAmelCase_     :				Tuple  =     re.split('''(%s)''' % '''|'''.join(_lowercase )					,		_lowercase )
     # last string should be ""
     return "".join(string_list[:-2] )







def lowerCamelCase__  (     _lowercase					,		_lowercase					,		_lowercase					,		_lowercase					,		_lowercase					,		_lowercase=20					,		**_lowercase ):

     '''simple docstring'''


     UpperCAmelCase_     :				List[Any]  =     defaultdict(_lowercase )  # dict of list of generated tokens
     for step, batch in tqdm(enumerate(_lowercase ) ):
          with torch.no_grad():
               UpperCAmelCase_     :				Dict  =     batch['''ids'''].shape[-1]
               UpperCAmelCase_     :				Optional[Any]  =     accelerator.unwrap_model(_lowercase ).generate(
                   input_ids=batch['''ids'''][:, : batch['''input_len''']]					,		num_return_sequences=_lowercase					,		**_lowercase )
               # each task is generated batch_size times
               UpperCAmelCase_     :				Union[str, Any]  =     batch['''task_id'''].repeat(_lowercase )
               UpperCAmelCase_     :				Dict  =     accelerator.pad_across_processes(
                   _lowercase					,		dim=1					,		pad_index=tokenizer.pad_token_id )

               UpperCAmelCase_,       UpperCAmelCase_     :				List[str]  =     accelerator.gather((generated_tokens, generated_tasks) )
               UpperCAmelCase_     :				Union[str, Any]  =     generated_tokens.cpu().numpy()
               UpperCAmelCase_     :				Union[str, Any]  =     generated_tasks.cpu().numpy()

               for task, generated_tokens in zip(_lowercase					,		_lowercase ):
                    gen_token_dict[task].append(_lowercase )

     UpperCAmelCase_     :				Union[str, Any]  =     [[] for _ in range(_lowercase )]
     for task, generated_tokens in gen_token_dict.items():
          for s in generated_tokens:
               UpperCAmelCase_     :				int  =     tokenizer.decode(_lowercase					,		skip_special_tokens=_lowercase					,		clean_up_tokenization_spaces=_lowercase )
               code_gens[task].append(remove_last_block(_lowercase ) )
     return code_gens







def lowerCamelCase__  (     ):

     '''simple docstring'''


     UpperCAmelCase_     :				Optional[Any]  =     HfArgumentParser(_lowercase )
     UpperCAmelCase_     :				int  =     parser.parse_args()

     transformers.logging.set_verbosity_error()
     # enables code execution in code_eval metric
     UpperCAmelCase_     :				Optional[Any]  =     args.HF_ALLOW_CODE_EVAL
     # make sure tokenizer plays nice with multiprocessing
     UpperCAmelCase_     :				List[Any]  =     '''false'''

     if args.num_workers is None:
          UpperCAmelCase_     :				Optional[Any]  =     multiprocessing.cpu_count()

     # Use dataset load to feed to accelerate
     UpperCAmelCase_     :				int  =     Accelerator()
     set_seed(args.seed					,		device_specific=_lowercase )

     # Load model and tokenizer
     UpperCAmelCase_     :				Tuple  =     AutoTokenizer.from_pretrained(args.model_ckpt )
     UpperCAmelCase_     :				Any  =     tokenizer.eos_token
     UpperCAmelCase_     :				List[str]  =     AutoModelForCausalLM.from_pretrained(args.model_ckpt )

     # Generation settings
     UpperCAmelCase_     :				str  =     {
         '''do_sample''': args.do_sample,
         '''temperature''': args.temperature,
         '''max_new_tokens''': args.max_new_tokens,
         '''top_p''': args.top_p,
         '''top_k''': args.top_k,
         '''stopping_criteria''': StoppingCriteriaList([EndOfFunctionCriteria(0					,		_lowercase					,		_lowercase )] ),
     }

     # Load evaluation dataset and metric
     UpperCAmelCase_     :				Tuple  =     load_dataset('''openai_humaneval''' )
     UpperCAmelCase_     :				Dict  =     load_metric('''code_eval''' )

     UpperCAmelCase_     :				Optional[int]  =     args.num_tasks if args.num_tasks is not None else len(human_eval['''test'''] )
     UpperCAmelCase_     :				str  =     args.n_samples // args.batch_size

     UpperCAmelCase_     :				str  =     TokenizedDataset(_lowercase					,		human_eval['''test''']					,		n_copies=_lowercase					,		n_tasks=_lowercase )
     # do not confuse args.batch_size, which is actually the num_return_sequences
     UpperCAmelCase_     :				Optional[Any]  =     DataLoader(_lowercase					,		batch_size=1 )

     # Run a quick test to see if code evaluation is enabled
     try:
          UpperCAmelCase_     :				Any  =     code_eval_metric.compute(references=['''''']					,		predictions=[['''''']] )
     except ValueError as exception:
          print(
              '''Code evaluation not enabled. Read the warning below carefully and then use `--HF_ALLOW_CODE_EVAL="1"`'''
              ''' flag to enable code evaluation.''' )
          raise exception

     UpperCAmelCase_,       UpperCAmelCase_     :				int  =     accelerator.prepare(_lowercase					,		_lowercase )

     UpperCAmelCase_     :				int  =     complete_code(
         _lowercase					,		_lowercase					,		_lowercase					,		_lowercase					,		n_tasks=_lowercase					,		batch_size=args.batch_size					,		**_lowercase					,		)

     if accelerator.is_main_process:
          UpperCAmelCase_     :				Any  =     []

          for task in tqdm(range(_lowercase ) ):
               UpperCAmelCase_     :				int  =     human_eval['''test'''][task]['''test''']
               UpperCAmelCase_     :				str  =     f'''check({human_eval["test"][task]["entry_point"]})'''
               references.append('''\n''' + test_func + '''\n''' + entry_point )

          # Evaluate completions with "code_eval" metric
          UpperCAmelCase_,       UpperCAmelCase_     :				Any  =     code_eval_metric.compute(
              references=_lowercase					,		predictions=_lowercase					,		num_workers=args.num_workers )
          print(f'''Results: {pass_at_k}''' )

          # Save results to json file
          with open(args.output_file					,		'''w''' ) as fp:
               json.dump(_lowercase					,		_lowercase )


# For some reason the folliwng seems to be necessary sometimes for code_eval to work nice with multiprocessing
# https://stackoverflow.com/questions/60804599/python-multiprocessing-keeps-spawning-the-whole-script
if __name__ == "__main__":
     main()