"""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


__snake_case         =					logging.get_logger(__name__)







def 						__lowerCAmelCase		(		lowercase						:						List[Any]		,							lowercase						:						Any				)			->		List[Any]:


    """simple docstring"""





    try:
        with open(lowercase		,							"rb"				) as flax_state_f:
            snake_case					:   List[str]         =					from_bytes(lowercase		,							flax_state_f.read()				)
    except UnpicklingError as e:
        try:
            with open(lowercase				) 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(lowercase		,							lowercase				)







def 						__lowerCAmelCase		(		lowercase						:						List[Any]		,							lowercase						:						int				)			->		Union[str, Any]:


    """simple docstring"""





    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
    snake_case					:   str         =					flatten_dict(jax.tree_util.tree_map(lambda lowercase				: x.dtype == jnp.bfloataa		,							lowercase				)				).values()
    if any(lowercase				):
        # 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."				)
        snake_case					:   str         =					jax.tree_util.tree_map(
            lambda lowercase				: params.astype(np.floataa				) if params.dtype == jnp.bfloataa else params		,							lowercase				)

    snake_case					:   Optional[Any]         =					""

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

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

    for flax_key_tuple, flax_tensor in flax_state_dict.items():
        snake_case					:   Tuple         =					flax_key_tuple.split("."				)

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

        if "time_embedding" not in flax_key_tuple_array:
            for i, flax_key_tuple_string in enumerate(lowercase				):
                snake_case					:   Optional[int]         =					(
                    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"				)
                )

        snake_case					:   Tuple         =					".".join(lowercase				)

        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
                snake_case					:   Any         =					np.asarray(lowercase				) if not isinstance(lowercase		,							np.ndarray				) else flax_tensor
                snake_case					:   Optional[int]         =					torch.from_numpy(lowercase				)
                # remove from missing keys
                missing_keys.remove(lowercase				)
        else:
            # weight is not expected by PyTorch model
            unexpected_keys.append(lowercase				)

    pt_model.load_state_dict(lowercase				)

    # re-transform missing_keys to list
    snake_case					:   Optional[Any]         =					list(lowercase				)

    if len(lowercase				) > 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(lowercase				) > 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"""



from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


__snake_case         =					{
    """configuration_distilbert""": [
        """DISTILBERT_PRETRAINED_CONFIG_ARCHIVE_MAP""",
        """DistilBertConfig""",
        """DistilBertOnnxConfig""",
    ],
    """tokenization_distilbert""": ["""DistilBertTokenizer"""],
}

try:
  if not is_tokenizers_available():
    raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
  pass
else:
  __snake_case         =					["""DistilBertTokenizerFast"""]

try:
  if not is_torch_available():
    raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
  pass
else:
  __snake_case         =					[
      """DISTILBERT_PRETRAINED_MODEL_ARCHIVE_LIST""",
      """DistilBertForMaskedLM""",
      """DistilBertForMultipleChoice""",
      """DistilBertForQuestionAnswering""",
      """DistilBertForSequenceClassification""",
      """DistilBertForTokenClassification""",
      """DistilBertModel""",
      """DistilBertPreTrainedModel""",
  ]

try:
  if not is_tf_available():
    raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
  pass
else:
  __snake_case         =					[
      """TF_DISTILBERT_PRETRAINED_MODEL_ARCHIVE_LIST""",
      """TFDistilBertForMaskedLM""",
      """TFDistilBertForMultipleChoice""",
      """TFDistilBertForQuestionAnswering""",
      """TFDistilBertForSequenceClassification""",
      """TFDistilBertForTokenClassification""",
      """TFDistilBertMainLayer""",
      """TFDistilBertModel""",
      """TFDistilBertPreTrainedModel""",
  ]

try:
  if not is_flax_available():
    raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
  pass
else:
  __snake_case         =					[
      """FlaxDistilBertForMaskedLM""",
      """FlaxDistilBertForMultipleChoice""",
      """FlaxDistilBertForQuestionAnswering""",
      """FlaxDistilBertForSequenceClassification""",
      """FlaxDistilBertForTokenClassification""",
      """FlaxDistilBertModel""",
      """FlaxDistilBertPreTrainedModel""",
  ]


if TYPE_CHECKING:
  from .configuration_distilbert import (
      DISTILBERT_PRETRAINED_CONFIG_ARCHIVE_MAP,
      DistilBertConfig,
      DistilBertOnnxConfig,
  )
  from .tokenization_distilbert import DistilBertTokenizer

  try:
    if not is_tokenizers_available():
      raise OptionalDependencyNotAvailable()
  except OptionalDependencyNotAvailable:
    pass
  else:
    from .tokenization_distilbert_fast import DistilBertTokenizerFast

  try:
    if not is_torch_available():
      raise OptionalDependencyNotAvailable()
  except OptionalDependencyNotAvailable:
    pass
  else:
    from .modeling_distilbert import (
        DISTILBERT_PRETRAINED_MODEL_ARCHIVE_LIST,
        DistilBertForMaskedLM,
        DistilBertForMultipleChoice,
        DistilBertForQuestionAnswering,
        DistilBertForSequenceClassification,
        DistilBertForTokenClassification,
        DistilBertModel,
        DistilBertPreTrainedModel,
    )

  try:
    if not is_tf_available():
      raise OptionalDependencyNotAvailable()
  except OptionalDependencyNotAvailable:
    pass
  else:
    from .modeling_tf_distilbert import (
        TF_DISTILBERT_PRETRAINED_MODEL_ARCHIVE_LIST,
        TFDistilBertForMaskedLM,
        TFDistilBertForMultipleChoice,
        TFDistilBertForQuestionAnswering,
        TFDistilBertForSequenceClassification,
        TFDistilBertForTokenClassification,
        TFDistilBertMainLayer,
        TFDistilBertModel,
        TFDistilBertPreTrainedModel,
    )

  try:
    if not is_flax_available():
      raise OptionalDependencyNotAvailable()
  except OptionalDependencyNotAvailable:
    pass
  else:
    from .modeling_flax_distilbert import (
        FlaxDistilBertForMaskedLM,
        FlaxDistilBertForMultipleChoice,
        FlaxDistilBertForQuestionAnswering,
        FlaxDistilBertForSequenceClassification,
        FlaxDistilBertForTokenClassification,
        FlaxDistilBertModel,
        FlaxDistilBertPreTrainedModel,
    )

else:
  import sys

  __snake_case         =					_LazyModule(__name__, globals()["""__file__"""], _import_structure, module_spec=__spec__)





