+
    &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   "q/Users/jameslopez/projects/CWCArchive/cwc-podcast/.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    zdi&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    JJt[)sRVVTWW{%:a$?@@AUdSj)))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)     % %d8n %$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XXdovx7PQF #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,    zz$&d
e+,t33r   )r:   )r   r!   r=   r   s   fff r   linear_schedulerA      s-    ( qy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   