




from dataclasses import dataclass
from typing import Optional, Tuple

import torch
from torch import nn
from transformers import RobertaPreTrainedModel, XLMRobertaConfig, XLMRobertaModel
from transformers.utils import ModelOutput






@dataclass
class  _lowerCAmelCase     (  _lowercase	):
      A__		     =		None
      A__		     =		None
      A__		     =		None
      A__		     =		None






class  _lowerCAmelCase     (  _lowercase	):

      def __init__(   self      ,				__UpperCAmelCase=1      ,				__UpperCAmelCase=0      ,				__UpperCAmelCase=2      ,				__UpperCAmelCase=512      ,				__UpperCAmelCase="cls"      ,				__UpperCAmelCase=False      ,				__UpperCAmelCase=True      ,				**__UpperCAmelCase      ,				):
        super().__init__(pad_token_id=UpperCAmelCase__      ,				bos_token_id=UpperCAmelCase__      ,				eos_token_id=UpperCAmelCase__      ,				**UpperCAmelCase__		)
        lowerCAmelCase__				:  Any		       =     project_dim
        lowerCAmelCase__				:  Tuple		       =     pooler_fn
        lowerCAmelCase__				:  Tuple		       =     learn_encoder
        lowerCAmelCase__				:  List[Any]		       =     use_attention_mask






class  _lowerCAmelCase     (  _lowercase	):
      A__		     =		[r'pooler', r'logit_scale']
      A__		     =		[r'position_ids', r'predictions.decoder.bias']
      A__		     =		'roberta'
      A__		     =		RobertaSeriesConfig

      def __init__(   self      ,				__UpperCAmelCase		):
        super().__init__(UpperCAmelCase__		)
        lowerCAmelCase__				:  int		       =     XLMRobertaModel(UpperCAmelCase__		)
        lowerCAmelCase__				:  List[Any]		       =     nn.Linear(config.hidden_size      ,				config.project_dim		)
        lowerCAmelCase__				:  Dict		       =     getattr(UpperCAmelCase__      ,				'''has_pre_transformation'''      ,				UpperCAmelCase__		)
        if self.has_pre_transformation:
          lowerCAmelCase__				:  Dict		       =     nn.Linear(config.hidden_size      ,				config.project_dim		)
          lowerCAmelCase__				:  Optional[Any]		       =     nn.LayerNorm(config.hidden_size      ,				eps=config.layer_norm_eps		)
        self.post_init()







      def 	__magic_name__(   self      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				__UpperCAmelCase = None      ,				):
        lowerCAmelCase__				:  List[str]		       =     return_dict if return_dict is not None else self.config.use_return_dict

        lowerCAmelCase__				:  Optional[int]		       =     self.base_model(
            input_ids=UpperCAmelCase__      ,				attention_mask=UpperCAmelCase__      ,				token_type_ids=UpperCAmelCase__      ,				position_ids=UpperCAmelCase__      ,				head_mask=UpperCAmelCase__      ,				inputs_embeds=UpperCAmelCase__      ,				encoder_hidden_states=UpperCAmelCase__      ,				encoder_attention_mask=UpperCAmelCase__      ,				output_attentions=UpperCAmelCase__      ,				output_hidden_states=True if self.has_pre_transformation else output_hidden_states      ,				return_dict=UpperCAmelCase__      ,				)

        if self.has_pre_transformation:
          lowerCAmelCase__				:  Dict		       =     outputs['''hidden_states'''][-2]
          lowerCAmelCase__				:  str		       =     self.pre_LN(UpperCAmelCase__		)
          lowerCAmelCase__				:  List[Any]		       =     self.transformation_pre(UpperCAmelCase__		)

          return TransformationModelOutput(
              projection_state=UpperCAmelCase__      ,				last_hidden_state=outputs.last_hidden_state      ,				hidden_states=outputs.hidden_states      ,				attentions=outputs.attentions      ,				)
        else:
          lowerCAmelCase__				:  List[str]		       =     self.transformation(outputs.last_hidden_state		)
          return TransformationModelOutput(
              projection_state=UpperCAmelCase__      ,				last_hidden_state=outputs.last_hidden_state      ,				hidden_states=outputs.hidden_states      ,				attentions=outputs.attentions      ,				)







