o
    i	                     @   sL  d dl mZmZmZmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ eZeddd
ee de
eef fddZde
eef dededeeef fddZ		d de
eef dee dee dd	fddZde
eef dedeeef fddZdededeeeef fddZdededededeeeef f
ddZd	S )!    )CallableOptionalTuplecast   )Ops)registry)Model)Floats2d)	get_widthzLayerNorm.v1NnIreturnc                 C   s   t dtt| | dd d ddS )N	layernorm)r   nO)Gb)initdimsparams)r	   forwardr   )r    r   J/home/ubuntu/.local/lib/python3.10/site-packages/thinc/layers/layernorm.py	LayerNorm   s   r   modelXis_trainc                    sX   t j\  d  }t|\}dtdtf fdd}||fS )N      dYr   c                    sR   | } t j| \}}} |  | |d  |  }|d 9 }|  }|S )Ng      r   )_get_d_momentsops)r   distsum_dysum_dy_distd_xhatNr   backprop_rescaler   muvarr   r   backprop   s   zforward.<locals>.backprop)_get_momentsr   _begin_update_scale_shiftInT)r   r   r   XhatYr)   r   r$   r   r      s
    r   r.   c                 C   s   |d urt |}| d| | d| n|d ur)t |}| d| | d| | d}| ds9| d| | d| j|d  | d| j| | dd usXJ d S )Nr   r   r      r   )r   set_dimget_dimhas_dim	set_paramr   alloc1f)r   r   r.   X_widthY_widthr   r   r   r   r   '   s   

r   c                    sF    d  d}  }||7 }dtdtf fdd}||fS )Nr   r   r   r   c                    s4    d| jdd  d|  jdd |   S )Nr   r   )axisr   )inc_gradsum)r   r   r   r   r   r   finish_update_scale_shift@   s   z<_begin_update_scale_shift.<locals>.finish_update_scale_shift)	get_paramr,   )r   r   r   r.   r;   r   r:   r   r+   :   s   

r+   r   c                 C   s>   |j ddd}|jdddd }tt| |jd g||fS )Nr/   Tr7   keepdimsg:0yE>)meanr(   r   r
   	asarray_fshape)r   r   r'   r(   r   r   r   r*   H   s   r*   dyr'   c                 C   s2   || }|| j j|ddd| j j|| dddfS )Nr/   Tr=   )xpr9   )r   rB   r   r'   r    r   r   r   r   O   s
   r   )N)NN)typingr   r   r   r   backendsr   configr   r   r	   typesr
   utilr   r,   layersintr   boolr   r   r+   r*   r   r   r   r   r   <module>   sB    "*


& 