o
    Qi                     @   s  d dl mZ d dlZd dlZd dlmZ ejjdkr*G dd deZej	e_
eZeZg Zdadd	 Zdd
dZG dd deZG dd deZe ZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Z d)d* Z!G d+d, d,eZ"d-d. Z#G d/d0 d0eZ$d1Z%d2d3 Z&dd4d5Z'd6d7 Z(G d8d9 d9eZ)e)e%a*d:d; Z+d<d= Z,d>d? Z-d@dA Z.dBdC Z/dDdE Z0ddGdHZ1ddIdJZ2ddKdLZ3ddMdNZ4ddPdQZ5ddRdSZ6ddTdUZ7dVdW Z8dXdY Z9dZd[ Z:d\d] Z;d^d_ Z<d`da Z=dbdc Z>ddde Z?dfdg Z@dhdi ZAdjdk ZBdldm ZCdndo ZDdpdq ZEdrds ZFdtdu ZGdvdw ZHdxdy ZIdzd{ ZJd|d} ZKd~d ZLdddZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdddZVdddZWdd ZXdddZYdddZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdaidd ZjG dd deZkG dd dekZlG dd dekZmG ddÄ dekZnG ddń dekZoG ddǄ deZpG ddɄ deZqG dd˄ deZrG dd̈́ deZsG ddτ desZtG ddф desZuG ddӄ desZvG ddՄ desZwG ddׄ desZxG ddل deZyG ddۄ deyZzG dd݄ deyZ{G dd߄ deyZ|G dd deyZ}G dd deyZ~G dd deyZdd ZG dd deZdd Zdd Zdd ZdddZdS )    )print_functionN)defaultdict   c                   @      e Zd ZdS )compat_dictN__name__
__module____qualname__ r   r   =/home/ubuntu/.local/lib/python3.10/site-packages/dynet_viz.pyr      s    r   c                   C      t d7 a t S N   )vindex_countr   r   r   r   	new_index      r   c                 C      d S Nr   )random_seedr   r   r   init       r   c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )SimpleConcreteDimc                 C   s   || _ || _|| _d S r   )nrowsncolsinferred)selfr   r   r   r   r   r   __init__   s   
zSimpleConcreteDim.__init__c                 C   s   | j | jg| S r   r   r   r   keyr   r   r   __getitem__        zSimpleConcreteDim.__getitem__c                 C   s   t | j| jgS r   )iterr   r   r   r   r   r   __iter__!   r#   zSimpleConcreteDim.__iter__c                 C   s   d| j | jf S )Nz
Dim(%s,%s)r   r%   r   r   r   __str__"   r#   zSimpleConcreteDim.__str__c                 C   s"   t |to| j|jko| j|jkS r   )
isinstancer   r   r   r   otherr   r   r   __eq__#   s   " zSimpleConcreteDim.__eq__c                 C   s
   | |k S r   r   r)   r   r   r   __ne__$      
 zSimpleConcreteDim.__ne__c                 C   s   t | j| jfS r   )hashr   r   r%   r   r   r   __hash__%   r#   zSimpleConcreteDim.__hash__c                 C      dS NTr   r%   r   r   r   isvalid&   r   zSimpleConcreteDim.isvalidc                 C   r0   NFr   r%   r   r   r   invalid'   r   zSimpleConcreteDim.invalidN)r   r	   r
   r   r"   r&   r'   r+   r,   r/   r2   r4   r   r   r   r   r      s    r   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )InvalidConcreteDimNc                 C      || _ || _d S r   a_dimb_dim)r   r8   r9   r   r   r   r   *      
zInvalidConcreteDim.__init__c                 C   r   r   r   r    r   r   r   r"   -   r   zInvalidConcreteDim.__getitem__c                 C   s(   | j d u r| jd u rdS d| j | jf S )N
InvalidDimzInvalidDim(%s, %s)r7   r%   r   r   r   __repr__.   s   zInvalidConcreteDim.__repr__c                 C      t | S r   reprr%   r   r   r   r'   3       zInvalidConcreteDim.__str__c                 C   r0   r3   r   r%   r   r   r   r2   4   r   zInvalidConcreteDim.isvalidc                 C   r0   r1   r   r%   r   r   r   r4   5   r   zInvalidConcreteDim.invalid)NN)	r   r	   r
   r   r"   r<   r'   r2   r4   r   r   r   r   r5   )   s    
r5   Fc                 C   s  t | tr|d u sJ | S t | tr |d u sJ t| j| j|S t | trA|d u s+J t| dks7J t| | \}}t|||S |d u r]t | tsWt | t	rUt| | ksWJ t| d|S t | tsot | t	rmt| | ksoJ t |tst |t	rt||ksJ t| ||S )Nr   r   )
r(   r5   r   r   r   tuplelenstrintfloat)abr   r   r   r   r   r   make_dim9   s"   


$$$rH   c                 C      | j t krtdd S )Nz"Attempt to use a stale expression.
cg_version_cgversion
ValueErrorrF   r   r   r   ensure_freshnessO      rP   c                 C   s   | j  rt| j ddS tS )NTr   )dimr2   rH   r;   rO   r   r   r   copy_dimS   s   
rT   c                 C   s:   | j  s
|j  rtS | j |j krt| S t| j |j S r   )rS   r4   r;   rT   r5   rF   rG   r   r   r   ensure_same_dimX   s
   rV   c                 C   sT   | j  s
