Ë
    éÿæi  ã            	       ó¦   — d dl Z d dlmZmZ d dlmZ dededefd„Zdedede	defd„Z
dded	e	d
edefd„Zdee   dee	   defd„Zded
ede	defd„Zy)é    N)ÚCallableÚListÚinitÚ
decay_rateÚreturnc                 ó   ‡ ‡— ˆˆ fd„}|S )a   Make an exponential decay scheduler.

    Args:
        init (float): Initial value.
        decay_rate (float): Multiplicative factor to decay by.

    Example:
        >>> lr_schedule = optim.exponential_decay(1e-1, 0.9)
        >>> optimizer = optim.SGD(learning_rate=lr_schedule)
        >>> optimizer.learning_rate
        array(0.1, dtype=float32)
        >>>
        >>> for _ in range(5): optimizer.update({}, {})
        ...
        >>> optimizer.learning_rate
        array(0.06561, dtype=float32)
    c                 ó   •— ‰‰| z  z  S ©N© )Ústepr   r   s    €€ún/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx/optimizers/schedulers.pyÚschedulez#exponential_decay.<locals>.schedule   s   ø€ Ø�j $Ñ&Ñ&Ð&ó    r   )r   r   r   s   `` r   Úexponential_decayr   	   s   ù€ õ&'ð €Or   Ú	step_sizec                 ó   ‡ ‡‡— ˆˆ ˆfd„}|S )a/  Make a step decay scheduler.

    Args:
        init (float): Initial value.
        decay_rate (float): Multiplicative factor to decay by.
        step_size (int): Decay every ``step_size`` steps.

    Example:

        >>> lr_schedule = optim.step_decay(1e-1, 0.9, 10)
        >>> optimizer = optim.SGD(learning_rate=lr_schedule)
        >>> optimizer.learning_rate
        array(0.1, dtype=float32)
        >>>
        >>> for _ in range(21): optimizer.update({}, {})
        ...
        >>> optimizer.learning_rate
        array(0.081, dtype=float32)
    c                 ó   •— ‰‰| ‰z  z  z  S r
   r   )r   r   r   r   s    €€€r   r   zstep_decay.<locals>.schedule7   s   ø€ Ø�z d¨iÑ&7Ñ8Ñ9Ð9r   r   )r   r   r   r   s   ``` r   Ú
step_decayr   "   s   ú€ ö*:ð €Or   Údecay_stepsÚendc                 ó   ‡ ‡‡— ˆˆˆ fd„}|S )aˆ  Make a cosine decay scheduler.

    Args:
        init (float): Initial value.
        decay_steps (int): Number of steps to decay over. The decayed
            value is constant for steps beyond ``decay_steps``.
        end (float, optional): Final value to decay to. Default: ``0``.

    Example:

        >>> lr_schedule = optim.cosine_decay(1e-1, 1000)
        >>> optimizer = optim.SGD(learning_rate=lr_schedule)
        >>> optimizer.learning_rate
        array(0.1, dtype=float32)
        >>>
        >>> for _ in range(5): optimizer.update({}, {})
        ...
        >>> optimizer.learning_rate
        array(0.0999961, dtype=float32)
    c                 ó¤   •— t        j                  | ‰«      }ddt        j                  t        j                  ‰z  |z  «      z   z  }‰|‰‰z
  z  z   S )Ng      à?g      ð?)ÚmxÚminimumÚcosÚmathÚpi)r   ÚsÚdecayr   r   r   s      €€€r   r   zcosine_decay.<locals>.scheduleS   sM   ø€ Ü�J‰J�t˜[Ó)ˆØ�sœRŸV™V¤T§W¡W¨{Ñ%:¸aÑ$?Ó@Ñ@ÑAˆØ�U˜d S™jÑ)Ñ)Ð)r   r   )r   r   r   r   s   ``` r   Úcosine_decayr    =   s   ú€ ö,*ð
 €Or   Ú	schedulesÚ
