


from manim import *






class       _UpperCamelCase    (					__snake_case				):

				"""simple docstring"""







				def      _UpperCAmelCase					(						self   )	->				List[str]:
					A								=				Rectangle(height=0.5				,   width=0.5   )
					A								=				Rectangle(height=0.46				,   width=0.46   ).set_stroke(width=0   )

					A								=				Rectangle(height=0.25				,   width=0.25   )

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

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

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

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

					A								=				[]
					A								=				[]

					for i, rect in enumerate(a__   ):
						A								=				fill.copy().set_fill(a__				,   opacity=0.8   )
						target.move_to(a__   )
						model_arr.append(a__   )

						A								=				Rectangle(height=0.46				,   width=0.46   ).set_stroke(width=0.0   ).set_fill(a__				,   opacity=0.8   )
						cpu_target.move_to(cpu_left_col_base[i]   )
						model_cpu_arr.append(a__   )

					self.add(*a__				,   *a__   )

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

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

					A								=				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(a__				,   a__   )

					A								=				MarkupText(
					    f'<span fgcolor=\'{BLUE}\'>●</span> Checkpoint'				,   font_size=18				,   )

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

					A								=				MarkupText(
					    f'Now watch as an input is passed through the model\nand how the memory is utilized and handled.'				,   font_size=24				,   )
					step_a.move_to([2, 2, 0]   )

					self.play(Write(a__   )   )

					A								=				Square(0.3   )
					input.set_fill(a__				,   opacity=1.0   )
					input.set_stroke(width=0.0   )
					input.next_to(model_base[0]				,   a__				,   buff=0.5   )

					self.play(Write(a__   )   )

					input.generate_target()
					input.target.next_to(model_arr[0]				,   direction=a__				,   buff=0.02   )
					self.play(MoveToTarget(a__   )   )

					self.play(FadeOut(a__   )   )

					A								=				Arrow(start=a__				,   end=a__				,   color=a__				,   buff=0.5   )
					a.next_to(model_arr[0].get_left()				,   a__				,   buff=0.2   )

					model_cpu_arr[0].generate_target()
					model_cpu_arr[0].target.move_to(gpu_rect[0]   )

					A								=				MarkupText(
					    f'As the input reaches a layer, the hook triggers\nand weights are moved from the CPU\nto the GPU and back.'				,   font_size=24				,   )
					step_a.move_to([2, 2, 0]   )

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

					A								=				{"""run_time""": 1, """fade_in""": True, """fade_out""": True, """buff""": 0.02}

					self.play(
					    Write(a__   )				,   Circumscribe(model_arr[0]				,   color=a__				,   **a__   )				,   Circumscribe(model_cpu_arr[0]				,   color=a__				,   **a__   )				,   Circumscribe(gpu_rect[0]				,   color=a__				,   **a__   )				,   )
					self.play(MoveToTarget(model_cpu_arr[0]   )   )

					A								=				a.copy()
					for i in range(6   ):
						a_c.next_to(model_arr[i].get_right() + 0.02				,   a__				,   buff=0.2   )

						input.generate_target()
						input.target.move_to(model_arr[i].get_right() + 0.02   )

						A								=				AnimationGroup(
						    FadeOut(a__				,   run_time=0.5   )				,   MoveToTarget(a__				,   run_time=0.5   )				,   FadeIn(a__				,   run_time=0.5   )				,   lag_ratio=0.2   )

						self.play(a__   )

						model_cpu_arr[i].generate_target()
						model_cpu_arr[i].target.move_to(cpu_left_col_base[i]   )

						if i < 5:
							model_cpu_arr[i + 1].generate_target()
							model_cpu_arr[i + 1].target.move_to(gpu_rect[0]   )
							if i >= 1:
								A								=				0.7

							self.play(
							    Circumscribe(model_arr[i]				,   **a__   )				,   Circumscribe(cpu_left_col_base[i]				,   **a__   )				,   Circumscribe(cpu_left_col_base[i + 1]				,   color=a__				,   **a__   )				,   Circumscribe(gpu_rect[0]				,   color=a__				,   **a__   )				,   Circumscribe(model_arr[i + 1]				,   color=a__				,   **a__   )				,   )
							if i < 1:
								self.play(
								    MoveToTarget(model_cpu_arr[i]   )				,   MoveToTarget(model_cpu_arr[i + 1]   )				,   )
							else:
								self.play(
								    MoveToTarget(model_cpu_arr[i]				,   run_time=0.7   )				,   MoveToTarget(model_cpu_arr[i + 1]				,   run_time=0.7   )				,   )
						else:
							model_cpu_arr[i].generate_target()
							model_cpu_arr[i].target.move_to(cpu_left_col_base[-1]   )
							input.generate_target()
							input.target.next_to(model_arr[-1].get_right()				,   RIGHT + 0.02				,   buff=0.2   )

							self.play(
							    Circumscribe(model_arr[-1]				,   color=a__				,   **a__   )				,   Circumscribe(cpu_left_col_base[-1]				,   color=a__				,   **a__   )				,   Circumscribe(gpu_rect[0]				,   color=a__				,   **a__   )				,   )

							self.play(MoveToTarget(model_cpu_arr[i]   )   )

						A								=				a_c
						A								=				a_c.copy()

					input.generate_target()
					input.target.next_to(model_base[-1]				,   RIGHT + 0.02				,   buff=0.5   )
					self.play(
					    FadeOut(a__   )				,   FadeOut(a__				,   run_time=0.5   )				,   )

					A								=				MarkupText(f'Inference on a model too large for GPU memory\nis successfully completed.'				,   font_size=24   )
					step_a.move_to([2, 2, 0]   )

					self.play(Write(a__				,   run_time=3   )				,   MoveToTarget(a__   )   )

					self.wait()







def   _lowerCAmelCase				(   UpperCamelCase__:     int						) ->   bool:





	"""simple docstring"""







	return str(UpperCamelCase__						) == str(UpperCamelCase__						)[::-1]





def   _lowerCAmelCase				(   UpperCamelCase__:     int						) ->   int:





	"""simple docstring"""







	return int(UpperCamelCase__						) + int(str(UpperCamelCase__						)[::-1]						)





def   _lowerCAmelCase				(   UpperCamelCase__:     int = 1_00_00						) ->   int:





	"""simple docstring"""







	A								=				[]
	for num in range(1							,					UpperCamelCase__						):
		A								=				0
		A								=				num
		while iterations < 50:
			A								=				sum_reverse(UpperCamelCase__						)
			iterations += 1
			if is_palindrome(UpperCamelCase__						):
				break
		else:
			lychrel_nums.append(UpperCamelCase__						)
	return len(UpperCamelCase__						)


if __name__ == "__main__":
				print(f'''{solution() = }''')



