o
    iD                  
   @   s  d dl mZmZmZmZ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 ddlmZ dd	lmZ e Zed
edZede	eee ef dZed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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 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S )#    )
AnyCallableDictListOptionalSequenceTupleTypeVarUnioncast   )NumpyOps)registry)Model)Array2dRagged
XY_XY_OutT)	get_width   )noopInT)boundOutTzconcatenate.v1layersreturnc                  G   s   | st tttf t S t| dkr| d S | d jtu r-| d j	| dd  | d S ddi}t
dd | D r?ddd}tdd	d | D tt|| d
S )zCompose two or more models `f`, `g`, etc, such that their outputs are
    concatenated, i.e. `concatenate(f, g)(x)` computes `hstack(f(x), g(x))`.
    Also supports chaining more than 2 layers.
    r   r   NnOc                 s   s    | ]
}| d dv V  qdS )nI)TNNhas_dim).0node r!   L/home/ubuntu/.local/lib/python3.10/site-packages/thinc/layers/concatenate.py	<genexpr>,   s    zconcatenate.<locals>.<genexpr>)r   r   |c                 s   s    | ]}|j V  qd S )N)namer   layerr!   r!   r"   r#   0   s    )initdimsr   )r   r   r   r   r   len_funcforwardr   extendalljoinr(   )r   r)   r!   r!   r"   concatenate   s"   
r0   modelXis_trainc           	         s   t  fdd| jD  \}}t|d tr't|  ||\}}tt||fS t|d tr?t|  ||\}}tt||fS t	|  ||\}}tt||fS )Nc                    s   g | ]}| d qS ))r3   r!   r&   r2   r3   r!   r"   
<listcomp>9       zforward.<locals>.<listcomp>r   )
zipr   
isinstancelist_list_forwardr   r   r   _ragged_forward_array_forward)	r1   r2   r3   Ys	callbacksdata_lbackpropdata_rdata_ar!   r4   r"   r,   8   s   r,   r=   c                    s>   dd |D j j|}dtdtf fdd}||fS )Nc                 S      g | ]}|j d  qS r   shaper   Yr!   r!   r"   r5   H       z"_array_forward.<locals>.<listcomp>d_outputr   c           	         s   j | d d d d f } d |}d }t|dp#t|d}t|do4t|jdp4t|jd}t dd  dd  D ]-\}}j | d d ||| f }||}|ra||7 }n
|rk| j|j7  _||7 }qB|S )Nr   __add____iadd__datar   )ops	as_contighasattrrM   r7   )	rJ   dYdXstartadd_gradientsadd_gradients_databwdwidthgradientr>   r1   widthsr!   r"   r@   K   s     
" 

z _array_forward.<locals>.backprop)rN   xphstackr   r   r1   r2   r=   r>   r3   outputr@   r!   rY   r"   r<   E   s   r<   c                    sT   dd |D t jjdd |D |d j}dt dtf fdd}||fS )	Nc                 S   s   g | ]}|j jd  qS rD   )dataXdrF   rG   r!   r!   r"   r5   d   r6   z#_ragged_forward.<locals>.<listcomp>c                 S   s   g | ]}|j qS r!   )rM   )r   yr!   r!   r"   r5   e   s    r   rJ   r   c              	      s   | j }tj|d d d d f | j} d |}d }t dd  dd  D ]"\}}tj|d d ||| f | j}|||7 }||7 }q.|S )Nr   r   )rM   r   rN   rO   lengthsr7   )rJ   d_arrayrQ   rR   rS   rV   rW   rY   r!   r"   r@   g   s   (""
z!_ragged_forward.<locals>.backprop)r   rN   r[   r\   ra   r   r]   r!   rY   r"   r;   `   s   $r;   c                    st   dt t dtf fdd}tdd |D fdd|D }dd |D jj|}j||fS )	NrJ   r   c                    s   j jj| dd}j |d d d d f }j |} d |}d }t dd  dd  D ]%\}}j |d d ||| f }j |}|||7 }||7 }q7|S )Nr   axisr   )rN   r[   r0   rO   	unflattenr7   )rJ   d_out_arrayrQ   rR   rS   rV   rW   r>   ra   r1   rZ   r!   r"   r@   z   s    " 
z_list_forward.<locals>.backpropc                 S   s   g | ]}t |qS r!   )r*   )r   xr!   r!   r"   r5      s    z!_list_forward.<locals>.<listcomp>c                    s   g | ]} j jj|d dqS )r   rc   )rN   r[   r0   rG   )r1   r!   r"   r5      s    c                 S   rC   rD   rE   rG   r!   r!   r"   r5      rI   )	r   r   r   	NUMPY_OPS	asarray1irN   r[   r\   re   )r1   r2   r=   r>   r3   r@   	out_arrayr!   rg   r"   r:   w   s    r:   NrH   c                 C   s   |d ur(|  ddur| dt| | jD ]}| ddur'|dt| q| jD ]	}|j||d q+tdd | jD rO| dtdd | jD  d S d S )	Nr   F)r2   rH   c                 S   s   g | ]}| d qS )r   r   r&   r!   r!   r"   r5      rI   zinit.<locals>.<listcomp>r   c                 s   s    | ]}| d V  qdS )r   N)get_dimr&   r!   r!   r"   r#      s    zinit.<locals>.<genexpr>)r   set_dimr   r   
initializer.   sum)r1   r2   rH   r'   r!   r!   r"   r(      s   

 r(   )NN)#typingr   r   r   r   r   r   r   r	   r
   r   backendsr   configr   r1   r   typesr   r   r   utilr   r   ri   r   r   r   r0   boolr,   r<   r;   r:   r(   r!   r!   r!   r"   <module>   sd   0 *








