





'''simple docstring'''





from manim import *

class 		snake_case_      (       UpperCAmelCase_	):







	'''simple docstring'''




	def       UpperCAmelCase (	self       :    Dict      )					->   List[Any]:

			'''simple docstring'''




			__lowercase					=    Rectangle(height=0.5				,			width=0.5      )
			__lowercase					=    Rectangle(height=0.46				,			width=0.46      ).set_stroke(width=0      )
			__lowercase					=    Rectangle(height=0.25				,			width=0.25      )

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

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

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

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

			__lowercase					=    []
			__lowercase					=    []

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

					__lowercase					=    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      )

			__lowercase					=    [meta_mem.copy() for i in range(6      )]
			__lowercase					=    [meta_mem.copy() for i in range(6      )]
			__lowercase					=    VGroup(*__lowerCamelCase      ).arrange(__lowerCamelCase				,			buff=0      )
			__lowercase					=    VGroup(*__lowerCamelCase      ).arrange(__lowerCamelCase				,			buff=0      )
			__lowercase					=    VGroup(__lowerCamelCase				,			__lowerCamelCase      ).arrange(__lowerCamelCase				,			buff=0      )
			__lowercase					=    Text('Disk'				,			font_size=24      )
			__lowercase					=    Group(__lowerCamelCase				,			__lowerCamelCase      ).arrange(__lowerCamelCase				,			buff=0.5				,			aligned_edge=__lowerCamelCase      )
			disk.move_to([-4.0, -1.25, 0]      )
			self.add(__lowerCamelCase				,			__lowerCamelCase      )

			__lowercase					=    []

			for i in range(6      ):
					__lowercase					=    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					=    Square(side_length=2.2      )
			key.move_to([-5, 2, 0]      )

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











def    SCREAMING_SNAKE_CASE							(			snake_case       )		->						int:
		__lowercase					=    str(snake_case       ).strip()
		if not bin_string:
				raise ValueError('Empty string was passed to the function'       )
		__lowercase					=    bin_string[0] == '-'
		if is_negative:
				__lowercase					=    bin_string[1:]
		if not all(char in '01' for char in bin_string       ):
				raise ValueError('Non-binary value was passed to the function'       )
		__lowercase					=    0
		for char in bin_string:
				__lowercase					=    2 * decimal_number + int(snake_case       )
		return -decimal_number if is_negative else decimal_number


if __name__ == "__main__":
		from doctest import testmod

		testmod()




