import gc
import random
import unittest

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

from diffusers import AutoencoderKL, CycleDiffusionPipeline, DDIMScheduler, UNetaDConditionModel
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, skip_mps

from ..pipeline_params import (
    IMAGE_TO_IMAGE_IMAGE_PARAMS,
    TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS,
    TEXT_GUIDED_IMAGE_VARIATION_PARAMS,
)
from ..test_pipelines_common import PipelineLatentTesterMixin, PipelineTesterMixin


enable_full_determinism()


class 	lowerCamelCase_     (   UpperCAmelCase_						,	UpperCAmelCase_						,	unittest.TestCase ):






    '''simple docstring'''






    a__	:						str						=      CycleDiffusionPipeline
    a__	:						List[str]						=      TEXT_GUIDED_IMAGE_VARIATION_PARAMS - {
        """negative_prompt""",
        """height""",
        """width""",
        """negative_prompt_embeds""",
    }
    a__	:						Union[str, Any]						=      PipelineTesterMixin.required_optional_params - {"""latents"""}
    a__	:						List[Any]						=      TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS.union({"""source_prompt"""} )
    a__	:						List[str]						=      IMAGE_TO_IMAGE_IMAGE_PARAMS
    a__	:						str						=      IMAGE_TO_IMAGE_IMAGE_PARAMS







    def 			UpperCamelCase__   (	self)       ->	Any:
        torch.manual_seed(0)
        __UpperCamelCase     :Union[str, Any]			  =		UNetaDConditionModel(
            block_out_channels=(32, 64) , layers_per_block=2 , sample_size=32 , in_channels=4 , out_channels=4 , down_block_types=('''DownBlock2D''', '''CrossAttnDownBlock2D''') , up_block_types=('''CrossAttnUpBlock2D''', '''UpBlock2D''') , cross_attention_dim=32 , )
        __UpperCamelCase     :Any			  =		DDIMScheduler(
            beta_start=0.0_00_85 , beta_end=0.0_12 , beta_schedule='''scaled_linear''' , num_train_timesteps=1_000 , clip_sample=__lowercase , set_alpha_to_one=__lowercase , )
        torch.manual_seed(0)
        __UpperCamelCase     :Any			  =		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 , )
        torch.manual_seed(0)
        __UpperCamelCase     :Tuple			  =		CLIPTextConfig(
            bos_token_id=0 , eos_token_id=2 , hidden_size=32 , intermediate_size=37 , layer_norm_eps=1E-0_5 , num_attention_heads=4 , num_hidden_layers=5 , pad_token_id=1 , vocab_size=1_000 , )
        __UpperCamelCase     :List[str]			  =		CLIPTextModel(__lowercase)
        __UpperCamelCase     :Tuple			  =		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 , __lowercase , __lowercase=0)       ->	str:
        __UpperCamelCase     :List[str]			  =		floats_tensor((1, 3, 32, 32) , rng=random.Random(__lowercase)).to(__lowercase)
        __UpperCamelCase     :List[Any]			  =		image / 2 + 0.5
        if str(__lowercase).startswith('''mps'''):
            __UpperCamelCase     :Optional[int]			  =		torch.manual_seed(__lowercase)
        else:
            __UpperCamelCase     :Optional[int]			  =		torch.Generator(device=__lowercase).manual_seed(__lowercase)
        __UpperCamelCase     :Any			  =		{
            '''prompt''': '''An astronaut riding an elephant''',
            '''source_prompt''': '''An astronaut riding a horse''',
            '''image''': image,
            '''generator''': generator,
            '''num_inference_steps''': 2,
            '''eta''': 0.1,
            '''strength''': 0.8,
            '''guidance_scale''': 3,
            '''source_guidance_scale''': 1,
            '''output_type''': '''numpy''',
        }
        return inputs







    def 			UpperCamelCase__   (	self)       ->	List[Any]:
        __UpperCamelCase     :Optional[Any]			  =		'''cpu'''  # ensure determinism for the device-dependent torch.Generator

        __UpperCamelCase     :Optional[Any]			  =		self.get_dummy_components()
        __UpperCamelCase     :List[str]			  =		CycleDiffusionPipeline(**__lowercase)
        __UpperCamelCase     :Tuple			  =		pipe.to(__lowercase)
        pipe.set_progress_bar_config(disable=__lowercase)

        __UpperCamelCase     :List[Any]			  =		self.get_dummy_inputs(__lowercase)
        __UpperCamelCase     :Tuple			  =		pipe(**__lowercase)
        __UpperCamelCase     :Tuple			  =		output.images

        __UpperCamelCase     :Union[str, Any]			  =		images[0, -3:, -3:, -1]

        assert images.shape == (1, 32, 32, 3)
        __UpperCamelCase     :int			  =		np.array([0.44_59, 0.49_43, 0.45_44, 0.66_43, 0.54_74, 0.43_27, 0.57_01, 0.59_59, 0.51_79])

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







    @unittest.skipIf(torch_device != '''cuda''' , '''This test requires a GPU''')
    def 			UpperCamelCase__   (	self)       ->	Optional[int]:
        __UpperCamelCase     :Any			  =		self.get_dummy_components()
        for name, module in components.items():
            if hasattr(__lowercase , '''half'''):
                __UpperCamelCase     :Any			  =		module.half()
        __UpperCamelCase     :int			  =		CycleDiffusionPipeline(**__lowercase)
        __UpperCamelCase     :Optional[int]			  =		pipe.to(__lowercase)
        pipe.set_progress_bar_config(disable=__lowercase)

        __UpperCamelCase     :Optional[Any]			  =		self.get_dummy_inputs(__lowercase)
        __UpperCamelCase     :str			  =		pipe(**__lowercase)
        __UpperCamelCase     :Any			  =		output.images

        __UpperCamelCase     :str			  =		images[0, -3:, -3:, -1]

        assert images.shape == (1, 32, 32, 3)
        __UpperCamelCase     :Optional[Any]			  =		np.array([0.35_06, 0.45_43, 0.4_46, 0.45_75, 0.51_95, 0.41_55, 0.52_73, 0.5_18, 0.41_16])

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







    @skip_mps
    def 			UpperCamelCase__   (	self)       ->	List[Any]:
        return super().test_save_load_local()







    @unittest.skip('''non-deterministic pipeline''')
    def 			UpperCamelCase__   (	self)       ->	Optional[int]:
        return super().test_inference_batch_single_identical()







    @skip_mps
    def 			UpperCamelCase__   (	self)       ->	Tuple:
        return super().test_dict_tuple_outputs_equivalent()







    @skip_mps
    def 			UpperCamelCase__   (	self)       ->	Any:
        return super().test_save_load_optional_components()







    @skip_mps
    def 			UpperCamelCase__   (	self)       ->	Tuple:
        return super().test_attention_slicing_forward_pass()


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






    '''simple docstring'''






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







    def 			UpperCamelCase__   (	self)       ->	Dict:
        __UpperCamelCase     :int			  =		load_image(
            '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
            '''/cycle-diffusion/black_colored_car.png''')
        __UpperCamelCase     :str			  =		load_numpy(
            '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/cycle-diffusion/blue_colored_car_fp16.npy''')
        __UpperCamelCase     :int			  =		init_image.resize((512, 512))

        __UpperCamelCase     :List[Any]			  =		'''CompVis/stable-diffusion-v1-4'''
        __UpperCamelCase     :Optional[Any]			  =		DDIMScheduler.from_pretrained(__lowercase , subfolder='''scheduler''')
        __UpperCamelCase     :Optional[Any]			  =		CycleDiffusionPipeline.from_pretrained(
            __lowercase , scheduler=__lowercase , safety_checker=__lowercase , torch_dtype=torch.floataa , revision='''fp16''')

        pipe.to(__lowercase)
        pipe.set_progress_bar_config(disable=__lowercase)
        pipe.enable_attention_slicing()

        __UpperCamelCase     :Dict			  =		'''A black colored car'''
        __UpperCamelCase     :List[str]			  =		'''A blue colored car'''

        __UpperCamelCase     :Optional[int]			  =		torch.manual_seed(0)
        __UpperCamelCase     :Optional[int]			  =		pipe(
            prompt=__lowercase , source_prompt=__lowercase , image=__lowercase , num_inference_steps=100 , eta=0.1 , strength=0.85 , guidance_scale=3 , source_guidance_scale=1 , generator=__lowercase , output_type='''np''' , )
        __UpperCamelCase     :List[Any]			  =		output.images

        # the values aren't exactly equal, but the images look the same visually
        assert np.abs(image - expected_image).max() < 5E-1







    def 			UpperCamelCase__   (	self)       ->	int:
        __UpperCamelCase     :str			  =		load_image(
            '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
            '''/cycle-diffusion/black_colored_car.png''')
        __UpperCamelCase     :str			  =		load_numpy(
            '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/cycle-diffusion/blue_colored_car.npy''')
        __UpperCamelCase     :List[Any]			  =		init_image.resize((512, 512))

        __UpperCamelCase     :Optional[int]			  =		'''CompVis/stable-diffusion-v1-4'''
        __UpperCamelCase     :str			  =		DDIMScheduler.from_pretrained(__lowercase , subfolder='''scheduler''')
        __UpperCamelCase     :List[str]			  =		CycleDiffusionPipeline.from_pretrained(__lowercase , scheduler=__lowercase , safety_checker=__lowercase)

        pipe.to(__lowercase)
        pipe.set_progress_bar_config(disable=__lowercase)
        pipe.enable_attention_slicing()

        __UpperCamelCase     :Tuple			  =		'''A black colored car'''
        __UpperCamelCase     :str			  =		'''A blue colored car'''

        __UpperCamelCase     :Tuple			  =		torch.manual_seed(0)
        __UpperCamelCase     :int			  =		pipe(
            prompt=__lowercase , source_prompt=__lowercase , image=__lowercase , num_inference_steps=100 , eta=0.1 , strength=0.85 , guidance_scale=3 , source_guidance_scale=1 , generator=__lowercase , output_type='''np''' , )
        __UpperCamelCase     :Optional[Any]			  =		output.images

        assert np.abs(image - expected_image).max() < 2E-2






