o
    i                     @   s  d Z ddlmZ ddlZddlmZ eddeded	ee d
ee fddZ	edded
ee fddZ
eddddededed
ee fddZeddddedededed
ee f
ddZdededed
efdd Zed!d"d#d$dd%d&ed'ed(ed)ededed
ee fd*d+Zed,d-ed.ed/ed
ee fd0d1Zed2d3ed4ed5ed
ee fd6d7Zg d8ZdS )9zEGenerators that provide different rates, schedules, decays or series.    )IterableN   )registryzconstant_then.v1ratestepsschedulereturnc                 c   s*    t |D ]}| V  q|D ]}|V  qdS )z>Yield a constant rate for N steps, before starting a schedule.N)range)r   r   r   ivalue r   C/home/ubuntu/.local/lib/python3.10/site-packages/thinc/schedules.pyconstant_then	   s   r   zconstant.v1c                 c   s    	 | V  q)zYield a constant rate.r   )r   r   r   r   constant   s   r   zdecaying.v1)t	base_ratedecayr   c                c   s$    	 | dd||    V  |d7 }q)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   r   r   r   decaying   s
   r   zcompounding.v1        startstopcompoundc                c   s$    t | }	 t|| |V  ||9 }q)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   currr   r   r   compounding,   s   r   r   c                 C   s   ||kr	t | |S t| |S )N)maxmin)r   r   r   r   r   r   r   @   s   r   zslanted_triangular.v1g?    r   )cut_fracratior   r   max_rate	num_stepsr    r!   c          	      c   sj    t || }	 |d7 }||k r|| }nd|| |d| d    }| d||d    d|  }|V  q)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_rater   r   r   slanted_triangularD   s   
r(   zwarmup_linear.v1initial_ratewarmup_stepstotal_stepsc                 c   sP    d}	 ||k r|t d| }nt d|| t d||  }||  V  |d7 }q)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   )r)   r*   r+   stepfactorr   r   r   warmup_linear\   s   
r.   zcyclic_triangular.v1min_lrmax_lrperiodc                 c   sb    d}	 t d|d|   }t || d|  d }tdd| }| ||  |  V  |d7 }q)Nr   T   r   )numpyfloorabsr   )r/   r0   r1   itcyclexrelativer   r   r   cyclic_triangularo   s   r:   )r:   r.   r   r   r   r.   r(   r   )__doc__typingr   r3   configr   	schedulesr   r$   r   r   r   r   r   r(   r.   r:   __all__r   r   r   r   <module>   s    
& 