boundariesc                 óÊ   ‡ ‡— t        ‰ «      dk(  rt        d«      ‚t        ‰ «      t        ‰«      dz   k7  r't        dt        ‰«      › dt        ‰ «      dz
  › d�«      ‚ˆˆ fd„}|S )ag  Join multiple schedules to create a new schedule.

    Args:
        schedules (list(Callable)): A list of schedules. Schedule :math:`i+1`
          receives a step count indicating the number of steps since
          the :math:`i`-th boundary.
        boundaries (list(int)): A list of integers of length ``len(schedules) - 1``
          that indicates when to transition between schedules.

    Example:
        >>> linear = optim.linear_schedule(0, 1e-1, steps=10)
        >>> cosine = optim.cosine_decay(1e-1, 200)
        >>> lr_schedule = optim.join_schedules([linear, cosine], [10])
        >>> optimizer = optim.Adam(learning_rate=lr_schedule)
        >>> optimizer.learning_rate
        array(0.0, dtype=float32)
        >>> for _ in range(12): optimizer.update({}, {})
        ...
        >>> optimizer.learning_rate
        array(0.0999938, dtype=float32)
    r   z)Must provide at least 1 schedule to join.é   z	Received z boundaries but expected Ú.c           	      ó’   •—  ‰d   | «      }t        ‰‰dd  «      D ](  \  }}t        j                  | |k  | || |z
  «      «      }Œ* |S )Nr   r$   )Úzipr   Úwhere)r   ÚoutputÚboundaryr   r"   r!   s       €€r   r   z join_schedules.<locals>.schedulez   sT   ø€ Ø�˜1‘˜dÓ#ˆÜ"% j°)¸A¸B°-Ö"@ÑˆH�hÜ—X‘X˜d X™o¨v±xÀÀxÁÓ7PÓQ‰Fð #Aàˆr   )ÚlenÚ
ValueError)r!   r"   r   s   `` r   Újoin_schedulesr-   [   sr   ù€ ô, ˆ9ƒ~˜ÒÜÐDÓEÐEä
ˆ9ƒ~œ˜Z›¨1Ñ,Ò,ÜØœ˜J›Ð(ð )Ü˜I›¨Ñ*Ð+¨1ð.ó
ð 	
õ
ð €Or   Ústepsc                 óB   ‡ ‡‡— ‰dk  rt        d‰› d�«      ‚ˆˆ ˆfd„}|S )aL  Make a linear scheduler.

    Args:
        init (float): Initial value.
        end (float): Final value.
        steps (int): Number of steps to apply the schedule over. The value is
          ``end`` for any steps beyond ``steps``.

    Example:

        >>> lr_schedule = optim.linear_schedule(0, 1e-1, 100)
        >>> optimizer = optim.Adam(learning_rate=lr_schedule)
        >>> optimizer.learning_rate
        array(0.0, dtype=float32)
        >>> for _ in range(101): optimizer.update({}, {})
        ...
        >>> optimizer.learning_rate
        array(0.1, dtype=float32)
    r$   z&steps must be greater than 0, but got r%   c                 óL   •— t        j                  | ‰«      } | ‰‰z
  ‰z  z  ‰z   S r
   )r   r   )r   r   r   r.   s    €€€r   r   z!linear_schedule.<locals>.scheduleš   s,   ø€ Ü�z‰z˜$ Ó&ˆØ˜˜d™
 eÑ+Ñ,¨tÑ3Ð3r   )r,   )r   r   r.   r   s   ``` r   Úlinear_scheduler1   ƒ   s-   ú€ ð( ˆq‚yÜÐAÀ%ÀÈÐJÓKÐKö4ð €Or   )g        )r   Útypingr   r   Úmlx.coreÚcorer   Úfloatr   Úintr   r    r-   r1   r   r   r   Ú<module>r7      s°   ðó ß !å ð˜Eð ¨uð ¸ó ð2�Uð ¨ð ¸#ð À(ó ñ6�uð ¨3ð °Uð ÀXó ð<%˜d 8™nð %¸$¸s¹)ð %Èó %ðP˜%ð  eð °Cð ¸Hô r   