
"""simple docstring"""






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


_lowercase							=				logging.get_logger(__name__)

class 					__a     ( __a					,   __a       ):



							'''simple docstring'''







							_lowerCamelCase					:			Union[str, Any]          =   """maskformer-swin"""

							_lowerCamelCase					:			List[Any]          =   {
							    """num_attention_heads""": """num_heads""",
							    """num_hidden_layers""": """num_layers""",
							}
							def __init__(     self  ,    _lowerCamelCase=224  ,    _lowerCamelCase=4  ,    _lowerCamelCase=3  ,    _lowerCamelCase=96  ,    _lowerCamelCase=[2, 2, 6, 2]  ,    _lowerCamelCase=[3, 6, 12, 24]  ,    _lowerCamelCase=7  ,    _lowerCamelCase=4.0  ,    _lowerCamelCase=True  ,    _lowerCamelCase=0.0  ,    _lowerCamelCase=0.0  ,    _lowerCamelCase=0.1  ,    _lowerCamelCase="gelu"  ,    _lowerCamelCase=False  ,    _lowerCamelCase=0.02  ,    _lowerCamelCase=1e-5  ,    _lowerCamelCase=None  ,    _lowerCamelCase=None  ,    **_lowerCamelCase  ,    )			->							Optional[Any]:




										'''simple docstring'''
										super().__init__(**_lowerCamelCase       )

										__lowercase       =       image_size
										__lowercase       =       patch_size
										__lowercase       =       num_channels
										__lowercase       =       embed_dim
										__lowercase       =       depths
										__lowercase       =       len(_lowerCamelCase       )
										__lowercase       =       num_heads
										__lowercase       =       window_size
										__lowercase       =       mlp_ratio
										__lowercase       =       qkv_bias
										__lowercase       =       hidden_dropout_prob
										__lowercase       =       attention_probs_dropout_prob
										__lowercase       =       drop_path_rate
										__lowercase       =       hidden_act
										__lowercase       =       use_absolute_embeddings
										__lowercase       =       layer_norm_eps
										__lowercase       =       initializer_range
										# we set the hidden_size attribute in order to make Swin work with VisionEncoderDecoderModel
										# this indicates the channel dimension after the last stage of the model
										__lowercase       =       int(embed_dim * 2 ** (len(_lowerCamelCase       ) - 1)       )
										__lowercase       =       ["stem"] + [f'''stage{idx}''' for idx in range(1  ,    len(_lowerCamelCase       ) + 1       )]
										__lowercase   ,					__lowercase       =       get_aligned_output_features_output_indices(
										    out_features=_lowerCamelCase  ,    out_indices=_lowerCamelCase  ,    stage_names=self.stage_names       )







"""simple docstring"""






import html

from ...feature_extraction_utils import BatchFeature, FeatureExtractionMixin
from ...utils import is_bsa_available, logging, requires_backends


if is_bsa_available():
					import bsa
					from bsa import BeautifulSoup


_lowercase							=				logging.get_logger(__name__)

class 					__a     ( __a       ):



							'''simple docstring'''







							def __init__(     self  ,    **_lowerCamelCase       )			->							List[Any]:




										'''simple docstring'''
										requires_backends(self  ,    ["bs4"]       )
										super().__init__(**_lowerCamelCase       )
							def   SCREAMING_SNAKE_CASE						(     self  ,    _lowerCamelCase       )			->							Tuple:




										'''simple docstring'''
										__lowercase       =       []
										__lowercase       =       []
										__lowercase       =       element if element.name else element.parent
										for parent in child.parents:  # type: bs4.element.Tag
													__lowercase       =       parent.find_all(child.name  ,    recursive=_lowerCamelCase       )
													xpath_tags.append(child.name       )
													xpath_subscripts.append(
													    0 if 1 == len(_lowerCamelCase       ) else next(i for i, s in enumerate(_lowerCamelCase  ,    1       ) if s is child       )       )
													__lowercase       =       parent
										xpath_tags.reverse()
										xpath_subscripts.reverse()
										return xpath_tags, xpath_subscripts
							def   SCREAMING_SNAKE_CASE						(     self  ,    _lowerCamelCase       )			->							Union[str, Any]:




										'''simple docstring'''
										__lowercase       =       BeautifulSoup(_lowerCamelCase  ,    "html.parser"       )

										__lowercase       =       []
										__lowercase       =       []
										__lowercase       =       []

										for element in html_code.descendants:
													if type(_lowerCamelCase       ) == bsa.element.NavigableString:
																if type(element.parent       ) != bsa.element.Tag:
																			continue

																__lowercase       =       html.unescape(_lowerCamelCase       ).strip()
																if not text_in_this_tag:
																			continue

																all_doc_strings.append(_lowerCamelCase       )

																__lowercase   ,					__lowercase       =       self.xpath_soup(_lowerCamelCase       )
																stringaxtag_seq.append(_lowerCamelCase       )
																stringaxsubs_seq.append(_lowerCamelCase       )

										if len(_lowerCamelCase       ) != len(_lowerCamelCase       ):
													raise ValueError("Number of doc strings and xtags does not correspond"       )
										if len(_lowerCamelCase       ) != len(_lowerCamelCase       ):
													raise ValueError("Number of doc strings and xsubs does not correspond"       )

										return all_doc_strings, stringaxtag_seq, stringaxsubs_seq
							def   SCREAMING_SNAKE_CASE						(     self  ,    _lowerCamelCase  ,    _lowerCamelCase       )			->							Tuple:




										'''simple docstring'''
										__lowercase       =       ""
										for tagname, subs in zip(_lowerCamelCase  ,    _lowerCamelCase       ):
													xpath += f'''/{tagname}'''
													if subs != 0:
																xpath += f'''[{subs}]'''
										return xpath





							def __call__(     self  ,    _lowerCamelCase       )			->							BatchFeature:




										'''simple docstring'''
										__lowercase       =       False

										# Check that strings has a valid type
										if isinstance(_lowerCamelCase  ,    _lowerCamelCase       ):
													__lowercase       =       True
										elif isinstance(_lowerCamelCase  ,    (list, tuple)       ):
													if len(_lowerCamelCase       ) == 0 or isinstance(html_strings[0]  ,    _lowerCamelCase       ):
																__lowercase       =       True

										if not valid_strings:
													raise ValueError(
													    "HTML strings must of type `str`, `List[str]` (batch of examples), "
													    f'''but is of type {type(_lowerCamelCase       )}.'''       )

										__lowercase       =       bool(isinstance(_lowerCamelCase  ,    (list, tuple)       ) and (isinstance(html_strings[0]  ,    _lowerCamelCase       ))       )

										if not is_batched:
													__lowercase       =       [html_strings]

										# Get nodes + xpaths
										__lowercase       =       []
										__lowercase       =       []
										for html_string in html_strings:
													__lowercase   ,					__lowercase   ,					__lowercase       =       self.get_three_from_single(_lowerCamelCase       )
													nodes.append(_lowerCamelCase       )
													__lowercase       =       []
													for node, tag_list, sub_list in zip(_lowerCamelCase  ,    _lowerCamelCase  ,    _lowerCamelCase       ):
																__lowercase       =       self.construct_xpath(_lowerCamelCase  ,    _lowerCamelCase       )
																xpath_strings.append(_lowerCamelCase       )
													xpaths.append(_lowerCamelCase       )

										# return as Dict
										__lowercase       =       {"nodes": nodes, "xpaths": xpaths}
										__lowercase       =       BatchFeature(data=_lowerCamelCase  ,    tensor_type=_lowerCamelCase       )

										return encoded_inputs





