"""simple docstring"""



import contextlib
from multiprocessing import Pool, RLock

from tqdm.auto import tqdm

from ..utils import experimental, logging


SCREAMING_SNAKE_CASE__:Union[str, Any]			=	logging.get_logger(__name__)






class 				snake_case__     :
 _snake_case   :			List[str]           =		None



@experimental
def 					_lowerCamelCase(					a ,  a ,  a ,  a ,  a ,  a ,  a							):
       if ParallelBackendConfig.backend_name is None:
              return _map_with_multiprocessing_pool(
                  a ,  a ,  a ,  a ,  a ,  a ,  a							)

       return _map_with_joblib(a ,  a ,  a ,  a ,  a ,  a ,  a							)



def 					_lowerCamelCase(					a ,  a ,  a ,  a ,  a ,  a ,  a							):
       __a     				=  num_proc if num_proc <= len(a							) else len(a							)
       __a     				=  []  # We organize the splits ourselve (contiguous splits)
       for index in range(a							):
              __a     				=  len(a							) // num_proc
              __a     				=  len(a							) % num_proc
              __a     				=  div * index + min(a ,  a							)
              __a     				=  start + div + (1 if index < mod else 0)
              split_kwds.append((function, iterable[start:end], types, index, disable_tqdm, desc)							)

       if len(a							) != sum(len(i[1]							) for i in split_kwds							):
              raise ValueError(
                  F"Error dividing inputs iterable among processes. "
                  F"Total number of objects {len(a							)}, "
                  F"length: {sum(len(i[1]							) for i in split_kwds							)}"							)

       logger.info(
           F"Spawning {num_proc} processes for {len(a							)} objects in slices of {[len(i[1]							) for i in split_kwds]}"							)
       __a				, __a     				=  None, None
       if not disable_tqdm:
              __a				, __a     				=  (RLock(),), tqdm.set_lock
       with Pool(a ,  initargs=a ,  initializer=a							) as pool:
              __a     				=  pool.map(a ,  a							)
       logger.info(F"Finished {num_proc} processes"							)
       __a     				=  [obj for proc_res in mapped for obj in proc_res]
       logger.info(F"Unpacked {len(a							)} objects"							)

       return mapped



def 					_lowerCamelCase(					a ,  a ,  a ,  a ,  a ,  a ,  a							):
       # progress bar is not yet supported for _map_with_joblib, because tqdm couldn't accurately be applied to joblib,
       # and it requires monkey-patching joblib internal classes which is subject to change
       import joblib

       with joblib.parallel_backend(ParallelBackendConfig.backend_name ,  n_jobs=a							):
              return joblib.Parallel()(
                  joblib.delayed(a							)((function, obj, types, None, True, None)							) for obj in iterable							)




@experimental
@contextlib.contextmanager
def 					_lowerCamelCase(					a							):
       __a     				=  backend_name

       if backend_name == "spark":
              from joblibspark import register_spark

              register_spark()

              # TODO: call create_cache_and_write_probe if "download" in steps
              # TODO: raise NotImplementedError when Dataset.map etc is called

       try:
              yield
       finally:
              __a     				=  None

"""simple docstring"""



from ...configuration_utils import PretrainedConfig
from ...utils import logging
from ...utils.backbone_utils import BackboneConfigMixin, get_aligned_output_features_output_indices


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

SCREAMING_SNAKE_CASE__:int			=	{
    """microsoft/focalnet-tiny""": """https://huggingface.co/microsoft/focalnet-tiny/resolve/main/config.json""",
}






class 				snake_case__     (   snake_case_,		snake_case_   ):
 _snake_case   :			List[Any]           =		"""focalnet"""


 def __init__(				self  ,						lowerCamelCase=224  ,						lowerCamelCase=4  ,						lowerCamelCase=3  ,						lowerCamelCase=96  ,						lowerCamelCase=False  ,						lowerCamelCase=[192, 384, 768, 768]  ,						lowerCamelCase=[2, 2, 6, 2]  ,						lowerCamelCase=[2, 2, 2, 2]  ,						lowerCamelCase=[3, 3, 3, 3]  ,						lowerCamelCase="gelu"  ,						lowerCamelCase=4.0  ,						lowerCamelCase=0.0  ,						lowerCamelCase=0.1  ,						lowerCamelCase=False  ,						lowerCamelCase=1E-4  ,						lowerCamelCase=False  ,						lowerCamelCase=False  ,						lowerCamelCase=False  ,						lowerCamelCase=0.02  ,						lowerCamelCase=1E-5  ,						lowerCamelCase=32  ,						lowerCamelCase=None  ,						lowerCamelCase=None  ,						**lowerCamelCase  ,						):
        super().__init__(**lowerCamelCase		)

        __a     				=  image_size
        __a     				=  patch_size
        __a     				=  num_channels
        __a     				=  embed_dim
        __a     				=  use_conv_embed
        __a     				=  hidden_sizes
        __a     				=  depths
        __a     				=  focal_levels
        __a     				=  focal_windows
        __a     				=  hidden_act
        __a     				=  mlp_ratio
        __a     				=  hidden_dropout_prob
        __a     				=  drop_path_rate
        __a     				=  use_layerscale
        __a     				=  layerscale_value
        __a     				=  use_post_layernorm
        __a     				=  use_post_layernorm_in_modulation
        __a     				=  normalize_modulator
        __a     				=  initializer_range
        __a     				=  layer_norm_eps
        __a     				=  encoder_stride
        __a     				=  ["stem"] + [F"stage{idx}" for idx in range(1  ,						len(self.depths		) + 1		)]
        __a				, __a     				=  get_aligned_output_features_output_indices(
            out_features=lowerCamelCase  ,						out_indices=lowerCamelCase  ,						stage_names=self.stage_names		)
