






'''simple docstring'''







from pickle import UnpicklingError

import jax
import jax.numpy as jnp
import numpy as np
from flax.serialization import from_bytes
from flax.traverse_util import flatten_dict

from ..utils import logging


_A	:			List[str]         =logging.get_logger(__name__)





def  SCREAMING_SNAKE_CASE_       (UpperCamelCase				,			UpperCamelCase      )      ->       Any:
							try:
														with open(UpperCamelCase				,			"""rb"""      ) as flax_state_f:
																					lowerCamelCase__					:	Tuple         =       from_bytes(UpperCamelCase				,			flax_state_f.read()      )
							except UnpicklingError as e:
														try:
																					with open(UpperCamelCase      ) as f:
																												if f.read().startswith("""version"""      ):
																																			raise OSError(
																																			    """You seem to have cloned a repository without having git-lfs installed. Please"""
																																			    """ install git-lfs and run `git lfs install` followed by `git lfs pull` in the"""
																																			    """ folder you cloned."""      )
																												else:
																																			raise ValueError from e
														except (UnicodeDecodeError, ValueError):
																					raise EnvironmentError(f'''Unable to convert {model_file} to Flax deserializable object. '''      )

							return load_flax_weights_in_pytorch_model(UpperCamelCase				,			UpperCamelCase      )





