




from ...configuration_utils import PretrainedConfig
from ...utils import logging


lowerCAmelCase_					    = logging.get_logger(__name__)

lowerCAmelCase_					    = {
    "tiiuae/falcon-40b": "https://huggingface.co/tiiuae/falcon-40b/resolve/main/config.json",
    "tiiuae/falcon-7b": "https://huggingface.co/tiiuae/falcon-7b/resolve/main/config.json",
}






class  _lowerCAmelCase     (  _UpperCAmelCase	):
      A__		     =		'falcon'
      A__		     =		['past_key_values']

      def __init__(   self      ,				__UpperCAmelCase=6_5024      ,				__UpperCAmelCase=4544      ,				__UpperCAmelCase=32      ,				__UpperCAmelCase=71      ,				__UpperCAmelCase=1e-5      ,				__UpperCAmelCase=0.02      ,				__UpperCAmelCase=True      ,				__UpperCAmelCase=0.0      ,				__UpperCAmelCase=0.0      ,				__UpperCAmelCase=None      ,				__UpperCAmelCase=False      ,				__UpperCAmelCase=False      ,				__UpperCAmelCase=True      ,				__UpperCAmelCase=True      ,				__UpperCAmelCase=False      ,				__UpperCAmelCase=11      ,				__UpperCAmelCase=11      ,				**__UpperCAmelCase      ,				):
        lowerCAmelCase__				:  List[Any]		       =     vocab_size
        # Backward compatibility with n_embed kwarg
        lowerCAmelCase__				:  Optional[Any]		       =     kwargs.pop('''n_embed'''      ,				lowerCamelCase_		)
        lowerCAmelCase__				:  List[str]		       =     hidden_size if n_embed is None else n_embed
        lowerCAmelCase__				:  Optional[int]		       =     num_hidden_layers
        lowerCAmelCase__				:  Optional[Any]		       =     num_attention_heads
        lowerCAmelCase__				:  Tuple		       =     layer_norm_epsilon
        lowerCAmelCase__				:  Tuple		       =     initializer_range
        lowerCAmelCase__				:  Optional[Any]		       =     use_cache
        lowerCAmelCase__				:  int		       =     hidden_dropout
        lowerCAmelCase__				:  Dict		       =     attention_dropout

        lowerCAmelCase__				:  Any		       =     bos_token_id
        lowerCAmelCase__				:  Any		       =     eos_token_id
        lowerCAmelCase__				:  Any		       =     num_attention_heads if num_kv_heads is None else num_kv_heads
        lowerCAmelCase__				:  List[str]		       =     alibi
        lowerCAmelCase__				:  List[str]		       =     new_decoder_architecture
        lowerCAmelCase__				:  Optional[Any]		       =     multi_query  # Ignored when new_decoder_architecture is True
        lowerCAmelCase__				:  Any		       =     parallel_attn
        lowerCAmelCase__				:  List[Any]		       =     bias

        super().__init__(bos_token_id=lowerCamelCase_      ,				eos_token_id=lowerCamelCase_      ,				**lowerCamelCase_		)

      @property
      def 	__magic_name__(   self		):
        return self.hidden_size // self.num_attention_heads







      @property
      def 	__magic_name__(   self		):
        return not self.alibi







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()

