





"""simple docstring"""




import warnings

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.metrics import pairwise_distances

warnings.filterwarnings('ignore')

lowerCamelCase_	:		Any         =   "K-MEANS-CLUST/ "





def 		UpperCAmelCase__						(	_UpperCAmelCase					,   _UpperCAmelCase					,   _UpperCAmelCase=None   ):






  """simple docstring"""





  if seed is not None:  # useful for obtaining consistent results
    np.random.seed(__A   )
  A_    :			List[str]									=    data.shape[0]  # number of data points

  # Pick K indices from range [0, N).
  A_    :			List[Any]									=    np.random.randint(0					,   __A					,   __A   )

  # Keep centroids as dense format, as many entries will be nonzero due to averaging.
  # As long as at least one document in a cluster contains a word,
  # it will carry a nonzero weight in the TF-IDF vector of the centroid.
  A_    :			Any									=    data[rand_indices, :]

  return centroids





def 		UpperCAmelCase__						(	_UpperCAmelCase					,   _UpperCAmelCase   ):






  """simple docstring"""





  return pairwise_distances(__A					,   __A					,   metric='euclidean'   )





def 		UpperCAmelCase__						(	_UpperCAmelCase					,   _UpperCAmelCase   ):






  """simple docstring"""





  A_    :			int									=    centroid_pairwise_dist(__A					,   __A   )

  # Compute cluster assignments for each data point:
  # Fill in the blank (RHS only)
  A_    :			Dict									=    np.argmin(__A					,   axis=1   )

  return cluster_assignment





def 		UpperCAmelCase__						(	_UpperCAmelCase					,   _UpperCAmelCase					,   _UpperCAmelCase   ):






  """simple docstring"""





  A_    :			Optional[int]									=    []
  for i in range(__A   ):
    # Select all data points that belong to cluster i. Fill in the blank (RHS only)
    A_    :			Dict									=    data[cluster_assignment == i]
    # Compute the mean of the data points. Fill in the blank (RHS only)
    A_    :			Any									=    member_data_points.mean(axis=0   )
    new_centroids.append(__A   )
  A_    :			Optional[Any]									=    np.array(__A   )

  return new_centroids





def 		UpperCAmelCase__						(	_UpperCAmelCase					,   _UpperCAmelCase					,   _UpperCAmelCase					,   _UpperCAmelCase   ):






  """simple docstring"""





  A_    :			str									=    0.0
  for i in range(__A   ):
    # Select all data points that belong to cluster i. Fill in the blank (RHS only)
    A_    :			Any									=    data[cluster_assignment == i, :]

    if member_data_points.shape[0] > 0:  # check if i-th cluster is non-empty
      # Compute distances from centroid to data points (RHS only)
      A_    :			Optional[Any]									=    pairwise_distances(
          __A					,   [centroids[i]]					,   metric='euclidean'   )
      A_    :			Optional[Any]									=    distances**2
      heterogeneity += np.sum(__A   )

  return heterogeneity





def 		UpperCAmelCase__						(	_UpperCAmelCase					,   _UpperCAmelCase   ):






  """simple docstring"""





  plt.figure(figsize=(7, 4)   )
  plt.plot(__A					,   linewidth=4   )
  plt.xlabel('# Iterations'   )
  plt.ylabel('Heterogeneity'   )
  plt.title(f"""Heterogeneity of clustering over time, K={k:d}"""   )
  plt.rcParams.update({'font.size': 16}   )
  plt.show()