def  SCREAMING_SNAKE_CASE_       (UpperCamelCase				,			UpperCamelCase      )      ->       str:

							try:
														import torch  # noqa: F401
							except ImportError:
														logger.error(
														    """Loading Flax weights in PyTorch requires both PyTorch and Flax to be installed. Please see"""
														    """ https://pytorch.org/ and https://flax.readthedocs.io/en/latest/installation.html for installation"""
														    """ instructions."""      )
														raise

							# check if we have bf16 weights
							lowerCamelCase__					:	Optional[Any]         =       flatten_dict(jax.tree_util.tree_map(lambda UpperCamelCase      : x.dtype == jnp.bfloataa				,			UpperCamelCase      )      ).values()
							if any(UpperCamelCase      ):
														# convert all weights to fp32 if they are bf16 since torch.from_numpy can-not handle bf16

														# and bf16 is not fully supported in PT yet.
														logger.warning(
														    """Found ``bfloat16`` weights in Flax model. Casting all ``bfloat16`` weights to ``float32`` """
														    """before loading those in PyTorch model."""      )
														lowerCamelCase__					:	Optional[Any]         =       jax.tree_util.tree_map(
														    lambda UpperCamelCase      : params.astype(np.floataa      ) if params.dtype == jnp.bfloataa else params				,			UpperCamelCase      )

							lowerCamelCase__					:	Union[str, Any]         =       """"""

							lowerCamelCase__					:	Optional[Any]         =       flatten_dict(UpperCamelCase				,			sep="""."""      )
							lowerCamelCase__					:	List[str]         =       pt_model.state_dict()

							# keep track of unexpected & missing keys
							lowerCamelCase__					:	Union[str, Any]         =       []
							lowerCamelCase__					:	Dict         =       set(pt_model_dict.keys()      )

							for flax_key_tuple, flax_tensor in flax_state_dict.items():
														lowerCamelCase__					:	Optional[Any]         =       flax_key_tuple.split("""."""      )

														if flax_key_tuple_array[-1] == "kernel" and flax_tensor.ndim == 4:
																					lowerCamelCase__					:	Union[str, Any]         =       flax_key_tuple_array[:-1] + ["""weight"""]
																					lowerCamelCase__					:	Optional[Any]         =       jnp.transpose(UpperCamelCase				,			(3, 2, 0, 1)      )
														elif flax_key_tuple_array[-1] == "kernel":
																					lowerCamelCase__					:	Tuple         =       flax_key_tuple_array[:-1] + ["""weight"""]
																					lowerCamelCase__					:	Tuple         =       flax_tensor.T
														elif flax_key_tuple_array[-1] == "scale":
																					lowerCamelCase__					:	Any         =       flax_key_tuple_array[:-1] + ["""weight"""]

														if "time_embedding" not in flax_key_tuple_array:
																					for i, flax_key_tuple_string in enumerate(UpperCamelCase      ):
																												lowerCamelCase__					:	List[Any]         =       (
																												    flax_key_tuple_string.replace("""_0"""				,			""".0"""      )
																												    .replace("""_1"""				,			""".1"""      )
																												    .replace("""_2"""				,			""".2"""      )
																												    .replace("""_3"""				,			""".3"""      )
																												    .replace("""_4"""				,			""".4"""      )
																												    .replace("""_5"""				,			""".5"""      )
																												    .replace("""_6"""				,			""".6"""      )
																												    .replace("""_7"""				,			""".7"""      )
																												    .replace("""_8"""				,			""".8"""      )
																												    .replace("""_9"""				,			""".9"""      )
																												)

														lowerCamelCase__					:	Optional[int]         =       """.""".join(UpperCamelCase      )

														if flax_key in pt_model_dict:
																					if flax_tensor.shape != pt_model_dict[flax_key].shape:
																												raise ValueError(
																												    f'''Flax checkpoint seems to be incorrect. Weight {flax_key_tuple} was expected '''
																												    f'''to be of shape {pt_model_dict[flax_key].shape}, but is {flax_tensor.shape}.'''      )
																					else:
																												# add weight to pytorch dict
																												lowerCamelCase__					:	List[Any]         =       np.asarray(UpperCamelCase      ) if not isinstance(UpperCamelCase				,			np.ndarray      ) else flax_tensor
																												lowerCamelCase__					:	Tuple         =       torch.from_numpy(UpperCamelCase      )
																												# remove from missing keys
																												missing_keys.remove(UpperCamelCase      )
														else:
																					# weight is not expected by PyTorch model
																					unexpected_keys.append(UpperCamelCase      )

							pt_model.load_state_dict(UpperCamelCase      )

							# re-transform missing_keys to list
							lowerCamelCase__					:	Union[str, Any]         =       list(UpperCamelCase      )

							if len(UpperCamelCase      ) > 0:
														logger.warning(
														    """Some weights of the Flax model were not used when initializing the PyTorch model"""
														    f''' {pt_model.__class__.__name__}: {unexpected_keys}\n- This IS expected if you are initializing'''
														    f''' {pt_model.__class__.__name__} from a Flax model trained on another task or with another architecture'''
														    """ (e.g. initializing a BertForSequenceClassification model from a FlaxBertForPreTraining model).\n- This"""
														    f''' IS NOT expected if you are initializing {pt_model.__class__.__name__} from a Flax model that you expect'''
														    """ to be exactly identical (e.g. initializing a BertForSequenceClassification model from a"""
														    """ FlaxBertForSequenceClassification model)."""      )
							if len(UpperCamelCase      ) > 0:
														logger.warning(
														    f'''Some weights of {pt_model.__class__.__name__} were not initialized from the Flax model and are newly'''
														    f''' initialized: {missing_keys}\nYou should probably TRAIN this model on a down-stream task to be able to'''
														    """ use it for predictions and inference."""      )

							return pt_model









'''simple docstring'''







import inspect
import unittest

from transformers import MobileNetVaConfig
from transformers.testing_utils import require_torch, require_vision, slow, torch_device
from transformers.utils import cached_property, is_torch_available, is_vision_available

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
			import torch

			from transformers import MobileNetVaForImageClassification, MobileNetVaModel
			from transformers.models.mobilenet_va.modeling_mobilenet_va import MOBILENET_V1_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
			from PIL import Image

			from transformers import MobileNetVaImageProcessor

