o
    i                  
   @   s  d dl mZmZ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mZmZmZmZ e ZededZed	eeeeef dZe
d
d%deeef d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defddZdeeef ded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eeef d"ededeeef fd#d$ZdS )'    )CallableOptionalTupleTypeVarUnioncast   )NumpyOps)registry)Model)Array3dArrayXdListXdPaddedRaggedArrayTXd)boundSeqTzwith_array.v1layerpadreturnc              	      s8   t d j dtt gd|i fdd jD d}|S )zTransform sequence data into a contiguous array on the way into and
    out of a model. Handles a variety of sequence types: lists, padded and ragged.
    If the input is an array, it is passed through unchanged.
    zwith_array()r   c                    s   i | ]}|  |qS  )maybe_get_dim).0namer   r   K/home/ubuntu/.local/lib/python3.10/site-packages/thinc/layers/with_array.py
<dictcomp>   s    zwith_array.<locals>.<dictcomp>)initlayersattrsdims)r   r   forwardr   	dim_names)r   r   modelr   r   r   
with_array   s   r&   r%   Xseqis_trainc                 C   s   t |trttttf t| ||S t |tr$ttttf t| ||S t |t	t
fs3| jd ||S ttttf t| ||S )Nr   )
isinstancer   r   r   r   r   _ragged_forwardr   _padded_forwardlisttupler    _list_forward)r%   r'   r(   r   r   r   r#       s   

r#   NXYc                 C   sj   | j d }|j|d urt| |n||d urt| |n|d |jD ]}||}|d ur2| || q!d S )Nr   )r/   r0   )r    
initialize
_get_arrayr$   r   set_dim)r%   r/   r0   r   dim_namevaluer   r   r   r   -   s   


r   c                 C   sD   t |tr|jS t |tr|jS t |ttfstt|S | j	
|S N)r)   r   dataXdr   datar,   r-   r   r   opsflatten)r%   r/   r   r   r   r2   ;   s   


r2   Xsc                    sx   | j d | jd tdd |D jj|d}||\} dtdtf fdd	}jj|d|fS )
Nr   r   c                 S   s   g | ]}t |qS r   )len)r   seqr   r   r   
<listcomp>K   s    z!_list_forward.<locals>.<listcomp>r   dYsr   c                    s*   j j| d} |}j j|dS )Nr?   )r9   r:   	unflatten)r@   dYfdXfget_dXfr   lengthsr   r   r   backpropO   s   z_list_forward.<locals>.backprop)r    r!   	NUMPY_OPS	asarray1ir9   r:   r   rA   )r%   r;   r(   XfYfrG   r   rD   r   r.   F   s   

r.   Xrc                    s@   | j d }||j|\} dtdtf fdd}t||j|fS )Nr   dYrr   c                    s   t  | j| jS r6   )r   r7   rF   )rM   get_dXr   r   rG   ]   s   z!_ragged_forward.<locals>.backprop)r    r7   r   rF   )r%   rL   r(   r   r0   rG   r   rN   r   r*   W   s   
r*   Xpc                    sH   | j d }||j|\} dtdtf fdd}t||j|j|j|fS )Nr   dYpr   c                    s,   t | tsJ  | j}t|| j| j| jS r6   )r)   r   r8   	size_at_trF   indices)rQ   dXrN   r   r   rG   i   s   
z!_padded_forward.<locals>.backprop)r    r8   r   rR   rF   rS   )r%   rP   r(   r   r0   rG   r   rN   r   r+   c   s   
r+   )r   )NN) typingr   r   r   r   r   r   backendsr	   configr
   r%   r   typesr   r   r   r   r   rH   r   r   r    intr&   boolr#   r   r2   r.   r*   r+   r   r   r   r   <module>   sr     *












