
from __future__ import annotations






def        lowerCamelCase__    (    __lowerCAmelCase  :  int   ,							__lowerCAmelCase  :  int   ,							__lowerCAmelCase  :  int    ):




			"""simple docstring"""


			assert n > 1 and a > 0 and greatest_common_divisor(__lowerCAmelCase   ,							__lowerCAmelCase    ) == 1
			((lowerCAmelCase_)     ,  (lowerCAmelCase_)     ,  (lowerCAmelCase_))      =     extended_gcd(__lowerCAmelCase   ,							__lowerCAmelCase    )  # Implemented below
			lowerCAmelCase_      =     (b * s) % n
			return x






def        lowerCamelCase__    (    __lowerCAmelCase  :  int   ,							__lowerCAmelCase  :  int    ):




			"""simple docstring"""


			((lowerCAmelCase_)     ,  (lowerCAmelCase_))      =     extended_euclid(__lowerCAmelCase   ,							__lowerCAmelCase    )  # Implemented below
			if b < 0:
						lowerCAmelCase_      =     (b % n + n) % n
			return b






def        lowerCamelCase__    (    __lowerCAmelCase  :  int   ,							__lowerCAmelCase  :  int   ,							__lowerCAmelCase  :  int    ):




			"""simple docstring"""


			lowerCAmelCase_      =     invert_modulo(__lowerCAmelCase   ,							__lowerCAmelCase    )
			lowerCAmelCase_      =     (b * s) % n
			return x






def        lowerCamelCase__    (    __lowerCAmelCase  :  int   ,							__lowerCAmelCase  :  int    ):




			"""simple docstring"""


			assert a >= 0 and b >= 0

			if b == 0:
						lowerCAmelCase_     ,  lowerCAmelCase_     ,  lowerCAmelCase_      =     a, 1, 0
			else:
						((lowerCAmelCase_)     ,  (lowerCAmelCase_)     ,  (lowerCAmelCase_))      =     extended_gcd(__lowerCAmelCase   ,							a % b    )
						lowerCAmelCase_      =     q
						lowerCAmelCase_      =     p - q * (a // b)

			assert a % d == 0 and b % d == 0
			assert d == a * x + b * y

			return (d, x, y)






def        lowerCamelCase__    (    __lowerCAmelCase  :  int   ,							__lowerCAmelCase  :  int    ):




			"""simple docstring"""


			if b == 0:
						return (1, 0)
			((lowerCAmelCase_)     ,  (lowerCAmelCase_))      =     extended_euclid(__lowerCAmelCase   ,							a % b    )
			lowerCAmelCase_      =     a // b
			return (y, x - k * y)






def        lowerCamelCase__    (    __lowerCAmelCase  :  int   ,							__lowerCAmelCase  :  int    ):




			"""simple docstring"""


			if a < b:
						lowerCAmelCase_     ,  lowerCAmelCase_      =     b, a

			while a % b != 0:
						lowerCAmelCase_     ,  lowerCAmelCase_      =     b, a % b

			return b


if __name__ == "__main__":
			from doctest import testmod

			testmod(name="modular_division", verbose=True)
			testmod(name="modular_division2", verbose=True)
			testmod(name="invert_modulo", verbose=True)
			testmod(name="extended_gcd", verbose=True)
			testmod(name="extended_euclid", verbose=True)
			testmod(name="greatest_common_divisor", verbose=True)





import torch
import torch.nn.functional as F

from diffusers import VQDiffusionScheduler

from .test_schedulers import SchedulerCommonTest





class      _lowerCAmelCase (     __a	):
				_lowercase      		=(VQDiffusionScheduler,)




				def 					__a						( self    ,    **_UpperCamelCase					)    ->				List[str]:
							lowerCAmelCase_      =     {
							    "num_vec_classes": 4_097,
							    "num_train_timesteps": 100,
							}

							config.update(**_UpperCamelCase					)
							return config




				def 					__a						( self    ,    _UpperCamelCase					)    ->				str:
							lowerCAmelCase_      =     4
							lowerCAmelCase_      =     8
							lowerCAmelCase_      =     8

							lowerCAmelCase_      =     torch.randint(0    ,    _UpperCamelCase    ,    (batch_size, height * width)					)

							return sample




				@property
				def 					__a						( self					)    ->				List[str]:
							assert False




				def 					__a						( self    ,    _UpperCamelCase					)    ->				Tuple:
							def model(_UpperCamelCase    ,    _UpperCamelCase    ,    *_UpperCamelCase					):
										lowerCAmelCase_     ,  lowerCAmelCase_      =     sample.shape
										lowerCAmelCase_      =     torch.rand((batch_size, num_vec_classes - 1, num_latent_pixels)					)
										lowerCAmelCase_      =     F.log_softmax(logits.double()    ,    dim=1					).float()
										return return_value

							return model




				def 					__a						( self					)    ->				str:
							for timesteps in [2, 5, 100, 1_000]:
										self.check_over_configs(num_train_timesteps=_UpperCamelCase					)




				def 					__a						( self					)    ->				Dict:
							for num_vec_classes in [5, 100, 1_000, 4_000]:
										self.check_over_configs(num_vec_classes=_UpperCamelCase					)




				def 					__a						( self					)    ->				Tuple:
							for t in [0, 50, 99]:
										self.check_over_forward(time_step=_UpperCamelCase					)




				def 					__a						( self					)    ->				List[str]:
							pass



