o
    iO                     @   sb   d Z ddlZej rddlmZ ddejdefddZd	ejfd
dZ	ddejdefddZ
dS )zTorch utility module.    N)ReduceOpFweightdistributedc                    s     dksJ  t| ttfr!t|  fdd| D S t| tr2 fdd|  D S t| tj	ra|   ksJJ |   f| | j
  }  r_tjj| tjd | S | d u rgd S tt| )N   c                 3   s    | ]	}t | V  qd S Nrecursive_sum.0vr   r    T/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/torch_utils/recursive_op.py	<genexpr>   s    z recursive_sum.<locals>.<genexpr>c                    s   i | ]\}}|t | qS r   r   r
   kr   r   r   r   
<dictcomp>   s    z!recursive_sum.<locals>.<dictcomp>op)dimsize
isinstancetuplelisttypedictitemstorchTensordtypesumr   
all_reducer   SUM
ValueErrorobjr   r   r   r   r   r      s   
$r   bc                    s   t | ttfrt|  fdd| D S t | tr$ fdd|  D S t | tjrD|    ks<J |    f|  | j	 S | d u rJd S t
t| )Nc                 3   s    | ]}t | V  qd S r   recursive_divider	   r&   r   r   r      s    z#recursive_divide.<locals>.<genexpr>c                    s   i | ]
\}}|t | qS r   r'   r   r)   r   r   r      s    z$recursive_divide.<locals>.<dictcomp>)r   r   r   r   r   r   r   r   r   r   r#   )ar&   r   r)   r   r(      s   
$r(   c                 C   s<   t | ||} | }|rtjj|tjd t| |} | |fS )Nr   )r   r    r   r   r!   r   r"   r(   r$   r   r   r   recursive_average(   s   
r+   )F)__doc__r   r   is_availabletorch.distributedr   r   boolr   r(   r+   r   r   r   r   <module>   s    
