


import os
import random
from pathlib import Path
from typing import List

import numpy as np
import torch
from torch.cuda.amp import GradScaler

from .utils import (
    MODEL_NAME,
    OPTIMIZER_NAME,
    RNG_STATE_NAME,
    SCALER_NAME,
    SCHEDULER_NAME,
    get_pretty_name,
    is_tpu_available,
    is_xpu_available,
    save,
)


if is_tpu_available(check_device=False):
 import torch_xla.core.xla_model as xm

from .logging import get_logger
from .state import PartialState


lowerCamelCase						 =	get_logger(__name__)




def      a_				(   SCREAMING_SNAKE_CASE__ :				str		,      SCREAMING_SNAKE_CASE__ :				List[dict]		,      SCREAMING_SNAKE_CASE__ :				list		,      SCREAMING_SNAKE_CASE__ :				list		,      SCREAMING_SNAKE_CASE__ :				int		,      SCREAMING_SNAKE_CASE__ :				GradScaler = None		,      ):
       '''simple docstring'''





       for i, state in enumerate(SCREAMING_SNAKE_CASE__					):
              _lowerCamelCase	:		Optional[Any]          =F'''{MODEL_NAME}.bin''' if i == 0 else F'''{MODEL_NAME}_{i}.bin'''
              _lowerCamelCase	:		int          =os.path.join(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              save(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              logger.info(F'''Model weights saved in {output_model_file}'''					)
       # Optimizer states
       for i, opt in enumerate(SCREAMING_SNAKE_CASE__					):
              _lowerCamelCase	:		Optional[Any]          =opt.state_dict()
              _lowerCamelCase	:		Optional[Any]          =F'''{OPTIMIZER_NAME}.bin''' if i == 0 else F'''{OPTIMIZER_NAME}_{i}.bin'''
              _lowerCamelCase	:		Optional[int]          =os.path.join(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              save(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              logger.info(F'''Optimizer state saved in {output_optimizer_file}'''					)
       # Scheduler states
       for i, scheduler in enumerate(SCREAMING_SNAKE_CASE__					):
              _lowerCamelCase	:		List[Any]          =scheduler.state_dict()
              _lowerCamelCase	:		Union[str, Any]          =F'''{SCHEDULER_NAME}.bin''' if i == 0 else F'''{SCHEDULER_NAME}_{i}.bin'''
              _lowerCamelCase	:		Dict          =os.path.join(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              save(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              logger.info(F'''Scheduler state saved in {output_scheduler_file}'''					)
       # GradScaler state
       if scaler is not None:
              _lowerCamelCase	:		Union[str, Any]          =scaler.state_dict()
              _lowerCamelCase	:		Optional[Any]          =os.path.join(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              torch.save(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              logger.info(F'''Gradient scaler state saved in {output_scaler_file}'''					)
       # Random number generator states
       _lowerCamelCase	:		List[Any]          ={}
       _lowerCamelCase	:		Optional[Any]          =F'''{RNG_STATE_NAME}_{process_index}.pkl'''
       _lowerCamelCase	:		List[Any]          =random.getstate()
       _lowerCamelCase	:		Dict          =np.random.get_state()
       _lowerCamelCase	:		Dict          =torch.get_rng_state()
       if is_xpu_available():
              _lowerCamelCase	:		List[Any]          =torch.xpu.get_rng_state_all()
       else:
              _lowerCamelCase	:		Tuple          =torch.cuda.get_rng_state_all()
       if is_tpu_available():
              _lowerCamelCase	:		Optional[int]          =xm.get_rng_state()
       _lowerCamelCase	:		Tuple          =os.path.join(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
       torch.save(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
       logger.info(F'''Random states saved in {output_states_file}'''					)
       return output_dir




def      a_				(   SCREAMING_SNAKE_CASE__ :				Optional[Any]		,      SCREAMING_SNAKE_CASE__ :				List[Any]		,      SCREAMING_SNAKE_CASE__ :				List[Any]		,      SCREAMING_SNAKE_CASE__ :				List[Any]		,      SCREAMING_SNAKE_CASE__ :				Tuple		,      SCREAMING_SNAKE_CASE__ :				Dict=None		,      SCREAMING_SNAKE_CASE__ :				Optional[Any]=None		,      **SCREAMING_SNAKE_CASE__ :				str		,      ):
       '''simple docstring'''





       if map_location not in [None, "cpu", "on_device"]:
              raise TypeError(
                  'Unsupported optimizer map location passed, please choose one of `None`, `\'cpu\'`, or `\'on_device\'`'					)
       if map_location is None:
              _lowerCamelCase	:		Dict          ='cpu'
       elif map_location == "on_device":
              _lowerCamelCase	:		Optional[int]          =PartialState().device
       # Model states
       for i, model in enumerate(SCREAMING_SNAKE_CASE__					):
              _lowerCamelCase	:		Any          =F'''{MODEL_NAME}.bin''' if i == 0 else F'''{MODEL_NAME}_{i}.bin'''
              _lowerCamelCase	:		Union[str, Any]          =os.path.join(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              models[i].load_state_dict(torch.load(SCREAMING_SNAKE_CASE__		,      map_location=SCREAMING_SNAKE_CASE__					)		,      **SCREAMING_SNAKE_CASE__					)
       logger.info('All model weights loaded successfully'					)

       # Optimizer states
       for i, opt in enumerate(SCREAMING_SNAKE_CASE__					):
              _lowerCamelCase	:		Dict          =F'''{OPTIMIZER_NAME}.bin''' if i == 0 else F'''{OPTIMIZER_NAME}_{i}.bin'''
              _lowerCamelCase	:		List[str]          =os.path.join(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              _lowerCamelCase	:		List[str]          =torch.load(SCREAMING_SNAKE_CASE__		,      map_location=SCREAMING_SNAKE_CASE__					)
              optimizers[i].load_state_dict(SCREAMING_SNAKE_CASE__					)
       logger.info('All optimizer states loaded successfully'					)

       # Scheduler states
       for i, scheduler in enumerate(SCREAMING_SNAKE_CASE__					):
              _lowerCamelCase	:		Any          =F'''{SCHEDULER_NAME}.bin''' if i == 0 else F'''{SCHEDULER_NAME}_{i}.bin'''
              _lowerCamelCase	:		Union[str, Any]          =os.path.join(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              scheduler.load_state_dict(torch.load(SCREAMING_SNAKE_CASE__					)					)
       logger.info('All scheduler states loaded successfully'					)

       # GradScaler state
       if scaler is not None:
              _lowerCamelCase	:		str          =os.path.join(SCREAMING_SNAKE_CASE__		,      SCREAMING_SNAKE_CASE__					)
              scaler.load_state_dict(torch.load(SCREAMING_SNAKE_CASE__					)					)
              logger.info('GradScaler state loaded successfully'					)

       # Random states
       try:
              _lowerCamelCase	:		Any          =torch.load(os.path.join(SCREAMING_SNAKE_CASE__		,      F'''{RNG_STATE_NAME}_{process_index}.pkl'''					)					)
              random.setstate(states['random_state']					)
              np.random.set_state(states['numpy_random_seed']					)
              torch.set_rng_state(states['torch_manual_seed']					)
              if is_xpu_available():
                     torch.xpu.set_rng_state_all(states['torch_xpu_manual_seed']					)
              else:
                     torch.cuda.set_rng_state_all(states['torch_cuda_manual_seed']					)
              if is_tpu_available():
                     xm.set_rng_state(states['xm_seed']					)
              logger.info('All random states loaded successfully'					)
       except Exception:
              logger.info('Could not load random states'					)




def      a_				(   SCREAMING_SNAKE_CASE__ :				str		,      SCREAMING_SNAKE_CASE__ :				List[Any]		,      SCREAMING_SNAKE_CASE__ :				int = 0					):
       '''simple docstring'''





       _lowerCamelCase	:		int          =Path(SCREAMING_SNAKE_CASE__					) / F'''custom_checkpoint_{index}.pkl'''
       logger.info(F'''Saving the state of {get_pretty_name(SCREAMING_SNAKE_CASE__					)} to {save_location}'''					)
       torch.save(obj.state_dict()		,      SCREAMING_SNAKE_CASE__					)




def      a_				(   SCREAMING_SNAKE_CASE__ :				Any		,      SCREAMING_SNAKE_CASE__ :				Tuple		,      SCREAMING_SNAKE_CASE__ :				int = 0					):
       '''simple docstring'''





       _lowerCamelCase	:		Dict          =F'''{path}/custom_checkpoint_{index}.pkl'''
       logger.info(F'''Loading the state of {get_pretty_name(SCREAMING_SNAKE_CASE__					)} from {load_location}'''					)
       obj.load_state_dict(torch.load(SCREAMING_SNAKE_CASE__		,      map_location='cpu'					)					)






from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available


lowerCamelCase						 =	{'configuration_visual_bert': ['VISUAL_BERT_PRETRAINED_CONFIG_ARCHIVE_MAP', 'VisualBertConfig']}

try:
 if not is_torch_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 lowerCamelCase						 =	[
     'VISUAL_BERT_PRETRAINED_MODEL_ARCHIVE_LIST',
     'VisualBertForMultipleChoice',
     'VisualBertForPreTraining',
     'VisualBertForQuestionAnswering',
     'VisualBertForRegionToPhraseAlignment',
     'VisualBertForVisualReasoning',
     'VisualBertLayer',
     'VisualBertModel',
     'VisualBertPreTrainedModel',
 ]


if TYPE_CHECKING:
 from .configuration_visual_bert import VISUAL_BERT_PRETRAINED_CONFIG_ARCHIVE_MAP, VisualBertConfig

 try:
  if not is_torch_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .modeling_visual_bert import (
      VISUAL_BERT_PRETRAINED_MODEL_ARCHIVE_LIST,
      VisualBertForMultipleChoice,
      VisualBertForPreTraining,
      VisualBertForQuestionAnswering,
      VisualBertForRegionToPhraseAlignment,
      VisualBertForVisualReasoning,
      VisualBertLayer,
      VisualBertModel,
      VisualBertPreTrainedModel,
  )


else:
 import sys

 lowerCamelCase						 =	_LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)


