
'''simple docstring'''

import torch
from torch import nn
from transformers import CLIPPreTrainedModel, CLIPVisionModel

from ...models.attention import BasicTransformerBlock
from ...utils import logging


snake_case									=    logging.get_logger(__name__)  # pylint: disable=invalid-name




class    lowerCAmelCase       (     UpperCamelCase_  ):


 def __init__(    self  : Union[str, Any]			,							a__  : int			,							a__  : List[Any]=768    ):
  '''simple docstring'''

  super().__init__(a__    )
  lowerCAmelCase__     :   int     		=	proj_size

  lowerCAmelCase__     :   str     		=	CLIPVisionModel(a__    )
  lowerCAmelCase__     :   int     		=	PaintByExampleMapper(a__    )
  lowerCAmelCase__     :   Optional[int]     		=	nn.LayerNorm(config.hidden_size    )
  lowerCAmelCase__     :   Optional[Any]     		=	nn.Linear(config.hidden_size			,							self.proj_size    )

  # uncondition for scaling
  lowerCAmelCase__     :   Dict     		=	nn.Parameter(torch.randn((1, 1, self.proj_size)    )    )


 def    _A	(    self  : Tuple			,							a__  : int			,							a__  : Optional[Any]=False    ):
  '''simple docstring'''

  lowerCAmelCase__     :   List[Any]     		=	self.model(pixel_values=a__    )
  lowerCAmelCase__     :   Any     		=	clip_output.pooler_output
  lowerCAmelCase__     :   Union[str, Any]     		=	self.mapper(latent_states[:, None]    )
  lowerCAmelCase__     :   List[Any]     		=	self.final_layer_norm(a__    )
  lowerCAmelCase__     :   Optional[int]     		=	self.proj_out(a__    )
  if return_uncond_vector:
   return latent_states, self.uncond_vector

  return latent_states




class    lowerCAmelCase       (     nn.Module  ):


 def __init__(    self  : Optional[Any]			,							a__  : Optional[Any]    ):
  '''simple docstring'''

  super().__init__()
  lowerCAmelCase__     :   Optional[Any]     		=	(config.num_hidden_layers + 1) // 5
  lowerCAmelCase__     :   str     		=	config.hidden_size
  lowerCAmelCase__     :   Dict     		=	1
  lowerCAmelCase__     :   int     		=	nn.ModuleList(
      [
          BasicTransformerBlock(a__			,							a__			,							a__			,							activation_fn="gelu"			,							attention_bias=a__    )
          for _ in range(a__    )
      ]    )


 def    _A	(    self  : int			,							a__  : Union[str, Any]    ):
  '''simple docstring'''

  for block in self.blocks:
   lowerCAmelCase__     :   List[Any]     		=	block(a__    )

  return hidden_states







'''simple docstring'''

from math import factorial

snake_case									=    {str(digit): factorial(digit) for digit in range(10)}


def        UpperCAmelCase_ (  lowerCamelCase_			):







 """simple docstring"""


 if not isinstance(lowerCamelCase_      ,			lowerCamelCase_			):
  raise TypeError("Parameter number must be int"			)

 if number < 0:
  raise ValueError("Parameter number must be greater than or equal to 0"			)

 # Converts number in string to iterate on its digits and adds its factorial.
 return sum(DIGIT_FACTORIAL[digit] for digit in str(lowerCamelCase_			)			)


def        UpperCAmelCase_ (  lowerCamelCase_ = 6_0      ,			lowerCamelCase_ = 1_0_0_0_0_0_0			):







 """simple docstring"""


 if not isinstance(lowerCamelCase_      ,			lowerCamelCase_			) or not isinstance(lowerCamelCase_      ,			lowerCamelCase_			):
  raise TypeError("Parameters chain_length and number_limit must be int"			)

 if chain_length <= 0 or number_limit <= 0:
  raise ValueError(
      "Parameters chain_length and number_limit must be greater than 0"			)

 # the counter for the chains with the exact desired length
 lowerCAmelCase__     :   str     		=	0
 # the cached sizes of the previous chains
 lowerCAmelCase__     :   dict[int, int]     		=	{}

 for start_chain_element in range(1      ,			lowerCamelCase_			):
  # The temporary set will contain the elements of the chain
  lowerCAmelCase__     :   Any     		=	set()
  lowerCAmelCase__     :   int     		=	0

  # Stop computing the chain when you find a cached size, a repeating item or the
  # length is greater then the desired one.
  lowerCAmelCase__     :   Dict     		=	start_chain_element
  while (
      chain_element not in chain_sets_lengths
      and chain_element not in chain_set
      and chain_set_length <= chain_length
  ):
   chain_set.add(lowerCamelCase_			)
   chain_set_length += 1
   lowerCAmelCase__     :   Dict     		=	digit_factorial_sum(lowerCamelCase_			)

  if chain_element in chain_sets_lengths:
   chain_set_length += chain_sets_lengths[chain_element]

  lowerCAmelCase__     :   Optional[Any]     		=	chain_set_length

  # If chain contains the exact amount of elements increase the counter
  if chain_set_length == chain_length:
   chains_counter += 1

 return chains_counter


if __name__ == "__main__":
     import doctest

     doctest.testmod()
     print(f'{solution()}')