import argparse
import json
import os

import fairseq
import torch
from fairseq.data import Dictionary

from transformers import (
    HubertConfig,
    HubertForCTC,
    HubertModel,
    WavaVecaCTCTokenizer,
    WavaVecaFeatureExtractor,
    WavaVecaProcessor,
    logging,
)


logging.set_verbosity_info()
__lowercase							 =					logging.get_logger(__name__)

__lowercase							 =					{
    '''post_extract_proj''': '''feature_projection.projection''',
    '''encoder.pos_conv.0''': '''encoder.pos_conv_embed.conv''',
    '''self_attn.k_proj''': '''encoder.layers.*.attention.k_proj''',
    '''self_attn.v_proj''': '''encoder.layers.*.attention.v_proj''',
    '''self_attn.q_proj''': '''encoder.layers.*.attention.q_proj''',
    '''self_attn.out_proj''': '''encoder.layers.*.attention.out_proj''',
    '''self_attn_layer_norm''': '''encoder.layers.*.layer_norm''',
    '''fc1''': '''encoder.layers.*.feed_forward.intermediate_dense''',
    '''fc2''': '''encoder.layers.*.feed_forward.output_dense''',
    '''final_layer_norm''': '''encoder.layers.*.final_layer_norm''',
    '''encoder.layer_norm''': '''encoder.layer_norm''',
    '''w2v_model.layer_norm''': '''feature_projection.layer_norm''',
    '''w2v_encoder.proj''': '''lm_head''',
    '''mask_emb''': '''masked_spec_embed''',
}