def 		UpperCAmelCase__						(	_UpperCAmelCase					,   _UpperCAmelCase					,   _UpperCAmelCase					,   _UpperCAmelCase=500					,   _UpperCAmelCase=None					,   _UpperCAmelCase=False   ):






  """simple docstring"""





  A_    :			List[Any]									=    initial_centroids[:]
  A_    :			Optional[int]									=    None

  for itr in range(__A   ):
    if verbose:
      print(__A					,   end=''   )

    # 1. Make cluster assignments using nearest centroids
    A_    :			Union[str, Any]									=    assign_clusters(__A					,   __A   )

    # 2. Compute a new centroid for each of the k clusters, averaging all data
    #    points assigned to that cluster.
    A_    :			Optional[Any]									=    revise_centroids(__A					,   __A					,   __A   )

    # Check for convergence: if none of the assignments changed, stop
    if (
        prev_cluster_assignment is not None
        and (prev_cluster_assignment == cluster_assignment).all()
    ):
      break

    # Print number of new assignments
    if prev_cluster_assignment is not None:
      A_    :			Tuple									=    np.sum(prev_cluster_assignment != cluster_assignment   )
      if verbose:
        print(
            f"""    {num_changed:5d} elements changed their cluster assignment."""   )

        # Record heterogeneity convergence metric
    if record_heterogeneity is not None:
      # YOUR CODE HERE
      A_    :			Optional[Any]									=    compute_heterogeneity(__A					,   __A					,   __A					,   __A   )
      record_heterogeneity.append(__A   )

    A_    :			List[Any]									=    cluster_assignment[:]

  return centroids, cluster_assignment


# Mock test below
if False:  # change to true to run this test case.
   from sklearn import datasets as ds

   lowerCamelCase_	:		List[str]         =   ds.load_iris()
   lowerCamelCase_	:		int         =   3
   lowerCamelCase_	:		List[Any]         =   []
   lowerCamelCase_	:		Optional[Any]         =   get_initial_centroids(dataset['data'], k, seed=0)
   lowerCamelCase_	:		str         =   kmeans(
       dataset['data'],
       k,
       initial_centroids,
       maxiter=4_00,
       record_heterogeneity=heterogeneity,
       verbose=True,
   )
   plot_heterogeneity(heterogeneity, k)





