+
    NV-j  ã                   ój   € ^ RI t ^ RIHtHt ^ RIHt R R ltR R ltRR R llt	R	 R
 lt
R R ltR# )é    N)ÚCallableÚListc                ó<   € V ^8„  d   QhR\         R\         R\        /# )é   ÚinitÚ
decay_rateÚreturn)Úfloatr   )Úformats   "Új/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx/optimizers/schedulers.pyÚ__annotate__r   	   s!   € ÷ ñ œEð ¬uð ¼ñ ó    c                ó   a a€ VV 3R lpV# )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                 ó$   <€ SSV ,          ,          # ©N© )Ústepr   r   s   &€€r   ÚscheduleÚ#exponential_decay.<locals>.schedule   s   ø€ Ø�j $Õ&Õ&Ð&r   r   )r   r   r   s   ff r   Úexponential_decayr   	   s   ù€ ö&'ð €Or   c                óH   € V ^8„  d   QhR\         R\         R\        R\        /# )r   r   r   Ú	step_sizer	   ©r
   Úintr   )r   s   "r   r   r   "   s(   € ÷ ñ ”Uð ¬ð ¼#ð Ä(ñ r   c                ó   a aa€ VV V3R lpV# )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                 ó2   <€ SSV S,          ,          ,          # r   r   )r   r   r   r   s   &€€€r   r   Ústep_decay.<locals>.schedule7   s   ø€ Ø�z d¨iÕ&7Õ8Õ9Ð9r   r   )r   r   r   r   s   fff r   Ú
step_decayr   "   s   ú€ ÷*:ð €Or   c                óH   € V ^8„  d   QhR\         R\        R\         R\        /# )r   r   Údecay_stepsÚendr	   r   )r   s   "r   r   r   =   s(   € ÷ ñ ”uð ¬3ð ´Uð ÄXñ r   c                ó   a aa€ VVV 3R lpV# )aH  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                 óà   <€ \         P                  ! V S4      pR R\         P                  ! \        P                  S,          V,          4      ,           ,          pSVSS,
          ,          ,           # )g      à?g      ð?)ÚmxÚminimumÚcosÚmathÚpi)r   ÚsÚdecayr    r!   r   s   &  €€€r   r   Ú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   fff r   Úcosine_decayr,   =   s   ú€ ÷,*ð
 €Or   c                óh   € V ^8„  d   QhR\         \        ,          R\         \        ,          R\        /# )r   Ú	schedulesÚ
boundariesr	   )r   r   r   )r   s   "r   r   r   [   s)   € ÷ %ñ %œd¤8�nð %¼$¼s½)ð %Ìñ %r   c                óä   a a€ \        S 4      ^ 8X  d   \        R4      h\        S 4      \        S4      ^,           8w  d,   \        R\        S4       R\        S 4      ^,
           R24      hVV 3R lpV# )a  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)
z)Must provide at least 1 schedule to join.z	Received z boundaries but expected Ú.c           	      ó¨   <€ S^ ,          ! V 4      p\        SSR,          4       F*  w  r#\        P                  ! W8  W! W,
          4      4      pK,  	  V# )r   :é   NN)Úzipr$   Úwhere)r   ÚoutputÚboundaryr   r/   r.   s   &   €€r   r   Ú join_schedules.<locals>.schedulez   sJ   ø€ Ø˜1–˜dÓ#ˆÜ"% j°)¸Bµ-Ö"@ÑˆHÜ—X’X˜d™o¨v°xÀÅÓ7PÓQŠFñ #Aàˆr   )ÚlenÚ
ValueError)r.   r/   r   s   ff r   Újoin_schedulesr;   [   sr   ù€ ô, ˆ9ƒ~˜ÔÜÐDÓEÐEä
ˆ9ƒ~œ˜Z›¨1Õ,Ô,ÜØœ˜J›Ð(ð )Ü˜I›¨Õ*Ð+¨1ð.ó
ð 	
ö
ð €Or   c                óH   € V ^8„  d   QhR\         R\         R\        R\        /# )r   r   r!   Ústepsr	   r   )r   s   "r   r   r   ƒ   s(   € ÷ ñ œ%ð ¤eð ´Cð ¼Hñ r   c                óH   a aa€ S^8  d   \        RS R24      hVV V3R lpV# )a  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)
z&steps must be greater than 0, but got r1   c                 ón   <€ \         P                  ! V S4      p V SS,
          S,          ,          S,           # r   )r$   r%   )r   r!   r   r=   s   &€€€r   r   Ú!linear_schedule.<locals>.scheduleš   s,   ø€ Ü�zŠz˜$ Ó&ˆØ˜˜d�
 eÕ+Õ,¨tÕ3Ð3r   )r:   )r   r!   r=   r   s   fff r   Úlinear_schedulerA   ƒ   s-   ú€ ð( ˆq„yÜÐAÀ%ÀÈÐJÓKÐK÷4ð €Or   )g        )r'   Útypingr   r   Úmlx.coreÚcorer$   r   r   r,   r;   rA   r   r   r   Ú<module>rE      s*   ðó ß !å õõ2÷6õ<%÷Pr   