def lowerCamelCase  (   SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE	):
    '''simple docstring'''







    for attribute in key.split('''.'''	):
        __UpperCamelCase     :str			  =		getattr(SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE	)

    if weight_type is not None:
        __UpperCamelCase     :Any			  =		getattr(SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE	).shape
    else:
        __UpperCamelCase     :Union[str, Any]			  =		hf_pointer.shape

    assert hf_shape == value.shape, (
        f"""Shape of hf {key + '.' + weight_type if weight_type is not None else ''} is {hf_shape}, but should be"""
        f""" {value.shape} for {full_name}"""
    )

    if weight_type == "weight":
        __UpperCamelCase     :str			  =		value
    elif weight_type == "weight_g":
        __UpperCamelCase     :List[str]			  =		value
    elif weight_type == "weight_v":
        __UpperCamelCase     :str			  =		value
    elif weight_type == "bias":
        __UpperCamelCase     :Union[str, Any]			  =		value
    else:
        __UpperCamelCase     :str			  =		value

    logger.info(f"""{key + '.' + weight_type if weight_type is not None else ''} was initialized from {full_name}."""	)



def lowerCamelCase  (   SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE	):
    '''simple docstring'''







    __UpperCamelCase     :List[Any]			  =		[]
    __UpperCamelCase     :int			  =		fairseq_model.state_dict()

    __UpperCamelCase     :List[Any]			  =		hf_model.hubert.feature_extractor if is_finetuned else hf_model.feature_extractor

    for name, value in fairseq_dict.items():
        __UpperCamelCase     :List[Any]			  =		False
        if "conv_layers" in name:
            load_conv_layer(
                SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			hf_model.config.feat_extract_norm == '''group'''  ,			)
            __UpperCamelCase     :List[str]			  =		True
        else:
            for key, mapped_key in MAPPING.items():
                __UpperCamelCase     :Dict			  =		'''hubert.''' + mapped_key if (is_finetuned and mapped_key != '''lm_head''') else mapped_key

                if key in name or (key.split('''w2v_model.'''	)[-1] == name.split('''.'''	)[0] and not is_finetuned):
                    __UpperCamelCase     :Optional[Any]			  =		True
                    if "*" in mapped_key:
                        __UpperCamelCase     :List[str]			  =		name.split(SCREAMING_SNAKE_CASE	)[0].split('''.'''	)[-2]
                        __UpperCamelCase     :Optional[int]			  =		mapped_key.replace('''*'''  ,			SCREAMING_SNAKE_CASE	)
                    if "weight_g" in name:
                        __UpperCamelCase     :int			  =		'''weight_g'''
                    elif "weight_v" in name:
                        __UpperCamelCase     :List[Any]			  =		'''weight_v'''
                    elif "weight" in name:
                        __UpperCamelCase     :Dict			  =		'''weight'''
                    elif "bias" in name:
                        __UpperCamelCase     :Dict			  =		'''bias'''
                    else:
                        __UpperCamelCase     :Dict			  =		None
                    set_recursively(SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE	)
                continue
        if not is_used:
            unused_weights.append(SCREAMING_SNAKE_CASE	)

    logger.warning(f"""Unused weights: {unused_weights}"""	)



