
    i                     H   d dl mZ d dlZd dlZd dlmZ ej                  j                  dkD  r  G d de      Zej                  e_
        eZeZg Zdad Zdd	Z G d
 de      Z G d de      Z e       ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z! G d de      Z"d Z# G d de      Z$d Z%d! Z&dd"Z'd# Z( G d$ d%e      Z) e)e%      a*d& Z+d' Z,d( Z-d) Z.d* Z/d+ Z0dd,Z1dd-Z2dd.Z3dd/Z4dd0Z5dd1Z6dd2Z7d3 Z8d4 Z9d5 Z:d6 Z;d7 Z<d8 Z=d9 Z>d: Z?d; Z@d< ZAd= ZBd> ZCd? ZDd@ ZEdA ZFdB ZGdC ZHdD ZIdE ZJdF ZKdG ZLddHZMdI ZNdJ ZOdK ZPdL ZQdM ZRdN ZSdO ZTdP ZUddQZVddRZWdS ZXddTZYddUZZdV Z[dW Z\dX Z]dY Z^dZ Z_d[ Z`d\ Zad] Zbd^ Zcd_ Zdd` Zeda Zfdb Zgdc Zhdaidd Zj G de dfe      Zk G dg dhek      Zl G di djek      Zm G dk dlek      Zn G dm dnek      Zo G do dpe      Zp G dq dre      Zq G ds dte      Zr G du dve      Zs G dw dxes      Zt G dy dzes      Zu G d{ d|es      Zv G d} d~es      Zw G d des      Zx G d de      Zy G d dey      Zz G d dey      Z{ G d dey      Z| G d dey      Z} G d dey      Z~ G d dey      Zd Z G d de      Zd Zd Zd ZddZy)    )print_functionN)defaultdict   c                       e Zd Zy)compat_dictN__name__
__module____qualname__     4/usr/local/lib/python3.12/site-packages/dynet_viz.pyr   r      s    r   r   c                       t         dz  a t         S N   )vindex_countr   r   r   	new_indexr      s    !,	r   c                      y Nr   )random_seeds    r   initr          Dr   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)SimpleConcreteDimc                 .    || _         || _        || _        y r   )nrowsncolsinferred)selfr   r   r   s       r   __init__zSimpleConcreteDim.__init__   s    DJDJDMr   c                 8    | j                   | j                  g|   S r   r   r   r    keys     r   __getitem__zSimpleConcreteDim.__getitem__    s    djj$**%=c%BBr   c                 D    t        | j                  | j                  g      S r   )iterr   r   r    s    r   __iter__zSimpleConcreteDim.__iter__!       T4::tzz":;;r   c                 <    d| j                   d| j                  dS )NzDim(,)r#   r)   s    r   __str__zSimpleConcreteDim.__str__"   s    DJJ

CCr   c                     t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )
isinstancer   r   r   r    others     r   __eq__zSimpleConcreteDim.__eq__#   s<    *U4E"F"~4::W\WbWbKb"~gkgqgqsxs~s~g~~r   c                     | |k(   S r   r   r2   s     r   __ne__zSimpleConcreteDim.__ne__$   s    dEk/1r   c                 D    t        | j                  | j                  f      S r   )hashr   r   r)   s    r   __hash__zSimpleConcreteDim.__hash__%   r+   r   c                      yNTr   r)   s    r   isvalidzSimpleConcreteDim.isvalid&   r   r   c                      yNFr   r)   s    r   invalidzSimpleConcreteDim.invalid'       Er   N)r	   r
   r   r!   r&   r*   r/   r4   r6   r9   r<   r?   r   r   r   r   r      s"     C;C~1; !r   r   c                   2    e Zd ZddZd Zd Zd Zd Zd Zy)	InvalidConcreteDimNc                      || _         || _        y r   a_dimb_dim)r    rE   rF   s      r   r!   zInvalidConcreteDim.__init__*   s    DJDJr   c                      y r   r   r$   s     r   r&   zInvalidConcreteDim.__getitem__-       Tr   c                 n    | j                   | j                  yd| j                   d| j                  dS )N
