




'''simple docstring'''






from manim import *

class   SCREAMING_SNAKE_CASE_		(       lowerCamelCase_				):



 def    SCREAMING_SNAKE_CASE(  self ):






        '''simple docstring'''




        lowercase  :		Tuple						=      Rectangle(height=0.5   ,		width=0.5 )
        lowercase  :		Dict						=      Rectangle(height=0.4_6   ,		width=0.4_6 ).set_stroke(width=0 )
        lowercase  :		str						=      Rectangle(height=0.2_5   ,		width=0.2_5 )

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

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

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

        lowercase  :		int						=      Text('''Model'''   ,		font_size=24 )
        lowercase  :		str						=      Group(__lowerCamelCase   ,		__lowerCamelCase ).arrange(__lowerCamelCase   ,		buff=0.5   ,		aligned_edge=__lowerCamelCase )
        model.move_to([3, -1.0, 0] )
        self.add(__lowerCamelCase )

        lowercase  :		Tuple						=      []
        lowercase  :		Any						=      []

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

               lowercase  :		Any						=      Rectangle(height=0.4_6 / 4   ,		width=0.4_6 / 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.0_2   ,		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 )

        lowercase  :		List[Any]						=      [meta_mem.copy() for i in range(6 )]
        lowercase  :		int						=      [meta_mem.copy() for i in range(6 )]
        lowercase  :		int						=      VGroup(*__lowerCamelCase ).arrange(__lowerCamelCase   ,		buff=0 )
        lowercase  :		Optional[int]						=      VGroup(*__lowerCamelCase ).arrange(__lowerCamelCase   ,		buff=0 )
        lowercase  :		Optional[int]						=      VGroup(__lowerCamelCase   ,		__lowerCamelCase ).arrange(__lowerCamelCase   ,		buff=0 )
        lowercase  :		Dict						=      Text('''Disk'''   ,		font_size=24 )
        lowercase  :		Optional[Any]						=      Group(__lowerCamelCase   ,		__lowerCamelCase ).arrange(__lowerCamelCase   ,		buff=0.5   ,		aligned_edge=__lowerCamelCase )
        disk.move_to([-4.0, -1.2_5, 0] )
        self.add(__lowerCamelCase   ,		__lowerCamelCase )

        lowercase  :		Union[str, Any]						=      []

        for i in range(6 ):
               lowercase  :		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 )

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

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

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

        self.add(__lowerCamelCase   ,		__lowerCamelCase )

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

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

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

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

        for i in range(6 ):
               lowercase  :		str						=      cpu_disk_arr[i]
               lowercase  :		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 ) )

        lowercase  :		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=24   ,		)
        step_a.move_to([2, 2, 0] )

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

        lowercase  :		Any						=      []
        lowercase  :		str						=      []
        for i in range(6 ):
               lowercase  :		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'''






import math
from timeit import timeit




def 		a_( lowerCamelCase      )				->int:






       '''simple docstring'''




       lowercase  :		Dict						=      0
       lowercase  :		Union[str, Any]						=      abs(lowerCamelCase      )
       while True:
              lowercase  :		List[Any]						=      n // 10
              digits += 1
              if n == 0:
                     break
       return digits




def 		a_( lowerCamelCase      )				->int:






       '''simple docstring'''




       return 1 if n == 0 else math.floor(math.log(abs(lowerCamelCase      )   ,				10      ) + 1      )




def 		a_( lowerCamelCase      )				->int:






       '''simple docstring'''




       return len(str(abs(lowerCamelCase      )      )      )




def 		a_( )				->None:






       '''simple docstring'''




       from collections.abc import Callable

       def benchmark_a_function(lowerCamelCase   ,				lowerCamelCase      ) -> None:
              lowercase  :		str						=      f"""{func.__name__}({value})"""
              lowercase  :		Optional[Any]						=      timeit(f"""__main__.{call}"""   ,				setup='''import __main__'''      )
              print(f"""{call}: {func(lowerCamelCase      )} -- {timing} seconds"""      )

       for value in (26_2144, 1125_8999_0684_2624, 126_7650_6002_2822_9401_4967_0320_5376):
              for func in (num_digits, num_digits_fast, num_digits_faster):
                     benchmark_a_function(lowerCamelCase   ,				lowerCamelCase      )
              print()


if __name__ == "__main__":
      import doctest

      doctest.testmod()
      benchmark()




