
"""simple docstring"""


import tempfile
import unittest

import torch

from diffusers import UNetaDConditionModel
from diffusers.training_utils import EMAModel
from diffusers.utils.testing_utils import enable_full_determinism, skip_mps, torch_device


enable_full_determinism()







class 	lowerCamelCase__      (      unittest.TestCase       ):





			'''simple docstring'''
			lowerCamelCase						      =	'''hf-internal-testing/tiny-stable-diffusion-pipe'''
			lowerCamelCase						      =	1
			lowerCamelCase						      =	77
			lowerCamelCase						      =	32
			lowerCamelCase						      =	4
			lowerCamelCase						      =	lowerCamelCase						      =	64
			lowerCamelCase						      =	torch.manual_seed(0       )



			def       _lowerCAmelCase	(							self  ,  __UpperCAmelCase=0.9_9_9_9						)				->  int:
				_lowerCAmelCase			=UNetaDConditionModel.from_pretrained(self.model_id  ,  subfolder="""unet"""						)
				_lowerCAmelCase			=unet.to(__UpperCAmelCase						)
				_lowerCAmelCase			=EMAModel(unet.parameters()  ,  decay=__UpperCAmelCase  ,  model_cls=__UpperCAmelCase  ,  model_config=unet.config						)
				return unet, ema_unet



			def       _lowerCAmelCase	(							self						)				->  Any:
				_lowerCAmelCase			=torch.randn(
				    self.batch_size  ,  self.num_in_channels  ,  self.latent_height  ,  self.latent_width  ,  generator=self.generator						).to(__UpperCAmelCase						)
				_lowerCAmelCase			=torch.randint(0  ,  10_00  ,  size=(self.batch_size,)  ,  generator=self.generator						).to(__UpperCAmelCase						)
				_lowerCAmelCase			=torch.randn(
				    self.batch_size  ,  self.prompt_length  ,  self.text_encoder_hidden_dim  ,  generator=self.generator						).to(__UpperCAmelCase						)
				return noisy_latents, timesteps, encoder_hidden_states



			def       _lowerCAmelCase	(							self  ,  __UpperCAmelCase						)				->  Union[str, Any]:
				_lowerCAmelCase			={}
				for k, param in unet.state_dict().items():
					_lowerCAmelCase			=torch.randn_like(__UpperCAmelCase						) + (param * torch.randn_like(__UpperCAmelCase						))
					updated_state_dict.update({k: updated_param}						)
				unet.load_state_dict(__UpperCAmelCase						)
				return unet



			def       _lowerCAmelCase	(							self						)				->  Union[str, Any]:
				_lowerCAmelCase		,							_lowerCAmelCase			=self.get_models()
				# Take the first (hypothetical) EMA step.
				ema_unet.step(unet.parameters()						)
				assert ema_unet.optimization_step == 1

				# Take two more.
				for _ in range(2						):
					ema_unet.step(unet.parameters()						)
				assert ema_unet.optimization_step == 3



			def       _lowerCAmelCase	(							self						)				->  Optional[Any]:
				_lowerCAmelCase		,							_lowerCAmelCase			=self.get_models()
				# Since the `unet` is not being updated (i.e., backprop'd)
				# there won't be any difference between the `params` of `unet`
				# and `ema_unet` even if we call `ema_unet.step(unet.parameters())`.
				ema_unet.step(unet.parameters()						)
				_lowerCAmelCase			=list(unet.parameters()						)
				for s_param, param in zip(ema_unet.shadow_params  ,  __UpperCAmelCase						):
					assert torch.allclose(__UpperCAmelCase  ,  __UpperCAmelCase						)

				# The above holds true even if we call `ema.step()` multiple times since
				# `unet` params are still not being updated.
				for _ in range(4						):
					ema_unet.step(unet.parameters()						)
				for s_param, param in zip(ema_unet.shadow_params  ,  __UpperCAmelCase						):
					assert torch.allclose(__UpperCAmelCase  ,  __UpperCAmelCase						)



			def       _lowerCAmelCase	(							self						)				->  Dict:
				_lowerCAmelCase		,							_lowerCAmelCase			=self.get_models()
				# Here we simulate the parameter updates for `unet`. Since there might
				# be some parameters which are initialized to zero we take extra care to
				# initialize their values to something non-zero before the multiplication.
				_lowerCAmelCase			=self.simulate_backprop(__UpperCAmelCase						)

				# Take the EMA step.
				ema_unet.step(unet_pseudo_updated_step_one.parameters()						)

				# Now the EMA'd parameters won't be equal to the original model parameters.
				_lowerCAmelCase			=list(unet_pseudo_updated_step_one.parameters()						)
				for s_param, param in zip(ema_unet.shadow_params  ,  __UpperCAmelCase						):
					assert ~torch.allclose(__UpperCAmelCase  ,  __UpperCAmelCase						)

				# Ensure this is the case when we take multiple EMA steps.
				for _ in range(4						):
					ema_unet.step(unet.parameters()						)
				for s_param, param in zip(ema_unet.shadow_params  ,  __UpperCAmelCase						):
					assert ~torch.allclose(__UpperCAmelCase  ,  __UpperCAmelCase						)



			def       _lowerCAmelCase	(							self						)				->  List[Any]:
				# If we call EMA step after a backpropagation consecutively for two times,
				# the shadow params from those two steps should be different.
				_lowerCAmelCase		,							_lowerCAmelCase			=self.get_models()

				# First backprop + EMA
				_lowerCAmelCase			=self.simulate_backprop(__UpperCAmelCase						)
				ema_unet.step(unet_step_one.parameters()						)
				_lowerCAmelCase			=ema_unet.shadow_params

				# Second backprop + EMA
				_lowerCAmelCase			=self.simulate_backprop(__UpperCAmelCase						)
				ema_unet.step(unet_step_two.parameters()						)
				_lowerCAmelCase			=ema_unet.shadow_params

				for step_one, step_two in zip(__UpperCAmelCase  ,  __UpperCAmelCase						):
					assert ~torch.allclose(__UpperCAmelCase  ,  __UpperCAmelCase						)



			def       _lowerCAmelCase	(							self						)				->  List[str]:
				# If there's no decay even if there are backprops, EMA steps
				# won't take any effect i.e., the shadow params would remain the
				# same.
				_lowerCAmelCase		,							_lowerCAmelCase			=self.get_models(decay=0.0						)
				_lowerCAmelCase			=self.simulate_backprop(__UpperCAmelCase						)
				ema_unet.step(unet_step_one.parameters()						)
				_lowerCAmelCase			=ema_unet.shadow_params

				_lowerCAmelCase			=self.simulate_backprop(__UpperCAmelCase						)
				ema_unet.step(unet_step_two.parameters()						)
				_lowerCAmelCase			=ema_unet.shadow_params

				for step_one, step_two in zip(__UpperCAmelCase  ,  __UpperCAmelCase						):
					assert torch.allclose(__UpperCAmelCase  ,  __UpperCAmelCase						)



			@skip_mps
			def       _lowerCAmelCase	(							self						)				->  Union[str, Any]:
				_lowerCAmelCase		,							_lowerCAmelCase			=self.get_models()
				_lowerCAmelCase		,							_lowerCAmelCase		,							_lowerCAmelCase			=self.get_dummy_inputs()

				with tempfile.TemporaryDirectory() as tmpdir:
					ema_unet.save_pretrained(__UpperCAmelCase						)
					_lowerCAmelCase			=UNetaDConditionModel.from_pretrained(__UpperCAmelCase  ,  model_cls=__UpperCAmelCase						)
					_lowerCAmelCase			=loaded_unet.to(unet.device						)

				# Since no EMA step has been performed the outputs should match.
				_lowerCAmelCase			=unet(__UpperCAmelCase  ,  __UpperCAmelCase  ,  __UpperCAmelCase						).sample
				_lowerCAmelCase			=loaded_unet(__UpperCAmelCase  ,  __UpperCAmelCase  ,  __UpperCAmelCase						).sample

				assert torch.allclose(__UpperCAmelCase  ,  __UpperCAmelCase  ,  atol=1e-4						)





