
    qi              	          d dl Z d dlmZmZ d dlmZ d dlZd dlm	c m
Z e G d de                      Z e j        d           G d de                      Z e j        d           G d	 d
e                      Ze G d de                      Z e j        d           G d de                      Z e j        d           G d de                      Z	 ddededej        dz  dej        fdZdS )    N)Protocolruntime_checkablec                   $    e Zd Zdej        fdZdS )LRScheduleConfigreturnc                     d S N selfs    :/home/robot-lab/Pi0.5_yam/src/openpi/training/optimizer.pycreatezLRScheduleConfig.create   s          N)__name__
__module____qualname__optaxScheduler   r
   r   r   r   r   
   s#        +++++++r   r   T)frozenc                   b    e Zd ZU dZdZeed<   dZeed<   dZ	eed<   dZ
eed	<   d
ej        fdZdS )CosineDecaySchedulez"Cosine decay schedule with warmup.  warmup_stepsg-C6>peak_lri0u  decay_stepsgh㈵>decay_lrr   c                 |    t          j        | j        | j        dz   z  | j        | j        | j        | j                  S )N   )
init_value
peak_valuer   r   	end_value)r   warmup_cosine_decay_scheduler   r   r   r   r   s    r   r   zCosineDecaySchedule.create   sD    1|t'81'<=|*(m
 
 
 	
r   N)r   r   r   __doc__r   int__annotations__r   floatr   r   r   r   r   r
   r   r   r   r      sy         ,,L#GUKHe
 
 
 
 
 
 
r   r   c                   T    e Zd ZU dZdZeed<   dZeed<   dZ	eed<   de
j        fd	Zd
S )RsqrtDecaySchedulez/Inverse square root decay schedule with warmup.r   r   -C6
?r   i'  	timescaler   c                      t          j        t          j         j         j        dz   z   j         j                   fdg j        g          S )Nr   )r   r!   transition_stepsc                 \    j         t          j        j        | z   j        z            z  S r	   )r   jnpsqrtr*   )stepr   s    r   <lambda>z+RsqrtDecaySchedule.create.<locals>.<lambda>2   s&    T\CHdnt6Kt~5],^,^^ r   )r   join_scheduleslinear_scheduler   r   r   s   `r   r   zRsqrtDecaySchedule.create*   si    #%#|t/@1/DE"l%)%6  
 _^^^ 

 

 
	
r   N)r   r   r   r#   r   r$   r%   r   r&   r*   r   r   r   r
   r   r   r(   r(   "   si         99L#GUIu
 
 
 
 
 
 
r   r(   c                   J    e Zd Z	 ddej        dej        dz  dej        fdZdS )OptimizerConfigNlrweight_decay_maskr   c                     d S r	   r
   r   r6   r7   s      r   r   zOptimizerConfig.create:   s	     (+sr   r	   )	r   r   r   r   ScalarOrScheduleatPyTreeGradientTransformationr   r
   r   r   r5   r5   8   s[        
 /3+ +"+ 9t++ 
	%	+ + + + + +r   r5   c                       e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   d
Z
eed<   	 ddej        dej        dz  dej        fdZdS )AdamWzAdamW optimizer.?b1gffffff?b2g:0yE>epsg|=weight_decayg      ?clip_gradient_normNr6   r7   r   c                     t          j        || j        | j        | j        | j        |          }t          j        t          j        | j                  |          S )N)rA   rB   rC   rD   mask)	r   adamwrA   rB   rC   rD   chainclip_by_global_normrE   )r   r6   r7   txs       r   r   zAdamW.createL   sS    
 [47twDH4CT[l
 
 
 {54T5LMMrRRRr   r	   )r   r   r   r#   rA   r&   r%   rB   rC   rD   rE   r   r:   r;   r<   r=   r   r
   r   r   r?   r?   A   s         BOOOBCL% ####
 /3	S 	S"	S 9t+	S 
	%		S 	S 	S 	S 	S 	Sr   r?   c                   z    e Zd ZU dZdZeed<   dZeed<   dZe	ed<   	 dde
j        d	ej        dz  d
e
j        fdZdS )SGDzSGD optimizer.r)   r6   r@   momentumFnesterovNr7   r   c                 \    |
J d            t          j        || j        | j                  S )Nz%Weight decay is not supported for SGD)rN   rO   )r   sgdrN   rO   r9   s      r   r   z
SGD.create`   s4    
 !((*Q(((ydmdmLLLLr   r	   )r   r   r   r#   r6   r&   r%   rN   rO   boolr   r:   r;   r<   r=   r   r
   r   r   rM   rM   X   s         BHeHd
 /3M M"M 9t+M 
	%	M M M M M Mr   rM   	optimizerlr_scheduler7   r   c                 X    |                                 }|                      ||          S )N)r7   )r   )rS   rT   r7   r6   s       r   create_optimizerrV   i   s/     
				BB2CDDDr   r	   )dataclassestypingr   r   	jax.numpynumpyr.   r   openpi.shared.array_typingsharedarray_typingr;   r   	dataclassr   r(   r5   r?   rM   r<   r=   rV   r
   r   r   <module>r_      s\       . . . . . . . .        ' ' ' ' ' ' ' ' ' , , , , ,x , , , d###
 
 
 
 
* 
 
 $#
$ d###
 
 
 
 
) 
 
 $#
* + + + + +h + + + d###S S S S SO S S $#S, d###M M M M M/ M M $#M" fjE EE-=ERTR[^bRbE
!E E E E E Er   