class _lowercase	(				_lowercase		):




							def 		lowerCamelCase_				(							self:				Any     ):
														lowerCamelCase__					:	str         =       self.config_class(**self.inputs_dict     )
														self.parent.assertTrue(hasattr(UpperCamelCase__			,							"""tf_padding"""     )     )
														self.parent.assertTrue(hasattr(UpperCamelCase__			,							"""depth_multiplier"""     )     )



class _lowercase	:




							def __init__(							self:				str			,							UpperCamelCase__:				Dict			,							UpperCamelCase__:				Tuple=13			,							UpperCamelCase__:				Optional[int]=3			,							UpperCamelCase__:				List[Any]=32			,							UpperCamelCase__:				Optional[Any]=0.25			,							UpperCamelCase__:				int=8			,							UpperCamelCase__:				Any=True			,							UpperCamelCase__:				Dict=1_024			,							UpperCamelCase__:				Optional[int]=32			,							UpperCamelCase__:				Tuple="relu6"			,							UpperCamelCase__:				int=0.1			,							UpperCamelCase__:				List[Any]=0.02			,							UpperCamelCase__:				Optional[Any]=True			,							UpperCamelCase__:				Union[str, Any]=True			,							UpperCamelCase__:				Union[str, Any]=10			,							UpperCamelCase__:				str=None			,							):
														lowerCamelCase__					:	Optional[Any]         =       parent
														lowerCamelCase__					:	List[str]         =       batch_size
														lowerCamelCase__					:	Optional[int]         =       num_channels
														lowerCamelCase__					:	Optional[int]         =       image_size
														lowerCamelCase__					:	Optional[Any]         =       depth_multiplier
														lowerCamelCase__					:	Union[str, Any]         =       min_depth
														lowerCamelCase__					:	Optional[Any]         =       tf_padding
														lowerCamelCase__					:	str         =       int(last_hidden_size * depth_multiplier     )
														lowerCamelCase__					:	Any         =       output_stride
														lowerCamelCase__					:	int         =       hidden_act
														lowerCamelCase__					:	Tuple         =       classifier_dropout_prob
														lowerCamelCase__					:	Dict         =       use_labels
														lowerCamelCase__					:	Tuple         =       is_training
														lowerCamelCase__					:	Optional[Any]         =       num_labels
														lowerCamelCase__					:	Union[str, Any]         =       initializer_range
														lowerCamelCase__					:	Optional[Any]         =       scope




							def 		lowerCamelCase_				(							self:				List[str]     ):
														lowerCamelCase__					:	Optional[Any]         =       floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]     )

														lowerCamelCase__					:	Optional[Any]         =       None
														lowerCamelCase__					:	Dict         =       None
														if self.use_labels:
																					lowerCamelCase__					:	Union[str, Any]         =       ids_tensor([self.batch_size]			,							self.num_labels     )
																					lowerCamelCase__					:	Dict         =       ids_tensor([self.batch_size, self.image_size, self.image_size]			,							self.num_labels     )

														lowerCamelCase__					:	Dict         =       self.get_config()

														return config, pixel_values, labels, pixel_labels




							def 		lowerCamelCase_				(							self:				str     ):
														return MobileNetVaConfig(
														    num_channels=self.num_channels			,							image_size=self.image_size			,							depth_multiplier=self.depth_multiplier			,							min_depth=self.min_depth			,							tf_padding=self.tf_padding			,							hidden_act=self.hidden_act			,							classifier_dropout_prob=self.classifier_dropout_prob			,							initializer_range=self.initializer_range			,							)




							def 		lowerCamelCase_				(							self:				Tuple			,							UpperCamelCase__:				int			,							UpperCamelCase__:				str			,							UpperCamelCase__:				Any			,							UpperCamelCase__:				Optional[int]     ):
														lowerCamelCase__					:	List[str]         =       MobileNetVaModel(config=UpperCamelCase__     )
														model.to(UpperCamelCase__     )
														model.eval()
														lowerCamelCase__					:	List[str]         =       model(UpperCamelCase__     )
														self.parent.assertEqual(
														    result.last_hidden_state.shape			,							(
														        self.batch_size,
														        self.last_hidden_size,
														        self.image_size // self.output_stride,
														        self.image_size // self.output_stride,
														    )			,							)




							def 		lowerCamelCase_				(							self:				str			,							UpperCamelCase__:				Tuple			,							UpperCamelCase__:				Optional[int]			,							UpperCamelCase__:				List[Any]			,							UpperCamelCase__:				Union[str, Any]     ):
														lowerCamelCase__					:	List[str]         =       self.num_labels
														lowerCamelCase__					:	Optional[Any]         =       MobileNetVaForImageClassification(UpperCamelCase__     )
														model.to(UpperCamelCase__     )
														model.eval()
														lowerCamelCase__					:	List[Any]         =       model(UpperCamelCase__			,							labels=UpperCamelCase__     )
														self.parent.assertEqual(result.logits.shape			,							(self.batch_size, self.num_labels)     )




							def 		lowerCamelCase_				(							self:				Optional[Any]     ):
														lowerCamelCase__					:	str         =       self.prepare_config_and_inputs()
														lowerCamelCase__  ,		lowerCamelCase__  ,		lowerCamelCase__  ,		lowerCamelCase__					:	int         =       config_and_inputs
														lowerCamelCase__					:	Optional[int]         =       {"""pixel_values""": pixel_values}
														return config, inputs_dict