|j  rtS | j d |j d kr#t| j d |j d ddS t| j |j S )Nr   r   TrR   )rS   r4   r;   rH   r5   rU   r   r   r   ensure_mul_dim_   s
   rW   c                 C   s^   | D ]}|j  rt  S q| d j }| dd  D ]}||j kr(t||j   S qt| d S )Nr   r   )rS   r4   r;   r5   rT   )xsxdim0r   r   r   ensure_all_same_dimf   s   


r[   c                 C      t d| |gt| |S )NaddGVExprrV   rU   r   r   r   _addq       r`   c                 C   r\   )Nmul)r_   rW   rU   r   r   r   _mulr   ra   rc   c                 C      t d| gt| S )Nnegr_   rT   rO   r   r   r   _negs       rg   c                 C      t d| |gt|S )N	scalarsubrf   rU   r   r   r   
_scalarsubt       rk   c                 C      t d| |gt| S )Ncaddrf   rU   r   r   r   _caddu   rl   ro   c                 C   rm   )Ncmulrf   rU   r   r   r   _cmulv   rl   rq   c                 C   rm   Ncdivrf   rU   r   r   r   _cdivw   rl   rt   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
d5ddZd5ddZd5ddZd5ddZd5ddZdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4S )6
Expressionc                 C   s*   || _ || _|| _t | _t  | _d S r   )nameargsrS   r   vindexcgrM   rK   )r   rv   rw   rS   r   r   r   r   z   s
   zExpression.__init__c                 C   s   t  S r   )ry   r%   r   r   r   ry          zExpression.cgc                 C      | j S r   )rK   r%   r   r   r   get_cg_version   rz   zExpression.get_cg_versionc                 C   r{   r   )rx   r%   r   r   r   
get_vindex   rz   zExpression.get_vindexc                 C   r=   r   )rC   r%   r   r   r   r<      r@   zExpression.__repr__c                 C   s(   d| j dtt| j| j| j| jf S )Nz%s([%s], %s, %s/%s), )rv   joinmaprC   rw   rS   rx   rK   r%   r   r   r   r'         ( zExpression.__str__c                 C   
   t | |S r   )lookupr   ir   r   r   r"      r-   zExpression.__getitem__c                 C   r   r   r   )r   r   jr   r   r   __getslice__   r   zExpression.__getslice__Fc                 C   r0   Ng        r   r   recalculater   r   r   scalar_value   r   zExpression.scalar_valuec                 C      g S r   r   r   r   r   r   	vec_value   r   zExpression.vec_valuec                 C   r   r   r   r   r   r   r   npvalue   r   zExpression.npvaluec                 C   r   r   r   r   r   r   r   value   r   zExpression.valuec                 C   r   r   r   r   r   r   r   forward   r   zExpression.forwardc                 C   r   r   r   )r   rY   r   r   r   set   r   zExpression.setc                 C   r   r   )lookup_batchr   r   r   r   batch   r-   zExpression.batchc                 C   s   | S r   r   r%   r   r   r   zero   r   zExpression.zeroc                 C   r   r   r   r%   r   r   r   backward   r   zExpression.backwardc                 C   T   t | trt |trt| |S t | ttfst |ttfr"t| |S td| |f Nzself=%s, other=%s)r(   ru   r`   rD   rE   ro   NotImplementedErrorr)   r   r   r   __add__   
   

zExpression.__add__c                 C   r   r   )r(   ru   rc   rD   rE   rq   r   r)   r   r   r   __mul__   r   zExpression.__mul__c                 C   s(   t | trt |ttfrt| |S t r   )r(   ru   rD   rE   rt   r   r)   r   r   r   __div__   s   
zExpression.__div__c                 C   r=   r   )rg   r%   r   r   r   __neg__   r@   zExpression.__neg__c                 C   sl   t | trt |tr| |  S t | ttfr t |tr t| |S t | tr3t |ttfr3tt|| S t r   )r(   ru   rD   rE   rk   rg   r   r)   r   r   r   __sub__   s   

zExpression.__sub__c                 C   r   r   r   )r   r   rowr   r   r   init_row   r   zExpression.init_rowc                 O   r   r   r   r   rw   kwargsr   r   r   init_from_array   r   zExpression.init_from_arrayc                 O   r   r   r   r   r   r   r   set_updated   r   zExpression.set_updatedNF)r   r	   r
   r   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   ru   y   s4    




ru   c                 C   s   t | ||}t| |S r   )ru   graphviz_itemsappend)rv   rw   rS   er   r   r   r_      s   
r_   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )Modelr   c                 O   s(   t |ttfs	J td|gt|}|S )N
parameters)r(   rA   rD   ru   rH   )r   rS   scalerw   r   ppr   r   r   add_parameters   s   zModel.add_parametersc                 O   s(   t |tsJ td|gt|d }|S )Nlookup_parametersr   )r(   rA   ru   rH   )r   rS   rw   r   r   r   r   r   add_lookup_parameters   s   zModel.add_lookup_parametersc                 C   r   r   r   r   fnamer   r   r   save_all   r   zModel.save_allc                 C   r   r   r   r   r   r   r   load_all   r   zModel.load_allc                 C   r   r   r   r   r   r   r   save   r   z
Model.savec                 C   r   r   r   r   r   r   r   load   r   z
Model.loadNr   )	r   r	   r
   r   r   r   r   r   r   r   r   r   r   r      s    