"""simple docstring"""


# Copyright 2023 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import TYPE_CHECKING

# rely on isort to merge the imports
from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_torch_available,
)


__A 		= {
    'configuration_convnextv2': [
        'CONVNEXTV2_PRETRAINED_CONFIG_ARCHIVE_MAP',
        'ConvNextV2Config',
    ]
}

try:
			if not is_torch_available():
						raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
			pass
else:
			__A 		= [
			    'CONVNEXTV2_PRETRAINED_MODEL_ARCHIVE_LIST',
			    'ConvNextV2ForImageClassification',
			    'ConvNextV2Model',
			    'ConvNextV2PreTrainedModel',
			    'ConvNextV2Backbone',
			]


if TYPE_CHECKING:
			from .configuration_convnextva import (
			    CONVNEXTV2_PRETRAINED_CONFIG_ARCHIVE_MAP,
			    ConvNextVaConfig,
			)

			try:
						if not is_torch_available():
									raise OptionalDependencyNotAvailable()
			except OptionalDependencyNotAvailable:
						pass
			else:
						from .modeling_convnextva import (
						    CONVNEXTV2_PRETRAINED_MODEL_ARCHIVE_LIST,
						    ConvNextVaBackbone,
						    ConvNextVaForImageClassification,
						    ConvNextVaModel,
						    ConvNextVaPreTrainedModel,
						)

else:
			import sys

			__A 		= _LazyModule(__name__, globals()['__file__'], _import_structure)



