




import sys

UpperCamelCase								=	(
    '73167176531330624919225119674426574742355349194934'
    '96983520312774506326239578318016984801869478851843'
    '85861560789112949495459501737958331952853208805511'
    '12540698747158523863050715693290963295227443043557'
    '66896648950445244523161731856403098711121722383113'
    '62229893423380308135336276614282806444486645238749'
    '30358907296290491560440772390713810515859307960866'
    '70172427121883998797908792274921901699720888093776'
    '65727333001053367881220235421809751254540594752243'
    '52584907711670556013604839586446706324415722155397'
    '53697817977846174064955149290862569321978468622482'
    '83972241375657056057490261407972968652414535100474'
    '82166370484403199890008895243450658541227588666881'
    '16427171479924442928230863465674813919123162824586'
    '17866458359124566529476545682848912883142607690042'
    '24219022671055626321111109370544217506941658960408'
    '07198403850962455444362981230987879927244284909188'
    '84580156166097919133875499200524063689912560717606'
    '05886116467109405077541002256983155200055935729725'
    '71636269561882670428252483600823257530420752963450'
)



def 				_A  (		lowerCAmelCase_	:   str = N     ):
     """simple docstring"""

     lowerCAmelCase__            =					-sys.maxsize - 1
     for i in range(len(lowerCAmelCase_     ) - 12     ):
          lowerCAmelCase__            =					1
          for j in range(13     ):
               product *= int(n[i + j]     )
          if product > largest_product:
               lowerCAmelCase__            =					product
     return largest_product


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




import unittest

import torch

from diffusers import DDIMScheduler, DDPMScheduler, UNetaDModel
from diffusers.training_utils import set_seed
from diffusers.utils.testing_utils import slow


SCREAMING_SNAKE_CASE__     					=			False



class 						_UpperCAmelCase      (     unittest.TestCase							):






		def _snake_case		(						self				:     str   ,  UpperCAmelCase				:     Dict=32):
				set_seed(0)
				SCREAMING_SNAKE_CASE_				:Dict				     =						UNetaDModel(sample_size=UpperCAmelCase   ,  in_channels=3   ,  out_channels=3)
				SCREAMING_SNAKE_CASE_				:Optional[Any]				     =						torch.optim.SGD(model.parameters()   ,  lr=0.0001)
				return model, optimizer







		@slow
		def _snake_case		(						self				:     str):
				SCREAMING_SNAKE_CASE_				:List[str]				     =						"cpu"  # ensure full determinism without setting the CUBLAS_WORKSPACE_CONFIG env variable
				SCREAMING_SNAKE_CASE_				:Any				     =						DDPMScheduler(
				    num_train_timesteps=10_00   ,  beta_start=0.0001   ,  beta_end=0.02   ,  beta_schedule="linear"   ,  clip_sample=UpperCAmelCase   ,  )
				SCREAMING_SNAKE_CASE_				:str				     =						DDIMScheduler(
				    num_train_timesteps=10_00   ,  beta_start=0.0001   ,  beta_end=0.02   ,  beta_schedule="linear"   ,  clip_sample=UpperCAmelCase   ,  )

				assert ddpm_scheduler.config.num_train_timesteps == ddim_scheduler.config.num_train_timesteps

				# shared batches for DDPM and DDIM
				set_seed(0)
				SCREAMING_SNAKE_CASE_				:Any				     =						[torch.randn((4, 3, 32, 32)).clip(-1   ,  1).to(UpperCAmelCase) for _ in range(4)]
				SCREAMING_SNAKE_CASE_				:str				     =						[torch.randn((4, 3, 32, 32)).to(UpperCAmelCase) for _ in range(4)]
				SCREAMING_SNAKE_CASE_				:List[Any]				     =						[torch.randint(0   ,  10_00   ,  (4,)).long().to(UpperCAmelCase) for _ in range(4)]

				# train with a DDPM scheduler
				SCREAMING_SNAKE_CASE_     ,				SCREAMING_SNAKE_CASE_				:Tuple				     =						self.get_model_optimizer(resolution=32)
				model.train().to(UpperCAmelCase)
				for i in range(4):
						optimizer.zero_grad()
						SCREAMING_SNAKE_CASE_				:List[Any]				     =						ddpm_scheduler.add_noise(clean_images[i]   ,  noise[i]   ,  timesteps[i])
						SCREAMING_SNAKE_CASE_				:Optional[Any]				     =						model(UpperCAmelCase   ,  timesteps[i]).sample
						SCREAMING_SNAKE_CASE_				:List[Any]				     =						torch.nn.functional.mse_loss(UpperCAmelCase   ,  noise[i])
						loss.backward()
						optimizer.step()
				del model, optimizer

				# recreate the model and optimizer, and retry with DDIM
				SCREAMING_SNAKE_CASE_     ,				SCREAMING_SNAKE_CASE_				:Optional[Any]				     =						self.get_model_optimizer(resolution=32)
				model.train().to(UpperCAmelCase)
				for i in range(4):
						optimizer.zero_grad()
						SCREAMING_SNAKE_CASE_				:List[str]				     =						ddim_scheduler.add_noise(clean_images[i]   ,  noise[i]   ,  timesteps[i])
						SCREAMING_SNAKE_CASE_				:Tuple				     =						model(UpperCAmelCase   ,  timesteps[i]).sample
						SCREAMING_SNAKE_CASE_				:Optional[Any]				     =						torch.nn.functional.mse_loss(UpperCAmelCase   ,  noise[i])
						loss.backward()
						optimizer.step()
				del model, optimizer

				self.assertTrue(torch.allclose(UpperCAmelCase   ,  UpperCAmelCase   ,  atol=1E-5))
				self.assertTrue(torch.allclose(UpperCAmelCase   ,  UpperCAmelCase   ,  atol=1E-5))






