code: 
  
  
  
  
  
  
  '''simple docstring'''
  
  
  
  
  
  import math
  from dataclasses import dataclass
  from typing import List, Optional, Tuple, Union
  
  import numpy as np
  import torch
  
  from ..configuration_utils import ConfigMixin, register_to_config
  from ..utils import BaseOutput, logging, randn_tensor
  from .scheduling_utils import KarrasDiffusionSchedulers, SchedulerMixin
  
  
  SCREAMING_SNAKE_CASE__		:       Tuple   							=							logging.get_logger(__name__)  # pylint: disable=invalid-name
  
  
  
  
  
  
  
  @dataclass
  # Copied from diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput with DDPM->EulerDiscrete
  class 							UpperCAmelCase_     (		lowerCAmelCase_		):
       __lowerCamelCase										=     42
       __lowerCamelCase										=     None
  
  
  
  
  
  def    _lowerCamelCase	(	__lowerCamelCase   ,       __lowerCamelCase=0.999   ,       __lowerCamelCase="cosine"   ,       )   -> Dict:
  
       '''simple docstring'''
       if alpha_transform_type == "cosine":
  
            def alpha_bar_fn(__lowerCamelCase					):
                 return math.cos((t + 0.008) / 1.008 * math.pi / 2					) ** 2
  
       elif alpha_transform_type == "exp":
  
            def alpha_bar_fn(__lowerCamelCase					):
                 return math.exp(t * -12.0					)
  
       else:
            raise ValueError(F"Unsupported alpha_tranform_type: {alpha_transform_type}"					)
  
       UpperCAmelCase__			:     Any										= []
       for i in range(_SCREAMING_SNAKE_CASE					):
            UpperCAmelCase__			:     Optional[int]										= i / num_diffusion_timesteps
            UpperCAmelCase__			:     List[str]										= (i + 1) / num_diffusion_timesteps
            betas.append(min(1 - alpha_bar_fn(_SCREAMING_SNAKE_CASE					) / alpha_bar_fn(_SCREAMING_SNAKE_CASE					)   ,       _SCREAMING_SNAKE_CASE					)					)
       return torch.tensor(_SCREAMING_SNAKE_CASE   ,       dtype=torch.floataa					)
  
  
  
  
  
  
  
  class 							UpperCAmelCase_     (		lowerCAmelCase_       ,			lowerCAmelCase_		):
       __lowerCamelCase										=     [e.name for e in KarrasDiffusionSchedulers]
       __lowerCamelCase										=     1
  
  
  
  
       @register_to_config
       def __init__(							self  ,	_lowerCAmelCase = 1000  ,	_lowerCAmelCase = 0.0_0_0_1  ,	_lowerCAmelCase = 0.0_2  ,	_lowerCAmelCase = "linear"  ,	_lowerCAmelCase = None  ,	_lowerCAmelCase = "epsilon"  ,	_lowerCAmelCase = "linear"  ,	_lowerCAmelCase = False  ,	_lowerCAmelCase = "linspace"  ,	_lowerCAmelCase = 0  ,	):
  
  
  
  
  
            if trained_betas is not None:
                 UpperCAmelCase__			:     Any										= torch.tensor(__a  ,	dtype=torch.floataa		)
            elif beta_schedule == "linear":
                 UpperCAmelCase__			:     Dict										= torch.linspace(__a  ,	__a  ,	__a  ,	dtype=torch.floataa		)
            elif beta_schedule == "scaled_linear":
                 # this schedule is very specific to the latent diffusion model.
                 UpperCAmelCase__			:     Any										= (
                     torch.linspace(beta_start**0.5  ,	beta_end**0.5  ,	__a  ,	dtype=torch.floataa		) ** 2
                 )
            elif beta_schedule == "squaredcos_cap_v2":
                 # Glide cosine schedule
                 UpperCAmelCase__			:     int										= betas_for_alpha_bar(__a		)
            else:
                 raise NotImplementedError(f"{beta_schedule} does is not implemented for {self.__class__}"		)
  
            UpperCAmelCase__			:     List[Any]										= 1.0 - self.betas
            UpperCAmelCase__			:     int										= torch.cumprod(self.alphas  ,	dim=0		)
  
            UpperCAmelCase__			:     List[Any]										= np.array(((1 - self.alphas_cumprod) / self.alphas_cumprod) ** 0.5		)
            UpperCAmelCase__			:     List[Any]										= np.concatenate([sigmas[::-1], [0.0]]		).astype(np.floataa		)
            UpperCAmelCase__			:     Union[str, Any]										= torch.from_numpy(__a		)
  
            # setable values
            UpperCAmelCase__			:     List[str]										= None
            UpperCAmelCase__			:     List[Any]										= np.linspace(0  ,	num_train_timesteps - 1  ,	__a  ,	dtype=__a		)[::-1].copy()
            UpperCAmelCase__			:     Optional[Any]										= torch.from_numpy(__a		)
            UpperCAmelCase__			:     Any										= False
            UpperCAmelCase__			:     str										= use_karras_sigmas
  
  
  
  
       @property
       def      __UpperCAmelCase     (							self		):
  
  
  
  
  
            if self.config.timestep_spacing in ["linspace", "trailing"]:
                 return self.sigmas.max()
  
            return (self.sigmas.max() ** 2 + 1) ** 0.5
  
  
  
  
       def      __UpperCAmelCase     (							self  ,	_lowerCAmelCase  ,	_lowerCAmelCase		):
  
  
  
  
  
            if isinstance(__a  ,	torch.Tensor		):
                 UpperCAmelCase__			:     Optional[int]										= timestep.to(self.timesteps.device		)
            UpperCAmelCase__			:     Optional[Any]										= (self.timesteps == timestep).nonzero().item()
            UpperCAmelCase__			:     List[str]										= self.sigmas[step_index]
  
            UpperCAmelCase__			:     int										= sample / ((sigma**2 + 1) ** 0.5)
  
            UpperCAmelCase__			:     Union[str, Any]										= True
            return sample
  
  
  
  
       def      __UpperCAmelCase     (							self  ,	_lowerCAmelCase  ,	_lowerCAmelCase = None		):
            UpperCAmelCase__			:     Dict										= num_inference_steps
  
            # "linspace", "leading", "trailing" corresponds to annotation of Table 2. of https://arxiv.org/abs/2305.08891
            if self.config.timestep_spacing == "linspace":
                 UpperCAmelCase__			:     Optional[Any]										= np.linspace(0  ,	self.config.num_train_timesteps - 1  ,	__a  ,	dtype=__a		)[
                     ::-1
                 ].copy()
            elif self.config.timestep_spacing == "leading":
                 UpperCAmelCase__			:     str										= self.config.num_train_timesteps // self.num_inference_steps
                 # creates integer timesteps by multiplying by ratio
                 # casting to int to avoid issues when num_inference_step is power of 3
                 UpperCAmelCase__			:     int										= (np.arange(0  ,	__a		) * step_ratio).round()[::-1].copy().astype(__a		)
                 timesteps += self.config.steps_offset
            elif self.config.timestep_spacing == "trailing":
                 UpperCAmelCase__			:     Optional[int]										= self.config.num_train_timesteps / self.num_inference_steps
                 # creates integer timesteps by multiplying by ratio
                 # casting to int to avoid issues when num_inference_step is power of 3
                 UpperCAmelCase__			:     str										= (np.arange(self.config.num_train_timesteps  ,	0  ,	-step_ratio		)).round().copy().astype(__a		)
                 timesteps -= 1
            else:
                 raise ValueError(
                     f"{self.config.timestep_spacing} is not supported. Please make sure to choose one of 'linspace', 'leading' or 'trailing'."		)
  
            UpperCAmelCase__			:     Tuple										= np.array(((1 - self.alphas_cumprod) / self.alphas_cumprod) ** 0.5		)
            UpperCAmelCase__			:     Tuple										= np.log(__a		)
  
            if self.config.interpolation_type == "linear":
                 UpperCAmelCase__			:     Optional[Any]										= np.interp(__a  ,	np.arange(0  ,	len(__a		)		)  ,	__a		)
            elif self.config.interpolation_type == "log_linear":
                 UpperCAmelCase__			:     Optional[Any]										= torch.linspace(np.log(sigmas[-1]		)  ,	np.log(sigmas[0]		)  ,	num_inference_steps + 1		).exp()
            else:
                 raise ValueError(
                     f"{self.config.interpolation_type} is not implemented. Please specify interpolation_type to either"
                     """ \'linear\' or \'log_linear\'"""		)
  
            if self.use_karras_sigmas:
                 UpperCAmelCase__			:     Any										= self._convert_to_karras(in_sigmas=__a  ,	num_inference_steps=self.num_inference_steps		)
                 UpperCAmelCase__			:     Tuple										= np.array([self._sigma_to_t(__a  ,	__a		) for sigma in sigmas]		)
  
            UpperCAmelCase__			:     str										= np.concatenate([sigmas, [0.0]]		).astype(np.floataa		)
            UpperCAmelCase__			:     List[Any]										= torch.from_numpy(__a		).to(device=__a		)
            if str(__a		).startswith("""mps"""		):
                 # mps does not support float64
                 UpperCAmelCase__			:     int										= torch.from_numpy(__a		).to(__a  ,	dtype=torch.floataa		)
            else:
                 UpperCAmelCase__			:     int										= torch.from_numpy(__a		).to(device=__a		)
  
  
  
  
       def      __UpperCAmelCase     (							self  ,	_lowerCAmelCase  ,	_lowerCAmelCase		):
            UpperCAmelCase__			:     Any										= np.log(__a		)
  
            # get distribution
            UpperCAmelCase__			:     Dict										= log_sigma - log_sigmas[:, np.newaxis]
  
            # get sigmas range
            UpperCAmelCase__			:     Optional[Any]										= np.cumsum((dists >= 0)  ,	axis=0		).argmax(axis=0		).clip(max=log_sigmas.shape[0] - 2		)
            UpperCAmelCase__			:     int										= low_idx + 1
  
            UpperCAmelCase__			:     Tuple										= log_sigmas[low_idx]
            UpperCAmelCase__			:     Any										= log_sigmas[high_idx]
  
            # interpolate sigmas
            UpperCAmelCase__			:     Dict										= (low - log_sigma) / (low - high)
            UpperCAmelCase__			:     List[Any]										= np.clip(__a  ,	0  ,	1		)
  
            # transform interpolation to time range
            UpperCAmelCase__			:     Union[str, Any]										= (1 - w) * low_idx + w * high_idx
            UpperCAmelCase__			:     Optional[Any]										= t.reshape(sigma.shape		)
            return t
  
  
  
  
       def      __UpperCAmelCase     (							self  ,	_lowerCAmelCase  ,	_lowerCAmelCase		):
            UpperCAmelCase__			:     float										= in_sigmas[-1].item()
            UpperCAmelCase__			:     float										= in_sigmas[0].item()
  
            UpperCAmelCase__			:     Union[str, Any]										= 7.0  # 7.0 is the value used in the paper
            UpperCAmelCase__			:     int										= np.linspace(0  ,	1  ,	__a		)
            UpperCAmelCase__			:     int										= sigma_min ** (1 / rho)
            UpperCAmelCase__			:     Optional[Any]										= sigma_max ** (1 / rho)
            UpperCAmelCase__			:     Optional[Any]										= (max_inv_rho + ramp * (min_inv_rho - max_inv_rho)) ** rho
            return sigmas
  
  
  
  
       def      __UpperCAmelCase     (							self  ,	_lowerCAmelCase  ,	_lowerCAmelCase  ,	_lowerCAmelCase  ,	_lowerCAmelCase = 0.0  ,	_lowerCAmelCase = 0.0  ,	_lowerCAmelCase = float("""inf"""		)  ,	_lowerCAmelCase = 1.0  ,	_lowerCAmelCase = None  ,	_lowerCAmelCase = True  ,	):
  
  
  
  
  
            if (
                isinstance(__a  ,	__a		)
                or isinstance(__a  ,	torch.IntTensor		)
                or isinstance(__a  ,	torch.LongTensor		)
            ):
                 raise ValueError(
                     (
                         """Passing integer indices (e.g. from `enumerate(timesteps)`) as timesteps to"""
                         """ `EulerDiscreteScheduler.step()` is not supported. Make sure to pass"""
                         """ one of the `scheduler.timesteps` as a timestep."""
                     )  ,	)
  
            if not self.is_scale_input_called:
                 logger.warning(
                     """The `scale_model_input` function should be called before `step` to ensure correct denoising. """
                     """See `StableDiffusionPipeline` for a usage example."""		)
  
            if isinstance(__a  ,	torch.Tensor		):
                 UpperCAmelCase__			:     Optional[int]										= timestep.to(self.timesteps.device		)
  
            UpperCAmelCase__			:     str										= (self.timesteps == timestep).nonzero().item()
            UpperCAmelCase__			:     List[Any]										= self.sigmas[step_index]
  
            UpperCAmelCase__			:     List[Any]										= min(s_churn / (len(self.sigmas		) - 1)  ,	2**0.5 - 1		) if s_tmin <= sigma <= s_tmax else 0.0
  
            UpperCAmelCase__			:     Optional[Any]										= randn_tensor(
                model_output.shape  ,	dtype=model_output.dtype  ,	device=model_output.device  ,	generator=__a		)
  
            UpperCAmelCase__			:     Optional[Any]										= noise * s_noise
            UpperCAmelCase__			:     int										= sigma * (gamma + 1)
  
            if gamma > 0:
                 UpperCAmelCase__			:     Optional[Any]										= sample + eps * (sigma_hat**2 - sigma**2) ** 0.5
  
            # 1. compute predicted original sample (x_0) from sigma-scaled predicted noise
            # NOTE: "original_sample" should not be an expected prediction_type but is left in for
            # backwards compatibility
            if self.config.prediction_type == "original_sample" or self.config.prediction_type == "sample":
                 UpperCAmelCase__			:     Optional[Any]										= model_output
            elif self.config.prediction_type == "epsilon":
                 UpperCAmelCase__			:     Tuple										= sample - sigma_hat * model_output
            elif self.config.prediction_type == "v_prediction":
                 # * c_out + input * c_skip
                 UpperCAmelCase__			:     List[Any]										= model_output * (-sigma / (sigma**2 + 1) ** 0.5) + (sample / (sigma**2 + 1))
            else:
                 raise ValueError(
                     f"prediction_type given as {self.config.prediction_type} must be one of `epsilon`, or `v_prediction`"		)
  
            # 2. Convert to an ODE derivative
            UpperCAmelCase__			:     List[Any]										= (sample - pred_original_sample) / sigma_hat
  
            UpperCAmelCase__			:     Union[str, Any]										= self.sigmas[step_index + 1] - sigma_hat
  
            UpperCAmelCase__			:     Tuple										= sample + derivative * dt
  
            if not return_dict:
                 return (prev_sample,)
  
            return EulerDiscreteSchedulerOutput(prev_sample=__a  ,	pred_original_sample=__a		)
  
  
  
  
       def      __UpperCAmelCase     (							self  ,	_lowerCAmelCase  ,	_lowerCAmelCase  ,	_lowerCAmelCase  ,	):
            UpperCAmelCase__			:     Optional[int]										= self.sigmas.to(device=original_samples.device  ,	dtype=original_samples.dtype		)
            if original_samples.device.type == "mps" and torch.is_floating_point(__a		):
                 # mps does not support float64
                 UpperCAmelCase__			:     int										= self.timesteps.to(original_samples.device  ,	dtype=torch.floataa		)
                 UpperCAmelCase__			:     int										= timesteps.to(original_samples.device  ,	dtype=torch.floataa		)
            else:
                 UpperCAmelCase__			:     Optional[Any]										= self.timesteps.to(original_samples.device		)
                 UpperCAmelCase__			:     Any										= timesteps.to(original_samples.device		)
  
            UpperCAmelCase__			:     Tuple										= [(schedule_timesteps == t).nonzero().item() for t in timesteps]
  
            UpperCAmelCase__			:     str										= sigmas[step_indices].flatten()
            while len(sigma.shape		) < len(original_samples.shape		):
                 UpperCAmelCase__			:     str										= sigma.unsqueeze(-1		)
  
            UpperCAmelCase__			:     Optional[Any]										= original_samples + noise * sigma
            return noisy_samples
  
  
  
  
       def __len__(							self		):
            return self.config.num_train_timesteps
  
  
  
  
  
  
  