def lowerCamelCase  (   SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE	):
    '''simple docstring'''







    __UpperCamelCase     :Tuple			  =		full_name.split('''conv_layers.'''	)[-1]
    __UpperCamelCase     :Optional[int]			  =		name.split('''.'''	)
    __UpperCamelCase     :str			  =		int(items[0]	)
    __UpperCamelCase     :List[Any]			  =		int(items[1]	)

    if type_id == 0:
        if "bias" in name:
            assert value.shape == feature_extractor.conv_layers[layer_id].conv.bias.data.shape, (
                f"""{full_name} has size {value.shape}, but"""
                f""" {feature_extractor.conv_layers[layer_id].conv.bias.data.shape} was found."""
            )
            __UpperCamelCase     :Dict			  =		value
            logger.info(f"""Feat extract conv layer {layer_id} was initialized from {full_name}."""	)
        elif "weight" in name:
            assert value.shape == feature_extractor.conv_layers[layer_id].conv.weight.data.shape, (
                f"""{full_name} has size {value.shape}, but"""
                f""" {feature_extractor.conv_layers[layer_id].conv.weight.data.shape} was found."""
            )
            __UpperCamelCase     :Any			  =		value
            logger.info(f"""Feat extract conv layer {layer_id} was initialized from {full_name}."""	)
    elif (type_id == 2 and not use_group_norm) or (type_id == 2 and layer_id == 0 and use_group_norm):
        if "bias" in name:
            assert value.shape == feature_extractor.conv_layers[layer_id].layer_norm.bias.data.shape, (
                f"""{full_name} has size {value.shape}, but {feature_extractor[layer_id].layer_norm.bias.data.shape} was"""
                " found."
            )
            __UpperCamelCase     :int			  =		value
            logger.info(f"""Feat extract layer norm weight of layer {layer_id} was initialized from {full_name}."""	)
        elif "weight" in name:
            assert value.shape == feature_extractor.conv_layers[layer_id].layer_norm.weight.data.shape, (
                f"""{full_name} has size {value.shape}, but"""
                f""" {feature_extractor[layer_id].layer_norm.weight.data.shape} was found."""
            )
            __UpperCamelCase     :Union[str, Any]			  =		value
            logger.info(f"""Feat extract layer norm weight of layer {layer_id} was initialized from {full_name}."""	)
    else:
        unused_weights.append(SCREAMING_SNAKE_CASE	)