@require_torch
class _lowercase	(				_lowercase				,      _lowercase				,      unittest.TestCase		):
							a				      =       (MobileNetVaModel, MobileNetVaForImageClassification) if is_torch_available() else ()
							a				      =       (
							    {"""feature-extraction""": MobileNetVaModel, """image-classification""": MobileNetVaForImageClassification}
							    if is_torch_available()
							    else {}
							)

							a				      =       False
							a				      =       False
							a				      =       False
							a				      =       False




							def 		lowerCamelCase_				(							self:				List[str]     ):
														lowerCamelCase__					:	Optional[int]         =       MobileNetVaModelTester(self     )
														lowerCamelCase__					:	List[str]         =       MobileNetVaConfigTester(self			,							config_class=UpperCamelCase__			,							has_text_modality=UpperCamelCase__     )




							def 		lowerCamelCase_				(							self:				Union[str, Any]     ):
														self.config_tester.run_common_tests()




							@unittest.skip(reason="""MobileNetV1 does not use inputs_embeds"""     )
							def 		lowerCamelCase_				(							self:				Optional[int]     ):
														pass




							@unittest.skip(reason="""MobileNetV1 does not support input and output embeddings"""     )
							def 		lowerCamelCase_				(							self:				Optional[Any]     ):
														pass




							@unittest.skip(reason="""MobileNetV1 does not output attentions"""     )
							def 		lowerCamelCase_				(							self:				Any     ):
														pass




							def 		lowerCamelCase_				(							self:				Any     ):
														lowerCamelCase__  ,		lowerCamelCase__					:	Optional[Any]         =       self.model_tester.prepare_config_and_inputs_for_common()

														for model_class in self.all_model_classes:
																					lowerCamelCase__					:	Dict         =       model_class(UpperCamelCase__     )
																					lowerCamelCase__					:	Dict         =       inspect.signature(model.forward     )
																					# signature.parameters is an OrderedDict => so arg_names order is deterministic
																					lowerCamelCase__					:	List[Any]         =       [*signature.parameters.keys()]

																					lowerCamelCase__					:	Dict         =       ["""pixel_values"""]
																					self.assertListEqual(arg_names[:1]			,							UpperCamelCase__     )




							def 		lowerCamelCase_				(							self:				str     ):
														lowerCamelCase__					:	Tuple         =       self.model_tester.prepare_config_and_inputs()
														self.model_tester.create_and_check_model(*UpperCamelCase__     )




							def 		lowerCamelCase_				(							self:				str     ):
														def check_hidden_states_output(UpperCamelCase__:				List[Any]			,							UpperCamelCase__:				Dict			,							UpperCamelCase__:				List[Any]     ):
																					lowerCamelCase__					:	str         =       model_class(UpperCamelCase__     )
																					model.to(UpperCamelCase__     )
																					model.eval()

																					with torch.no_grad():
																												lowerCamelCase__					:	Union[str, Any]         =       model(**self._prepare_for_class(UpperCamelCase__			,							UpperCamelCase__     )     )

																					lowerCamelCase__					:	List[Any]         =       outputs.hidden_states

																					lowerCamelCase__					:	Tuple         =       26
																					self.assertEqual(len(UpperCamelCase__     )			,							UpperCamelCase__     )

														lowerCamelCase__  ,		lowerCamelCase__					:	List[str]         =       self.model_tester.prepare_config_and_inputs_for_common()

														for model_class in self.all_model_classes:
																					lowerCamelCase__					:	List[Any]         =       True
																					check_hidden_states_output(UpperCamelCase__			,							UpperCamelCase__			,							UpperCamelCase__     )

																					# check that output_hidden_states also work using config
																					del inputs_dict["output_hidden_states"]
																					lowerCamelCase__					:	Optional[Any]         =       True

																					check_hidden_states_output(UpperCamelCase__			,							UpperCamelCase__			,							UpperCamelCase__     )




							def 		lowerCamelCase_				(							self:				Dict     ):
														lowerCamelCase__					:	int         =       self.model_tester.prepare_config_and_inputs()
														self.model_tester.create_and_check_for_image_classification(*UpperCamelCase__     )




							@slow
							def 		lowerCamelCase_				(							self:				List[str]     ):
														for model_name in MOBILENET_V1_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
																					lowerCamelCase__					:	Dict         =       MobileNetVaModel.from_pretrained(UpperCamelCase__     )
																					self.assertIsNotNone(UpperCamelCase__     )





