


"""simple docstring"""





from manim import *

class  lowercase_  ( a_						):







      def 				_lowerCAmelCase       (      self :							int    ):
        lowerCAmelCase__    :    Tuple								=					Rectangle(height=0.5		,  width=0.5    )
        lowerCAmelCase__    :    Dict								=					Rectangle(height=0.46		,  width=0.46    ).set_stroke(width=0    )
        lowerCAmelCase__    :    str								=					Rectangle(height=0.25		,  width=0.25    )

        lowerCAmelCase__    :    Union[str, Any]								=					[mem.copy() for i in range(6    )]
        lowerCAmelCase__    :    int								=					[mem.copy() for i in range(6    )]
        lowerCAmelCase__    :    List[str]								=					VGroup(*__lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0    )
        lowerCAmelCase__    :    Union[str, Any]								=					VGroup(*__lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0    )
        lowerCAmelCase__    :    Union[str, Any]								=					VGroup(__lowerCamelCase		,  __lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0    )
        lowerCAmelCase__    :    List[Any]								=					Text("CPU"		,  font_size=2_4    )
        lowerCAmelCase__    :    List[str]								=					Group(__lowerCamelCase		,  __lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0.5		,  aligned_edge=__lowerCamelCase    )
        cpu.move_to([-2.5, -0.5, 0]    )
        self.add(__lowerCamelCase    )

        lowerCAmelCase__    :    Optional[int]								=					[mem.copy() for i in range(4    )]
        lowerCAmelCase__    :    Dict								=					VGroup(*__lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0    )
        lowerCAmelCase__    :    Optional[int]								=					Text("GPU"		,  font_size=2_4    )
        lowerCAmelCase__    :    Optional[Any]								=					Group(__lowerCamelCase		,  __lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0.5		,  aligned_edge=__lowerCamelCase    )
        gpu.move_to([-1, -1, 0]    )
        self.add(__lowerCamelCase    )

        lowerCAmelCase__    :    int								=					[mem.copy() for i in range(6    )]
        lowerCAmelCase__    :    Any								=					VGroup(*__lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0    )

        lowerCAmelCase__    :    int								=					Text("Model"		,  font_size=2_4    )
        lowerCAmelCase__    :    str								=					Group(__lowerCamelCase		,  __lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0.5		,  aligned_edge=__lowerCamelCase    )
        model.move_to([3, -1.0, 0]    )
        self.add(__lowerCamelCase    )

        lowerCAmelCase__    :    Tuple								=					[]
        lowerCAmelCase__    :    Any								=					[]

        for i, rect in enumerate(__lowerCamelCase    ):
          rect.set_stroke(__lowerCamelCase    )

          lowerCAmelCase__    :    Any								=					Rectangle(height=0.46 / 4		,  width=0.46 / 3    ).set_stroke(width=0.0    ).set_fill(__lowerCamelCase		,  opacity=0.7    )

          if i == 0:
            cpu_target.next_to(cpu_left_col_base[0].get_corner(DOWN + LEFT    )		,  buff=0.02		,  direction=__lowerCamelCase    )
            cpu_target.set_x(cpu_target.get_x() + 0.1    )
          elif i == 3:
            cpu_target.next_to(model_cpu_arr[0]		,  direction=__lowerCamelCase		,  buff=0.0    )
          else:
            cpu_target.next_to(model_cpu_arr[i - 1]		,  direction=__lowerCamelCase		,  buff=0.0    )
          self.add(__lowerCamelCase    )
          model_cpu_arr.append(__lowerCamelCase    )

        self.add(*__lowerCamelCase		,  *__lowerCamelCase    )

        lowerCAmelCase__    :    List[Any]								=					[meta_mem.copy() for i in range(6    )]
        lowerCAmelCase__    :    int								=					[meta_mem.copy() for i in range(6    )]
        lowerCAmelCase__    :    int								=					VGroup(*__lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0    )
        lowerCAmelCase__    :    Optional[int]								=					VGroup(*__lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0    )
        lowerCAmelCase__    :    Optional[int]								=					VGroup(__lowerCamelCase		,  __lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0    )
        lowerCAmelCase__    :    Dict								=					Text("Disk"		,  font_size=2_4    )
        lowerCAmelCase__    :    Optional[Any]								=					Group(__lowerCamelCase		,  __lowerCamelCase    ).arrange(__lowerCamelCase		,  buff=0.5		,  aligned_edge=__lowerCamelCase    )
        disk.move_to([-4.0, -1.25, 0]    )
        self.add(__lowerCamelCase		,  __lowerCamelCase    )

        lowerCAmelCase__    :    Union[str, Any]								=					[]

        for i in range(6    ):
          lowerCAmelCase__    :    Optional[int]								=					fill.copy().set_fill(__lowerCamelCase		,  opacity=0.8    )
          target.move_to(disk_left_col_base[i]    ).scale(0.5    )
          cpu_disk_arr.append(__lowerCamelCase    )

        self.add(*__lowerCamelCase    )

        lowerCAmelCase__    :    Dict								=					Square(side_length=2.2    )
        key.move_to([-5, 2, 0]    )

        lowerCAmelCase__    :    Optional[int]								=					MarkupText(
            f"<b>Key:</b>\n\n<span fgcolor='{YELLOW}'>●</span> Empty Model"		,  font_size=1_8		,  )

        key_text.move_to([-5, 2.4, 0]    )

        self.add(__lowerCamelCase		,  __lowerCamelCase    )

        lowerCAmelCase__    :    Tuple								=					MarkupText(
            f"<span fgcolor='{BLUE}'>●</span> Checkpoint"		,  font_size=1_8		,  )

        blue_text.next_to(__lowerCamelCase		,  DOWN * 2.4		,  aligned_edge=key_text.get_left()    )
        self.add(__lowerCamelCase    )

        lowerCAmelCase__    :    int								=					MarkupText(f"The offloaded weights are all sent to the CPU."		,  font_size=2_4    )
        step_a.move_to([2, 2, 0]    )

        self.play(Write(__lowerCamelCase		,  run_time=3    )    )

        for i in range(6    ):
          lowerCAmelCase__    :    str								=					cpu_disk_arr[i]
          lowerCAmelCase__    :    Dict								=					rect.copy().set_fill(__lowerCamelCase		,  opacity=0.8    ).scale(2.0    )
          cpa.generate_target()
          cpa.target.move_to(model_base[i]    )

          if i == 0:
            rect.set_fill(__lowerCamelCase		,  opacity=0.8    )
            rect.generate_target()
            rect.target.move_to(cpu_left_col_base[0]    ).scale(2.0    )

            self.remove(
                *__lowerCamelCase		,  *__lowerCamelCase		,  )

          else:
            rect.generate_target()
            rect.target.move_to(cpu_left_col_base[i]    ).scale(2.0    )
          self.play(MoveToTarget(__lowerCamelCase    )		,  MoveToTarget(__lowerCamelCase    )		,  model_base[i].animate.set_stroke(__lowerCamelCase    )    )
        self.play(FadeOut(__lowerCamelCase    )    )

        lowerCAmelCase__    :    Any								=					MarkupText(
            f"Finally, hooks are added to each weight in the model\nto transfer the weights from CPU to GPU\n\t\tand back when needed."		,  font_size=2_4		,  )
        step_a.move_to([2, 2, 0]    )

        self.play(Write(__lowerCamelCase		,  run_time=3    )    )

        lowerCAmelCase__    :    Any								=					[]
        lowerCAmelCase__    :    str								=					[]
        for i in range(6    ):
          lowerCAmelCase__    :    Optional[Any]								=					Arrow(start=__lowerCamelCase		,  end=__lowerCamelCase		,  color=__lowerCamelCase		,  buff=0.5    )
          a.next_to(model_base[i].get_left()		,  __lowerCamelCase		,  buff=0.2    )
          arrows.append(__lowerCamelCase    )
          animations.append(Write(__lowerCamelCase    )    )
        self.play(*__lowerCamelCase    )
        self.wait()




"""simple docstring"""





from math import factorial





def     lowercase__	(  lowerCamelCase     :  Dict				,	lowerCamelCase     :  int				)					->     Tuple:
  return factorial(lowerCamelCase				) / (factorial(lowerCamelCase				) * factorial(n - r				))





def     lowercase__	(  )					->     Optional[Any]:
  lowerCAmelCase__    :    List[Any]								=					0

  for i in range(1				,	1_0_1				):
    for j in range(1				,	i + 1				):
      if combinations(lowerCamelCase				,	lowerCamelCase				) > 1e6:
        total += 1
  return total


if __name__ == "__main__":
   print(solution())