@torch.no_grad()
def lowerCamelCase  (   SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE=None  ,			SCREAMING_SNAKE_CASE=None  ,			SCREAMING_SNAKE_CASE=True	):
    '''simple docstring'''







    if config_path is not None:
        __UpperCamelCase     :Tuple			  =		HubertConfig.from_pretrained(SCREAMING_SNAKE_CASE	)
    else:
        __UpperCamelCase     :Optional[int]			  =		HubertConfig()

    if is_finetuned:
        if dict_path:
            __UpperCamelCase     :Optional[int]			  =		Dictionary.load(SCREAMING_SNAKE_CASE	)

            # important change bos & pad token id since CTC symbol is <pad> and
            # not <s> as in fairseq
            __UpperCamelCase     :Optional[int]			  =		target_dict.pad_index
            __UpperCamelCase     :Dict			  =		target_dict.bos_index
            __UpperCamelCase     :str			  =		target_dict.eos_index
            __UpperCamelCase     :Dict			  =		len(target_dict.symbols	)
            __UpperCamelCase     :List[Any]			  =		os.path.join(SCREAMING_SNAKE_CASE  ,			'''vocab.json'''	)
            if not os.path.isdir(SCREAMING_SNAKE_CASE	):
                logger.error('''--pytorch_dump_folder_path ({}) should be a directory'''.format(SCREAMING_SNAKE_CASE	)	)
                return
            os.makedirs(SCREAMING_SNAKE_CASE  ,			exist_ok=SCREAMING_SNAKE_CASE	)
            with open(SCREAMING_SNAKE_CASE  ,			'''w'''  ,			encoding='''utf-8'''	) as vocab_handle:
                json.dump(target_dict.indices  ,			SCREAMING_SNAKE_CASE	)
            __UpperCamelCase     :Optional[int]			  =		WavaVecaCTCTokenizer(
                SCREAMING_SNAKE_CASE  ,			unk_token=target_dict.unk_word  ,			pad_token=target_dict.pad_word  ,			bos_token=target_dict.bos_word  ,			eos_token=target_dict.eos_word  ,			word_delimiter_token='''|'''  ,			do_lower_case=SCREAMING_SNAKE_CASE  ,			)
            __UpperCamelCase     :Union[str, Any]			  =		True if config.feat_extract_norm == '''layer''' else False
            __UpperCamelCase     :Any			  =		WavaVecaFeatureExtractor(
                feature_size=1  ,			sampling_rate=16_000  ,			padding_value=0  ,			do_normalize=SCREAMING_SNAKE_CASE  ,			return_attention_mask=SCREAMING_SNAKE_CASE  ,			)
            __UpperCamelCase     :Any			  =		WavaVecaProcessor(feature_extractor=SCREAMING_SNAKE_CASE  ,			tokenizer=SCREAMING_SNAKE_CASE	)
            processor.save_pretrained(SCREAMING_SNAKE_CASE	)

        __UpperCamelCase     :List[str]			  =		HubertForCTC(SCREAMING_SNAKE_CASE	)
    else:
        __UpperCamelCase     :str			  =		HubertModel(SCREAMING_SNAKE_CASE	)

    if is_finetuned:
        __UpperCamelCase  ,       __UpperCamelCase  ,       __UpperCamelCase     :int			  =		fairseq.checkpoint_utils.load_model_ensemble_and_task(
            [checkpoint_path]  ,			arg_overrides={'''data''': '''/'''.join(dict_path.split('''/'''	)[:-1]	)}	)
    else:
        __UpperCamelCase  ,       __UpperCamelCase  ,       __UpperCamelCase     :Any			  =		fairseq.checkpoint_utils.load_model_ensemble_and_task([checkpoint_path]	)

    __UpperCamelCase     :Dict			  =		model[0].eval()

    recursively_load_weights(SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE  ,			SCREAMING_SNAKE_CASE	)

    hf_wavavec.save_pretrained(SCREAMING_SNAKE_CASE	)


if __name__ == "__main__":
    __lowercase							 =					argparse.ArgumentParser()
    parser.add_argument('''--pytorch_dump_folder_path''', default=None, type=str, help='''Path to the output PyTorch model.''')
    parser.add_argument('''--checkpoint_path''', default=None, type=str, help='''Path to fairseq checkpoint''')
    parser.add_argument('''--dict_path''', default=None, type=str, help='''Path to dict of fine-tuned model''')
    parser.add_argument('''--config_path''', default=None, type=str, help='''Path to hf config.json of model to convert''')
    parser.add_argument(
        '''--not_finetuned''', action='''store_true''', help='''Whether the model to convert is a fine-tuned model or not'''
    )
    __lowercase							 =					parser.parse_args()
    convert_hubert_checkpoint(
        args.checkpoint_path, args.pytorch_dump_folder_path, args.config_path, args.dict_path, not args.not_finetuned
    )





