
from __future__ import annotations

from math import ceil, floor, sqrt





def 	SCREAMING_SNAKE_CASE__    (      __lowerCAmelCase = 2_000_000							):
    snake_case__						=				[0]
    snake_case__						=				42

    for idx in range(1    ,		ceil(sqrt(target * 2							) * 1.1							)							):
        triangle_numbers.append(triangle_numbers[-1] + idx							)

    # we want this to be as close as possible to target
    snake_case__						=				0
    # the area corresponding to the grid that gives the product closest to target
    snake_case__						=				0
    # an estimate of b, using the quadratic formula
    snake_case__						=				42
    # the largest integer less than b_estimate
    snake_case__						=				42
    # the largest integer less than b_estimate
    snake_case__						=				42
    # the triangle number corresponding to b_floor
    snake_case__						=				42
    # the triangle number corresponding to b_ceil
    snake_case__						=				42

    for idx_a, triangle_a in enumerate(triangle_numbers[1:]    ,		1							):
        snake_case__						=				(-1 + sqrt(1 + 8 * target / triangle_a							)) / 2
        snake_case__						=				floor(lowercase__							)
        snake_case__						=				ceil(lowercase__							)
        snake_case__						=				triangle_numbers[b_floor]
        snake_case__						=				triangle_numbers[b_ceil]

        if abs(target - triangle_b_first_guess * triangle_a							) < abs(
            target - best_product							):
            snake_case__						=				triangle_b_first_guess * triangle_a
            snake_case__						=				idx_a * b_floor

        if abs(target - triangle_b_second_guess * triangle_a							) < abs(
            target - best_product							):
            snake_case__						=				triangle_b_second_guess * triangle_a
            snake_case__						=				idx_a * b_ceil

    return area


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





import torch

from diffusers import KDPMaDiscreteScheduler
from diffusers.utils import torch_device

from .test_schedulers import SchedulerCommonTest




class 					_SCREAMING_SNAKE_CASE  (      __UpperCamelCase ):
      _A						:		Any    	=     (KDPMaDiscreteScheduler,)
      _A						:		Dict    	=     10
      def A_			(			self		,	**lowerCamelCase ):
          snake_case__						=				{
              "num_train_timesteps": 11_00,
              "beta_start": 0.0_0_0_1,
              "beta_end": 0.0_2,
              "beta_schedule": "linear",
          }

          config.update(**lowerCamelCase )
          return config
      def A_			(			self ):
          for timesteps in [10, 50, 1_00, 10_00]:
              self.check_over_configs(num_train_timesteps=lowerCamelCase )
      def A_			(			self ):
          for beta_start, beta_end in zip([0.0_0_0_0_1, 0.0_0_0_1, 0.0_0_1]		,	[0.0_0_0_2, 0.0_0_2, 0.0_2] ):
              self.check_over_configs(beta_start=lowerCamelCase		,	beta_end=lowerCamelCase )
      def A_			(			self ):
          for schedule in ["linear", "scaled_linear"]:
              self.check_over_configs(beta_schedule=lowerCamelCase )
      def A_			(			self ):
          for prediction_type in ["epsilon", "v_prediction"]:
              self.check_over_configs(prediction_type=lowerCamelCase )
      def A_			(			self ):
          snake_case__						=				self.scheduler_classes[0]
          snake_case__						=				self.get_scheduler_config(prediction_type="v_prediction" )
          snake_case__						=				scheduler_class(**lowerCamelCase )

          scheduler.set_timesteps(self.num_inference_steps )

          snake_case__						=				self.dummy_model()
          snake_case__						=				self.dummy_sample_deter * scheduler.init_noise_sigma
          snake_case__						=				sample.to(lowerCamelCase )

          for i, t in enumerate(scheduler.timesteps ):
              snake_case__						=				scheduler.scale_model_input(lowerCamelCase		,	lowerCamelCase )

              snake_case__						=				model(lowerCamelCase		,	lowerCamelCase )

              snake_case__						=				scheduler.step(lowerCamelCase		,	lowerCamelCase		,	lowerCamelCase )
              snake_case__						=				output.prev_sample

          snake_case__						=				torch.sum(torch.abs(lowerCamelCase ) )
          snake_case__						=				torch.mean(torch.abs(lowerCamelCase ) )

          if torch_device in ["cpu", "mps"]:
              assert abs(result_sum.item() - 4.69_34e-07 ) < 1e-2
              assert abs(result_mean.item() - 6.11_12e-10 ) < 1e-3
          else:
              # CUDA
              assert abs(result_sum.item() - 4.6_93_42_86_50_17_09_72e-07 ) < 1e-2
              assert abs(result_mean.item() - 0.0_0_0_2 ) < 1e-3
      def A_			(			self ):
          if torch_device == "mps":
              return
          snake_case__						=				self.scheduler_classes[0]
          snake_case__						=				self.get_scheduler_config()
          snake_case__						=				scheduler_class(**lowerCamelCase )

          scheduler.set_timesteps(self.num_inference_steps )

          snake_case__						=				self.dummy_model()
          snake_case__						=				self.dummy_sample_deter * scheduler.init_noise_sigma
          snake_case__						=				sample.to(lowerCamelCase )

          for i, t in enumerate(scheduler.timesteps ):
              snake_case__						=				scheduler.scale_model_input(lowerCamelCase		,	lowerCamelCase )

              snake_case__						=				model(lowerCamelCase		,	lowerCamelCase )

              snake_case__						=				scheduler.step(lowerCamelCase		,	lowerCamelCase		,	lowerCamelCase )
              snake_case__						=				output.prev_sample

          snake_case__						=				torch.sum(torch.abs(lowerCamelCase ) )
          snake_case__						=				torch.mean(torch.abs(lowerCamelCase ) )

          if torch_device in ["cpu", "mps"]:
              assert abs(result_sum.item() - 2_0.4_1_2_5 ) < 1e-2
              assert abs(result_mean.item() - 0.0_2_6_6 ) < 1e-3
          else:
              # CUDA
              assert abs(result_sum.item() - 2_0.4_1_2_5 ) < 1e-2
              assert abs(result_mean.item() - 0.0_2_6_6 ) < 1e-3



      def A_			(			self ):
          if torch_device == "mps":
              return
          snake_case__						=				self.scheduler_classes[0]
          snake_case__						=				self.get_scheduler_config()
          snake_case__						=				scheduler_class(**lowerCamelCase )

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

          snake_case__						=				self.dummy_model()
          snake_case__						=				self.dummy_sample_deter.to(lowerCamelCase ) * scheduler.init_noise_sigma

          for t in scheduler.timesteps:
              snake_case__						=				scheduler.scale_model_input(lowerCamelCase		,	lowerCamelCase )

              snake_case__						=				model(lowerCamelCase		,	lowerCamelCase )

              snake_case__						=				scheduler.step(lowerCamelCase		,	lowerCamelCase		,	lowerCamelCase )
              snake_case__						=				output.prev_sample

          snake_case__						=				torch.sum(torch.abs(lowerCamelCase ) )
          snake_case__						=				torch.mean(torch.abs(lowerCamelCase ) )

          if str(lowerCamelCase ).startswith("cpu" ):
              # The following sum varies between 148 and 156 on mps. Why?
              assert abs(result_sum.item() - 2_0.4_1_2_5 ) < 1e-2
              assert abs(result_mean.item() - 0.0_2_6_6 ) < 1e-3
          else:
              # CUDA
              assert abs(result_sum.item() - 2_0.4_1_2_5 ) < 1e-2
              assert abs(result_mean.item() - 0.0_2_6_6 ) < 1e-3