def      __lowerCAmelCase			(					UpperCamelCase      )     ->	None:
  lowerCAmelCase__				:  Dict		       =     generate_pascal_triangle(UpperCamelCase      )
  for row_idx in range(UpperCamelCase      ):
    # Print left spaces
    for _ in range(num_rows - row_idx - 1      ):
      print(end=''' '''      )
    # Print row values
    for col_idx in range(row_idx + 1      ):
      if col_idx != row_idx:
        print(triangle[row_idx][col_idx]	,      end=''' '''      )
      else:
        print(triangle[row_idx][col_idx]	,      end=''''''      )
    print()



def      __lowerCAmelCase			(					UpperCamelCase      )     ->	list[list[int]]:

  if not isinstance(UpperCamelCase	,      UpperCamelCase      ):
    raise TypeError('''The input value of \'num_rows\' should be \'int\''''      )

  if num_rows == 0:
    return []
  elif num_rows < 0:
    raise ValueError(
        '''The input value of \'num_rows\' should be greater than or equal to 0'''      )

  lowerCAmelCase__				:  list[list[int]]		       =     []
  for current_row_idx in range(UpperCamelCase      ):
    lowerCAmelCase__				:  List[str]		       =     populate_current_row(UpperCamelCase	,      UpperCamelCase      )
    triangle.append(UpperCamelCase      )
  return triangle



def      __lowerCAmelCase			(					UpperCamelCase	,      UpperCamelCase      )     ->	list[int]:
  lowerCAmelCase__				:  Optional[Any]		       =     [-1] * (current_row_idx + 1)
  # first and last elements of current row are equal to 1
  lowerCAmelCase__       ,			lowerCAmelCase__				:  int		       =     1, 1
  for current_col_idx in range(1	,      UpperCamelCase      ):
    calculate_current_element(
        UpperCamelCase	,      UpperCamelCase	,      UpperCamelCase	,      UpperCamelCase      )
  return current_row



def      __lowerCAmelCase			(					UpperCamelCase	,      UpperCamelCase	,      UpperCamelCase	,      UpperCamelCase	,      )     ->	None:
  lowerCAmelCase__				:  Optional[int]		       =     triangle[current_row_idx - 1][current_col_idx - 1]
  lowerCAmelCase__				:  List[str]		       =     triangle[current_row_idx - 1][current_col_idx]
  lowerCAmelCase__				:  List[Any]		       =     above_to_left_elt + above_to_right_elt



def      __lowerCAmelCase			(					UpperCamelCase      )     ->	list[list[int]]:

  if not isinstance(UpperCamelCase	,      UpperCamelCase      ):
    raise TypeError('''The input value of \'num_rows\' should be \'int\''''      )

  if num_rows == 0:
    return []
  elif num_rows < 0:
    raise ValueError(
        '''The input value of \'num_rows\' should be greater than or equal to 0'''      )

  lowerCAmelCase__				:  list[list[int]]		       =     [[1]]

  for row_index in range(1	,      UpperCamelCase      ):
    lowerCAmelCase__				:  Optional[int]		       =     [0] + result[-1] + [0]
    lowerCAmelCase__				:  List[str]		       =     row_index + 1
    # Calculate the number of distinct elements in a row
    lowerCAmelCase__				:  Tuple		       =     sum(divmod(UpperCamelCase	,      2      )      )
    lowerCAmelCase__				:  Tuple		       =     [
        temp_row[i - 1] + temp_row[i] for i in range(1	,      distinct_elements + 1      )
    ]
    lowerCAmelCase__				:  int		       =     row_first_half[: (row_index + 1) // 2]
    row_second_half.reverse()
    lowerCAmelCase__				:  Dict		       =     row_first_half + row_second_half
    result.append(UpperCamelCase      )

  return result



def      __lowerCAmelCase			(					)     ->	None:
  from collections.abc import Callable
  from timeit import timeit

  def benchmark_a_function(UpperCamelCase	,      UpperCamelCase      ) -> None:
    lowerCAmelCase__				:  Tuple		       =     F"""{func.__name__}({value})"""
    lowerCAmelCase__				:  Dict		       =     timeit(F"""__main__.{call}"""	,      setup='''import __main__'''      )
    # print(f"{call:38} = {func(value)} -- {timing:.4f} seconds")
    print(F"""{call:38} -- {timing:.4f} seconds"""      )

  for value in range(15      ):  # (1, 7, 14):
    for func in (generate_pascal_triangle, generate_pascal_triangle_optimized):
      benchmark_a_function(UpperCamelCase	,      UpperCamelCase      )
    print()


if __name__ == "__main__":
     import doctest

     doctest.testmod()
     benchmark()

