




from __future__ import annotations

import random
import string






class 					__lowerCAmelCase				:







			def __init__( self					:    Tuple					,					snake_case__					:    str | None = None   ):




									"""simple docstring"""


									_UpperCAmelCase									=  passcode or self.__passcode_creator()
									_UpperCAmelCase									=  self.__make_key_list()
									_UpperCAmelCase									=  self.__make_shift_key()







			def __str__( self					:    Optional[int]   ):




									"""simple docstring"""


									return "".join(self.__passcode   )







			def UpperCamelCase    ( self					:    str					,					snake_case__					:    list[int]   ):




									"""simple docstring"""


									for i in range(1					,					len(snake_case__   )					,					2   ):
															iterlist[i] *= -1
									return iterlist







			def UpperCamelCase    ( self					:    List[Any]   ):




									"""simple docstring"""


									_UpperCAmelCase									=  string.ascii_letters + string.digits
									_UpperCAmelCase									=  [random.choice(snake_case__   ) for _ in range(random.randint(10					,					20   )   )]
									return password







			def UpperCamelCase    ( self					:    int   ):




									"""simple docstring"""


									_UpperCAmelCase									=  (
									    string.ascii_letters + string.digits + string.punctuation + " \t\n"
									)

									_UpperCAmelCase									=  []

									# creates points known as breakpoints to break the key_list_options at those
									# points and pivot each substring
									_UpperCAmelCase									=  sorted(set(self.__passcode   )   )
									_UpperCAmelCase									=  []

									# algorithm for creating a new shuffled list, keys_l, out of key_list_options
									for i in key_list_options:
															temp_list.extend(snake_case__   )

															# checking breakpoints at which to pivot temporary sublist and add it into
															# keys_l
															if i in breakpoints or i == key_list_options[-1]:
																					keys_l.extend(temp_list[::-1]   )
																					temp_list.clear()

        # returning a shuffled keys_l to prevent brute force guessing of shift key
									return keys_l







			def UpperCamelCase    ( self					:    Tuple   ):




									"""simple docstring"""


									_UpperCAmelCase									=  sum(self.__neg_pos([ord(snake_case__   ) for x in self.__passcode]   )   )
									return num if num > 0 else len(self.__passcode   )







			def UpperCamelCase    ( self					:    Union[str, Any]					,					snake_case__					:    str   ):




									"""simple docstring"""


									_UpperCAmelCase									=  ""

									# decoding shift like Caesar cipher algorithm implementing negative shift or
									# reverse shift or left shift
									for i in encoded_message:
															_UpperCAmelCase									=  self.__key_list.index(snake_case__   )
															decoded_message += self.__key_list[
															    (position - self.__shift_key) % -len(self.__key_list   )
															]

									return decoded_message







			def UpperCamelCase    ( self					:    Any					,					snake_case__					:    str   ):




									"""simple docstring"""


									_UpperCAmelCase									=  ""

									# encoding shift like Caesar cipher algorithm implementing positive shift or
									# forward shift or right shift
									for i in plaintext:
															_UpperCAmelCase									=  self.__key_list.index(snake_case__   )
															encoded_message += self.__key_list[
															    (position + self.__shift_key) % len(self.__key_list   )
															]

									return encoded_message




def 							__SCREAMING_SNAKE_CASE						(    snake_case_ = "Hello, this is a modified Caesar cipher"		):

						'''simple docstring'''


						_UpperCAmelCase									=  ShuffledShiftCipher()
						return cipa.decrypt(cipa.encrypt(snake_case_		)		)


if __name__ == "__main__":
				import doctest

				doctest.testmod()









import argparse
import os

import torch
from torchvision.datasets.utils import download_url

from diffusers import AutoencoderKL, DDIMScheduler, DiTPipeline, TransformeraDModel


lowercase_			:       Tuple						       =				{5_12: 'DiT-XL-2-512x512.pt', 2_56: 'DiT-XL-2-256x256.pt'}


def 							__SCREAMING_SNAKE_CASE						(    snake_case_		):

						'''simple docstring'''


						_UpperCAmelCase									=  f"""pretrained_models/{model_name}"""
						if not os.path.isfile(snake_case_		):
												os.makedirs("pretrained_models"			,					exist_ok=snake_case_		)
												_UpperCAmelCase									=  f"""https://dl.fbaipublicfiles.com/DiT/models/{model_name}"""
												download_url(snake_case_			,					"pretrained_models"		)
						_UpperCAmelCase									=  torch.load(snake_case_			,					map_location=lambda snake_case_			,					snake_case_		: storage		)
						return model