def 		UpperCAmelCase__						(	_UpperCAmelCase					,   _UpperCAmelCase					,   _UpperCAmelCase=None   ):






  """simple docstring"""





  if fill_missing_report:
    A_    :			int									=    df.fillna(value=__A   )
  A_    :			int									=    1
  A_    :			Union[str, Any]									=    df.select_dtypes(np.number   ).columns
  A_    :			Optional[int]									=    (
      df.groupby(['Cluster']   )[  # construct report dataframe
          numeric_cols
      ]  # group by cluster number
      .agg(
          [
              ('sum', np.sum),
              ('mean_with_zeros', lambda _UpperCAmelCase   : np.mean(np.nan_to_num(__A   )   )),
              ('mean_without_zeros', lambda _UpperCAmelCase   : x.replace(0					,   np.NaN   ).mean()),
              (
                  'mean_25-75',
                  lambda _UpperCAmelCase   : np.mean(
                      np.nan_to_num(
                          sorted(__A   )[
                              round(len(__A   ) * 25 / 100   ) : round(len(__A   ) * 75 / 100   )
                          ]   )   ),
              ),
              ('mean_with_na', np.mean),
              ('min', lambda _UpperCAmelCase   : x.min()),
              ('5%', lambda _UpperCAmelCase   : x.quantile(0.05   )),
              ('25%', lambda _UpperCAmelCase   : x.quantile(0.25   )),
              ('50%', lambda _UpperCAmelCase   : x.quantile(0.50   )),
              ('75%', lambda _UpperCAmelCase   : x.quantile(0.75   )),
              ('95%', lambda _UpperCAmelCase   : x.quantile(0.95   )),
              ('max', lambda _UpperCAmelCase   : x.max()),
              ('count', lambda _UpperCAmelCase   : x.count()),
              ('stdev', lambda _UpperCAmelCase   : x.std()),
              ('mode', lambda _UpperCAmelCase   : x.mode()[0]),
              ('median', lambda _UpperCAmelCase   : x.median()),
              ('# > 0', lambda _UpperCAmelCase   : (x > 0).sum()),
          ]   )
      .T.reset_index()
      .rename(index=__A					,   columns={'level_0': 'Features', 'level_1': 'Type'}   )
  )  # rename columns
  # calculate the size of cluster(count of clientID's)
  A_    :			Optional[Any]									=    report[
      (report["""Features"""] == """dummy""") & (report["""Type"""] == """count""")
  ].copy()  # avoid SettingWithCopyWarning
  A_    :			List[str]									=    (
      """ClusterSize"""  # rename created cluster df to match report column names
  )
  A_    :			Tuple									=    """# of Customers"""
  A_    :			int									=    pd.DataFrame(
      clustersize.iloc[:, 2:].values
      / clustersize.iloc[:, 2:].values.sum()   )
  A_    :			str									=    """% of Customers"""  # rename created cluster df to match report column names
  A_    :			Optional[Any]									=    """ClusterProportion"""
  A_    :			Tuple									=    clusterproportion.columns.tolist()
  A_    :			Optional[Any]									=    cols[-2:] + cols[:-2]
  A_    :			List[Any]									=    clusterproportion[cols]  # rearrange columns to match report
  A_    :			List[str]									=    report.columns
  A_    :			Tuple									=    pd.DataFrame(
      abs(
          report[report['Type'] == 'count'].iloc[:, 2:].values
          - clustersize.iloc[:, 2:].values   )   )  # generating df with count of nan values
  A_    :			Union[str, Any]									=    0
  A_    :			Tuple									=    """# of nan"""
  A_    :			List[Any]									=    report[
      report["""Type"""] == """count"""
  ].Features.tolist()  # filling values in order to match report
  A_    :			Any									=    a.columns.tolist()
  A_    :			List[Any]									=    cols[-2:] + cols[:-2]
  A_    :			Dict									=    a[cols]  # rearrange columns to match report
  A_    :			List[Any]									=    report.columns  # rename columns to match report
  A_    :			Union[str, Any]									=    report.drop(
      report[report.Type == 'count'].index   )  # drop count values except cluster size
  A_    :			Optional[int]									=    pd.concat(
      [report, a, clustersize, clusterproportion]					,   axis=0   )  # concat report with clustert size and nan values
  A_    :			str									=    report["""Features"""].isin(__A   )
  A_    :			int									=    report.columns.tolist()
  A_    :			Optional[Any]									=    cols[0:2] + cols[-1:] + cols[2:-1]
  A_    :			Dict									=    report[cols]
  A_    :			Any									=    {
      """ClusterSize""": 9,
      """ClusterProportion""": 8,
      """mean_with_zeros""": 7,
      """mean_with_na""": 6,
      """max""": 5,
      """50%""": 4,
      """min""": 3,
      """25%""": 2,
      """75%""": 1,
      """# of nan""": 0,
      """# > 0""": -1,
      """sum_with_na""": -2,
  }
  A_    :			List[Any]									=    (
      report.assign(
          Sortera=lambda _UpperCAmelCase   : x.Type.map(__A   )					,   Sortera=lambda _UpperCAmelCase   : list(reversed(range(len(__A   )   )   )   )					,   )
      .sort_values(['Sorter1', 'Mark', 'Sorter2']					,   ascending=__A   )
      .drop(['Sorter1', 'Sorter2']					,   axis=1   )
  )
  A_    :			Optional[int]									=    """"""
  A_    :			List[str]									=    report.reset_index()
  A_    :			Union[str, Any]									=    report.drop(columns=['index']   )
  return report


if __name__ == "__main__":
   import doctest

   doctest.testmod()
import unittest

from transformers import YosoConfig, is_torch_available
from transformers.testing_utils import require_torch, slow, torch_device

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
    import torch

    from transformers import (
        YosoForMaskedLM,
        YosoForMultipleChoice,
        YosoForQuestionAnswering,
        YosoForSequenceClassification,
        YosoForTokenClassification,
        YosoModel,
    )
    from transformers.models.yoso.modeling_yoso import YOSO_PRETRAINED_MODEL_ARCHIVE_LIST




