





'''simple docstring'''

import unittest
from timeit import timeit





def 		UpperCamelCase       (							_lowerCamelCase      :      int		, _lowerCamelCase      :      int ):
    A__       =    first_num if first_num >= second_num else second_num
    A__       =    max_num
    while (common_mult % first_num > 0) or (common_mult % second_num > 0):
        common_mult += max_num
    return common_mult





def 		UpperCamelCase       (							_lowerCamelCase      :      int		, _lowerCamelCase      :      int ):
    return b if a == 0 else greatest_common_divisor(b % a		, _lowerCamelCase )





def 		UpperCamelCase       (							_lowerCamelCase      :      int		, _lowerCamelCase      :      int ):
    return first_num // greatest_common_divisor(_lowerCamelCase		, _lowerCamelCase ) * second_num





def 		UpperCamelCase       (							):
    A__       =    (
        "from __main__ import least_common_multiple_slow, least_common_multiple_fast"
    )
    print(
        "least_common_multiple_slow():"		, timeit("least_common_multiple_slow(1000, 999)"		, setup=_lowerCamelCase )		, )
    print(
        "least_common_multiple_fast():"		, timeit("least_common_multiple_fast(1000, 999)"		, setup=_lowerCamelCase )		, )






class      UpperCAmelCase			( unittest.TestCase       ):
 __lowercase     	=       (
     (10, 20),
     (13, 15),
     (4, 31),
     (10, 42),
     (43, 34),
     (5, 12),
     (12, 25),
     (10, 25),
     (6, 9),
 )
 __lowercase     	=       (20, 195, 124, 210, 1462, 60, 300, 50, 18)
 def   UpperCAmelCase_							(       self   :Tuple							)->							List[str]:
     for i, (first_num, second_num) in enumerate(self.test_inputs							):
         A__       =    least_common_multiple_slow(lowercase_		, lowercase_							)
         A__       =    least_common_multiple_fast(lowercase_		, lowercase_							)
         with self.subTest(i=lowercase_							):
             self.assertEqual(lowercase_		, self.expected_results[i]							)
             self.assertEqual(lowercase_		, self.expected_results[i]							)


if __name__ == "__main__":
  benchmark()
  unittest.main()










'''simple docstring'''

import bisect
import copy
from collections import defaultdict

import numpy as np
from torch.utils.data import BatchSampler, Sampler

from utils import logger





def 		UpperCamelCase       (							_lowerCamelCase      :      str		, _lowerCamelCase      :      Optional[Any] ):
    A__       =    copy.deepcopy(_lowerCamelCase )
    A__       =    sorted(_lowerCamelCase )
    A__       =    [bisect.bisect_right(_lowerCamelCase		, _lowerCamelCase ) for y in x]
    return quantized





def 		UpperCamelCase       (							_lowerCamelCase      :      Optional[int]		, _lowerCamelCase      :      Tuple=0 ):
    A__       =    np.arange(start=3		, stop=_lowerCamelCase		, step=4 ).tolist() if k > 0 else [10]
    A__       =    _quantize(_lowerCamelCase		, _lowerCamelCase )
    # count number of elements per group
    A__       =    np.unique(_lowerCamelCase		, return_counts=_lowerCamelCase )[1]
    A__       =    [0] + bins + [np.inf]
    logger.info("Using {} as bins for aspect lengths quantization".format(_lowerCamelCase ) )
    logger.info("Count of instances per bin: {}".format(_lowerCamelCase ) )
    return groups






class      UpperCAmelCase			( UpperCamelCase__       ):
 def __init__(       self   :Optional[Any]		, lowercase_   :List[Any]		, lowercase_   :Optional[int]		, lowercase_   :str							)->							Dict:
     if not isinstance(lowercase_		, lowercase_							):
         raise ValueError(
             "sampler should be an instance of torch.utils.data.Sampler, but got sampler={}".format(lowercase_							)							)
     A__       =    sampler
     A__       =    group_ids
     A__       =    batch_size
 def __iter__(       self   :int							)->							Tuple:
     A__       =    defaultdict(lowercase_							)
     A__       =    defaultdict(lowercase_							)

     A__       =    0
     for idx in self.sampler:
         A__       =    self.group_ids[idx]
         buffer_per_group[group_id].append(lowercase_							)
         samples_per_group[group_id].append(lowercase_							)
         if len(buffer_per_group[group_id]							) == self.batch_size:
             yield buffer_per_group[group_id]  # TODO
             num_batches += 1
             del buffer_per_group[group_id]
         assert len(buffer_per_group[group_id]							) < self.batch_size

     # now we have run out of elements that satisfy
     # the group criteria, let's return the remaining
     # elements so that the size of the sampler is
     # deterministic
     A__       =    len(self							)
     A__       =    expected_num_batches - num_batches
     if num_remaining > 0:
         # for the remaining batches, group the batches by similar lengths
         A__       =    []
         for group_id, idxs in sorted(buffer_per_group.items()		, key=lambda lowercase_							: x[0]							):
             batch_idx.extend(lowercase_							)
             if len(lowercase_							) >= self.batch_size:
                 yield batch_idx[: self.batch_size]
                 A__       =    batch_idx[self.batch_size :]
                 num_remaining -= 1
         if len(lowercase_							) > 0:
             yield batch_idx
             num_remaining -= 1
     assert num_remaining == 0



 def __len__(       self   :int							)->							Tuple:
     return (len(self.sampler							) + self.batch_size - 1) // self.batch_size