style_context: 
  
  
  
  
  
  
  import random
  
  
  
  
  
  
  
  class 							UpperCAmelCase_     :
  
  
  
  
       def __init__(							self  ,	_lowerCAmelCase  ,	_lowerCAmelCase		):
            UpperCAmelCase__			:     Union[str, Any]										= x
            UpperCAmelCase__			:     Union[str, Any]										= y
  
  
  
  
       def      __UpperCAmelCase     (							self		):
            return (self.x**2 + self.y**2) <= 1
  
  
  
  
       @classmethod
       def      __UpperCAmelCase     (							cls		):
            return cls(x=random.random()  ,	y=random.random()		)
  
  
  
  
  
  def    _lowerCamelCase	(	__lowerCamelCase					)   -> float:
  
       '''simple docstring'''
       if number_of_simulations < 1:
            raise ValueError("""At least one simulation is necessary to estimate PI."""					)
  
       UpperCAmelCase__			:     Dict										= 0
       for _ in range(__lowerCamelCase					):
            UpperCAmelCase__			:     Union[str, Any]										= Point.random_unit_square()
  
            if random_point.is_in_unit_circle():
                 number_in_unit_circle += 1
  
       return 4 * number_in_unit_circle / number_of_simulations
  
  
  if __name__ == "__main__":
        # import doctest
  
        # doctest.testmod()
        from math import pi
  
        SCREAMING_SNAKE_CASE__		:       List[str]   							=							"""Please enter the desired number of Monte Carlo simulations: """
        SCREAMING_SNAKE_CASE__		:       int   							=							estimate_pi(int(input(prompt).strip()))
        print(f'''An estimate of PI is {my_pi} with an error of {abs(my_pi - pi)}''')
  
  
  
  
  
  
  