class 						__snake_case						:





      '''simple docstring'''






      def __init__(       self  :					List[Any]     ,	_UpperCamelCase  :					Union[str, Any]     ,	_UpperCamelCase  :					Tuple=13     ,	_UpperCamelCase  :					Union[str, Any]=7     ,	_UpperCamelCase  :					Union[str, Any]=True     ,	_UpperCamelCase  :					Dict=True     ,	_UpperCamelCase  :					List[Any]=True     ,	_UpperCamelCase  :					Optional[Any]=True     ,	_UpperCamelCase  :					Optional[int]=99     ,	_UpperCamelCase  :					List[Any]=32     ,	_UpperCamelCase  :					Dict=5     ,	_UpperCamelCase  :					Dict=4     ,	_UpperCamelCase  :					Optional[int]=37     ,	_UpperCamelCase  :					List[Any]="gelu"     ,	_UpperCamelCase  :					int=0.1     ,	_UpperCamelCase  :					str=0.1     ,	_UpperCamelCase  :					int=512     ,	_UpperCamelCase  :					Optional[Any]=16     ,	_UpperCamelCase  :					Tuple=2     ,	_UpperCamelCase  :					Any=0.0_2     ,	_UpperCamelCase  :					Any=3     ,	_UpperCamelCase  :					Union[str, Any]=4     ,	_UpperCamelCase  :					List[Any]=None     ,	)					->List[Any]:


          """simple docstring"""


          _lowerCamelCase  :		List[str]			    =    parent
          _lowerCamelCase  :		List[Any]			    =    batch_size
          _lowerCamelCase  :		int			    =    seq_length
          _lowerCamelCase  :		List[Any]			    =    is_training
          _lowerCamelCase  :		List[Any]			    =    use_input_mask
          _lowerCamelCase  :		Tuple			    =    use_token_type_ids
          _lowerCamelCase  :		int			    =    use_labels
          _lowerCamelCase  :		int			    =    vocab_size
          _lowerCamelCase  :		List[str]			    =    hidden_size
          _lowerCamelCase  :		List[Any]			    =    num_hidden_layers
          _lowerCamelCase  :		str			    =    num_attention_heads
          _lowerCamelCase  :		List[str]			    =    intermediate_size
          _lowerCamelCase  :		List[Any]			    =    hidden_act
          _lowerCamelCase  :		Optional[int]			    =    hidden_dropout_prob
          _lowerCamelCase  :		Optional[int]			    =    attention_probs_dropout_prob
          _lowerCamelCase  :		Tuple			    =    max_position_embeddings
          _lowerCamelCase  :		List[str]			    =    type_vocab_size
          _lowerCamelCase  :		Dict			    =    type_sequence_label_size
          _lowerCamelCase  :		str			    =    initializer_range
          _lowerCamelCase  :		Tuple			    =    num_labels
          _lowerCamelCase  :		Union[str, Any]			    =    num_choices
          _lowerCamelCase  :		str			    =    scope



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Union[str, Any])					->str:


          """simple docstring"""


          _lowerCamelCase  :		Optional[int]			    =    ids_tensor([self.batch_size, self.seq_length]     ,	self.vocab_size)

          _lowerCamelCase  :		Tuple			    =    None
          if self.use_input_mask:
              _lowerCamelCase  :		Dict			    =    random_attention_mask([self.batch_size, self.seq_length])

          _lowerCamelCase  :		str			    =    None
          if self.use_token_type_ids:
              _lowerCamelCase  :		Optional[Any]			    =    ids_tensor([self.batch_size, self.seq_length]     ,	self.type_vocab_size)

          _lowerCamelCase  :		List[str]			    =    None
          _lowerCamelCase  :		Optional[int]			    =    None
          _lowerCamelCase  :		Dict			    =    None
          if self.use_labels:
              _lowerCamelCase  :		List[str]			    =    ids_tensor([self.batch_size]     ,	self.type_sequence_label_size)
              _lowerCamelCase  :		List[str]			    =    ids_tensor([self.batch_size, self.seq_length]     ,	self.num_labels)
              _lowerCamelCase  :		Any			    =    ids_tensor([self.batch_size]     ,	self.num_choices)

          _lowerCamelCase  :		Optional[Any]			    =    self.get_config()

          return config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Optional[int])					->str:


          """simple docstring"""


          return YosoConfig(
              vocab_size=self.vocab_size     ,	hidden_size=self.hidden_size     ,	num_hidden_layers=self.num_hidden_layers     ,	num_attention_heads=self.num_attention_heads     ,	intermediate_size=self.intermediate_size     ,	hidden_act=self.hidden_act     ,	hidden_dropout_prob=self.hidden_dropout_prob     ,	attention_probs_dropout_prob=self.attention_probs_dropout_prob     ,	max_position_embeddings=self.max_position_embeddings     ,	type_vocab_size=self.type_vocab_size     ,	is_decoder=_UpperCamelCase     ,	initializer_range=self.initializer_range     ,	)



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Union[str, Any])					->Optional[Any]:


          """simple docstring"""


          _lowerCamelCase  :		Union[str, Any]			    =    self.get_config()
          _lowerCamelCase  :		List[str]			    =    300
          return config



      def 						_SCREAMING_SNAKE_CASE     (       self  :					List[Any])					->Optional[Any]:


          """simple docstring"""


          (
              (
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				
          )  :		Dict			    =    self.prepare_config_and_inputs()

          _lowerCamelCase  :		int			    =    True
          _lowerCamelCase  :		List[Any]			    =    floats_tensor([self.batch_size, self.seq_length, self.hidden_size])
          _lowerCamelCase  :		Any			    =    ids_tensor([self.batch_size, self.seq_length]     ,	vocab_size=2)

          return (
              config,
              input_ids,
              token_type_ids,
              input_mask,
              sequence_labels,
              token_labels,
              choice_labels,
              encoder_hidden_states,
              encoder_attention_mask,
          )



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Any     ,	_UpperCamelCase  :					Tuple     ,	_UpperCamelCase  :					Optional[Any]     ,	_UpperCamelCase  :					str     ,	_UpperCamelCase  :					Dict     ,	_UpperCamelCase  :					Optional[int]     ,	_UpperCamelCase  :					Any     ,	_UpperCamelCase  :					Optional[int])					->str:


          """simple docstring"""


          _lowerCamelCase  :		str			    =    YosoModel(config=_UpperCamelCase)
          model.to(_UpperCamelCase)
          model.eval()
          _lowerCamelCase  :		Union[str, Any]			    =    model(_UpperCamelCase     ,	attention_mask=_UpperCamelCase     ,	token_type_ids=_UpperCamelCase)
          _lowerCamelCase  :		Optional[Any]			    =    model(_UpperCamelCase     ,	token_type_ids=_UpperCamelCase)
          _lowerCamelCase  :		Optional[int]			    =    model(_UpperCamelCase)
          self.parent.assertEqual(result.last_hidden_state.shape     ,	(self.batch_size, self.seq_length, self.hidden_size))



      def 						_SCREAMING_SNAKE_CASE     (       self  :					str     ,	_UpperCamelCase  :					Union[str, Any]     ,	_UpperCamelCase  :					Dict     ,	_UpperCamelCase  :					str     ,	_UpperCamelCase  :					Any     ,	_UpperCamelCase  :					int     ,	_UpperCamelCase  :					Optional[Any]     ,	_UpperCamelCase  :					str     ,	_UpperCamelCase  :					List[Any]     ,	_UpperCamelCase  :					Optional[int]     ,	)					->List[str]:


          """simple docstring"""


          _lowerCamelCase  :		Optional[Any]			    =    True
          _lowerCamelCase  :		str			    =    YosoModel(_UpperCamelCase)
          model.to(_UpperCamelCase)
          model.eval()
          _lowerCamelCase  :		Optional[int]			    =    model(
              _UpperCamelCase     ,	attention_mask=_UpperCamelCase     ,	token_type_ids=_UpperCamelCase     ,	encoder_hidden_states=_UpperCamelCase     ,	encoder_attention_mask=_UpperCamelCase     ,	)
          _lowerCamelCase  :		Union[str, Any]			    =    model(
              _UpperCamelCase     ,	attention_mask=_UpperCamelCase     ,	token_type_ids=_UpperCamelCase     ,	encoder_hidden_states=_UpperCamelCase     ,	)
          _lowerCamelCase  :		List[str]			    =    model(_UpperCamelCase     ,	attention_mask=_UpperCamelCase     ,	token_type_ids=_UpperCamelCase)
          self.parent.assertEqual(result.last_hidden_state.shape     ,	(self.batch_size, self.seq_length, self.hidden_size))



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Any     ,	_UpperCamelCase  :					int     ,	_UpperCamelCase  :					Optional[int]     ,	_UpperCamelCase  :					Dict     ,	_UpperCamelCase  :					Tuple     ,	_UpperCamelCase  :					Optional[Any]     ,	_UpperCamelCase  :					Optional[Any]     ,	_UpperCamelCase  :					str)					->Tuple:


          """simple docstring"""


          _lowerCamelCase  :		List[Any]			    =    YosoForMaskedLM(config=_UpperCamelCase)
          model.to(_UpperCamelCase)
          model.eval()
          _lowerCamelCase  :		Tuple			    =    model(_UpperCamelCase     ,	attention_mask=_UpperCamelCase     ,	token_type_ids=_UpperCamelCase     ,	labels=_UpperCamelCase)
          self.parent.assertEqual(result.logits.shape     ,	(self.batch_size, self.seq_length, self.vocab_size))



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Union[str, Any]     ,	_UpperCamelCase  :					str     ,	_UpperCamelCase  :					Any     ,	_UpperCamelCase  :					Dict     ,	_UpperCamelCase  :					Optional[int]     ,	_UpperCamelCase  :					Dict     ,	_UpperCamelCase  :					Dict     ,	_UpperCamelCase  :					Union[str, Any])					->Any:


          """simple docstring"""


          _lowerCamelCase  :		Tuple			    =    YosoForQuestionAnswering(config=_UpperCamelCase)
          model.to(_UpperCamelCase)
          model.eval()
          _lowerCamelCase  :		int			    =    model(
              _UpperCamelCase     ,	attention_mask=_UpperCamelCase     ,	token_type_ids=_UpperCamelCase     ,	start_positions=_UpperCamelCase     ,	end_positions=_UpperCamelCase     ,	)
          self.parent.assertEqual(result.start_logits.shape     ,	(self.batch_size, self.seq_length))
          self.parent.assertEqual(result.end_logits.shape     ,	(self.batch_size, self.seq_length))



      def 						_SCREAMING_SNAKE_CASE     (       self  :					List[Any]     ,	_UpperCamelCase  :					str     ,	_UpperCamelCase  :					Any     ,	_UpperCamelCase  :					Union[str, Any]     ,	_UpperCamelCase  :					Union[str, Any]     ,	_UpperCamelCase  :					str     ,	_UpperCamelCase  :					str     ,	_UpperCamelCase  :					str)					->Optional[int]:


          """simple docstring"""


          _lowerCamelCase  :		List[Any]			    =    self.num_labels
          _lowerCamelCase  :		Tuple			    =    YosoForSequenceClassification(_UpperCamelCase)
          model.to(_UpperCamelCase)
          model.eval()
          _lowerCamelCase  :		Optional[Any]			    =    model(_UpperCamelCase     ,	attention_mask=_UpperCamelCase     ,	token_type_ids=_UpperCamelCase     ,	labels=_UpperCamelCase)
          self.parent.assertEqual(result.logits.shape     ,	(self.batch_size, self.num_labels))



      def 						_SCREAMING_SNAKE_CASE     (       self  :					List[Any]     ,	_UpperCamelCase  :					List[str]     ,	_UpperCamelCase  :					Dict     ,	_UpperCamelCase  :					Any     ,	_UpperCamelCase  :					List[str]     ,	_UpperCamelCase  :					Union[str, Any]     ,	_UpperCamelCase  :					str     ,	_UpperCamelCase  :					str)					->List[str]:


          """simple docstring"""


          _lowerCamelCase  :		Tuple			    =    self.num_labels
          _lowerCamelCase  :		Union[str, Any]			    =    YosoForTokenClassification(config=_UpperCamelCase)
          model.to(_UpperCamelCase)
          model.eval()
          _lowerCamelCase  :		str			    =    model(_UpperCamelCase     ,	attention_mask=_UpperCamelCase     ,	token_type_ids=_UpperCamelCase     ,	labels=_UpperCamelCase)
          self.parent.assertEqual(result.logits.shape     ,	(self.batch_size, self.seq_length, self.num_labels))



      def 						_SCREAMING_SNAKE_CASE     (       self  :					List[Any]     ,	_UpperCamelCase  :					Tuple     ,	_UpperCamelCase  :					List[str]     ,	_UpperCamelCase  :					Optional[Any]     ,	_UpperCamelCase  :					str     ,	_UpperCamelCase  :					Dict     ,	_UpperCamelCase  :					int     ,	_UpperCamelCase  :					Tuple)					->str:


          """simple docstring"""


          _lowerCamelCase  :		Any			    =    self.num_choices
          _lowerCamelCase  :		Tuple			    =    YosoForMultipleChoice(config=_UpperCamelCase)
          model.to(_UpperCamelCase)
          model.eval()
          _lowerCamelCase  :		Optional[int]			    =    input_ids.unsqueeze(1).expand(-1     ,	self.num_choices     ,	-1).contiguous()
          _lowerCamelCase  :		Union[str, Any]			    =    token_type_ids.unsqueeze(1).expand(-1     ,	self.num_choices     ,	-1).contiguous()
          _lowerCamelCase  :		Optional[Any]			    =    input_mask.unsqueeze(1).expand(-1     ,	self.num_choices     ,	-1).contiguous()
          _lowerCamelCase  :		str			    =    model(
              _UpperCamelCase     ,	attention_mask=_UpperCamelCase     ,	token_type_ids=_UpperCamelCase     ,	labels=_UpperCamelCase     ,	)
          self.parent.assertEqual(result.logits.shape     ,	(self.batch_size, self.num_choices))




      def 						_SCREAMING_SNAKE_CASE     (       self  :					Tuple)					->Union[str, Any]:


          """simple docstring"""


          _lowerCamelCase  :		Dict			    =    self.prepare_config_and_inputs()
          (
              (
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				(
              _lowerCamelCase
          )    ,				
          )  :		Tuple			    =    config_and_inputs
          _lowerCamelCase  :		Union[str, Any]			    =    {"""input_ids""": input_ids, """token_type_ids""": token_type_ids, """attention_mask""": input_mask}
          return config, inputs_dict





@require_torch
class 						__snake_case						(			__lowerCAmelCase			,	__lowerCAmelCase			,	unittest.TestCase		):





      '''simple docstring'''






      _snake_case     		=							(
          (
              YosoModel,
              YosoForMaskedLM,
              YosoForMultipleChoice,
              YosoForQuestionAnswering,
              YosoForSequenceClassification,
              YosoForTokenClassification,
          )
          if is_torch_available()
          else ()
      )
      _snake_case     		=							False
      _snake_case     		=							False
      _snake_case     		=							False

      _snake_case     		=							()
      _snake_case     		=							(
          {
              'feature-extraction': YosoModel,
              'fill-mask': YosoForMaskedLM,
              'question-answering': YosoForQuestionAnswering,
              'text-classification': YosoForSequenceClassification,
              'token-classification': YosoForTokenClassification,
              'zero-shot': YosoForSequenceClassification,
          }
          if is_torch_available()
          else {}
      )



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Optional[int])					->Union[str, Any]:


          """simple docstring"""


          _lowerCamelCase  :		Union[str, Any]			    =    YosoModelTester(self)
          _lowerCamelCase  :		Optional[int]			    =    ConfigTester(self     ,	config_class=_UpperCamelCase     ,	hidden_size=37)



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Optional[Any])					->Optional[Any]:


          """simple docstring"""


          self.config_tester.run_common_tests()



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Optional[int])					->List[str]:


          """simple docstring"""


          _lowerCamelCase  :		Optional[Any]			    =    self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_model(*_UpperCamelCase)



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Any)					->Tuple:


          """simple docstring"""


          _lowerCamelCase  :		Union[str, Any]			    =    self.model_tester.prepare_config_and_inputs()
          for type in ["absolute", "relative_key", "relative_key_query"]:
              _lowerCamelCase  :		List[str]			    =    type
              self.model_tester.create_and_check_model(*_UpperCamelCase)



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Optional[Any])					->Optional[int]:


          """simple docstring"""


          _lowerCamelCase  :		Union[str, Any]			    =    self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_masked_lm(*_UpperCamelCase)



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Dict)					->Union[str, Any]:


          """simple docstring"""


          _lowerCamelCase  :		Union[str, Any]			    =    self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_multiple_choice(*_UpperCamelCase)



      def 						_SCREAMING_SNAKE_CASE     (       self  :					List[Any])					->Union[str, Any]:


          """simple docstring"""


          _lowerCamelCase  :		Union[str, Any]			    =    self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_question_answering(*_UpperCamelCase)



      def 						_SCREAMING_SNAKE_CASE     (       self  :					Tuple)					->Union[str, Any]:


          """simple docstring"""


          _lowerCamelCase  :		Union[str, Any]			    =    self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_sequence_classification(*_UpperCamelCase)



      def 						_SCREAMING_SNAKE_CASE     (       self  :					str)					->Any:


          """simple docstring"""


          _lowerCamelCase  :		List[Any]			    =    self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_token_classification(*_UpperCamelCase)



      @slow
      def 						_SCREAMING_SNAKE_CASE     (       self  :					str)					->List[str]:


          """simple docstring"""


          for model_name in YOSO_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
              _lowerCamelCase  :		Tuple			    =    YosoModel.from_pretrained(_UpperCamelCase)
              self.assertIsNotNone(_UpperCamelCase)




      def 						_SCREAMING_SNAKE_CASE     (       self  :					List[str])					->Union[str, Any]:


          """simple docstring"""


          return





