




from typing import Optional, Tuple, Union

import tensorflow as tf

from ...activations_tf import ACTaFN
from ...file_utils import add_code_sample_docstrings, add_start_docstrings, add_start_docstrings_to_model_forward
from ...modeling_tf_outputs import (
    TFBaseModelOutputWithNoAttention,
    TFBaseModelOutputWithPoolingAndNoAttention,
    TFSequenceClassifierOutput,
)
from ...modeling_tf_utils import TFPreTrainedModel, TFSequenceClassificationLoss, keras_serializable, unpack_inputs
from ...tf_utils import shape_list
from ...utils import logging
from .configuration_regnet import RegNetConfig


lowercase__				:     Tuple 		=						logging.get_logger(__name__)

# General docstring
lowercase__				:     List[Any] 		=						"RegNetConfig"

# Base docstring
lowercase__				:     Optional[Any] 		=						"facebook/regnet-y-040"
lowercase__				:     Any 		=						[1, 1088, 7, 7]

# Image classification docstring
lowercase__				:     str 		=						"facebook/regnet-y-040"
lowercase__				:     str 		=						"tabby, tabby cat"

lowercase__				:     Tuple 		=						[
    "facebook/regnet-y-040",
    # See all regnet models at https://huggingface.co/models?filter=regnet
]
class 		UpperCAmelCase   (				tf.keras.layers.Layer			):







						'''simple docstring'''





						def __init__(						self							:     Tuple       ,	__lowercase							:     int       ,	__lowercase							:     int = 3       ,	__lowercase							:     int = 1       ,	__lowercase							:     int = 1       ,	__lowercase							:     Optional[str] = "relu"       ,	**__lowercase							:     List[Any]       ,	):






							"""simple docstring"""






							super().__init__(**__lowercase						)
							# The padding and conv has been verified in
							# https://colab.research.google.com/gist/sayakpaul/854bc10eeaf21c9ee2119e0b9f3841a7/scratchpad.ipynb
							snake_case_		    =     tf.keras.layers.ZeroPaddingaD(padding=kernel_size // 2						)
							snake_case_		    =     tf.keras.layers.ConvaD(
							    filters=__lowercase       ,	kernel_size=__lowercase       ,	strides=__lowercase       ,	padding="VALID"       ,	groups=__lowercase       ,	use_bias=__lowercase       ,	name="convolution"       ,	)
							snake_case_		    =     tf.keras.layers.BatchNormalization(epsilon=1E-5       ,	momentum=0.9       ,	name="normalization"						)
							snake_case_		    =     ACTaFN[activation] if activation is not None else tf.identity






						def        snake_case__						(						self							:     List[Any]       ,	__lowercase							:     Dict						):






							"""simple docstring"""






							snake_case_		    =     self.convolution(self.padding(__lowercase						)						)
							snake_case_		    =     self.normalization(__lowercase						)
							snake_case_		    =     self.activation(__lowercase						)
							return hidden_state







class 		UpperCAmelCase   (				tf.keras.layers.Layer			):







						'''simple docstring'''





						def __init__(						self							:     List[Any]       ,	__lowercase							:     RegNetConfig       ,	**__lowercase							:     List[str]						):






							"""simple docstring"""






							super().__init__(**__lowercase						)
							snake_case_		    =     config.num_channels
							snake_case_		    =     TFRegNetConvLayer(
							    out_channels=config.embedding_size       ,	kernel_size=3       ,	stride=2       ,	activation=config.hidden_act       ,	name="embedder"       ,	)






						def        snake_case__						(						self							:     List[Any]       ,	__lowercase							:     Any						):






							"""simple docstring"""






							snake_case_		    =     shape_list(__lowercase						)[1]
							if tf.executing_eagerly() and num_channels != self.num_channels:
								raise ValueError(
								    "Make sure that the channel dimension of the pixel values match with the one set in the configuration."						)

							# When running on CPU, `tf.keras.layers.Conv2D` doesn't support `NCHW` format.
							# So change the input format from `NCHW` to `NHWC`.
							# shape = (batch_size, in_height, in_width, in_channels=num_channels)
							snake_case_		    =     tf.transpose(__lowercase       ,	perm=(0, 2, 3, 1)						)
							snake_case_		    =     self.embedder(__lowercase						)
							return hidden_state







class 		UpperCAmelCase   (				tf.keras.layers.Layer			):







						'''simple docstring'''





						def __init__(						self							:     List[Any]       ,	__lowercase							:     int       ,	__lowercase							:     int = 2       ,	**__lowercase							:     str						):






							"""simple docstring"""






							super().__init__(**__lowercase						)
							snake_case_		    =     tf.keras.layers.ConvaD(
							    filters=__lowercase       ,	kernel_size=1       ,	strides=__lowercase       ,	use_bias=__lowercase       ,	name="convolution"						)
							snake_case_		    =     tf.keras.layers.BatchNormalization(epsilon=1E-5       ,	momentum=0.9       ,	name="normalization"						)






						def        snake_case__						(						self							:     List[str]       ,	__lowercase							:     tf.Tensor       ,	__lowercase							:     bool = False						):






							"""simple docstring"""






							return self.normalization(self.convolution(__lowercase						)       ,	training=__lowercase						)







class 		UpperCAmelCase   (				tf.keras.layers.Layer			):







						'''simple docstring'''





						def __init__(						self							:     Optional[Any]       ,	__lowercase							:     int       ,	__lowercase							:     int       ,	**__lowercase							:     Optional[int]						):






							"""simple docstring"""






							super().__init__(**__lowercase						)
							snake_case_		    =     tf.keras.layers.GlobalAveragePoolingaD(keepdims=__lowercase       ,	name="pooler"						)
							snake_case_		    =     [
							    tf.keras.layers.ConvaD(filters=__lowercase       ,	kernel_size=1       ,	activation="relu"       ,	name="attention.0"						),
							    tf.keras.layers.ConvaD(filters=__lowercase       ,	kernel_size=1       ,	activation="sigmoid"       ,	name="attention.2"						),
							]






						def        snake_case__						(						self							:     str       ,	__lowercase							:     Optional[Any]						):






							"""simple docstring"""






							snake_case_		    =     self.pooler(__lowercase						)
							for layer_module in self.attention:
								snake_case_		    =     layer_module(__lowercase						)
							snake_case_		    =     hidden_state * pooled
							return hidden_state







class 		UpperCAmelCase   (				tf.keras.layers.Layer			):







						'''simple docstring'''





						def __init__(						self							:     Tuple       ,	__lowercase							:     RegNetConfig       ,	__lowercase							:     int       ,	__lowercase							:     int       ,	__lowercase							:     int = 1       ,	**__lowercase							:     int						):






							"""simple docstring"""






							super().__init__(**__lowercase						)
							snake_case_		    =     in_channels != out_channels or stride != 1
							snake_case_		    =     max(1       ,	out_channels // config.groups_width						)
							snake_case_		    =     (
							    TFRegNetShortCut(__lowercase       ,	stride=__lowercase       ,	name="shortcut"						)
							    if should_apply_shortcut
							    else tf.keras.layers.Activation("linear"       ,	name="shortcut"						)
							)
							# `self.layers` instead of `self.layer` because that is a reserved argument.
							snake_case_		    =     [
							    TFRegNetConvLayer(__lowercase       ,	kernel_size=1       ,	activation=config.hidden_act       ,	name="layer.0"						),
							    TFRegNetConvLayer(
							        __lowercase       ,	stride=__lowercase       ,	groups=__lowercase       ,	activation=config.hidden_act       ,	name="layer.1"						),
							    TFRegNetConvLayer(__lowercase       ,	kernel_size=1       ,	activation=__lowercase       ,	name="layer.2"						),
							]
							snake_case_		    =     ACTaFN[config.hidden_act]






						def        snake_case__						(						self							:     List[Any]       ,	__lowercase							:     List[str]						):






							"""simple docstring"""






							snake_case_		    =     hidden_state
							for layer_module in self.layers:
								snake_case_		    =     layer_module(__lowercase						)
							snake_case_		    =     self.shortcut(__lowercase						)
							hidden_state += residual
							snake_case_		    =     self.activation(__lowercase						)
							return hidden_state







class 		UpperCAmelCase   (				tf.keras.layers.Layer			):







						'''simple docstring'''





						def __init__(						self							:     List[str]       ,	__lowercase							:     RegNetConfig       ,	__lowercase							:     int       ,	__lowercase							:     int       ,	__lowercase							:     int = 1       ,	**__lowercase							:     Dict						):






							"""simple docstring"""






							super().__init__(**__lowercase						)
							snake_case_		    =     in_channels != out_channels or stride != 1
							snake_case_		    =     max(1       ,	out_channels // config.groups_width						)
							snake_case_		    =     (
							    TFRegNetShortCut(__lowercase       ,	stride=__lowercase       ,	name="shortcut"						)
							    if should_apply_shortcut
							    else tf.keras.layers.Activation("linear"       ,	name="shortcut"						)
							)
							snake_case_		    =     [
							    TFRegNetConvLayer(__lowercase       ,	kernel_size=1       ,	activation=config.hidden_act       ,	name="layer.0"						),
							    TFRegNetConvLayer(
							        __lowercase       ,	stride=__lowercase       ,	groups=__lowercase       ,	activation=config.hidden_act       ,	name="layer.1"						),
							    TFRegNetSELayer(__lowercase       ,	reduced_channels=int(round(in_channels / 4						)						)       ,	name="layer.2"						),
							    TFRegNetConvLayer(__lowercase       ,	kernel_size=1       ,	activation=__lowercase       ,	name="layer.3"						),
							]
							snake_case_		    =     ACTaFN[config.hidden_act]






						def        snake_case__						(						self							:     int       ,	__lowercase							:     Optional[Any]						):






							"""simple docstring"""






							snake_case_		    =     hidden_state
							for layer_module in self.layers:
								snake_case_		    =     layer_module(__lowercase						)
							snake_case_		    =     self.shortcut(__lowercase						)
							hidden_state += residual
							snake_case_		    =     self.activation(__lowercase						)
							return hidden_state







class 		UpperCAmelCase   (				tf.keras.layers.Layer			):







						'''simple docstring'''





						def __init__(						self							:     Dict       ,	__lowercase							:     RegNetConfig       ,	__lowercase							:     int       ,	__lowercase							:     int       ,	__lowercase							:     int = 2       ,	__lowercase							:     int = 2       ,	**__lowercase							:     Tuple						):






							"""simple docstring"""






							super().__init__(**__lowercase						)

							snake_case_		    =     TFRegNetXLayer if config.layer_type == "x" else TFRegNetYLayer
							snake_case_		    =     [
							    # downsampling is done in the first layer with stride of 2
							    layer(__lowercase       ,	__lowercase       ,	__lowercase       ,	stride=__lowercase       ,	name="layers.0"						),
							    *[layer(__lowercase       ,	__lowercase       ,	__lowercase       ,	name=f"layers.{i+1}"						) for i in range(depth - 1						)],
							]






						def        snake_case__						(						self							:     List[str]       ,	__lowercase							:     Dict						):






							"""simple docstring"""






							for layer_module in self.layers:
								snake_case_		    =     layer_module(__lowercase						)
							return hidden_state







class 		UpperCAmelCase   (				tf.keras.layers.Layer			):







						'''simple docstring'''





						def __init__(						self							:     Union[str, Any]       ,	__lowercase							:     RegNetConfig       ,	**__lowercase							:     int						):






							"""simple docstring"""






							super().__init__(**__lowercase						)
							snake_case_		    =     []
							# based on `downsample_in_first_stage`, the first layer of the first stage may or may not downsample the input
							self.stages.append(
							    TFRegNetStage(
							        __lowercase       ,	config.embedding_size       ,	config.hidden_sizes[0]       ,	stride=2 if config.downsample_in_first_stage else 1       ,	depth=config.depths[0]       ,	name="stages.0"       ,	)						)
							snake_case_		    =     zip(config.hidden_sizes       ,	config.hidden_sizes[1:]						)
							for i, ((in_channels, out_channels), depth) in enumerate(zip(__lowercase       ,	config.depths[1:]						)						):
								self.stages.append(TFRegNetStage(__lowercase       ,	__lowercase       ,	__lowercase       ,	depth=__lowercase       ,	name=f"stages.{i+1}"						)						)






						def        snake_case__						(						self							:     Any       ,	__lowercase							:     tf.Tensor       ,	__lowercase							:     bool = False       ,	__lowercase							:     bool = True						):






							"""simple docstring"""






							snake_case_		    =     () if output_hidden_states else None

							for stage_module in self.stages:
								if output_hidden_states:
									snake_case_		    =     hidden_states + (hidden_state,)

								snake_case_		    =     stage_module(__lowercase						)

							if output_hidden_states:
								snake_case_		    =     hidden_states + (hidden_state,)

							if not return_dict:
								return tuple(v for v in [hidden_state, hidden_states] if v is not None						)

							return TFBaseModelOutputWithNoAttention(last_hidden_state=__lowercase       ,	hidden_states=__lowercase						)







@keras_serializable
class 		UpperCAmelCase   (				tf.keras.layers.Layer			):







						'''simple docstring'''





						lowerCAmelCase_     		=   RegNetConfig






						def __init__(						self							:     Dict       ,	__lowercase							:     Union[str, Any]       ,	**__lowercase							:     Optional[int]						):






							"""simple docstring"""






							super().__init__(**__lowercase						)
							snake_case_		    =     config
							snake_case_		    =     TFRegNetEmbeddings(__lowercase       ,	name="embedder"						)
							snake_case_		    =     TFRegNetEncoder(__lowercase       ,	name="encoder"						)
							snake_case_		    =     tf.keras.layers.GlobalAveragePoolingaD(keepdims=__lowercase       ,	name="pooler"						)






						@unpack_inputs
						def        snake_case__						(						self							:     Tuple       ,	__lowercase							:     tf.Tensor       ,	__lowercase							:     Optional[bool] = None       ,	__lowercase							:     Optional[bool] = None       ,	__lowercase							:     bool = False       ,	):






							"""simple docstring"""






							snake_case_		    =     (
							    output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
							)
							snake_case_		    =     return_dict if return_dict is not None else self.config.use_return_dict

							snake_case_		    =     self.embedder(__lowercase       ,	training=__lowercase						)

							snake_case_		    =     self.encoder(
							    __lowercase       ,	output_hidden_states=__lowercase       ,	return_dict=__lowercase       ,	training=__lowercase						)

							snake_case_		    =     encoder_outputs[0]
							snake_case_		    =     self.pooler(__lowercase						)

							# Change to NCHW output format have uniformity in the modules
							snake_case_		    =     tf.transpose(__lowercase       ,	perm=(0, 3, 1, 2)						)
							snake_case_		    =     tf.transpose(__lowercase       ,	perm=(0, 3, 1, 2)						)

							# Change the other hidden state outputs to NCHW as well
							if output_hidden_states:
								snake_case_		    =     tuple([tf.transpose(__lowercase       ,	perm=(0, 3, 1, 2)						) for h in encoder_outputs[1]]						)

							if not return_dict:
								return (last_hidden_state, pooled_output) + encoder_outputs[1:]

							return TFBaseModelOutputWithPoolingAndNoAttention(
							    last_hidden_state=__lowercase       ,	pooler_output=__lowercase       ,	hidden_states=hidden_states if output_hidden_states else encoder_outputs.hidden_states       ,	)







class 		UpperCAmelCase   (				UpperCAmelCase__			):







						'''simple docstring'''





						lowerCAmelCase_     		=   RegNetConfig
						lowerCAmelCase_     		=   '''regnet'''
						lowerCAmelCase_     		=   '''pixel_values'''






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






							"""simple docstring"""






							return {"pixel_values": tf.TensorSpec(shape=(None, self.config.num_channels, 2_24, 2_24)       ,	dtype=tf.floataa						)}







lowercase__				:     str 		=						R"\n    Parameters:\n    This model is a Tensorflow\n    [tf.keras.layers.Layer](https://www.tensorflow.org/api_docs/python/tf/keras/layers/Layer) sub-class. Use it as a\n    regular Tensorflow Module and refer to the Tensorflow documentation for all matter related to general usage and\n    behavior.\n        config ([`RegNetConfig`]): Model configuration class with all the parameters of the model.\n            Initializing with a config file does not load the weights associated with the model, only the\n            configuration. Check out the [`~TFPreTrainedModel.from_pretrained`] method to load the model weights.\n"

lowercase__				:     List[str] 		=						R"\n    Args:\n        pixel_values (`tf.Tensor` of shape `(batch_size, num_channels, height, width)`):\n            Pixel values. Pixel values can be obtained using [`AutoImageProcessor`]. See\n            [`ConveNextImageProcessor.__call__`] for details.\n        output_hidden_states (`bool`, *optional*):\n            Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for\n            more detail.\n        return_dict (`bool`, *optional*):\n            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.\n"
@add_start_docstrings(
    '''The bare RegNet model outputting raw features without any specific head on top.'''       ,   UpperCAmelCase__       ,   )
class 		UpperCAmelCase   (				UpperCAmelCase__			):







						'''simple docstring'''





						def __init__(						self							:     List[Any]       ,	__lowercase							:     RegNetConfig       ,	*__lowercase							:     Any       ,	**__lowercase							:     int						):






							"""simple docstring"""






							super().__init__(__lowercase       ,	*__lowercase       ,	**__lowercase						)
							snake_case_		    =     TFRegNetMainLayer(__lowercase       ,	name="regnet"						)






						@unpack_inputs
						@add_start_docstrings_to_model_forward(__lowercase						)
						@add_code_sample_docstrings(
						    checkpoint=_CHECKPOINT_FOR_DOC       ,	output_type=__lowercase       ,	config_class=_CONFIG_FOR_DOC       ,	modality="vision"       ,	expected_output=_EXPECTED_OUTPUT_SHAPE       ,	)
						def        snake_case__						(						self							:     Any       ,	__lowercase							:     tf.Tensor       ,	__lowercase							:     Optional[bool] = None       ,	__lowercase							:     Optional[bool] = None       ,	__lowercase							:     Optional[int]=False       ,	):






							"""simple docstring"""






							snake_case_		    =     (
							    output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
							)
							snake_case_		    =     return_dict if return_dict is not None else self.config.use_return_dict

							snake_case_		    =     self.regnet(
							    pixel_values=__lowercase       ,	output_hidden_states=__lowercase       ,	return_dict=__lowercase       ,	training=__lowercase       ,	)
							if not return_dict:
								return (outputs[0],) + outputs[1:]

							return TFBaseModelOutputWithPoolingAndNoAttention(
							    last_hidden_state=outputs.last_hidden_state       ,	pooler_output=outputs.pooler_output       ,	hidden_states=outputs.hidden_states       ,	)







@add_start_docstrings(
    '''
    RegNet Model with an image classification head on top (a linear layer on top of the pooled features), e.g. for
    ImageNet.
    '''       ,   UpperCAmelCase__       ,   )
class 		UpperCAmelCase   (				UpperCAmelCase__       ,   UpperCAmelCase__			):







						'''simple docstring'''





						def __init__(						self							:     int       ,	__lowercase							:     RegNetConfig       ,	*__lowercase							:     List[str]       ,	**__lowercase							:     Optional[int]						):






							"""simple docstring"""






							super().__init__(__lowercase       ,	*__lowercase       ,	**__lowercase						)
							snake_case_		    =     config.num_labels
							snake_case_		    =     TFRegNetMainLayer(__lowercase       ,	name="regnet"						)
							# classification head
							snake_case_		    =     [
							    tf.keras.layers.Flatten(),
							    tf.keras.layers.Dense(config.num_labels       ,	name="classifier.1"						) if config.num_labels > 0 else tf.identity,
							]






						@unpack_inputs
						@add_start_docstrings_to_model_forward(__lowercase						)
						@add_code_sample_docstrings(
						    checkpoint=_IMAGE_CLASS_CHECKPOINT       ,	output_type=__lowercase       ,	config_class=_CONFIG_FOR_DOC       ,	expected_output=_IMAGE_CLASS_EXPECTED_OUTPUT       ,	)
						def        snake_case__						(						self							:     List[str]       ,	__lowercase							:     tf.Tensor = None       ,	__lowercase							:     tf.Tensor = None       ,	__lowercase							:     bool = None       ,	__lowercase							:     bool = None       ,	__lowercase							:     Optional[int]=False       ,	):






							"""simple docstring"""






							snake_case_		    =     (
							    output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
							)
							snake_case_		    =     return_dict if return_dict is not None else self.config.use_return_dict

							snake_case_		    =     self.regnet(
							    __lowercase       ,	output_hidden_states=__lowercase       ,	return_dict=__lowercase       ,	training=__lowercase						)

							snake_case_		    =     outputs.pooler_output if return_dict else outputs[1]

							snake_case_		    =     self.classifier[0](__lowercase						)
							snake_case_		    =     self.classifier[1](__lowercase						)

							snake_case_		    =     None if labels is None else self.hf_compute_loss(labels=__lowercase       ,	logits=__lowercase						)

							if not return_dict:
								snake_case_		    =     (logits,) + outputs[2:]
								return ((loss,) + output) if loss is not None else output

							return TFSequenceClassifierOutput(loss=__lowercase       ,	logits=__lowercase       ,	hidden_states=outputs.hidden_states						)






import argparse
import os.path as osp
import re

import torch
from safetensors.torch import load_file, save_file


# =================#
# UNet Conversion #
# =================#

lowercase__				:     Optional[int] 		=						[
    # (stable-diffusion, HF Diffusers)
    ("time_embed.0.weight", "time_embedding.linear_1.weight"),
    ("time_embed.0.bias", "time_embedding.linear_1.bias"),
    ("time_embed.2.weight", "time_embedding.linear_2.weight"),
    ("time_embed.2.bias", "time_embedding.linear_2.bias"),
    ("input_blocks.0.0.weight", "conv_in.weight"),
    ("input_blocks.0.0.bias", "conv_in.bias"),
    ("out.0.weight", "conv_norm_out.weight"),
    ("out.0.bias", "conv_norm_out.bias"),
    ("out.2.weight", "conv_out.weight"),
    ("out.2.bias", "conv_out.bias"),
]

lowercase__				:     List[Any] 		=						[
    # (stable-diffusion, HF Diffusers)
    ("in_layers.0", "norm1"),
    ("in_layers.2", "conv1"),
    ("out_layers.0", "norm2"),
    ("out_layers.3", "conv2"),
    ("emb_layers.1", "time_emb_proj"),
    ("skip_connection", "conv_shortcut"),
]

lowercase__				:     Optional[Any] 		=						[]
# hardcoded number of downblocks and resnets/attentions...
# would need smarter logic for other networks.
for i in range(4):
		# loop over downblocks/upblocks

		for j in range(2):
				# loop over resnets/attentions for downblocks
				lowercase__				:     str 		=						f'''down_blocks.{i}.resnets.{j}.'''
				lowercase__				:     Union[str, Any] 		=						f'''input_blocks.{3*i + j + 1}.0.'''
				unet_conversion_map_layer.append((sd_down_res_prefix, hf_down_res_prefix))

				if i < 3:
						# no attention layers in down_blocks.3
						lowercase__				:     Tuple 		=						f'''down_blocks.{i}.attentions.{j}.'''
						lowercase__				:     Dict 		=						f'''input_blocks.{3*i + j + 1}.1.'''
						unet_conversion_map_layer.append((sd_down_atn_prefix, hf_down_atn_prefix))

		for j in range(3):
				# loop over resnets/attentions for upblocks
				lowercase__				:     List[Any] 		=						f'''up_blocks.{i}.resnets.{j}.'''
				lowercase__				:     int 		=						f'''output_blocks.{3*i + j}.0.'''
				unet_conversion_map_layer.append((sd_up_res_prefix, hf_up_res_prefix))

				if i > 0:
						# no attention layers in up_blocks.0
						lowercase__				:     List[str] 		=						f'''up_blocks.{i}.attentions.{j}.'''
						lowercase__				:     Tuple 		=						f'''output_blocks.{3*i + j}.1.'''
						unet_conversion_map_layer.append((sd_up_atn_prefix, hf_up_atn_prefix))

		if i < 3:
				# no downsample in down_blocks.3
				lowercase__				:     List[str] 		=						f'''down_blocks.{i}.downsamplers.0.conv.'''
				lowercase__				:     Any 		=						f'''input_blocks.{3*(i+1)}.0.op.'''
				unet_conversion_map_layer.append((sd_downsample_prefix, hf_downsample_prefix))

				# no upsample in up_blocks.3
				lowercase__				:     Optional[int] 		=						f'''up_blocks.{i}.upsamplers.0.'''
				lowercase__				:     int 		=						f'''output_blocks.{3*i + 2}.{1 if i == 0 else 2}.'''
				unet_conversion_map_layer.append((sd_upsample_prefix, hf_upsample_prefix))

lowercase__				:     Union[str, Any] 		=						"mid_block.attentions.0."
lowercase__				:     List[Any] 		=						"middle_block.1."
unet_conversion_map_layer.append((sd_mid_atn_prefix, hf_mid_atn_prefix))

for j in range(2):
		lowercase__				:     Tuple 		=						f'''mid_block.resnets.{j}.'''
		lowercase__				:     List[str] 		=						f'''middle_block.{2*j}.'''
		unet_conversion_map_layer.append((sd_mid_res_prefix, hf_mid_res_prefix))


def 						lowerCamelCase__    (		_A							):







	'''simple docstring'''





	snake_case_		    =     {k: k for k in unet_state_dict.keys()}
	for sd_name, hf_name in unet_conversion_map:
		snake_case_		    =     sd_name
	for k, v in mapping.items():
		if "resnets" in k:
			for sd_part, hf_part in unet_conversion_map_resnet:
				snake_case_		    =     v.replace(_A     ,	_A							)
			snake_case_		    =     v
	for k, v in mapping.items():
		for sd_part, hf_part in unet_conversion_map_layer:
			snake_case_		    =     v.replace(_A     ,	_A							)
		snake_case_		    =     v
	snake_case_		    =     {v: unet_state_dict[k] for k, v in mapping.items()}
	return new_state_dict


# ================#
# VAE Conversion #
# ================#

lowercase__				:     Dict 		=						[
    # (stable-diffusion, HF Diffusers)
    ("nin_shortcut", "conv_shortcut"),
    ("norm_out", "conv_norm_out"),
    ("mid.attn_1.", "mid_block.attentions.0."),
]

for i in range(4):
		# down_blocks have two resnets
		for j in range(2):
				lowercase__				:     Any 		=						f'''encoder.down_blocks.{i}.resnets.{j}.'''
				lowercase__				:     List[Any] 		=						f'''encoder.down.{i}.block.{j}.'''
				vae_conversion_map.append((sd_down_prefix, hf_down_prefix))

		if i < 3:
				lowercase__				:     Optional[int] 		=						f'''down_blocks.{i}.downsamplers.0.'''
				lowercase__				:     Tuple 		=						f'''down.{i}.downsample.'''
				vae_conversion_map.append((sd_downsample_prefix, hf_downsample_prefix))

				lowercase__				:     List[str] 		=						f'''up_blocks.{i}.upsamplers.0.'''
				lowercase__				:     Optional[int] 		=						f'''up.{3-i}.upsample.'''
				vae_conversion_map.append((sd_upsample_prefix, hf_upsample_prefix))

		# up_blocks have three resnets
		# also, up blocks in hf are numbered in reverse from sd
		for j in range(3):
				lowercase__				:     int 		=						f'''decoder.up_blocks.{i}.resnets.{j}.'''
				lowercase__				:     Union[str, Any] 		=						f'''decoder.up.{3-i}.block.{j}.'''
				vae_conversion_map.append((sd_up_prefix, hf_up_prefix))

# this part accounts for mid blocks in both the encoder and the decoder
for i in range(2):
		lowercase__				:     Dict 		=						f'''mid_block.resnets.{i}.'''
		lowercase__				:     int 		=						f'''mid.block_{i+1}.'''
		vae_conversion_map.append((sd_mid_res_prefix, hf_mid_res_prefix))


lowercase__				:     Optional[Any] 		=						[
    # (stable-diffusion, HF Diffusers)
    ("norm.", "group_norm."),
    ("q.", "query."),
    ("k.", "key."),
    ("v.", "value."),
    ("proj_out.", "proj_attn."),
]


def 						lowerCamelCase__    (		_A							):







	'''simple docstring'''





	return w.reshape(*w.shape     ,	1     ,	1							)


def 						lowerCamelCase__    (		_A							):







	'''simple docstring'''





	snake_case_		    =     {k: k for k in vae_state_dict.keys()}
	for k, v in mapping.items():
		for sd_part, hf_part in vae_conversion_map:
			snake_case_		    =     v.replace(_A     ,	_A							)
		snake_case_		    =     v
	for k, v in mapping.items():
		if "attentions" in k:
			for sd_part, hf_part in vae_conversion_map_attn:
				snake_case_		    =     v.replace(_A     ,	_A							)
			snake_case_		    =     v
	snake_case_		    =     {v: vae_state_dict[k] for k, v in mapping.items()}
	snake_case_		    =     ["q", "k", "v", "proj_out"]
	for k, v in new_state_dict.items():
		for weight_name in weights_to_convert:
			if f"mid.attn_1.{weight_name}.weight" in k:
				print(f"Reshaping {k} for SD format"							)
				snake_case_		    =     reshape_weight_for_sd(_A							)
	return new_state_dict


# =========================#
# Text Encoder Conversion #
# =========================#


lowercase__				:     int 		=						[
    # (stable-diffusion, HF Diffusers)
    ("resblocks.", "text_model.encoder.layers."),
    ("ln_1", "layer_norm1"),
    ("ln_2", "layer_norm2"),
    (".c_fc.", ".fc1."),
    (".c_proj.", ".fc2."),
    (".attn", ".self_attn"),
    ("ln_final.", "transformer.text_model.final_layer_norm."),
    ("token_embedding.weight", "transformer.text_model.embeddings.token_embedding.weight"),
    ("positional_embedding", "transformer.text_model.embeddings.position_embedding.weight"),
]
lowercase__				:     Dict 		=						{re.escape(x[1]): x[0] for x in textenc_conversion_lst}
lowercase__				:     Tuple 		=						re.compile("|".join(protected.keys()))

# Ordering is from https://github.com/pytorch/pytorch/blob/master/test/cpp/api/modules.cpp
lowercase__				:     Dict 		=						{"q": 0, "k": 1, "v": 2}


def 						lowerCamelCase__    (		_A							):







	'''simple docstring'''





	snake_case_		    =     {}
	snake_case_		    =     {}
	snake_case_		    =     {}
	for k, v in text_enc_dict.items():
		if (
		    k.endswith(".self_attn.q_proj.weight"							)
		    or k.endswith(".self_attn.k_proj.weight"							)
		    or k.endswith(".self_attn.v_proj.weight"							)
		):
			snake_case_		    =     k[: -len(".q_proj.weight"							)]
			snake_case_		    =     k[-len("q_proj.weight"							)]
			if k_pre not in capture_qkv_weight:
				snake_case_		    =     [None, None, None]
			snake_case_		    =     v
			continue

		if (
		    k.endswith(".self_attn.q_proj.bias"							)
		    or k.endswith(".self_attn.k_proj.bias"							)
		    or k.endswith(".self_attn.v_proj.bias"							)
		):
			snake_case_		    =     k[: -len(".q_proj.bias"							)]
			snake_case_		    =     k[-len("q_proj.bias"							)]
			if k_pre not in capture_qkv_bias:
				snake_case_		    =     [None, None, None]
			snake_case_		    =     v
			continue

		snake_case_		    =     textenc_pattern.sub(lambda _A							: protected[re.escape(m.group(0							)							)]     ,	_A							)
		snake_case_		    =     v

	for k_pre, tensors in capture_qkv_weight.items():
		if None in tensors:
			raise Exception("CORRUPTED MODEL: one of the q-k-v values for the text encoder was missing"							)
		snake_case_		    =     textenc_pattern.sub(lambda _A							: protected[re.escape(m.group(0							)							)]     ,	_A							)
		snake_case_		    =     torch.cat(_A							)

	for k_pre, tensors in capture_qkv_bias.items():
		if None in tensors:
			raise Exception("CORRUPTED MODEL: one of the q-k-v values for the text encoder was missing"							)
		snake_case_		    =     textenc_pattern.sub(lambda _A							: protected[re.escape(m.group(0							)							)]     ,	_A							)
		snake_case_		    =     torch.cat(_A							)

	return new_state_dict


def 						lowerCamelCase__    (		_A							):







	'''simple docstring'''





	return text_enc_dict


if __name__ == "__main__":
		lowercase__				:     int 		=						argparse.ArgumentParser()

		parser.add_argument("--model_path", default=None, type=str, required=True, help="Path to the model to convert.")
		parser.add_argument("--checkpoint_path", default=None, type=str, required=True, help="Path to the output model.")
		parser.add_argument("--half", action="store_true", help="Save weights in half precision.")
		parser.add_argument(
		    "--use_safetensors", action="store_true", help="Save weights use safetensors, default is ckpt."
		)

		lowercase__				:     Dict 		=						parser.parse_args()

		assert args.model_path is not None, "Must provide a model path!"

		assert args.checkpoint_path is not None, "Must provide a checkpoint path!"

		# Path for safetensors
		lowercase__				:     Tuple 		=						osp.join(args.model_path, "unet", "diffusion_pytorch_model.safetensors")
		lowercase__				:     int 		=						osp.join(args.model_path, "vae", "diffusion_pytorch_model.safetensors")
		lowercase__				:     Any 		=						osp.join(args.model_path, "text_encoder", "model.safetensors")

		# Load models from safetensors if it exists, if it doesn't pytorch
		if osp.exists(unet_path):
				lowercase__				:     str 		=						load_file(unet_path, device="cpu")
		else:
				lowercase__				:     Optional[Any] 		=						osp.join(args.model_path, "unet", "diffusion_pytorch_model.bin")
				lowercase__				:     Any 		=						torch.load(unet_path, map_location="cpu")

		if osp.exists(vae_path):
				lowercase__				:     Tuple 		=						load_file(vae_path, device="cpu")
		else:
				lowercase__				:     Any 		=						osp.join(args.model_path, "vae", "diffusion_pytorch_model.bin")
				lowercase__				:     Dict 		=						torch.load(vae_path, map_location="cpu")

		if osp.exists(text_enc_path):
				lowercase__				:     Union[str, Any] 		=						load_file(text_enc_path, device="cpu")
		else:
				lowercase__				:     Union[str, Any] 		=						osp.join(args.model_path, "text_encoder", "pytorch_model.bin")
				lowercase__				:     Optional[int] 		=						torch.load(text_enc_path, map_location="cpu")

		# Convert the UNet model
		lowercase__				:     Dict 		=						convert_unet_state_dict(unet_state_dict)
		lowercase__				:     Any 		=						{"model.diffusion_model." + k: v for k, v in unet_state_dict.items()}

		# Convert the VAE model
		lowercase__				:     Dict 		=						convert_vae_state_dict(vae_state_dict)
		lowercase__				:     Union[str, Any] 		=						{"first_stage_model." + k: v for k, v in vae_state_dict.items()}

		# Easiest way to identify v2.0 model seems to be that the text encoder (OpenCLIP) is deeper
		lowercase__				:     Optional[Any] 		=						"text_model.encoder.layers.22.layer_norm2.bias" in text_enc_dict

		if is_vaa_model:
				# Need to add the tag 'transformer' in advance so we can knock it out from the final layer-norm
				lowercase__				:     Any 		=						{"transformer." + k: v for k, v in text_enc_dict.items()}
				lowercase__				:     List[Any] 		=						convert_text_enc_state_dict_vaa(text_enc_dict)
				lowercase__				:     List[str] 		=						{"cond_stage_model.model." + k: v for k, v in text_enc_dict.items()}
		else:
				lowercase__				:     Tuple 		=						convert_text_enc_state_dict(text_enc_dict)
				lowercase__				:     Any 		=						{"cond_stage_model.transformer." + k: v for k, v in text_enc_dict.items()}

		# Put together new checkpoint
		lowercase__				:     Tuple 		=						{**unet_state_dict, **vae_state_dict, **text_enc_dict}
		if args.half:
				lowercase__				:     Any 		=						{k: v.half() for k, v in state_dict.items()}

		if args.use_safetensors:
				save_file(state_dict, args.checkpoint_path)
		else:
				lowercase__				:     Union[str, Any] 		=						{"state_dict": state_dict}
				torch.save(state_dict, args.checkpoint_path)