InvalidDimzInvalidDim(, r.   rD   r)   s    r   __repr__zInvalidConcreteDim.__repr__.   s,    zzdjj0%)ZZ<<r   c                     t        |       S r   reprr)   s    r   r/   zInvalidConcreteDim.__str__3       DJ&r   c                      yr>   r   r)   s    r   r<   zInvalidConcreteDim.isvalid4   r@   r   c                      yr;   r   r)   s    r   r?   zInvalidConcreteDim.invalid5   r   r   )NN)	r	   r
   r   r!   r&   rL   r/   r<   r?   r   r   r   rB   rB   )   s     *=
 '! r   rB   c                 x   t        | t              r|J | S t        | t              r%|J t        | j                  | j                  |      S t        | t
              r4|J t        |       dk(  sJ t        |              | \  }}t        |||      S |=t        | t              s t        | t              rt        |       | k(  sJ t        | d|      S t        | t              s t        | t              rt        |       | k(  sJ t        |t              s t        |t              rt        |      |k(  sJ t        | ||      S )Nr   r   )
r1   rB   r   r   r   tuplelenstrintfloat)abr   r   r   s        r   make_dimr[   9   s   %&99H!&'99QWWaggx88!U99q6Q;A;NUEUE844ya*Q"63q6Q;GGQ8,,a*Q"63q6Q;GGa*Q"63q6Q;GGQ8,,r   c                 \    | j                   t        j                         k7  rt        d      y )Nz"Attempt to use a stale expression.
cg_version_cgversion
ValueErrorrY   s    r   ensure_freshnessrc   O   s"    ||s{{}$J7[,\&\$r   c                 p    | j                   j                         rt        | j                   d      S t        S )NTr   )dimr<   r[   rJ   rb   s    r   copy_dimrg   S   s&    UU]]_AEED))r   c                     | j                   j                         s|j                   j                         rt        S | j                   |j                   k(  rt        |       S t	        | j                   |j                         S r   )rf   r?   rJ   rg   rB   rY   rZ   s     r   ensure_same_dimrj   X   sO    UU]]_uuaee|A;aeeAEE**r   c                 D   | j                   j                         s|j                   j                         rt        S | j                   d   |j                   d   k(  r(t        | j                   d   |j                   d   d      S t	        | j                   |j                         S )Nr   r   Tre   )rf   r?   rJ   r[   rB   ri   s     r   ensure_mul_dimrl   _   sm    UU]]_uuQxqAEE!HaeeAh66aeeAEE**r   c                     | D ]$  }|j                   j                         st        c S  | d   j                   }| dd  D ])  }||j                   k7  st        ||j                         c S  t	        | d         S )Nr   r   )rf   r?   rJ   rB   rg   )xsxdim0s      r   ensure_all_same_dimrq   f   sj    auu}}  
A$ab6aquu}aee,,  
"Q%r   c                 4    t        d| |gt        | |            S )NaddGVExprrj   ri   s     r   _addrv   q   s    VEAa5/!A2FGGr   c                 4    t        d| |gt        | |            S )Nmul)ru   rl   ri   s     r   _mulry   r   s    VEAa5.12EFFr   c                 0    t        d| gt        |             S )Nnegru   rg   rb   s    r   _negr}   s   s    VE!DDr   c                 2    t        d| |gt        |            S )N	scalarsubr|   ri   s     r   
_scalarsubr   t   s    VK!ADDr   c                 2    t        d| |gt        |             S )Ncaddr|   ri   s     r   _caddr   u       VFQqE8A;??r   c                 2    t        d| |gt        |             S )Ncmulr|   ri   s     r   _cmulr   v   r   r   c                 2    t        d| |gt        |             S Ncdivr|   ri   s     r   _cdivr   w   r   r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
dd	Zdd
ZddZddZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)
Expressionc                     || _         || _        || _        t               | _        t               j                         | _        y r   )nameargsrf   r   vindexcgr`   r^   )r    r   r   rf   s       r   r!   zExpression.__init__z   s/    DIDIDH+DKdllnDOr   c                     t               S r   )r   r)   s    r   r   zExpression.cg   s    rtr   c                     | j                   S r   )r^   r)   s    r   get_cg_versionzExpression.get_cg_version   s    4??2r   c                     | j                   S r   )r   r)   s    r   
get_vindexzExpression.get_vindex   s    t{{*r   c                     t        |       S r   )rV   r)   s    r   rL   zExpression.__repr__   s    SY&r   c           
          | j                   ddj                  t        t        | j                              d| j
                  d| j                  d| j                  d
S )Nz([rK   z], /r.   )r   joinmaprV   r   rf   r   r^   r)   s    r   r/   zExpression.__str__   sP    TYY		#cRVR[R[J\@]_c_g_gimititvz  wF  wF  G  Gr   c                     t        | |      S r   )lookupr    is     r   r&   zExpression.__getitem__   s    6$?2r   c                      y r   r   )r    r   js      r   __getslice__zExpression.__getslice__       tr   c                      yNg        r   r    recalculates     r   scalar_valuezExpression.scalar_value   s    Cr   c                     g S r   r   r   s     r   	vec_valuezExpression.vec_value   s    )r   c                      y r   r   r   s     r   npvaluezExpression.npvalue       tr   c                      y r   r   r   s     r   valuezExpression.value   s    Tr   c                      y r   r   r   s     r   forwardzExpression.forward   r   r   c                      y r   r   )r    ro   s     r   setzExpression.set       Dr   c                     t        | |      S r   )lookup_batchr   s     r   batchzExpression.batch   s    \$22r   c                     | S r   r   r)   s    r   zerozExpression.zero   s    +r   c                      y r   r   r)   s    r   backwardzExpression.backward   s    dr   c                     t        | t              rt        |t              rt        | |      S t        | t        t        f      st        |t        t        f      rt        | |      S t        d| d|      Nzself=z, other=)r1   r   rv   rW   rX   r   NotImplementedErrorr2   s     r   __add__zExpression.__add__   Z    	D*	%*UJ*Gd5!
!dSK(Jus5k,JtU#
#%T5&IJJr   c                     t        | t              rt        |t              rt        | |      S t        | t        t        f      st        |t        t        f      rt        | |      S t        d| d|      r   )r1   r   ry   rW   rX   r   r   r2   s     r   __mul__zExpression.__mul__   r   r   c                 z    t        | t              r"t        |t        t        f      rt	        | |      S t               r   )r1   r   rW   rX   r   r   r2   s     r   __div__zExpression.__div__   s/    	D*	%*USK*HtU#
#%''r   c                     t        |       S r   )r}   r)   s    r   __neg__zExpression.__neg__   s    4:-r   c                 <   t        | t              rt        |t              r| | z   S t        | t        t        f      rt        |t              rt	        | |      S t        | t              r+t        |t        t        f      rt        t	        ||             S t               r   )r1   r   rW   rX   r   r}   r   r2   s     r   __sub__zExpression.__sub__   sw    	D	$E*)Ev
dC;'JuZ,HD%(
(d:&:eS%L+Ij-.
.%''r   c                      y r   r   )r    r   rows      r   init_rowzExpression.init_row       dr   c                      y r   r   r    r   kwargss      r   init_from_arrayzExpression.init_from_array   s    dr   c                      y r   r   r   s      r   set_updatedzExpression.set_updated   s    $r   NF)r	   r
   r   r!   r   r   r   rL   r/   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   y   sb    % 2*& G2+733132KK( .( #2.r   r   c                 J    t        | ||      }t        j                  |       |S r   )r   graphviz_itemsappend)r   r   rf   es       r   ru   ru      s#    tS!!	
(r   c                   2    e Zd ZddZd Zd Zd Zd Zd Zy)	Modelc                 d    t        |t        t        f      sJ t        d|gt	        |            }|S )N
parameters)r1   rT   rW   r   r[   )r    rf   scaler   r   pps         r   add_parameterszModel.add_parameters   s/    #uSk*+*seXc];	r   c                 ^    t        |t              sJ t        d|gt        |d               }|S )Nlookup_parametersr   )r1   rT   r   r[   )r    rf   r   r   r   s        r   add_lookup_parameterszModel.add_lookup_parameters   s1    #u%&%+cUHSV4DE	r   c                      y r   r   r    fnames     r   save_allzModel.save_all       tr   c                      y r   r   r   s     r   load_allzModel.load_all   r   r   c                      y r   r   r   s     r   savez
Model.save       4r   c                      y r   r   r   s     r   loadz
Model.load   r   r   Nr   )	r	   r
   r   r   r   r   r   r   r   r   r   r   r   r      s    

 $#r   r   i c                  "    t         j                  S r   )r_   _cg_versionr   r   r   r^   r^      s    (r   c                 .    t         j                  | |      S r   )r_   renew)immediate_computecheck_validitys     r   renew_cgr      s    CIIN_aoDp=pr   c                      t         S r   )r_   r   r   r   r   r      s    Jr   c                   R    e Zd ZddZddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)ComputationGraphc                 :    |t         k7  rt        d      d| _        y )Nz>Do not instantiate ComputationGraph directly. Use pydynet.cg()r   )SECRETRuntimeErrorr   )r    guards     r   r!   zComputationGraph.__init__   s    F?,/o"ppr   c                     d}t         d d = | S Nr   )r   )r    r   r   r   s       r   r   zComputationGraph.renew   s    l

kr   c                     | j                   S r   )r   r)   s    r   r`   zComputationGraph.version   s    d...r   c                 0    t         j                  |       |S r   r   r   )r    paramss     r   r   zComputationGraph.parameters   s    F#mr   c                      yr   r   r)   s    r   forward_scalarzComputationGraph.forward_scalar   s    Sr   c                      yr   r   r)   s    r   inc_forward_scalarz#ComputationGraph.inc_forward_scalar   s    r   c                     g S r   r   r)   s    r   forward_veczComputationGraph.forward_vec   s    "9r   c                     g S r   r   r)   s    r   inc_forward_vecz ComputationGraph.inc_forward_vec   s    byr   c                      y r   r   r)   s    r   r   zComputationGraph.forward   r   r   c                      y r   r   r)   s    r   inc_forwardzComputationGraph.inc_forward   s    $r   c                      y r   r   r)   s    r   r   zComputationGraph.backward   r   r   Nr   FF)r	   r
   r   r!   r   r`   r   r  r  r	  r  r   r  r   r   r   r   r   r      s-    
 / ),$("&#r   r   c                 0    t         j                  |        | S r   r  )ps    r   	parameterr     s    	
(r   c                 4    t        d| gt        dd            S )NscalarInputr   Tre   ru   r[   )ss    r   r  r     s    6-!hq46PQQr   c                 0    t        d| gt        |             S )NvecInputr  rf   s    r   r  r     s    &cUHSMBBr   c           	      F    t        d| gt        t        |       d            S )NinputVectorTre   ru   r[   rU   )vs    r   r  r     s    6-!hs1vPT6UVVr   c                 4    t        d| |gt        | |            S )NmatInputr  )d1d2s     r   r   r      s    VJR(2r:JKKr   c                 6    t        d| |gt        |d            S )NinputMatrixTre   r  )r  ds     r   r$  r$     s    f]QFHQQU<VWWr   c                 6    t        d| ||g| j                        S )Nr   ru   rf   )r  indexupdates      r   r   r      s    F8a=OQRQVQV,W%Wr   c                 6    t        d| ||g| j                        S )Nr   r'  )r  indicesr)  s      r   r   r      s    &!WV\I]_`_d_d2e+er   c                 6    t        d| |gt        dd            S )Npickr   Tre   r  )rY   r(  rf   s      r   r-  r-     s    F6Au:xTX?Y$ZZr   c           	      H    t        d| |gt        t        |      d            S )N
pick_batchTre   r  )rY   r+  rf   s      r   r/  r/     s#    &7|XVYZaVbmqMr*s#sr   c                 4    t        d| ||gt        |             S )Nhinger|   )ro   r(  ms      r   r1  r1     s    6'Aua=(1+#NNr   c                 6    t        d| |gt        dd            S )Nmax_dimr   Tre   r  rY   r%  s     r   r4  r4         F9q!fhq46PQQr   c                 6    t        d| |gt        dd            S )Nmin_dimr   Tre   r  r5  s     r   r8  r8     r6  r   c                 0    t        d| gt        |             S )N
nobackpropr|   ro   s    r   r:  r:     s    &sHQK@@r   c                 0    t        d| gt        |             S )Nflip_gradientr|   r;  s    r   r=  r=    s    VOaS(1+FFr   c                 4    t        d| |gt        | |            S r   rt   ro   ys     r   r   r         vfqe_Qq-ABBr   c                 P   | j                   j                         s|j                   j                         rt        }n]| j                   d   |j                   d   k(  r|j                   d   dk(  rt        |       }n t	        | j                   |j                         }t        d| |g|      S )Nr   r   colwise_add)rf   r?   rJ   rg   rB   ru   ro   r@  r%  s      r   rC  rC    sv    UU]]_AuuQx1558aAA155!%%(A	!ua	((r   c                 4    t        d| |gt        | |            S )Ntrace_of_productrt   r?  s     r   rF  rF        6*<qe_UVWXEY#ZZr   c                 4    t        d| |gt        | |            S )Ncmultrt   r?  s     r   rI  rI    s    w1q/CDDr   c                 4    t        d| |gt        | |            S )Ndot_productrt   r?  s     r   rK  rK        f]QqE?1Q;OPPr   c                 4    t        d| |gt        | |            S )Nsquared_distancert   r?  s     r   rN  rN    rG  r   c                 4    t        d| |gt        | |            S )Nl1_distancert   r?  s     r   rP  rP    rL  r   c                 4    t        d| |gt        | |            S )Nbinary_log_lossrt   r?  s     r   rR  rR    s    &):QqE?STUVCW"XXr   c                    | j                   j                         s|j                   j                         rt        }ny| j                   d   |j                   d   k7  r!t        | j                   |j                         }n9t	        | j                   d   | j                   d   |j                   d   z
  dz         }t        d| |g|      S )Nr   r   filter1d_narrowrf   r?   rJ   rB   r[   ru   rD  s      r   rT  rT  $  s    UU]]_AuuQx1558155!%%(Aq1558aeeAh.23A	!Aa5!	,,r   c                 0    t        d| gt        |             S )Ntanhr|   r;  s    r   rW  rW  .      F6A344r   c                 0    t        d| gt        |             S )Nexpr|   r;  s    r   rZ  rZ  /      6%!hqk22r   c                 0    t        d| gt        |             S )Nsquarer|   r;  s    r   r]  r]  0      fXsHQK88r   c                 0    t        d| gt        |             S )Nsqrtr|   r;  s    r   r`  r`  1  rX  r   c                 0    t        d| gt        |             S )Nerfr|   r;  s    r   rb  rb  2  r[  r   c                 0    t        d| gt        |             S )Ncuber|   r;  s    r   rd  rd  3  rX  r   c                 0    t        d| gt        |             S )Nlogr|   r;  s    r   rf  rf  4  r[  r   c                 0    t        d| gt        |             S )Nlgammar|   r;  s    r   rh  rh  5  r^  r   c                 0    t        d| gt        |             S )Nlogisticr|   r;  s    r   rj  rj  6      zA3<<r   c                 0    t        d| gt        |             S )Nrectifyr|   r;  s    r   rm  rm  7      vi!hqk::r   c                 2    t        d| |gt        |             S )Nlog_softmaxr|   )ro   restricts     r   rp  rp  8  s    &8hWXk*Z#Zr   c                 0    t        d| gt        |             S )Nsoftmaxr|   r;  s    r   rs  rs  9  rn  r   c                 0    t        d| gt        |             S )Nsoftsignr|   r;  s    r   ru  ru  :  rk  r   c                 4    t        d| |gt        | |            S )Npowrt   r?  s     r   rw  rw  ;  s    fUQqE?1Q+?@@r   c                 4    t        d| |gt        | |            S )Nbminrt   r?  s     r   ry  ry  <  rA  r   c                 4    t        d| |gt        | |            S )Nbmaxrt   r?  s     r   r{  r{  =  rA  r   c           	          t        d| g| j                  j                         r*t        | j                  d   | j                  d               S t              S )N	transposer   r   ru   rf   r<   r[   rJ   r;  s    r   r}  r}  >  sD    aSRSRWRWR_R_Ra(1558QUU1X2Nrrgqrrr   c                     t        d| g| j                  j                         rt        | j                  d   d            S t              S )Nsum_colsr   r   r~  r;  s    r   r  r  ?  s6    zA3q!0Dhh]ghhr   c                 0    t        d| gt        |             S )Nsum_batchesr|   r;  s    r   r  r  A  s    6-!hqkBBr   c                     | j                   j                         rt        }nB| j                   d   |k7  rt        | j                   |      }nt	        d| j                   d         }t        d| |g|      S )Nr   r   	fold_rowsrU  )ro   r   r%  s      r   r  r  D  s[    UU]]_AuuQx5155%(AAEE!HA	aY	**r   c                 6    t        d| ||gt        | |            S )Npairwise_rank_lossrt   )ro   r@  r2  s      r   r  r  L  s!    F3G!AaRabcdeRf,g%gr   c                 2    t        d| |gt        |             S )Npoisson_lossr|   r?  s     r   r  r  M  s    vnqeXa[IIr   c                 6    t        d| ||gt        | |            S )Nhuber_distancert   )ro   r@  cs      r   r  r  N  s     &1AAa7O\]^_L`*a#ar   c                     t        d| ||g| j                  j                         rt        | j                  d   |            S t              S )Nkmax_poolingr   r~  )ro   kr%  s      r   r  r  P  sB    F>Aa7]^]b]b]j]j]lHQUUSTXWXDY$}}r|$}}r   c                 6    t        d| |gt        dd            S )Npickneglogsoftmaxr   Tre   r  )ro   r  s     r   r  r  Q  s    F+>1xPQ\`Ga$bbr   c           	      H    t        d| |gt        t        |      d            S )Npickneglogsoftmax_batchTre   r  )ro   vss     r   r  r  R  s&    62KaPRVU]^abd^eptUu+v$vr   c           	          t        d| |g| j                  j                         r0t        | j                  d   | j                  d   |z
  dz               S t              S )N	kmh_ngramr   r   r~  )ro   ns     r   r  r  T  sQ    F;1[\[`[`[h[h[jxa!%%PQ(ST*UV,7W{{pz{{r   c           	          t        d| ||g| j                  j                         r t        ||z
  | j                  d               S t              S )N	pickranger   r~  )ro   r  us      r   r  r  U  sE    vkAa7WXW\W\WdWdWfHQqS!%%PQ(<Swwlvwwr   c                 2    t        d| |gt        |             S )Nnoiser|   )ro   stddevs     r   r  r  W  s    VGaZ!EEr   c                 2    t        d| |gt        |             S )Ndropoutr|   ro   r  s     r   r  r  X      &QqE8A;??r   c                 2    t        d| |gt        |             S )Nblock_dropoutr|   r  s     r   r  r  Y  s    1x{ KKr   c                 2    t        d| |gt        |            S )Nreshaper  )ro   r%  s     r   r  r  [  r  r   c                 .    t        d| t        |             S )Nesumru   rq   rn   s    r   r  r  \      VFB(;B(?@@r   c                 .    t        d| t        |             S )Naverager  r  s    r   r  r  ]  s    y".A".EFFr   c                 .    t        d| t        |             S )Nemaxr  r  s    r   r  r  ^  r  r   c                 "   t        d | D              rt        }nj| d   j                  d   }| d   j                  d   }| D ]*  }||j                  d   z  }||j                  d   k(  r|nd}, |dk\  rt        ||      nt        }t	        d| |      S )Nc              3   P   K   | ]  }|j                   j                            y wr   rf   r?   .0ro   s     r   	<genexpr>z#concatenate_cols.<locals>.<genexpr>`       %"Q"   $&r   r   r   concatenate_colsanyrJ   rf   r[   ru   rn   rf   r   r   ro   s        r   r  r  _  s    %"%%
CqEIIaLEqEIIaLEquuQxea(ebe  %*QJ(5%
 JC	"B	,,r   c                 (   t        d | D              rt        }nm| d   j                  d   }| d   j                  d   }| dd  D ]*  }||j                  d   z  }||j                  d   k(  r|nd}, |dk\  rt        ||      nt        }t	        d| |      S )Nc              3   P   K   | ]  }|j                   j                            y wr   r  r  s     r   r  zconcatenate.<locals>.<genexpr>k  r  r  r   r   r   concatenater  r  s        r   r  r  j  s    %"%%
CqEIIaLEqEIIaLEVquuQxea(ebe  %*QJ(5%
 JC	r3	''r   c           
           t        d  D              rt        }n@t         fdt         dd d    dd d         D              r d   j                  }nt        }t        d |      S )Nc              3   P   K   | ]  }|j                   j                            y wr   r  r  s     r   r  z#affine_transform.<locals>.<genexpr>w  r  r  c              3   \   K   | ]#  \  }}t        ||      d    j                  k(   % yw)r   N)rl   rf   )r  rY   rZ   rn   s      r   r  z#affine_transform.<locals>.<genexpr>y  s,     
L5Kca>!A1		)5Ks   ),r   r   r   affine_transform)r  rJ   allziprf   ru   )rn   rf   s   ` r   r  r  v  sa    %"%%
C

LSADqD"QTT(5K
LL
Q%))C
C	"B	,,r   c                       t         dz  a t         S r   )builder_numr   r   r   new_builder_numr    s    +	r   c                   f    e Zd Zd Zd Zd ZddZd Zd Zd Z	d	 Z
d
 Zd Zd Zd ZddZddZy)_RNNBuilderc                      y r   r   )r    fs     r   set_dropoutz_RNNBuilder.set_dropout  r   r   c                      y r   r   r)   s    r   disable_dropoutz_RNNBuilder.disable_dropout  s    Tr   c                 T    t         j                         | _        t               | _        y r   )r_   r`   r^   r  builder_versionr)   s    r   	new_graphz_RNNBuilder.new_graph  s    do,.dr   Nc                 \    | j                   t        j                         k7  rt        d      y NzLUsing stale builder. Create .new_graph() after computation graph is renewed.r]   )r    ess     r   start_new_sequencez_RNNBuilder.start_new_sequence  s+    	CKKM	)  =K  2L  ,L	)r   c                     t        |       | j                  t        j                         k7  rt	        d      t
        j                  | j                  | j                  j                  |j                                     S r  