r   i c                   C   s   t jS r   )rL   _cg_versionr   r   r   r   rK      rz   rK   c                 C   s   t | |S r   )rL   renew)immediate_computecheck_validityr   r   r   renew_cg       r   c                   C   s   t S r   )rL   r   r   r   r   ry      s   ry   c                   @   sh   e Zd ZdddZdddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )ComputationGraphr   c                 C   s   |t krtdd| _d S )Nz>Do not instantiate ComputationGraph directly. Use pydynet.cg()r   )SECRETRuntimeErrorr   )r   guardr   r   r   r      s   
zComputationGraph.__init__Fc                 C   s   d}t d d = | S Nr   )r   )r   r   r   r   r   r   r   r      s   
zComputationGraph.renewc                 C   r{   r   )r   r%   r   r   r   rM      rz   zComputationGraph.versionc                 C   s   t | |S r   r   r   )r   paramsr   r   r   r         
zComputationGraph.parametersc                 C   r0   r   r   r%   r   r   r   forward_scalar   r   zComputationGraph.forward_scalarc                 C   r0   r   r   r%   r   r   r   inc_forward_scalar   r   z#ComputationGraph.inc_forward_scalarc                 C   r   r   r   r%   r   r   r   forward_vec   r   zComputationGraph.forward_vecc                 C   r   r   r   r%   r   r   r   inc_forward_vec   r   z ComputationGraph.inc_forward_vecc                 C   r   r   r   r%   r   r   r   r      r   zComputationGraph.forwardc                 C   r   r   r   r%   r   r   r   inc_forward   r   zComputationGraph.inc_forwardc                 C   r   r   r   r%   r   r   r   r      r   zComputationGraph.backwardNr   FF)r   r	   r
   r   r   rM   r   r   r   r   r   r   r   r   r   r   r   r   r      s    

r   c                 C   s   t |  | S r   r   )pr   r   r   	parameter   r   r   c                 C   s   t d| gtdddS )NscalarInputr   TrR   r_   rH   sr   r   r   r      ra   r   c                 C   rd   )NvecInputr   rS   r   r   r   r      rh   r   c                 C   s   t d| gtt| ddS )NinputVectorTrR   r_   rH   rB   )vr   r   r   r      s    r   c                 C   r\   )NmatInputr   )d1d2r   r   r   r      ra   r   c                 C   s   t d| |gt|ddS )NinputMatrixTrR   r   )r   dr   r   r   r          r   Tc                 C      t d| ||g| jS )Nr   r_   rS   )r   indexupdater   r   r   r      rl   r   c                 C   r   )Nr   r   )r   indicesr   r   r   r   r      rl   r   c                 C      t d| |gtdddS )Npickr   TrR   r   )rF   r   rS   r   r   r   r      r   r   c                 C      t d| |gtt|ddS )N
pick_batchTrR   r   )rF   r   rS   r   r   r   r          r         ?c                 C   s   t d| ||gt| S )Nhingerf   )rY   r   mr   r   r   r      ra   r   c                 C   r   )Nmax_dimr   TrR   r   rF   r   r   r   r   r      r   r   c                 C   r   )Nmin_dimr   TrR   r   r   r   r   r   r      r   r   c                 C   rd   )N
nobackproprf   rY   r   r   r   r      rh   r   c                 C   rd   )Nflip_gradientrf   r   r   r   r   r     rh   r   c                 C   r\   rr   r^   rY   yr   r   r   rs     ra   rs   c                 C   sd   | j  s
|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)rS   r4   r;   rT   r5   r_   rY   r   r   r   r   r   r     s   "
r   c                 C   r\   )Ntrace_of_productr^   r   r   r   r   r     ra   r   c                 C   r\   )Ncmultr^   r   r   r   r   r     ra   r   c                 C   r\   )Ndot_productr^   r   r   r   r   r     ra   r   c                 C   r\   )Nsquared_distancer^   r   r   r   r   r     ra   r   c                 C   r\   )Nl1_distancer^   r   r   r   r   r     ra   r   c                 C   r\   )Nbinary_log_lossr^   r   r   r   r   r     ra   r   c                 C   sr   | j  s
|j  rt}n$| j d |j d krt| j |j }nt| j d | j d |j d  d }td| |g|S )Nr   r   filter1d_narrowrS   r4   r;   r5   rH   r_   r   r   r   r   r   $  s   $r   c                 C   rd   )Ntanhrf   r   r   r   r   r   .  rh   r   c                 C   rd   )Nexprf   r   r   r   r   r   /  rh   r   c                 C   rd   )Nsquarerf   r   r   r   r   r   0  rh   r   c                 C   rd   )Nsqrtrf   r   r   r   r   r   1  rh   r   c                 C   rd   )Nerfrf   r   r   r   r   r   2  rh   r   c                 C   rd   )Ncuberf   r   r   r   r   r   3  rh   r   c                 C   rd   )Nlogrf   r   r   r   r   r  4  rh   r  c                 C   rd   )Nlgammarf   r   r   r   r   r  5  rh   r  c                 C   rd   )Nlogisticrf   r   r   r   r   r  6  rh   r  c                 C   rd   )Nrectifyrf   r   r   r   r   r  7  rh   r  c                 C   rm   )Nlog_softmaxrf   )rY   restrictr   r   r   r  8  rl   r  c                 C   rd   )Nsoftmaxrf   r   r   r   r   r  9  rh   r  c                 C   rd   )Nsoftsignrf   r   r   r   r   r  :  rh   r  c                 C   r\   )Npowr^   r   r   r   r   r	  ;  ra   r	  c                 C   r\   )Nbminr^   r   r   r   r   r
  <  ra   r
  c                 C   r\   )Nbmaxr^   r   r   r   r   r  =  ra   r  c                 C   s0   t d| g| j rt| jd | jd S tS )N	transposer   r   r_   rS   r2   rH   r;   r   r   r   r   r  >  s   0 r  c                 C   s*   t d| g| j rt| jd dS tS )Nsum_colsr   r   r  r   r   r   r   r  ?  s   * r  c                 C   rd   )Nsum_batchesrf   r   r   r   r   r  A  rh   r  c                 C   sL   | j  rt}n| j d |krt| j |}ntd| j d }td| |g|S )Nr   r   	fold_rowsr   )rY   r   r   r   r   r   r  D  s   
