




"""simple docstring"""

a							      =     [sum(int(c, 10) ** 2 for c in i.__str__()) for i in range(100_000)]






def 		_snake_case	(   _snake_case				:   int				)       ->   int:






      '''simple docstring'''


      _A     =  0
      while number:
            # Increased Speed Slightly by checking every 5 digits together.
            sum_of_digits_squared += DIGITS_SQUARED[number % 10_00_00]
            number //= 10_00_00

      return sum_of_digits_squared


# There are 2 Chains made,
# One ends with 89 with the chain member 58 being the one which when declared first,
# there will be the least number of iterations for all the members to be checked.

# The other one ends with 1 and has only one element 1.

# So 58 and 1 are chosen to be declared at the starting.

# Changed dictionary to an array to quicken the solution
a							      =     [None] * 10_000_000
a							      =     True
a							      =     False






def 		_snake_case	(   _snake_case				:   int				)       ->   bool:






      '''simple docstring'''


      if CHAINS[number - 1] is not None:
            return CHAINS[number - 1]  # type: ignore

      _A     =  chain(next_number(_snake_case				)				)
      _A     =  number_chain

      while number < 10_00_00_00:
            _A     =  number_chain
            number *= 10

      return number_chain






def 		_snake_case	(   _snake_case				:   int = 10_00_00_00				)       ->   int:






      '''simple docstring'''


      for i in range(1							,    _snake_case				):
            if CHAINS[i] is None:
                  chain(i + 1				)

      return CHAINS[:number].count(_snake_case				)


if __name__ == "__main__":
       import doctest

       doctest.testmod()
       print(F'''{solution() = }''')







"""simple docstring"""

import torch

from diffusers import KDPMaDiscreteScheduler
from diffusers.utils import torch_device

from .test_schedulers import SchedulerCommonTest