rc   r^   r_   r`   ra   r   
from_cexprthisptr	add_inputr  )r    r   s     r   r  z_RNNBuilder.add_input  s\    q	CKKM	)  =K  2L  ,L""4??DLL4J4J13354QRRr   c                     t        |       | j                  t        j                         k7  rt	        d      t
        j                  | j                  | j                  j                  ||j                                     S r  r  )r    prevr   s      r   add_input_to_prevz_RNNBuilder.add_input_to_prev  sb    q	CKKM	)  =K  2L  ,L""4??DLL4J4J4QRQTQTQV4WXXr   c                     | j                   t        j                         k7  rt        d      | j                  j                          y r  )r^   r_   r`   ra   r  rewind_one_stepr)   s    r   r  z_RNNBuilder.rewind_one_step  s8    	CKKM	)  =K  2L  ,L
ll""$r   c                     | j                   t        j                         k7  rt        d      t        j                  | j                   | j                  j                               S r  )r^   r_   r`   ra   r   r  r  backr)   s    r   r  z_RNNBuilder.back  sL    	CKKM	)  =K  2L  ,L""4??DLL4E4E4GHHr   c                    | j                   t        j                         k7  rt        d      g }| j                  j                         }|D ]1  }|j                  t        j                  | j                   |             3 |S r  )	r^   r_   r`   ra   r  final_hr   r   r  r    rescexpscexps       r   r  z_RNNBuilder.final_h  k    	CKKM	)  =K  2L  ,Lcll""$e$
**Z**4??DA
B jr   c                    | j                   t        j                         k7  rt        d      g }| j                  j                         }|D ]1  }|j                  t        j                  | j                   |             3 |S r  )	r^   r_   r`   ra   r  final_sr   r   r  r  s       r   r  z_RNNBuilder.final_s  r  r   c                    | j                   t        j                         k7  rt        d      g }| j                  j                  |      }|D ]1  }|j                  t        j                  | j                   |             3 |S r  )	r^   r_   r`   ra   r  get_hr   r   r  r    r   r  r  r  s        r   r  z_RNNBuilder.get_h  m    	CKKM	)  =K  2L  ,Lcll  #e$
**Z**4??DA
B jr   c                    | j                   t        j                         k7  rt        d      g }| j                  j                  |      }|D ]1  }|j                  t        j                  | j                   |             3 |S r  )	r^   r_   r`   ra   r  get_sr   r   r  r  s        r   r  z_RNNBuilder.get_s  r  r   c                     | j                   !| j                  t        j                         k7  rE| j	                          || j                  |       n| j                          t        | d      | _         | j                   S r   )_init_stater^   r_   r`   r  r  RNNState)r    vecss     r   initial_statez_RNNBuilder.initial_state  sd    				!T__%E
..
%%d+%%'%dB/$
r   c                 |   | j                   !| j                  t        j                         k7  r| j	                          |Qg }|D ]8  }t        t        |            }|j                  |       |j                  |       : | j                  |       n| j                          t        | d      | _         | j                   S r   )r  r^   r_   r`   r  r  rU   r   r   r  r  )r    r  r  r  r   s        r   initial_state_from_raw_vectorsz*_RNNBuilder.initial_state_from_raw_vectors  s    				!T__%E
..
b!s1v&!%%())A,  %%b)%%'%dB/$
r   r   )r	   r
   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r  r    sH     !/LS
Y
%Ir   r  c                       e Zd Zd Zd Zy)SimpleRNNBuilderc                 v    d| _         || _        || _        || _        || _        d | _        t               | _        y r   r^   layers	input_dim
hidden_dimmodelr  r  r  r    r  r  r  r  s        r   r!   zSimpleRNNBuilder.__init__  8    DODKDN DODJD*,Dr   c                      y)Nr  r   r)   s    r   whoamizSimpleRNNBuilder.whoami  s    -r   Nr	   r
   r   r!   r  r   r   r   r  r    s    - .r   r  c                       e Zd Zd Zd Zy)
GRUBuilderc                 v    d| _         || _        || _        || _        || _        d | _        t               | _        y r   r  r  s        r   r!   zGRUBuilder.__init__  r  r   c                      y)Nr  r   r)   s    r   r  zGRUBuilder.whoami  s    <r   Nr  r   r   r   r  r    s    - (r   r  c                       e Zd Zd Zd Zy)LSTMBuilderc                 v    d| _         || _        || _        || _        || _        d | _        t               | _        y r   r  r  s        r   r!   zLSTMBuilder.__init__  r  r   c                      y)Nr  r   r)   s    r   r  zLSTMBuilder.whoami  s    =r   Nr  r   r   r   r  r    s    - )r   r  c                       e Zd Zd Zd Zy)FastLSTMBuilderc                 v    d| _         || _        || _        || _        || _        d | _        t               | _        y r   r  r  s        r   r!   zFastLSTMBuilder.__init__  r  r   c                      y)Nr  r   r)   s    r   r  zFastLSTMBuilder.whoami  s    ,r   Nr  r   r   r   r  r    s    - -r   r  c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	BiRNNBuilderz
    Builder for BiRNNs that delegates to regular RNNs and wires them together.  
    
        builder = BiRNNBuilder(1, 128, 100, model, LSTMBuilder)
        [o1,o2,o3] = builder.transduce([i1,i2,i3])
    c                 >   |dkD  sJ |dz  dk(  sJ g | _          |d||dz  |      } |d||dz  |      }| j                   j                  ||f       t        |dz
        D ];  } |d||dz  |      } |d||dz  |      }| j                   j                  ||f       = y)a  
        @param num_layers: depth of the BiRNN
        @param input_dim: size of the inputs
        @param hidden_dim: size of the outputs (and intermediate layer representations)
        @param model
        @param rnn_builder_factory: RNNBuilder subclass, e.g. LSTMBuilder
        r   r   r   N)builder_layersr   xrange)	r    
num_layersr  r  r  rnn_builder_factoryr  rZ   _s	            r   r!   zBiRNNBuilder.__init__  s     A~~A~""" 9jlEB9jlEB""Aa5)
1%A#Az:a<GA#Az:a<GA&&!u- &r   c                      y)Nr  r   r)   s    r   r  zBiRNNBuilder.whoami+  s    ^r   c                 p    | j                   D ]'  \  }}|j                  |       |j                  |       ) y r   )r  r  )r    r  fbbbs       r   r  zBiRNNBuilder.set_dropout-  s.    (('2b
q
q )r   c                 l    | j                   D ]%  \  }}|j                          |j                          ' y r   )r  r  )r    r  r  s      r   r  zBiRNNBuilder.disable_dropout1  s.    (('2b

 )r   c           	      d   |D ]  }t        |        | j                  dd D ]~  \  }}|j                         j                  |      }|j                         j                  t	        |            }t        |t	        |            D cg c]  \  }}t        ||g       }}} | j                  d   \  }}|j                         j                  |      }|j                         j                  t	        |            }t        |t	        |            D cg c]	  \  }}||f c}}S c c}}w c c}}w )a  
        returns the list of state pairs (stateF, stateB) obtained by adding 
        inputs to both forward (stateF) and backward (stateB) RNNs.  

        @param es: a list of Expression

        see also transduce(xs)

        .transduce(xs) is different from .add_inputs(xs) in the following way:

            .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be
             queried in various ways. In particular, they allow access to the previous
             state, as well as to the state-vectors (h() and s() )

            .transduce(xs) returns a list of Expression. These are just the output
             expressions. For many cases, this suffices. 
             transduce is much more memory efficient than add_inputs. 
        Nr   )rc   r  r  	transducereversedr  r  
add_inputs	r    r  r   r  r  fsbsr  rZ   s	            r   r  zBiRNNBuilder.add_inputs6  s   & AQ **3B/GR!!#--b1B!!#--hrl;B03B0EF0E1+qe$0EBF 0 %%b)B**2.**8B<8!$R"!67!6#!A1!677	 G 8s   D&D,c           	      P   |D ]  }t        |        | j                  D ]~  \  }}|j                         j                  |      }|j                         j                  t	        |            }t        |t	        |            D cg c]  \  }}t        ||g       }}} |S c c}}w )a1  
        returns the list of output Expressions obtained by adding the given inputs
        to the current state, one by one, to both the forward and backward RNNs, 
        and concatenating.
        
        @param es: a list of Expression

        see also add_inputs(xs)

        .transduce(xs) is different from .add_inputs(xs) in the following way:

            .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be
             queried in various ways. In particular, they allow access to the previous
             state, as well as to the state-vectors (h() and s() )

            .transduce(xs) returns a list of Expression. These are just the output
             expressions. For many cases, this suffices. 
             transduce is much more memory efficient than add_inputs. 
        )rc   r  r  r  r  r  r  r   s	            r   r  zBiRNNBuilder.transduceT  s    ( AQ **GR!!#--b1B!!#--hrl;B03B0EF0E1+qe$0EBF + 	 Gs   B"N)
r	   r
   r   __doc__r!   r  r  r  r  r  r   r   r   r  r    s%    .& ,
8<r   r  c                   >    e Zd Zd
dZd Zd Zd Zd Zd Zd Z	d	 Z
y)r  Nc                 <    || _         || _        || _        || _        y r   )builder	state_idx_prev_out)r    r'  r(  
prev_stateouts        r   r!   zRNNState.__init__q  s    dldndjdir   c           	         t        | j                  j                        }|j                  |k(  r|j                  nt	        |j                  |      }| j                  j                         }|j                  d      r|d t        d        }t        d|||| j                  j                  | j                  dz   gt        | j                  j                              }t        | j                  | j                  dz   | |      }|S )NBuilderr  r   r  )r[   r'  r  rf   rB   r  endswithrU   ru   r  r(  r  r  )r    ro   r  rnn_typeoutput_e	new_states         r   r  zRNNState.add_inputw  s    4<<112i55)+!%%1CAEE91Ui$$&h			9	%(;KS^O2Lx
Q	8T\\=Y=Y[_[i[ijk[k$lrz{  |H  |H  |S  |S  sT  Uh4<<)94Jir   c                     | j                   t               | j                  _        g }| }|D ]$  }|j	                  |      }|j                  |       & |S r   )r)  r  r'  r  r  r   r    rn   statescurro   s        r   r  zRNNState.add_inputs  sP    ::)8):$,,
&A--"CMM#  r   c                 f    | j                  |      D cg c]  }|j                          c}S c c}w r   )r  output)r    rn   ro   s      r   r  zRNNState.transduce  s+    $(OOB$78$7q
$7888s   .c                     | j                   S r   )r*  r)   s    r   r8  zRNNState.output  s    TYY&r   c                     | j                   S r   )r)  r)   s    r   r  zRNNState.prev  s    4::%r   c                     | j                   S r   )r'  r)   s    r   rZ   z
RNNState.b  s    $r   c                     | j                   S r   )r(  r)   s    r   get_state_idxzRNNState.get_state_idx  s    DNN2r   )r   NN)r	   r
   r   r!   r  r  r  r8  r  rZ   r=  r   r   r   r  r  p  s$    9 '%$2r   r  c                   8    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	y)
StackedRNNStateNc                      || _         || _        y r   )r5  r  )r    r5  r  s      r   r!   zStackedRNNState.__init__  s    	r   c                     g }| j                   D ]5  }|j                  |j                  |             |d   j                         }7 t	        ||       S r   )r5  r   r  r8  r?  )r    ro   next_statesr  s       r   r  zStackedRNNState.add_input  sL    Aq{{1~.B&&(A  {D11r   c                 <    | j                   d   j                         S r   )r5  r8  r)   s    r   r8  zStackedRNNState.output  s    T[[_3355r   c                     | j                   S r   )r  r)   s    r   r  zStackedRNNState.prev  s    499$r   c                 \    | j                   D cg c]  }|j                          c}S c c}w r   )r5  hr    r  s     r   rF  zStackedRNNState.h  #    41444   )c                 \    | j                   D cg c]  }|j                          c}S c c}w r   )r5  r  rG  s     r   r  zStackedRNNState.s  rH  rI  c                 `    g }| }|D ]$  }|j                  |      }|j                  |       & |S )zz
        returns the list of states obtained by adding the given inputs
        to the current state, one by one.
        )r  r   r4  s        r   r  zStackedRNNState.add_inputs  s9    
 A--"CMM#  r   r   )