def 							__SCREAMING_SNAKE_CASE						(    snake_case_		):

						'''simple docstring'''


						_UpperCAmelCase									=  download_model(pretrained_models[args.image_size]		)

						_UpperCAmelCase									=  state_dict["x_embedder.proj.weight"]
						_UpperCAmelCase									=  state_dict["x_embedder.proj.bias"]
						state_dict.pop("x_embedder.proj.weight"		)
						state_dict.pop("x_embedder.proj.bias"		)

						for depth in range(28		):
												_UpperCAmelCase									=  state_dict[
												    "t_embedder.mlp.0.weight"
												]
												_UpperCAmelCase									=  state_dict[
												    "t_embedder.mlp.0.bias"
												]
												_UpperCAmelCase									=  state_dict[
												    "t_embedder.mlp.2.weight"
												]
												_UpperCAmelCase									=  state_dict[
												    "t_embedder.mlp.2.bias"
												]
												_UpperCAmelCase									=  state_dict[
												    "y_embedder.embedding_table.weight"
												]

												_UpperCAmelCase									=  state_dict[
												    f"""blocks.{depth}.adaLN_modulation.1.weight"""
												]
												_UpperCAmelCase									=  state_dict[
												    f"""blocks.{depth}.adaLN_modulation.1.bias"""
												]

												_UpperCAmelCase							,				_UpperCAmelCase							,				_UpperCAmelCase									=  torch.chunk(state_dict[f"""blocks.{depth}.attn.qkv.weight"""]			,					3			,					dim=0		)
												_UpperCAmelCase							,				_UpperCAmelCase							,				_UpperCAmelCase									=  torch.chunk(state_dict[f"""blocks.{depth}.attn.qkv.bias"""]			,					3			,					dim=0		)

												_UpperCAmelCase									=  q
												_UpperCAmelCase									=  q_bias
												_UpperCAmelCase									=  k
												_UpperCAmelCase									=  k_bias
												_UpperCAmelCase									=  v
												_UpperCAmelCase									=  v_bias

												_UpperCAmelCase									=  state_dict[
												    f"""blocks.{depth}.attn.proj.weight"""
												]
												_UpperCAmelCase									=  state_dict[f"""blocks.{depth}.attn.proj.bias"""]

												_UpperCAmelCase									=  state_dict[f"""blocks.{depth}.mlp.fc1.weight"""]
												_UpperCAmelCase									=  state_dict[f"""blocks.{depth}.mlp.fc1.bias"""]
												_UpperCAmelCase									=  state_dict[f"""blocks.{depth}.mlp.fc2.weight"""]
												_UpperCAmelCase									=  state_dict[f"""blocks.{depth}.mlp.fc2.bias"""]

												state_dict.pop(f"""blocks.{depth}.attn.qkv.weight"""		)
												state_dict.pop(f"""blocks.{depth}.attn.qkv.bias"""		)
												state_dict.pop(f"""blocks.{depth}.attn.proj.weight"""		)
												state_dict.pop(f"""blocks.{depth}.attn.proj.bias"""		)
												state_dict.pop(f"""blocks.{depth}.mlp.fc1.weight"""		)
												state_dict.pop(f"""blocks.{depth}.mlp.fc1.bias"""		)
												state_dict.pop(f"""blocks.{depth}.mlp.fc2.weight"""		)
												state_dict.pop(f"""blocks.{depth}.mlp.fc2.bias"""		)
												state_dict.pop(f"""blocks.{depth}.adaLN_modulation.1.weight"""		)
												state_dict.pop(f"""blocks.{depth}.adaLN_modulation.1.bias"""		)

						state_dict.pop("t_embedder.mlp.0.weight"		)
						state_dict.pop("t_embedder.mlp.0.bias"		)
						state_dict.pop("t_embedder.mlp.2.weight"		)
						state_dict.pop("t_embedder.mlp.2.bias"		)
						state_dict.pop("y_embedder.embedding_table.weight"		)

						_UpperCAmelCase									=  state_dict["final_layer.adaLN_modulation.1.weight"]
						_UpperCAmelCase									=  state_dict["final_layer.adaLN_modulation.1.bias"]
						_UpperCAmelCase									=  state_dict["final_layer.linear.weight"]
						_UpperCAmelCase									=  state_dict["final_layer.linear.bias"]

						state_dict.pop("final_layer.linear.weight"		)
						state_dict.pop("final_layer.linear.bias"		)
						state_dict.pop("final_layer.adaLN_modulation.1.weight"		)
						state_dict.pop("final_layer.adaLN_modulation.1.bias"		)

						# DiT XL/2
						_UpperCAmelCase									=  TransformeraDModel(
						    sample_size=args.image_size // 8			,					num_layers=28			,					attention_head_dim=72			,					in_channels=4			,					out_channels=8			,					patch_size=2			,					attention_bias=snake_case_			,					num_attention_heads=16			,					activation_fn="gelu-approximate"			,					num_embeds_ada_norm=1000			,					norm_type="ada_norm_zero"			,					norm_elementwise_affine=snake_case_			,					)
						transformer.load_state_dict(snake_case_			,					strict=snake_case_		)

						_UpperCAmelCase									=  DDIMScheduler(
						    num_train_timesteps=1000			,					beta_schedule="linear"			,					prediction_type="epsilon"			,					clip_sample=snake_case_			,					)

						_UpperCAmelCase									=  AutoencoderKL.from_pretrained(args.vae_model		)

						_UpperCAmelCase									=  DiTPipeline(transformer=snake_case_			,					vae=snake_case_			,					scheduler=snake_case_		)

						if args.save:
												pipeline.save_pretrained(args.checkpoint_path		)


if __name__ == "__main__":
				lowercase_			:       Union[str, Any]						       =				argparse.ArgumentParser()

				parser.add_argument(
				    '--image_size',
				    default=2_56,
				    type=int,
				    required=False,
				    help='Image size of pretrained model, either 256 or 512.',
				)
				parser.add_argument(
				    '--vae_model',
				    default='stabilityai/sd-vae-ft-ema',
				    type=str,
				    required=False,
				    help='Path to pretrained VAE model, either stabilityai/sd-vae-ft-mse or stabilityai/sd-vae-ft-ema.',
				)
				parser.add_argument(
				    '--save', default=True, type=bool, required=False, help='Whether to save the converted pipeline or not.'
				)
				parser.add_argument(
				    '--checkpoint_path', default=None, type=str, required=True, help='Path to the output pipeline.'
				)

				lowercase_			:       Tuple						       =				parser.parse_args()
				main(args)




