
    PiA)              
          d dl Zd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZ ej                            dd          Z G d d          Zej        dddfd	e
ej        ej        f         d
ee         dee         dee         fdZej        j        j        d             Z G d dej                  Z G d dej                  Z G d dej                  ZdS )    N)partial)current_module)AnyCallableLiteralOptionalhaikuhkc                       e Zd Z G d dej        j        j                  Z G d dej        j        j                  Z G d dej        j	                  Z
dS )ParamFactoryc                       e Zd Zd Zd ZdS )ParamFactory.Concretec                     || _         || _        |(t                      }t          |d          r|j        }nd}|| _        || _        d S )Ndtypefloat32)nameinitr   hasattrr   
param_type)selfr   r   r   r   modules         a/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/einx/nn/haiku.py__init__zParamFactory.Concrete.__init__   sR    DIDI}'))67++ &"LEE%EDJ(DOOO    c                 h    d t                               | j        | j        | j        | j                  fS N)r   CacheKeyr   r   r   r   r   s    r   to_value_and_keyz&ParamFactory.Concrete.to_value_and_key   s+    ..ty$)TZQUQ`aaaar   N)__name__
__module____qualname__r   r    r   r   Concreter      s7        	) 	) 	)	b 	b 	b 	b 	br   r$   c                   &    e Zd Zd Zd Zd Zd ZdS )ParamFactory.CacheKeyc                 >    || _         || _        || _        || _        d S r   )r   r   r   r   )r   r   r   r   r   s        r   r   zParamFactory.CacheKey.__init__   s"    DIDIDJ(DOOOr   c                 P    t          | j        | j        | j        | j        f          S r   )hashr   r   r   r   r   s    r   __hash__zParamFactory.CacheKey.__hash__$   s!    DItz4?KLLLr   c                     t          |t          j                  o?| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r   )
isinstancer   r   r   r   r   r   )r   others     r   __eq__zParamFactory.CacheKey.__eq__'   s`    5,"788 8I+8I+8 J%+-8 Ou'77r   c                 j    d t                               | j        | j        | j        | j        |          fS r   )r   Tracerr   r   r   r   )r   backendvirtual_args      r   	to_tracerzParamFactory.CacheKey.to_tracer0   s1    ##DIty$*doWbcc r   N)r    r!   r"   r   r*   r.   r3   r#   r   r   r   r&      sS        	) 	) 	)	M 	M 	M	 	 		 	 	 	 	r   r   c                       e Zd Zd Zd ZdS )ParamFactory.Tracerc                 L    || _         || _        || _        || _        || _        d S r   )r   r   r   r   	depend_on)r   r   r   r   r   r7   s         r   r   zParamFactory.Tracer.__init__7   s)    DIDIDJ(DO&DNNNr   c                 ,   | j         | j         n|                    dd           }| j        | j        n|                    dd           }| j        | j        n|                    dd           }|t	          d          |t	          d          t          |t                    r|dv s|dk    r!t          j        	                    d	          }n|d
k    r t          j        
                    d          }n|dk    r t          j        
                    d          }n~|dk    r*t          j                            ddd|d                   }nNt	          d| d          t          |t          t          f          rt          j        
                    |          }| j        dk    rt          j        }n| j        dk    rt          j        }nJ t"          j                            |||||dt"          j                            |          | j        g          S )Nr   r   r   z=Must specify name for tensor factory hk.get_{parameter|state}z=Must specify init for tensor factory hk.get_{parameter|state}get_at	rearrangeg{Gz?)stddevaddg        multiplyg      ?dotfan_intruncated_normalin_axis)fan_in_axesz3Don't know which initializer to use for operation ''	parameterstateF)shaper   r   r   )kwargsoutputr7   )r   getr   r   