r	   r
   r   r!   r  r8  r  rF  r  r  r   r   r   r?  r?    s    2 6$44
r   r?  c                   .    e Zd ZddZddZd Zd Zd Zy)Trainerc                      y r   r   rG  s     r   r)  zTrainer.update  r   r   c                      y r   r   )r    rs     r   update_epochzTrainer.update_epoch  s    4r   c                      y r   r   r)   s    r   statuszTrainer.status  r   r   c                      y r   r   )r    thrs     r   set_clip_thresholdzTrainer.set_clip_threshold  rH   r   c                      y r   r   r)   s    r   get_clip_thresholdzTrainer.get_clip_threshold  s    r   Ng      ?)r	   r
   r   r)  rQ  rS  rV  rX  r   r   r   rM  rM    s    ')$r   rM  c                       e Zd ZdZddZy)SimpleSGDTrainerz#
    This object is very cool!
    c                      y r   r   )r    r2  e0r   s       r   r!   zSimpleSGDTrainer.__init__  s    Dr   N)皙?)r	   r
   r   r$  r!   r   r   r   r[  r[    s     1r   r[  c                       e Zd ZddZy)MomentumSGDTrainerc                      y r   r   )r    r2  r]  momr   s        r   r!   zMomentumSGDTrainer.__init__  s    r   N)g{Gz??r	   r
   r   r!   r   r   r   r`  r`    s    <r   r`  c                       e Zd ZddZy)AdagradTrainerc                      y r   r   )r    r2  r]  epsr   s        r   r!   zAdagradTrainer.__init__  s    r   N)r^  g#B;rd  r   r   r   rf  rf    s    =r   rf  c                       e Zd ZddZy)AdadeltaTrainerc                      y r   r   )r    r2  rh  rhor   s        r   r!   zAdadeltaTrainer.__init__  s    $r   N)gư>gffffff?rd  r   r   r   rj  rj    s    >r   rj  c                       e Zd ZddZy)AdamTrainerc                      y r   r   )r    r2  alphabeta_1beta_2rh  r   s          r   r!   zAdamTrainer.__init__  s    \`r   N)gMbP?rc  g+?g:0yE>rd  r   r   r   rn  rn    s    `r   rn  c                       e Zd Zy)InitializerNr   r   r   r   rt  rt    s    r   rt  c                       e Zd ZddZy)NormalInitializerc                      y r   r   )r    meanvars      r   r!   zNormalInitializer.__init__  r   r   N)r   r   rd  r   r   r   rv  rv    s    +r   rv  c                       e Zd Zd Zy)UniformInitializerc                      y r   r   )r    r   s     r   r!   zUniformInitializer.__init__  r   r   Nrd  r   r   r   r{  r{        #r   r{  c                       e Zd Zd Zy)ConstInitializerc                      y r   r   )r    r  s     r   r!   zConstInitializer.__init__  r   r   Nrd  r   r   r   r  r    s    r   r  c                       e Zd ZddZy)GlorotInitializerc                      y r   r   )r    	is_lookups     r   r!   zGlorotInitializer.__init__  s    r   Nr   rd  r   r   r   r  r    s    -r   r  c                       e Zd Zd Zy)FromFileInitializerc                      y r   r   r   s     r   r!   zFromFileInitializer.__init__  r   r   Nrd  r   r   r   r  r    r}  r   r  c                       e Zd Zd Zy)NumpyInitializerc                      y r   r   )r    arrays     r   r!   zNumpyInitializer.__init__  r   r   Nrd  r   r   r   r  r    r}  r   r  c                     | j                         rt        |       S | j                  r| d   dk(  rd| d   z  S d| d   d| d   dS | d   dk(  rd| d   z  S d| d   d| d   d	S )
Nr   z{%s}r   {r-   }z{{%s}}z{{z}})r?   rV   r   )e_dims    r   	shape_strr    s    
]]_u:~~Qx1}uQx     (58,,Qx1}q""  "!HU1X..r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)GVNodec	                 t    || _         || _        || _        || _        || _        || _        || _        || _        y r   )r   r  label
output_dimchildrenfeatures	node_type	expr_name)	r    r   r  r  r  r  r  r  r  s	            r   r!   zGVNode.__init__  s:    DIDNDJ DODMDMDNDNr   c           
          t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  g      S r   )	r(   r   r  r  r  r  r  r  r  r)   s    r   r*   zGVNode.__iter__  sf    T499dnndjj$//[_[h[hjnjwjwy}  zH  zH  JN  JX  JX  #Y  Z  Zr   c                 F    ddj                  t        t        |             z  S )Nz