r  c                 C      t d| ||gt| |S )Npairwise_rank_lossr^   )rY   r   r   r   r   r   r  L  r   r  c                 C   rm   )Npoisson_lossrf   r   r   r   r   r  M  rl   r  Q?c                 C   r  )Nhuber_distancer^   )rY   r   cr   r   r   r  N  r   r  r   c                 C   s.   t d| ||g| j rt| jd |S tS )Nkmax_poolingr   r  )rY   kr   r   r   r   r  P  s   . r  c                 C   r   )Npickneglogsoftmaxr   TrR   r   )rY   r   r   r   r   r  Q  r   r  c                 C   r   )Npickneglogsoftmax_batchTrR   r   )rY   vsr   r   r   r  R  r   r  c                 C   s:   t d| |g| j rt| jd | jd | d S tS )N	kmh_ngramr   r   r  )rY   nr   r   r   r  T  s   : r  c                 C   s2   t d| ||g| j rt|| | jd S tS )N	pickranger   r  )rY   r   ur   r   r   r  U  s   2 r  c                 C   rm   )Nnoiserf   )rY   stddevr   r   r   r   W  rl   r   c                 C   rm   )Ndropoutrf   rY   r   r   r   r   r"  X  rl   r"  c                 C   rm   )Nblock_dropoutrf   r#  r   r   r   r$  Y  rl   r$  c                 C   ri   )Nreshaper   )rY   r   r   r   r   r%  [  rl   r%  c                 C      t d| t| S )Nesumr_   r[   rX   r   r   r   r'  \  r#   r'  c                 C   r&  )Naverager(  r)  r   r   r   r*  ]  r#   r*  c                 C   r&  )Nemaxr(  r)  r   r   r   r+  ^  r#   r+  c                 C   s   t dd | D rt}n0| d jd }| d jd }| D ]}||jd 7 }||jd kr.|nd}q|dkr:t||nt}td| |S )Nc                 s       | ]}|j  V  qd S r   rS   r4   .0rY   r   r   r   	<genexpr>`      z#concatenate_cols.<locals>.<genexpr>r   r   r   concatenate_colsanyr;   rS   rH   r_   rX   rS   r   r   rY   r   r   r   r2  _  s   r2  c                 C   s   t dd | D rt}n4| d jd }| d jd }| dd  D ]}||jd 7 }||jd kr2|nd}q |dkr>t||nt}td| |S )Nc                 s   r,  r   r-  r.  r   r   r   r0  k  r1  zconcatenate.<locals>.<genexpr>r   r   r   concatenater3  r5  r   r   r   r6  j  s   r6  c                    sd   t dd  D rt}n t fddt dd d  dd d D r* d j}nt}td |S )Nc                 s   r,  r   r-  r.  r   r   r   r0  w  r1  z#affine_transform.<locals>.<genexpr>c                 3   s(    | ]\}}t || d  jkV  qdS )r   N)rW   rS   )r/  rF   rG   r)  r   r   r0  y  s   & r   r   r   affine_transform)r4  r;   allziprS   r_   )rX   rS   r   r)  r   r7  v  s   0r7  c                   C   r   r   )builder_numr   r   r   r   new_builder_num  r   r;  c                   @   s   e Zd Zdd Zdd Zdd Zddd	Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdddZdddZdS )_RNNBuilderc                 C   r   r   r   )r   fr   r   r   set_dropout  r   z_RNNBuilder.set_dropoutc                 C   r   r   r   r%   r   r   r   disable_dropout  r   z_RNNBuilder.disable_dropoutc                 C   s   t  | _t | _d S r   )rL   rM   rK   r;  builder_versionr%   r   r   r   	new_graph  s   
z_RNNBuilder.new_graphNc                 C   rI   NzLUsing stale builder. Create .new_graph() after computation graph is renewed.rJ   )r   esr   r   r   start_new_sequence  rQ   z_RNNBuilder.start_new_sequencec                 C   s8   t | | jt krtdt| j| j|	 S rB  
rP   rK   rL   rM   rN   ru   
from_cexprthisptr	add_inputr  )r   r   r   r   r   rH    s   z_RNNBuilder.add_inputc                 C   s:   t | | jt krtdt| j| j||	 S rB  rE  )r   prevr   r   r   r   add_input_to_prev  s   z_RNNBuilder.add_input_to_prevc                 C   s$   | j t krtd| j  d S rB  )rK   rL   rM   rN   rG  rewind_one_stepr%   r   r   r   rK    s   z_RNNBuilder.rewind_one_stepc                 C   s*   | j t krtdt| j | j S rB  )rK   rL   rM   rN   ru   rF  rG  backr%   r   r   r   rL    s   z_RNNBuilder.backc                 C   F   | j t krtdg }| j }|D ]}|t| j | q|S rB  )	rK   rL   rM   rN   rG  final_hr   ru   rF  r   rescexpscexpr   r   r   rN       
z_RNNBuilder.final_hc                 C   rM  rB  )	rK   rL   rM   rN   rG  final_sr   ru   rF  rO  r   r   r   rT    rS  z_RNNBuilder.final_sc                 C   H   | j t krtdg }| j|}|D ]}|t| j | q|S rB  )	rK   rL   rM   rN   rG  get_hr   ru   rF  r   r   rP  rQ  rR  r   r   r   rV       z_RNNBuilder.get_hc                 C   rU  rB  )	rK   rL   rM   rN   rG  get_sr   ru   rF  rW  r   r   r   rY    rX  z_RNNBuilder.get_sc                 C   sN   | j d u s| jt kr$|   |d ur| | n|   t| d| _ | j S r   )_init_staterK   rL   rM   rA  rD  RNNState)r   vecsr   r   r   initial_state  s   z_RNNBuilder.initial_statec                 C   s|   | j d u s| jt kr;|   |d ur1g }|D ]}tt|}|| || q| 	| n| 	  t
| d| _ | j S r   )rZ  rK   rL   rM   rA  r   rB   r   r   rD  r[  )r   r\  rC  r   r   r   r   r   initial_state_from_raw_vectors  s   
z*_RNNBuilder.initial_state_from_raw_vectorsr   )r   r	   r
   r>  r?  rA  rD  rH  rJ  rK  rL  rN  rT  rV  rY  r]  r^  r   r   r   r   r<    s    
			
	