ValueErrorr,   strthkinitializersRandomNormalConstantVarianceScalingintfloatr   get_parameter	get_stateeinxtracerapplyTensorr7   )r   rF   rG   r   r   r   funcs          r   __call__zParamFactory.Tracer.__call__>   s   $(I$54996::fd;S;SD$(I$54996::fd;S;SD&*j&8DJJfjjRV>W>WE| !`aaa| !`aaaD#&& 78##t{':':+888EEDDU]]+44S99DDZ''+44S99DDU]]+;;X'9viGX <  DD %%b[_%b%b%bcccD3,// 7'0066+--(G++}u;$$!&udSS{))%00>*	 %   r   N)r    r!   r"   r   rZ   r#   r   r   r0   r5   6   s2        	' 	' 	'&	 &	 &	 &	 &	r   r0   N)r    r!   r"   rU   rV   inputInputr$   r   TensorFactoryr0   r#   r   r   r   r   
   s        b b b b b4;$* b b b$    4;$-   2. . . . .* . . . . .r   r   rY   r   r   r   c                     | t           j        k    rd}n&| t           j        k    rd}nt          d|  d          t                              ||||          S )a  Create a tensor factory for Haiku parameters.

    Args:
        func: Either ``hk.get_parameter`` or ``hk.get_state``. Defaults to ``hk.get_parameter``.
        name: Name of the parameter. If ``None``, uses a default name determined from the calling
            operation. Defaults to ``None``.
        init: Initializer for the parameter. If ``None``, uses a default init method determined
            from the calling operation. Defaults to ``None``.
        dtype: Data type of the parameter. If ``None``, uses the ``dtype`` member of the calling
            module or ``float32`` if it does not exist. Defaults to ``None``.

    Returns:
        A tensor factory with the given default parameters.
    rD   rE   zUnknown parameter function 'rC   )r
   rS   rT   rJ   r   r$   )rY   r   r   r   r   s        r   paramr_   g   sa    ( r 

			

????@@@  tUJ???r   c                     t          |           t          t          j                  k    s*t          |           t          t          j                  k    r!t	          |                                           S d S r   )idr
   rS   rT   r_   r   )xs    r   tensor_factoryrc      sU    	!uu2#$$$$1BL1A1A(A(AQxx((***tr   c                        e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddeded	ed
ededededededee         dee         def fdZ	ddZ
 xZS )Norma  Normalization layer.

    Args:
        stats: Einstein string determining the axes along which mean and variance are computed.
            Will be passed to ``einx.reduce``.
        params: Einstein string determining the axes along which learnable parameters are
            applied. Will be passed to ``einx.elementwise``. Defaults to ``"b... [c]"``.
        mean: Whether to apply mean normalization. Defaults to ``True``.
        var: Whether to apply variance normalization. Defaults to ``True``.
        scale: Whether to apply a learnable scale according to ``params``. Defaults to ``True``.
        bias: Whether to apply a learnable bias according to ``params``. Defaults to ``True``.
        epsilon: A small float added to the variance to avoid division by zero. Defaults
            to ``1e-5``.
        fastvar: Whether to use a fast variance computation. Defaults to ``True``.
        dtype: Data type of the weights. Defaults to ``"float32"``.
        decay_rate: Decay rate for exponential moving average of mean and variance. If ``None``,
            no moving average is applied. Defaults to ``None``.
        name: Name of the module. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    b... [c]Th㈵>r   Nstatsparamsmeanvarscalebiasepsilonfastvarr   
decay_rater   rG   c                     t                                          |           || _        || _        || _        || _        || _        || _        || _        || _	        |	| _
        |
| _        || _        d S Nr   )superr   rh   ri   rj   rk   rl   rm   rn   ro   r   rp   rG   )r   rh   ri   rj   rk   rl   rm   rn   ro   r   rp   r   rG   	__class__s                r   r   zNorm.__init__   sq     	d###
	
	
$r   c           
      l   | j         |t          d          | j         d uo| pt          j                    }t	          j        j        || j        | j        f|r"| j	        rt          t          j        d          n| j	        |r"| j        rt          t          j        d          n| j        | j        rt          t          j        d          nd | j        rt          t          j        d          nd | j        | j        d| j        \  }}}| j         d uo|ot          j                     }|r| j	        r=t          j        dt          j        d          | j         z  |d| j         z
  z  z              | j        r=t          j        dt          j        d          | j         z  |d| j         z
  z  z              |S )	Nz2training must be specified when decay_rate is usedrj   rs   rk   rl   rm   )rj   rk   rl   rm   rn   ro      )rp   rJ   r
   running_initrU   nnnormrh   ri   rj   r_   rT   rk   rl   rS   rm   rn   ro   rG   	set_state)r   rb   traininguse_emarj   rk   
