
# 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,
)


SCREAMING_SNAKE_CASE							:List[Any]											=       {
    'configuration_convnextv2': [
        'CONVNEXTV2_PRETRAINED_CONFIG_ARCHIVE_MAP',
        'ConvNextV2Config',
    ]
}

try:
					if not is_torch_available():
										raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
					pass
else:
					SCREAMING_SNAKE_CASE							:str											=       [
					    '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

					SCREAMING_SNAKE_CASE							:int											=       _LazyModule(__name__, globals()['__file__'], _import_structure)


import argparse

import torch

from transformers import MraConfig, MraForMaskedLM


def 		UpperCAmelCase    (			a_		)	->			Any:







				"""simple docstring"""



				if "model" in orig_key:
								__A         =				orig_key.replace("model."	,     ""		)
				if "norm1" in orig_key:
								__A         =				orig_key.replace("norm1"	,     "attention.output.LayerNorm"		)
				if "norm2" in orig_key:
								__A         =				orig_key.replace("norm2"	,     "output.LayerNorm"		)
				if "norm" in orig_key:
								__A         =				orig_key.replace("norm"	,     "LayerNorm"		)
				if "transformer" in orig_key:
								__A         =				orig_key.split("."		)[0].split("_"		)[-1]
								__A         =				orig_key.replace(F'''transformer_{layer_num}'''	,     F'''encoder.layer.{layer_num}'''		)
				if "mha.attn" in orig_key:
								__A         =				orig_key.replace("mha.attn"	,     "attention.self"		)
				if "mha" in orig_key:
								__A         =				orig_key.replace("mha"	,     "attention"		)
				if "W_q" in orig_key:
								__A         =				orig_key.replace("W_q"	,     "self.query"		)
				if "W_k" in orig_key:
								__A         =				orig_key.replace("W_k"	,     "self.key"		)
				if "W_v" in orig_key:
								__A         =				orig_key.replace("W_v"	,     "self.value"		)
				if "ff.0" in orig_key:
								__A         =				orig_key.replace("ff.0"	,     "intermediate.dense"		)
				if "ff.2" in orig_key:
								__A         =				orig_key.replace("ff.2"	,     "output.dense"		)
				if "ff" in orig_key:
								__A         =				orig_key.replace("ff"	,     "output.dense"		)
				if "mlm_class" in orig_key:
								__A         =				orig_key.replace("mlm.mlm_class"	,     "cls.predictions.decoder"		)
				if "mlm" in orig_key:
								__A         =				orig_key.replace("mlm"	,     "cls.predictions.transform"		)
				if "backbone.backbone.encoders" in orig_key:
								__A         =				orig_key.replace("backbone.backbone.encoders"	,     "encoder.layer"		)
				if "cls" not in orig_key:
								__A         =				"mra." + orig_key

				return orig_key


def 		UpperCAmelCase    (			a_	,     a_		)	->			List[str]:







				"""simple docstring"""



				for key in orig_state_dict.copy().keys():
								__A         =				orig_state_dict.pop(a_		)

								if ("pooler" in key) or ("sen_class" in key):
												continue
								else:
												__A         =				val

				__A         =				orig_state_dict["cls.predictions.decoder.bias"]
				__A         =				torch.arange(a_		).expand((1, -1)		) + 2

				return orig_state_dict


def 		UpperCAmelCase    (			a_	,     a_	,     a_		)	->			Dict:







				"""simple docstring"""



				__A         =				torch.load(a_	,     map_location="cpu"		)["model_state_dict"]
				__A         =				MraConfig.from_json_file(a_		)
				__A         =				MraForMaskedLM(a_		)

				__A         =				convert_checkpoint_helper(config.max_position_embeddings	,     a_		)

				print(model.load_state_dict(a_		)		)
				model.eval()
				model.save_pretrained(a_		)

				print(F'''Checkpoint successfuly converted. Model saved at {pytorch_dump_path}'''		)


if __name__ == "__main__":
					SCREAMING_SNAKE_CASE							:Optional[Any]											=       argparse.ArgumentParser()
					# Required parameters
					parser.add_argument(
					    '--pytorch_model_path', default=None, type=str, required=True, help='Path to Mra pytorch checkpoint.'
					)
					parser.add_argument(
					    '--config_file',
					    default=None,
					    type=str,
					    required=True,
					    help='The json file for Mra model config.',
					)
					parser.add_argument(
					    '--pytorch_dump_path', default=None, type=str, required=True, help='Path to the output PyTorch model.'
					)
					SCREAMING_SNAKE_CASE							:Any											=       parser.parse_args()
					convert_mra_checkpoint(args.pytorch_model_path, args.config_file, args.pytorch_dump_path)