def  SCREAMING_SNAKE_CASE_       ()      ->       Union[str, Any]:
							lowerCamelCase__					:	Optional[int]         =       Image.open("""./tests/fixtures/tests_samples/COCO/000000039769.png"""      )
							return image



@require_torch
@require_vision
class _lowercase	(				unittest.TestCase		):




							@cached_property
							def 		lowerCamelCase_				(							self:				Optional[int]     ):
														return (
														    MobileNetVaImageProcessor.from_pretrained("""google/mobilenet_v1_1.0_224"""     ) if is_vision_available() else None
														)




							@slow
							def 		lowerCamelCase_				(							self:				Dict     ):
														lowerCamelCase__					:	List[Any]         =       MobileNetVaForImageClassification.from_pretrained("""google/mobilenet_v1_1.0_224"""     ).to(UpperCamelCase__     )

														lowerCamelCase__					:	Dict         =       self.default_image_processor
														lowerCamelCase__					:	int         =       prepare_img()
														lowerCamelCase__					:	List[Any]         =       image_processor(images=UpperCamelCase__			,							return_tensors="""pt"""     ).to(UpperCamelCase__     )

														# forward pass
														with torch.no_grad():
																					lowerCamelCase__					:	str         =       model(**UpperCamelCase__     )

														# verify the logits
														lowerCamelCase__					:	List[str]         =       torch.Size((1, 1_001)     )
														self.assertEqual(outputs.logits.shape			,							UpperCamelCase__     )

														lowerCamelCase__					:	List[str]         =       torch.tensor([-4.1_739, -1.1_233, 3.1_205]     ).to(UpperCamelCase__     )

														self.assertTrue(torch.allclose(outputs.logits[0, :3]			,							UpperCamelCase__			,							atol=1e-4     )     )

