from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_torch_available,
)


SCREAMING_SNAKE_CASE__      						=  {
    "configuration_mega": ["MEGA_PRETRAINED_CONFIG_ARCHIVE_MAP", "MegaConfig", "MegaOnnxConfig"],
}

try:
					if not is_torch_available():
										raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
					pass
else:
					SCREAMING_SNAKE_CASE__      						=  [
					    "MEGA_PRETRAINED_MODEL_ARCHIVE_LIST",
					    "MegaForCausalLM",
					    "MegaForMaskedLM",
					    "MegaForMultipleChoice",
					    "MegaForQuestionAnswering",
					    "MegaForSequenceClassification",
					    "MegaForTokenClassification",
					    "MegaModel",
					    "MegaPreTrainedModel",
					]

if TYPE_CHECKING:
					from .configuration_mega import MEGA_PRETRAINED_CONFIG_ARCHIVE_MAP, MegaConfig, MegaOnnxConfig

					try:
										if not is_torch_available():
															raise OptionalDependencyNotAvailable()
					except OptionalDependencyNotAvailable:
										pass
					else:
										from .modeling_mega import (
										    MEGA_PRETRAINED_MODEL_ARCHIVE_LIST,
										    MegaForCausalLM,
										    MegaForMaskedLM,
										    MegaForMultipleChoice,
										    MegaForQuestionAnswering,
										    MegaForSequenceClassification,
										    MegaForTokenClassification,
										    MegaModel,
										    MegaPreTrainedModel,
										)

else:
					import sys

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



"""simple docstring"""
import unittest

from transformers.utils.backbone_utils import (
    BackboneMixin,
    get_aligned_output_features_output_indices,
    verify_out_features_out_indices,
)



class   lowerCAmelCase_    (			unittest.TestCase					):



				"""simple docstring"""

				def 		snake_case (				self    ):






										"""simple docstring"""

										snake_case								=			['a', 'b', 'c']

										# Defaults to last layer if both are None
										snake_case					,snake_case								=			get_aligned_output_features_output_indices(lowerCAmelCase		,    lowerCAmelCase		,    lowerCAmelCase    )
										self.assertEqual(lowerCAmelCase		,    ['c']    )
										self.assertEqual(lowerCAmelCase		,    [2]    )

										# Out indices set to match out features
										snake_case					,snake_case								=			get_aligned_output_features_output_indices(['a', 'c']		,    lowerCAmelCase		,    lowerCAmelCase    )
										self.assertEqual(lowerCAmelCase		,    ['a', 'c']    )
										self.assertEqual(lowerCAmelCase		,    [0, 2]    )

										# Out features set to match out indices
										snake_case					,snake_case								=			get_aligned_output_features_output_indices(lowerCAmelCase		,    [0, 2]		,    lowerCAmelCase    )
										self.assertEqual(lowerCAmelCase		,    ['a', 'c']    )
										self.assertEqual(lowerCAmelCase		,    [0, 2]    )

										# Out features selected from negative indices
										snake_case					,snake_case								=			get_aligned_output_features_output_indices(lowerCAmelCase		,    [-3, -1]		,    lowerCAmelCase    )
										self.assertEqual(lowerCAmelCase		,    ['a', 'c']    )
										self.assertEqual(lowerCAmelCase		,    [-3, -1]    )

				def 		snake_case (				self    ):






										"""simple docstring"""

										with self.assertRaises(lowerCAmelCase    ):
																verify_out_features_out_indices(['a', 'b']		,    (0, 1)		,    lowerCAmelCase    )

										# Out features must be a list
										with self.assertRaises(lowerCAmelCase    ):
																verify_out_features_out_indices(('a', 'b')		,    (0, 1)		,    ['a', 'b']    )

										# Out features must be a subset of stage names
										with self.assertRaises(lowerCAmelCase    ):
																verify_out_features_out_indices(['a', 'b']		,    (0, 1)		,    ['a']    )

										# Out indices must be a list or tuple
										with self.assertRaises(lowerCAmelCase    ):
																verify_out_features_out_indices(lowerCAmelCase		,    0		,    ['a', 'b']    )

										# Out indices must be a subset of stage names
										with self.assertRaises(lowerCAmelCase    ):
																verify_out_features_out_indices(lowerCAmelCase		,    (0, 1)		,    ['a']    )

										# Out features and out indices must be the same length
										with self.assertRaises(lowerCAmelCase    ):
																verify_out_features_out_indices(['a', 'b']		,    (0,)		,    ['a', 'b', 'c']    )

										# Out features should match out indices
										with self.assertRaises(lowerCAmelCase    ):
																verify_out_features_out_indices(['a', 'b']		,    (0, 2)		,    ['a', 'b', 'c']    )

										# Out features and out indices should be in order
										with self.assertRaises(lowerCAmelCase    ):
																verify_out_features_out_indices(['b', 'a']		,    (0, 1)		,    ['a', 'b']    )

										# Check passes with valid inputs
										verify_out_features_out_indices(['a', 'b', 'd']		,    (0, 1, -1)		,    ['a', 'b', 'c', 'd']    )

				def 		snake_case (				self    ):






										"""simple docstring"""

										snake_case								=			BackboneMixin()

										snake_case								=			['a', 'b', 'c']
										snake_case								=			['a', 'c']
										snake_case								=			[0, 2]

										# Check that the output features and indices are set correctly
										self.assertEqual(backbone.out_features		,    ['a', 'c']    )
										self.assertEqual(backbone.out_indices		,    [0, 2]    )

										# Check out features and indices are updated correctly
										snake_case								=			['a', 'b']
										self.assertEqual(backbone.out_features		,    ['a', 'b']    )
										self.assertEqual(backbone.out_indices		,    [0, 1]    )

										snake_case								=			[-3, -1]
										self.assertEqual(backbone.out_features		,    ['a', 'c']    )
										self.assertEqual(backbone.out_indices		,    [-3, -1]    )