r<  c                   @      e Zd Zdd Zdd ZdS )SimpleRNNBuilderc                 C   0   d| _ || _|| _|| _|| _d | _t | _d S r   rK   layers	input_dim
hidden_dimmodelrZ  r;  r@  r   rc  rd  re  rf  r   r   r   r        zSimpleRNNBuilder.__init__c                 C   r0   )Nr`  r   r%   r   r   r   whoami  r   zSimpleRNNBuilder.whoamiNr   r	   r
   r   ri  r   r   r   r   r`        r`  c                   @   r_  )
GRUBuilderc                 C   ra  r   rb  rg  r   r   r   r     rh  zGRUBuilder.__init__c                 C   r0   )Nrl  r   r%   r   r   r   ri    r   zGRUBuilder.whoamiNrj  r   r   r   r   rl    rk  rl  c                   @   r_  )LSTMBuilderc                 C   ra  r   rb  rg  r   r   r   r     rh  zLSTMBuilder.__init__c                 C   r0   )Nrm  r   r%   r   r   r   ri    r   zLSTMBuilder.whoamiNrj  r   r   r   r   rm    rk  rm  c                   @   r_  )FastLSTMBuilderc                 C   ra  r   rb  rg  r   r   r   r     rh  zFastLSTMBuilder.__init__c                 C   r0   )Nrn  r   r%   r   r   r   ri    r   zFastLSTMBuilder.whoamiNrj  r   r   r   r   rn    rk  rn  c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )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           	      C   s   |dksJ |d dksJ g | _ |d||d |}|d||d |}| j ||f t|d D ]}|d||d |}|d||d |}| j ||f q1dS )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_layersrd  re  rf  rnn_builder_factoryr=  rG   _r   r   r   r     s   zBiRNNBuilder.__init__c                 C   r0   )Nro  r   r%   r   r   r   ri  +  r   zBiRNNBuilder.whoamic                 C   s(   | j D ]\}}|| || qd S r   )rp  r>  )r   r   fbbbr   r   r   r>  -  s   
zBiRNNBuilder.set_dropoutc                 C   s$   | j D ]\}}|  |  qd S r   )rp  r?  )r   ru  rv  r   r   r   r?  1  s   
zBiRNNBuilder.disable_dropoutc                 C   s   |D ]}t | q| jdd D ] \}}| |}| t|}dd t|t|D }q| jd \}}| |}| t|}dd t|t|D S )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   c                 S      g | ]
\}}t ||gqS r   r6  r/  r=  rG   r   r   r   
<listcomp>N  r   z+BiRNNBuilder.add_inputs.<locals>.<listcomp>c                 S   s   g | ]\}}||fqS r   r   ry  r   r   r   rz  R  r   )rP   rp  r]  	transducereversedr9  
add_inputsr   rC  r   ru  rv  fsbsr   r   r   r}  6  s   
zBiRNNBuilder.add_inputsc                 C   s^   |D ]}t | q| jD ] \}}| |}| t|}dd t|t|D }q|S )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. 
        c                 S   rw  r   rx  ry  r   r   r   rz  m  r   z*BiRNNBuilder.transduce.<locals>.<listcomp>)rP   rp  r]  r{  r|  r9  r~  r   r   r   r{  T  s   
zBiRNNBuilder.transduceN)
r   r	   r
   __doc__r   ri  r>  r?  r}  r{  r   r   r   r   ro    s    ro  c                   @   sN   e Zd ZdddZdd Zdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dS )r[  r   Nc                 C   s   || _ || _|| _|| _d S r   )builder	state_idx_prev_out)r   r  r  
prev_stateoutr   r   r   r   q  s   
zRNNState.__init__c                 C   s   t | jj}|j|kr|jnt|j|}| j }|dr'|d td  }td|||| jj	| j
d gt | jjd}t| j| j
d | |}|S )NBuilderr[  r   r   )rH   r  rd  rS   r5   ri  endswithrB   r_   r@  r  re  r[  )r   rY   rd  rnn_typeoutput_e	new_stater   r   r   rH  w  s   
*zRNNState.add_inputc                 C   s>   | j d u r
t | j_g }| }|D ]}||}|| q|S r   )r  r;  r  r@  rH  r   r   rX   statescurrY   r   r   r   r}    s   


zRNNState.add_inputsc                 C   s   dd |  |D S )Nc                 S      g | ]}|  qS r   )outputr.  r   r   r   rz    rl   z&RNNState.transduce.<locals>.<listcomp>)r}  )r   rX   r   r   r   r{    s   zRNNState.transducec                 C   r{   r   )r  r%   r   r   r   r    rz   zRNNState.outputc                 C   r{   r   )r  r%   r   r   r   rI    rz   zRNNState.prevc                 C   r{   r   )r  r%   r   r   r   rG     rz   z
RNNState.bc                 C   r{   r   )r  r%   r   r   r   get_state_idx  rz   zRNNState.get_state_idx)r   NN)r   r	   r
   r   rH  r}  r{  r  rI  rG   r  r   r   r   r   r[  p  s    
	
r[  c                   @   sF   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )StackedRNNStateNc                 C   r6   r   )r  rI  )r   r  rI  r   r   r   r     r:   zStackedRNNState.__init__c                 C   s6   g }| j D ]}||| |d  }qt|| S r   )r  r   rH  r  r  )r   rY   next_statesr   r   r   r   rH    s
   

zStackedRNNState.add_inputc                 C   s   | j d  S r   )r  r  r%   r   r   r   r    s    zStackedRNNState.outputc                 C   r{   r   )rI  r%   r   r   r   rI    rz   zStackedRNNState.prevc                 C      dd | j D S )Nc                 S   r  r   )hr/  r   r   r   r   rz    rl   z%StackedRNNState.h.<locals>.<listcomp>r  r%   r   r   r   r    r#   zStackedRNNState.hc                 C   r  )Nc                 S   r  r   r   r  r   r   r   rz    rl   z%StackedRNNState.s.<locals>.<listcomp>r  r%   r   r   r   r     r#   zStackedRNNState.sc                 C   s*   g }| }|D ]}| |}|| q|S )zz
        returns the list of states obtained by adding the given inputs
        to the current state, one by one.
        )rH  r   r  r   r   r   r}    s   
zStackedRNNState.add_inputsr   )
r   r	   r
   r   rH  r  rI  r  r   r}  r   r   r   r   r    s    
r  c                   @   s8   e Zd ZdddZdddZdd Zdd	 Zd
d ZdS )Trainerr   c                 C   r   r   r   )r   r   r   r   r   r     r   zTrainer.updatec                 C   r   r   r   )r   rr   r   r   update_epoch  r   zTrainer.update_epochc                 C   r   r   r   r%   r   r   r   status  r   zTrainer.statusc                 C   r   r   r   )r   thrr   r   r   set_clip_threshold  r   zTrainer.set_clip_thresholdc                 C   r   r   r   r%   r   r   r   get_clip_threshold  r   zTrainer.get_clip_thresholdNr   )r   r	   r
   r   r  r  r  r  r   r   r   r   r    s    

r  c                   @   s   e Zd ZdZdddZdS )SimpleSGDTrainerz#
    This object is very cool!
    皙?c                 G   r   r   r   )r   r   e0rw   r   r   r   r     r   zSimpleSGDTrainer.__init__N)r  )r   r	   r
   r  r   r   r   r   r   r    s    r  c                   @      e Zd ZdddZdS )MomentumSGDTrainer{Gz??c                 G   r   r   r   )r   r   r  momrw   r   r   r   r     r   zMomentumSGDTrainer.__init__N)r  r  r   r	   r
   r   r   r   r   r   r        r  c                   @   r  )AdagradTrainerr  #B;c                 G   r   r   r   )r   r   r  epsrw   r   r   r   r     r   zAdagradTrainer.__init__N)r  r  r  r   r   r   r   r    r  r  c                   @   r  )AdadeltaTrainerư>ffffff?c                 G   r   r   r   )r   r   r  rhorw   r   r   r   r     r   zAdadeltaTrainer.__init__N)r  r  r  r   r   r   r   r    r  r  c                   @   s   e Zd ZdddZdS )	AdamTrainerMbP?r  +?:0yE>c                 G   r   r   r   )r   r   alphabeta_1beta_2r  rw   r   r   r   r     r   zAdamTrainer.__init__N)r  r  r  r  r  r   r   r   r   r    r  r  c                   @   r   )InitializerNr   r   r   r   r   r    r   r  c                   @   r  )NormalInitializerr   r   c                 C   r   r   r   )r   meanvarr   r   r   r     r   zNormalInitializer.__init__N)r   r   r  r   r   r   r   r    r  r  c                   @      e Zd Zdd ZdS )UniformInitializerc                 C   r   r   r   )r   r   r   r   r   r     r   zUniformInitializer.__init__Nr  r   r   r   r   r        r  c                   @   r  )ConstInitializerc                 C   r   r   r   )r   r  r   r   r   r     r   zConstInitializer.__init__Nr  r   r   r   r   r    r  r  c                   @   s   e Zd ZdddZdS )GlorotInitializerFc                 C   r   r   r   )r   	is_lookupr   r   r   r     r   zGlorotInitializer.__init__Nr   r  r   r   r   r   r    r  r  c                   @   r  )FromFileInitializerc                 C   r   r   r   r   r   r   r   r     r   zFromFileInitializer.__init__Nr  r   r   r   r   r    r  r  c                   @   r  )NumpyInitializerc                 C   r   r   r   )r   arrayr   r   r   r     r   zNumpyInitializer.__init__Nr  r   r   r   r   r    r  r  c                 C   sn   |   rt| S | jr!| d dkrd| d  S d| d | d f S | d dkr-d| d  S d| d | d f S )Nr   z{%s}r   z{%s,%s}z{{%s}}z	{{%s,%s}})r4   rC   r   )e_dimr   r   r   	shape_str  s   r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )GVNodec	           	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S r   )rv   rd  label
output_dimchildrenfeatures	node_type	expr_name)	r   rv   rd  r  r  r  r  r  r  r   r   r   r     s   
zGVNode.__init__c              	   C   s(   t | j| j| j| j| j| j| j| jgS r   )	r$   rv   rd  r  r  r  r  r  r  r%   r   r   r   r&     r   zGVNode.__iter__c                 C   s   dd tt|  S )Nz
GVNode(%s)r~   )r   r   rC   r%   r   r   r   r<     rl   zGVNode.__repr__c                 C   r=   r   r>   r%   r   r   r   r'     r@   zGVNode.__str__c                 C   s   t | t |k S r   )idr)   r   r   r   __lt__  r#   zGVNode.__lt__N)r   r	   r
   r   r&   r<   r'   r  r   r   r   r   r    s    	r  c           )         s6  t  }t }|rtD ]}||v r|| ||j< q
t fdd dd }tD ]q}|j}|j}|j}	|j}
d}t  }d}|dkrG|	\}g }na|dkrR|	\}g }nV|d	kr^|	\}}g }nJ|d
krj|	\}}g }n>|dkr|	\}g }| r}||v r}|| }d}n'|dkr|	\}g }| r||v r|| }d}n|dkr|	\}}}|j\}||v r|| }nd}d}|r||v r|| }||v rd|| | f }| r|dur|}n|durd||f }nd| }g }n||jd|j g}|dur|	| |d }|
d| d| |r
dndg n|dkrT|	\}}}}} | }|dr.|dtd   d|||f }| sG|j} || d|  }!|!g}ng }|||j d}nTg }|	D ]O}t|tr}| ss|j} || d|  }!|	|! |||j qXt|tr| rtddd| }!|!dkrt|}!|	|! qX|	t| qX| rdd d!d"dd!d"d d#d$d%d&d'||}|rd(|d)|f }"n|}"n|d*kr|\}#}$d+|#|$f }"nr|d,kr|\}#}$d-|#|$f }"nb|d.kr|\}#}$d/|#|$f }"nR|d0kr|\}#}$d1|#|$f }"nB|d2kr|\}#d3|# }"n5|d4kr?|d }"td5t|d6D ]} |"d7t|| | d6   7 }"q,n|durNd(|d)|f }"n|}"||}| sad||d|  nd}%|"}&| snd8|%|&f }&d}'| r|r||v r|| |kr|| nd}(|t|||&|
t||'||( q&|S )9aU  
  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                      s   t t td S )NA)chrrB   ordr   rnn_bldr_namer   r   <lambda>  rl   z$make_network_graph.<locals>.<lambda>c                 S   s   dd| f S )Nz%s%sNr   )vidxr   r   r   vidx2str  r   z$make_network_graph.<locals>.vidx2strN	2_regularr   r   r   r   r   1_paramr   r   z\"%s\"z%s[%s]z
lookup(%s)zv%dr   z%sr   fixedr[  r  z%s-%s-%s3_rnn_statez0+$ z%.3fz0.+-*/catsummaxmin)r]   subrb   divrn   rp   rs   rj   r6  r'  r+  eminz%s(%s)r~   r]   z%s + %sr  z%s - %srb   z%s * %sr  z%s / %sre   z-%sr7  r   r   z + %s*%sz%s = %s)r   dictr   rx   r   rv   rw   rS   getr   extendr  rB   r]   r(   ru   rE   rer  rC   r   rq  rA   r  	frozenset))compactexpression_nameslookup_namesnodesvar_name_dictr   r  r  f_namerw   r  rd  r  r  _dimarg_strs_v_d1_d2_dr   idxr   rv   	item_name
param_name
vocab_sizearg	bldr_typebldr_numr  rnn_namer   r   str_reprrF   rG   var_namer  r  r  r   r  r   make_network_graph  s   




$









 
0"r  c                 C   s.   g }|D ]} | j D ]
}| |j v r|j q	q|S r   )r  r   )r  r  psr  r   r   r   
parents_of  s   

r  c                    s  dd | D  g }t  }g }tt}i }tt}t  }t }	| D ]3}
|
jD ]} | jdkr9| | j |
j q%|
jdkrS||
 t fdd|
jD ||
j< q |D ]}
||
j \}||
j \}|||f |
 qV| D ]\\}}}tdd |D }tdd |D }t	|dkrt	|dkrt	|dkr|\}|\}d	
d
d t|D }d
dd t|D }|sd | j|f }t|d d |d }t||||t|gd	d | j}|D ]}
|j||
j< |	|
j q|j||< | | |	| qr| D ]9\}}}}}}}}||	vr?g }|D ]}||v r*|| }||v s!|| q|t|||||||| q||fS )Nc                 S   s   i | ]}|j |qS r   rv   r/  r  r   r   r   
<dictcomp>  rl   z)collapse_birnn_states.<locals>.<dictcomp>r  c                 3   s    | ]} | j V  qd S r   r  )r/  r  	node_infor   r   r0    r1  z(collapse_birnn_states.<locals>.<genexpr>c                 s       | ]}|j V  qd S r   )rd  r	  r   r   r   r0        c                 s   r  r   )r  r	  r   r   r   r0    r  r   r  c                 s   r  r   r  r	  r   r   r   r0    r  z\nc                 s   r  r   )r  r	  r   r   r   r0    r  %s\n%sr   r   )r  r   r   r  r  rv   r]   r   	iteritemsrB   r   sortedr  rH   r  r  r  )r  r  	new_nodeschildren_forwardsrnn_state_nodesrnn_parentsrnn_childrenshared_rnn_states
rnn_groupsnodes_to_deleter  r  in_eout_ens
input_dimsoutput_dimsrd  r  new_rnn_group_state_namenew_rnn_group_state_labelcat_output_dimnew_rnn_group_staterv   r  r  r  r  r  new_childrenr   r  r   collapse_birnn_states  sh   


*"





r$  c                 C   sl  t | ||}|}t }|rt|| \}}|| td td | s'td tt}	|D ]}
|	|
j |
j	 q-t
|	D ]}dddd| }td| d	|	|  q=|D ]Z}
|
j}|r|
jd urid
|
j|f }d
t|
j|f }|
jd urd
|t|
jf }|
j s|
jd ur|
j r|
 jd7  _td|
j	||
jf  |
jD ]}td||
j	f  qqVg }td}|D ]+}
|
jdkr||
j}|d usJ d|
j|
f | \}}||t||
j	f qt
|}t }t||dd  D ])\\}}}\}}}||kr|d |kr|||}|||}|||f q|D ]\}}td||f  q"td d S )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  %s [label="%s"] %s;z  %s -> %s;z[^-]+-(.)-(\d+)r  zrnn_state_re.search(%s); %sr   z  %s -> %s [style=dotted];})r  r  r$  r   printr   r   r  r]   rv   r  r   r  r  r  r  rd  r4   r  r  r  compilesearchgroupsr   rD   r9  r  )r  	show_dimsr  r  collapse_birnnsoriginal_nodesr  collapse_tobirnn_collapse_to
node_typesr  r  styler  r  
rnn_statesrnn_state_rer   r  r  edges
rnn_name_pstate_idx_pname_p
rnn_name_nstate_idx_nname_ngroup_name_pgroup_name_nr   r   r   print_graphviz  sn   





&
r=  r   r3   r   )r   T)T)r   r   r   r  )r   )r  )r   )FTNNF)
__future__r   sysr  collectionsr   version_infomajorr   itemsr  rangerq  r   r   r   r   objectr   r5   r;   rH   rP   rT   rV   rW   r[   r`   rc   rg   rk   ro   rq   rt   ru   r_   r   r   rK   r   ry   r   rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rs   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  r  r  r  r   r"  r$  r%  r'  r*  r+  r2  r6  r7  r:  r;  r<  r`  rl  rm  rn  ro  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   <module>   s   

9







	





Z


_$" /3