
    #Zj                        d Z ddlmZ ddlZddlmZ  ej        d          deded	ee         d
ee         fd            Z	 ej        d          ded
ee         fd            Z
 ej        d          dddededed
ee         fd            Z ej        d          dddedededed
ee         f
d            Zdededed
efdZ ej        d          ddddd d!ed"ed#ed$ededed
ee         fd%            Z ej        d&          d'ed(ed)ed
ee         fd*            Z ej        d+          d,ed-ed.ed
ee         fd/            Zg d0ZdS )1zEGenerators that provide different rates, schedules, decays or series.    )IterableN   )registryzconstant_then.v1ratestepsschedulereturnc              #   H   K   t          |          D ]}| V  |D ]}|V  dS )z>Yield a constant rate for N steps, before starting a schedule.N)range)r   r   r   ivalues        [/Users/jameslopez/projects/MentorCore/.venv/lib/python3.11/site-packages/thinc/schedules.pyconstant_thenr   
   sL      
 5\\  



       zconstant.v1c              #      K   	 | V  )zYield a constant rate. )r   s    r   constantr      s      


r   zdecaying.v1)t	base_ratedecayr   c             #   4   K   	 | dd||z  z   z  z  V  |dz  })a  Yield an infinite series of linearly decaying values,
    following the schedule: base_rate * 1 / (1 + decay * t)

    EXAMPLE:
        >>> learn_rates = decaying(0.001, 1e-4)
        >>> next(learn_rates)
        0.001
        >>> next(learn_rates)
        0.00999
    T      ?r   r   )r   r   r   s      r   decayingr      s7      3#	/23333	Qr   zcompounding.v1        startstopcompoundc             #   X   K   t          |           }	 t          || |          V  ||z  })ad  Yield an infinite series of compounding values. Each time the
    generator is called, a value is produced by multiplying the previous
    value by the compound rate.

    EXAMPLE:
        >>> sizes = compounding(1.0, 10.0, 1.5)
        >>> assert next(sizes) == 1.
        >>> assert next(sizes) == 1 * 1.5
        >>> assert next(sizes) == 1.5 * 1.5
    )float_clip)r   r   r   r   currs        r   compoundingr"   -   s?       <<DD%&&&&&r   r   c                 N    ||k    rt          | |          nt          | |          S )N)maxmin)r   r   r   s      r   r    r    A   s)     %3ud3ud3C3CCr   zslanted_triangular.v1g?    r   )cut_fracratior   r   max_rate	num_stepsr'   r(   c             #      K   t          ||z            }	 |dz  }||k     r||z  }nd||z
  |d|z  dz
  z  z  z
  }| d||dz
  z  z   z  d|z  z  }|V  >)zxYield an infinite series of values according to Howard and Ruder's
    "slanted triangular learning rate" schedule.
    Tr   )int)	r)   r*   r'   r(   r   r   cutp
learn_rates	            r   slanted_triangularr0   E   s       i("
#
#C	Qs77CAAa#g#X)9":;<AQ%!)_!45UC
r   zwarmup_linear.v1initial_ratewarmup_stepstotal_stepsc           	   #      K   d}	 ||k     r|t          d|          z  }n't          d||z
  t          d||z
            z            }|| z  V  |dz  }N)zGenerate a series, starting from an initial rate, and then with a warmup
    period, and then a linear decline. Used for learning rates.
    r   Tr   r   r   )r$   )r1   r2   r3   stepfactors        r   warmup_linearr7   ]   s       D,C<000FFkD(C[<5O,P,PP F |####	r   zcyclic_triangular.v1min_lrmax_lrperiodc              #      K   d}	 t          j        d|d|z  z  z             }t          j        ||z  d|z  z
  dz             }t          dd|z
            }| || z
  |z  z   V  |dz  }c)Nr   T   r   )numpyfloorabsr$   )r8   r9   r:   itcyclexrelatives          r   cyclic_triangularrD   p   s      	
BAa&j 1122Ib6kAI-122q!a%==833333
ar   )rD   r7   r   r   r   r7   r0   r"   )__doc__typingr   r=   configr   	schedulesr   r,   r   r   r   r"   r    r0   r7   rD   __all__r   r   r   <module>rJ      s   K K              &''
'/e_   (' M""5 Xe_    #" M""9:    e 3 x    #"  $%%>A  ).6;e_   &%&D Du DE De D D D D +,,
    	
    e_   -,. &'''*9<e_   ('$ *++e U C HUO    ,+	 	 	r   