@require_torch
class 						__snake_case						(			unittest.TestCase		):





      '''simple docstring'''






      @slow
      def 						_SCREAMING_SNAKE_CASE     (       self  :					Dict)					->Dict:


          """simple docstring"""


          _lowerCamelCase  :		List[Any]			    =    YosoModel.from_pretrained("""uw-madison/yoso-4096""")
          _lowerCamelCase  :		int			    =    torch.tensor([[0, 1, 2, 3, 4, 5]])

          with torch.no_grad():
              _lowerCamelCase  :		Any			    =    model(_UpperCamelCase)[0]

          _lowerCamelCase  :		List[Any]			    =    torch.Size((1, 6, 768))
          self.assertEqual(output.shape     ,	_UpperCamelCase)

          _lowerCamelCase  :		int			    =    torch.tensor(
              [[[-0.0_6_1_1, 0.1_2_4_2, 0.0_8_4_0], [0.0_2_8_0, -0.0_0_4_8, 0.1_1_2_5], [0.0_1_0_6, 0.0_2_2_6, 0.0_7_5_1]]])

          self.assertTrue(torch.allclose(output[:, :3, :3]     ,	_UpperCamelCase     ,	atol=1E-4))



      @slow
      def 						_SCREAMING_SNAKE_CASE     (       self  :					Union[str, Any])					->str:


          """simple docstring"""


          _lowerCamelCase  :		Union[str, Any]			    =    YosoForMaskedLM.from_pretrained("""uw-madison/yoso-4096""")
          _lowerCamelCase  :		Tuple			    =    torch.tensor([[0, 1, 2, 3, 4, 5]])

          with torch.no_grad():
              _lowerCamelCase  :		Optional[Any]			    =    model(_UpperCamelCase)[0]

          _lowerCamelCase  :		Union[str, Any]			    =    5_0265

          _lowerCamelCase  :		Any			    =    torch.Size((1, 6, vocab_size))
          self.assertEqual(output.shape     ,	_UpperCamelCase)

          _lowerCamelCase  :		List[str]			    =    torch.tensor(
              [[[-2.1_3_1_3, -3.7_2_8_5, -2.2_4_0_7], [-2.7_0_4_7, -3.3_3_1_4, -2.6_4_0_8], [0.0_6_2_9, -2.5_1_6_6, -0.3_3_5_6]]])

          self.assertTrue(torch.allclose(output[:, :3, :3]     ,	_UpperCamelCase     ,	atol=1E-4))




      @slow
      def 						_SCREAMING_SNAKE_CASE     (       self  :					str)					->Tuple:


          """simple docstring"""


          _lowerCamelCase  :		Tuple			    =    YosoForMaskedLM.from_pretrained("""uw-madison/yoso-4096""")
          _lowerCamelCase  :		Any			    =    torch.arange(4096).unsqueeze(0)

          with torch.no_grad():
              _lowerCamelCase  :		Optional[Any]			    =    model(_UpperCamelCase)[0]

          _lowerCamelCase  :		Dict			    =    5_0265

          _lowerCamelCase  :		str			    =    torch.Size((1, 4096, vocab_size))
          self.assertEqual(output.shape     ,	_UpperCamelCase)

          _lowerCamelCase  :		int			    =    torch.tensor(
              [[[-2.3_9_1_4, -4.3_7_4_2, -5.0_9_5_6], [-4.0_9_8_8, -4.2_3_8_4, -7.0_4_0_6], [-3.1_4_2_7, -3.7_1_9_2, -6.6_8_0_0]]])

          self.assertTrue(torch.allclose(output[:, :3, :3]     ,	_UpperCamelCase     ,	atol=1E-4))