class 							lowercase_			(	__lowerCAmelCase				):



 '''simple docstring'''
 UpperCAmelCase       :	Optional[int]     =      (KDPMaDiscreteScheduler,)
 UpperCAmelCase       :	Any     =      10

 def      lowerCAmelCase_				(					self			:			Dict       ,				**_UpperCAmelCase			:			Optional[Any]						):
       _A     =  {
           'num_train_timesteps': 1_100,
           'beta_start': 0.0001,
           'beta_end': 0.02,
           'beta_schedule': 'linear',
       }

       config.update(**_UpperCAmelCase						)
       return config

 def      lowerCAmelCase_				(					self			:			Any						):
       for timesteps in [10, 50, 100, 1_000]:
             self.check_over_configs(num_train_timesteps=_UpperCAmelCase						)

 def      lowerCAmelCase_				(					self			:			Dict						):
       for beta_start, beta_end in zip([0.0_0001, 0.0001, 0.001]       ,				[0.0002, 0.002, 0.02]						):
             self.check_over_configs(beta_start=_UpperCAmelCase       ,				beta_end=_UpperCAmelCase						)

 def      lowerCAmelCase_				(					self			:			Tuple						):
       for schedule in ["linear", "scaled_linear"]:
             self.check_over_configs(beta_schedule=_UpperCAmelCase						)

 def      lowerCAmelCase_				(					self			:			Optional[int]						):
       for prediction_type in ["epsilon", "v_prediction"]:
             self.check_over_configs(prediction_type=_UpperCAmelCase						)

 def      lowerCAmelCase_				(					self			:			Optional[int]						):
       _A     =  self.scheduler_classes[0]
       _A     =  self.get_scheduler_config(prediction_type='v_prediction'						)
       _A     =  scheduler_class(**_UpperCAmelCase						)

       scheduler.set_timesteps(self.num_inference_steps						)

       _A     =  self.dummy_model()
       _A     =  self.dummy_sample_deter * scheduler.init_noise_sigma
       _A     =  sample.to(_UpperCAmelCase						)

       for i, t in enumerate(scheduler.timesteps						):
             _A     =  scheduler.scale_model_input(_UpperCAmelCase       ,				_UpperCAmelCase						)

             _A     =  model(_UpperCAmelCase       ,				_UpperCAmelCase						)

             _A     =  scheduler.step(_UpperCAmelCase       ,				_UpperCAmelCase       ,				_UpperCAmelCase						)
             _A     =  output.prev_sample

       _A     =  torch.sum(torch.abs(_UpperCAmelCase						)						)
       _A     =  torch.mean(torch.abs(_UpperCAmelCase						)						)

       if torch_device in ["cpu", "mps"]:
             assert abs(result_sum.item() - 4.6_9_3_4E-0_7						) < 1E-2
             assert abs(result_mean.item() - 6.1_1_1_2E-1_0						) < 1E-3
       else:
             # CUDA
             assert abs(result_sum.item() - 4.6_9_3_4_2_8_6_5_0_1_7_0_9_7_2E-0_7						) < 1E-2
             assert abs(result_mean.item() - 0.0002						) < 1E-3

 def      lowerCAmelCase_				(					self			:			Optional[Any]						):
       if torch_device == "mps":
             return
       _A     =  self.scheduler_classes[0]
       _A     =  self.get_scheduler_config()
       _A     =  scheduler_class(**_UpperCAmelCase						)

       scheduler.set_timesteps(self.num_inference_steps						)

       _A     =  self.dummy_model()
       _A     =  self.dummy_sample_deter * scheduler.init_noise_sigma
       _A     =  sample.to(_UpperCAmelCase						)

       for i, t in enumerate(scheduler.timesteps						):
             _A     =  scheduler.scale_model_input(_UpperCAmelCase       ,				_UpperCAmelCase						)

             _A     =  model(_UpperCAmelCase       ,				_UpperCAmelCase						)

             _A     =  scheduler.step(_UpperCAmelCase       ,				_UpperCAmelCase       ,				_UpperCAmelCase						)
             _A     =  output.prev_sample

       _A     =  torch.sum(torch.abs(_UpperCAmelCase						)						)
       _A     =  torch.mean(torch.abs(_UpperCAmelCase						)						)

       if torch_device in ["cpu", "mps"]:
             assert abs(result_sum.item() - 20.4125						) < 1E-2
             assert abs(result_mean.item() - 0.0266						) < 1E-3
       else:
             # CUDA
             assert abs(result_sum.item() - 20.4125						) < 1E-2
             assert abs(result_mean.item() - 0.0266						) < 1E-3



 def      lowerCAmelCase_				(					self			:			Any						):
       if torch_device == "mps":
             return
       _A     =  self.scheduler_classes[0]
       _A     =  self.get_scheduler_config()
       _A     =  scheduler_class(**_UpperCAmelCase						)

       scheduler.set_timesteps(self.num_inference_steps       ,				device=_UpperCAmelCase						)

       _A     =  self.dummy_model()
       _A     =  self.dummy_sample_deter.to(_UpperCAmelCase						) * scheduler.init_noise_sigma

       for t in scheduler.timesteps:
             _A     =  scheduler.scale_model_input(_UpperCAmelCase       ,				_UpperCAmelCase						)

             _A     =  model(_UpperCAmelCase       ,				_UpperCAmelCase						)

             _A     =  scheduler.step(_UpperCAmelCase       ,				_UpperCAmelCase       ,				_UpperCAmelCase						)
             _A     =  output.prev_sample

       _A     =  torch.sum(torch.abs(_UpperCAmelCase						)						)
       _A     =  torch.mean(torch.abs(_UpperCAmelCase						)						)

       if str(_UpperCAmelCase						).startswith('cpu'						):
             # The following sum varies between 148 and 156 on mps. Why?
             assert abs(result_sum.item() - 20.4125						) < 1E-2
             assert abs(result_mean.item() - 0.0266						) < 1E-3
       else:
             # CUDA
             assert abs(result_sum.item() - 20.4125						) < 1E-2
             assert abs(result_mean.item() - 0.0266						) < 1E-3