update_emas          r   rZ   zNorm.__call__   s   ?&8+;QRRR/-Ux<3T2?CTCTw|JK
 6=YYr|&1111PTPY3:UtxUbl////TX;?:O%(w777749=Lr'f5555LL
 
 k
 
4 _D0WXWboFWFWBW
 	y BL004?BTQQUQ`M`Eaa   x 2<..@3!doJ]C^^   r   )
rf   TTTTrg   Tr   NNr   )r    r!   r"   __doc__rK   boolrR   r   r   r   rZ   __classcell__ru   s   @r   re   re      s         0 !&*"   	
       UO sm      8       r   re   c                   R     e Zd ZdZ	 	 	 ddedededee         d	ef
 fd
Zd Z	 xZ
S )Lineara  Linear layer.

    Args:
        expr: Einstein string determining the axes along which the weight matrix is multiplied.
            Will be passed to ``einx.dot``.
        bias: Whether to apply a learnable bias. Defaults to ``True``.
        dtype: Data type of the weights. Defaults to ``"float32"``.
        name: Name of the module. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    Tr   Nexprrm   r   r   rG   c                     t                                          |           || _        || _        || _        || _        d S rr   )rt   r   r   rm   r   rG   )r   r   rm   r   r   rG   ru   s         r   r   zLinear.__init__   s@     	d###		
r   c                     t          j        j        || j        f| j        rt          t          j        d          nd t          t          j        d          d| j        S )Nrm   rs   weight)rm   r   )	rU   ry   linearr   rm   r_   r
   rS   rG   )r   rb   s     r   rZ   zLinear.__call__   sj    w~I
 :>Lr'f5555)999	
 

 k
 
 	
r   )Tr   N)r    r!   r"   r   rK   r   r   r   r   rZ   r   r   s   @r   r   r      s        	 	 "   	
 sm      
 
 
 
 
 
 
r   r   c            	       H     e Zd ZdZd	dededee         def fdZd Z	 xZ
S )
DropoutaV  Dropout layer.

    Args:
        expr: Einstein string determining the axes along which dropout is applied. Will be
            passed to ``einx.elementwise``.
        drop_rate: Drop rate.
        name: Name of the module. Defaults to ``None``.
        **kwargs: Additional parameters that specify values for single axes, e.g. ``a=4``.
    Nr   	drop_rater   rG   c                 v    t                                          |           || _        || _        || _        d S rr   )rt   r   r   r   rG   )r   r   r   r   rG   ru   s        r   r   zDropout.__init__  s7    d###	"r   c                     |r;t          j        j        || j        f| j        t          j                    d| j        S |S )N)r   rng)rU   ry   dropoutr   r   r
   next_rng_keyrG   )r   rb   r|   s      r   rZ   zDropout.__call__  sW     		7?	 .O%%	 
 +   Hr   r   )r    r!   r"   r   rK   rR   r   r   r   rZ   r   r   s   @r   r   r     s|          S U (3- Z]      
 
 
 
 
 
 
r   r   )r	   r
   rU   	functoolsr   haiku._src.baser   typingr   r   r   r   rV   import_rL   r   rS   rT   rK   r_   r[   register_tensor_factoryrc   Modulere   r   r   r#   r   r   <module>r      s              * * * * * * 3 3 3 3 3 3 3 3 3 3 3 3
k'4((Z Z Z Z Z Z Z Z| 574D	@ @
""BL0
1@
3-@ 3-@ C=	@ @ @ @< *  +*O O O O O29 O O Od!
 !
 !
 !
 !
RY !
 !
 !
H    bi     r   