GVNode(%s)rK   )r   r   rV   r)   s    r   rL   zGVNode.__repr__  s    \DIIc#tn,EEEr   c                     t        |       S r   rN   r)   s    r   r/   zGVNode.__str__  rP   r   c                 0    t        |       t        |      k  S r   )idr2   s     r   __lt__zGVNode.__lt__  s    "T(RY"66r   N)r	   r
   r   r!   r*   rL   r/   r  r   r   r   r  r    s     ZE&6r   r  c                 	  ) t               }t               }|r"t        D ]  }||v s||   ||j                  <    t	        )fd      )d }t        D ]*  }|j                  }|j
                  }|j                  }	|j                  }
d}t               }d}|dk(  r|	\  }g }n||dk(  r|	\  }g }no|dk(  r	|	\  }}g }na|dk(  r	|	\  }}g }nS|d	k(  r|	\  }g }| r	||v r||   }d
}n9|dk(  r|	\  }g }| r	||v r||   }d
}n|dk(  r|	\  }}}|j                  \  }||v r||   }nd}d}|r||v r||   }||v rd||   |   d}| r||}n|	|d|d}nd|z  }g }n|j                  |j                  d|j                  z        g}||j                  |       |d   }|j                  d|z  d|z  |rdndg       n`|dk(  r|	\  }}}}})|   }|j                  d      r|dt        d         |d|d|}| s%|j                  } |j                  | d| z        }!|!g}ng }|j                   ||j                               d}ng }|	D ]  }t        |t              rV| s2|j                  } |j                  | d| z        }!|j                  |!       |j                   ||j                               it        |t               r>| r<t#        j$                  ddd|z        }!|!dk(  rt'        |      }!|j                  |!       |j                  t'        |              | r<dddd ddd dd!d"d#d$d%j                  ||      }|r|d&d'j)                  |      d(}"n|}"n|d)k(  r|\  }#}$|#d*|$}"n|d+k(  r|\  }#}$|#d,|$}"n|d-k(  r|\  }#}$|#d.|$}"nz|d/k(  r|\  }#}$|#d0|$}"nh|d1k(  r
|\  }#d2|#z  }"nY|d3k(  r8|d   }"t+        d4t        |      d5      D ]  } |"d6t-        || | d5z          z  z  }" n||d&d'j)                  |      d(}"n|}" ||      }| sd|j                  |d|z        z  nd}%|"}&| s|%d7|&}&d}'| r|r||v r||   |k7  r||   nd}(|j                  t/        |||&|
t1        |      |'||(             - |S )8aU  
  Make a network graph, represented as of nodes and a set of edges.  
  The nodes are represented as tuples: (name: string, input_dim: Dim, label: string, output_dim: Dim, children: set[name], features: string)
#   The edges are represented as dict of children to sets of parents: (child: string) -> [(parent: string, features: string)] 
  c                  D    t        t               t        d      z         S )NA)chrrU   ord)rnn_bldr_names   r   <lambda>z$make_network_graph.<locals>.<lambda>  s    c#m*<SX*E&Fr   c                     d| S )NNr   )vidxs    r   vidx2strz$make_network_graph.<locals>.vidx2str  s    sD11r   N	2_regularr  r  r   r$  r   1_paramr   r   z\"[]z
lookup(%s)zv%dr   z%sr)  fixedr  r.  -3_rnn_statez0+$ z%.3fz0.+*r   catsummaxmin)rs   subrx   divr   r   r   r   r  r  r  emin(rK   r.   rs   z + r  z - rx   z * r  z / r{   z-%sr  r   r   z + %s*%sz = )r   dictr   r   r   r   r   rf   getr   extendr/  rU   rs   r1   r   rX   rer  rV   r   r  rT   r  	frozenset)*compactexpression_nameslookup_namesnodesvar_name_dictr   r  r  f_namer   r  r  r  r  _dimarg_strs_v_d1_d2_dr  idxr)  r   	item_name
param_name
vocab_sizearg	bldr_typebldr_numr(  rnn_namer   r  str_reprrY   rZ   var_namer  r  r  r  s*                                            @r   make_network_graphr    sc    %% &-	
	"21"5ahh  FG-1>a88DVVF66DJIuHIfth	=	 drh	:	jsCh	=	 hr2h	<	fth	=  &&i	&	&fth	=  &&i	8	q#vvvft		T"i	!//%a(
%$0$<S$AC)	 &#S)&3'&!%%ahh0BCD 
//)
$!W
tz':HT[\] 
:	9=6sIy(Ix(h			I	&"C	N?#&)<fJJa!-3ll8CJJ'(ih#c:&

A!!!Ua[1AOOA
,,x

+
,U#ffUB#/!$YCA
//!

//#c(
# $ ! % VV$  
%tyy':;	5eq"h	5eq"h	5eq"h	5eq"h	5dq!h	%	%!haX*!Jx!A#!777 + 
	%tyy':;D>DGNt}((u~>?TVH E#U+eH (/3CN^I^euvwex  }C  fC #  JNI	IIfT9eZ89LhXaclmnq t 
,r   c                 p    g }|D ].  } | j                   D ]  }| |j                   v s|j                    0 |S r   )r  r   )r  r  psr  s       r   
parents_ofr    s8    	"aZZ	
ajj
		   
)r   c                 >   | D ci c]  }|j                   | c}g }t               }g }t        t              }i }t        t              }t               }	t               }
| D ]  }|j                  D ]@  }|   j
                  dk(  s||   j                      j                  |j                          B |j
                  dk(  sb|j                  |       t        fd|j                  D              ||j                   <    |D ]:  }||j                      \  }||j                      \  }|||f   j                  |       < |j                         D ]d  \  \  }}}t        d |D              }t        d |D              }t        |      dkD  s=t        |      dk(  sLt        |      dk(  s[|\  }|\  }dj                  d t        |      D              }dj                  d	 t        |      D              }|s|   j                  d|}t        |d
   dz  |d         }t        ||||t        |g      dd|   j                         }|D ]6  }|j                   |	|j                   <   |
j                  |j                          8 |j                   ||<   | j                  |       |
j                  |       g | D ]Y  \  }}}}}}}}||
vsg }|D ]!  }||v r
||   }||v r
|j                  |       # |j                  t        ||||||||             [ ||	fS c c}w )Nr  c              3   <   K   | ]  }|   j                     y wr   r   )r  r  	node_infos     r   r  z(collapse_birnn_states.<locals>.<genexpr>  s      GJq1!2!2Js   c              3   4   K   | ]  }|j                     y wr   )r  r  r  s     r   r  z(collapse_birnn_states.<locals>.<genexpr>  s     -"QQ[["   c              3   4   K   | ]  }|j                     y wr   )r  r  s     r   r  z(collapse_birnn_states.<locals>.<genexpr>  s     /BqallBr  r   r  c              3   4   K   | ]  }|j                     y wr   r  r  s     r   r  z(collapse_birnn_states.<locals>.<genexpr>  s     (DAr  \nc              3   4   K   | ]  }|j                     y wr   )r  r  s     r   r  z(collapse_birnn_states.<locals>.<genexpr>  s     ,IjQWWjr  r   r   )r   r  r   r   r  r  rs   r   	iteritemsrU   r   sortedr  r[   r  r  r  )r  r  r  	new_nodeschildren_forwardsrnn_state_nodesrnn_parentsrnn_childrenshared_rnn_states
rnn_groupsnodes_to_deleter  in_eout_ens
input_dimsoutput_dimsr  r  new_rnn_group_state_namenew_rnn_group_state_labelcat_output_dimnew_rnn_group_stater   r  r  r  r  r  new_childrenr  s                                 @r   collapse_birnn_statesr    sM   !&'Aqvvax'))f/C +,!#&v*E/aZZ	1		=	0IaL%%&**1662  	{{m#Q  GAJJ GGl166  a ED FEtUm$((+  /88:}eb-"--J/B//K
2w{s:)c+.>.Ajikj!#(D(D!D"'**,IfRj,I"I1:51A1G1GIb$c!
1aA?n"#;YHacqs|  C  ~D  tE  GI  KX  Zc  di  Zj  Zt  Zt  u!055
166AFF#  "5!9!9ii#$% % ;( Y^TtYz8Xy)?"l!$$"! $$A  vdIuj,PXZcenop Y^ Z	  a (s   Lc           
      h   t        | ||      }|}t               }|r t        ||       \  }}|j                  |       t	        d       t	        d       | st	        d       t        t              }	|D ]*  }
|	|
j                     j                  |
j                         , t        |	      D ],  }dddd|   }t	        d|z  d	j                  |	|                . |D ]  }
|
j                  }|r]|
j                  |
j                  d
|}t        |
j                        d
|}|
j                   |d
t        |
j                         }|
j                  j#                         s&|
j                   /|
j                   j#                         r|
xj$                  dz  c_        t	        d|
j                  d|d|
j$                  d       |
j&                  D ]  }t	        d|d|
j                  d          g }t)        j*                  d      }|D ]  }
|
j                  dk(  s|j-                  |
j                        }|J d|
j                  d|
       |j/                         \  }}|j1                  |t3        |      |
j                  f        t        |      }t               }t5        ||dd        D ]S  \  \  }}}\  }}}||k(  s|dz   |k(  s|j7                  ||      }|j7                  ||      }|j                  ||f       U |D ]  \  }}t	        d|d|d        t	        d       y )Nzdigraph G {z  rankdir=BT;z  nodesep=.05;z[shape=ellipse]z[shape=rect]z[shape=rect, peripheries=2])r  r  r  z  node %s;  r  z' [color=red,style=filled,fillcolor=red]z  z	 [label="z"] ;z -> z[^-]+-(.)-(\d+)r  zrnn_state_re.search(z); r   z [style=dotted];r  )r  r  r  r)  printr   r   r  rs   r   r  r   r  r  r  r  r  r?   r  r  r  compilesearchgroupsr   rW   r  r  )r  	show_dimsr  r  collapse_birnnsoriginal_nodesr  collapse_tobirnn_collapse_to
node_typesr  r  styler  r  
rnn_statesrnn_state_rer2  r  r(  edges
rnn_name_pstate_idx_pname_p
rnn_name_nstate_idx_nname_ngroup_name_pgroup_name_ns                                r   print_graphvizr    s   %g/?N.
%+!6ug!FU()	%()3*aq{{' *%i*): 	E
 
-5
!388Jy,A#BC & aGGE	
	 [[%0$Q\\2E:e	
	 "Iakk$:;||!++"9akk>Q>Q>Sjj==j	QVVUAJJ
?@ZZQ'(   *./,a{{m#


agg
&a]HQWWaHH]hhjx3y>166:;  j!*
%%PST^_ijkjl_mPnL(
K*K:{FZ	Q+	%"vv6"vv6		<./ Qo  vv	&&
9:   *r   r   r>   r  )r   T)T)r   r   r   rY  )r   )gQ?)r   )FTNNF)
__future__r   sysr  collectionsr   version_infomajorr   itemsr  ranger  r   r   r   r   objectr   rB   rJ   r[   rc   rg   rj   rl   rq   rv   ry   r}   r   r   r   r   r   ru   r   r   r^   r   r   r   r_   r  r  r  r  r   r$  r   r   r-  r/  r1  r4  r8  r:  r=  r   rC  rF  rI  rK  rN  rP  rR  rT  rW  rZ  r]  r`  rb  rd  rf  rh  rj  rm  rp  rs  ru  rw  ry  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r?  rM  r[  r`  rf  rj  rn  rt  rv  r{  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     s   % 
 	 #A	K 	 &++++ &
 !" "! !  !
-,]
++ H F D D ? ? ?6/ 6/r F  " 
 ) p$v $. v
 R B V K W W e Z s N Q Q @ F C) [ D P Z P X"- 5 2 8 4 2 4 2 8 < : Z : < @ B B r h B+ h I a } b v { w E ? K ? @ F @
-
(-$ 
X& Xt	.{ 	.	( 	(	)+ 	)	-k 	-]6 ]~!3v !3Hf D%f %1w 1
= =>W >?g ?a' a  & , ,$ $ {  . .$+ $${ $$/7V 7l\1!f9r   