U
    Kc"	                     @   sD   d dl Z ddlmZmZ ddlmZmZmZmZ G dd deZ	dS )    N   )_TensorTensor)_dims_enable_layersllistltuplec                       s`   e Zd Zdd Zedd Zedd Zedd Zed	d
 Ze fddZ	dd Z
  ZS )DelayedMulTensorc                 C   s8   || | _ | _d | _d | _|jp$|j| _d | _d | _d S N)_lhs_rhs_data_levels_data_has_device_batchtensor_data_tensor_data)selflhsrhs r   D/tmp/pip-unpacked-wheel-gikjz4vx/functorch/dim/delayed_mul_tensor.py__init__   s    zDelayedMulTensor.__init__c                 C   sF   | j d kr@t| jj}| jjD ]}||kr|| qt|| _ | j S r
   )r   r   r   _levelsr   appendr   )r   levelslr   r   r   r      s    

zDelayedMulTensor._levelsc              	   C   s@   | j d kr:t| j  td | jj| jj | _ W 5 Q R X | j S )Nzbt multiply fallback)r   r   r   printr   _batchtensorr   r   r   r   r   r      s
    
zDelayedMulTensor._batchtensorc                 C   s$   | j d krt| j| jj| _ | j S r
   )r   r   Zfrom_batchedr   r   _tensorr   r   r   r   r   %   s    
zDelayedMulTensor._tensorc                 C   s   | j jS r
   )r   ndimr   r   r   r   r    +   s    zDelayedMulTensor.ndimc                    s   t t jS r
   )r   superdimsr   	__class__r   r   r"   /   s    zDelayedMulTensor.dimsc           
   	      s   t |dddtd| j  fdd| jj| jj }}| jj| jj }}tfdd| jD }fdd	| jD }d
fdd|D dfdd|D dfdd|D }t	
|||f}	t|	|dS )Nr   Fac                    s   t  |  S r
   )chrindex)d)
all_levelsnr   r   to_char9   s    z%DelayedMulTensor.sum.<locals>.to_charc                 3   s   | ]}| kr|V  qd S r
   r   .0r(   r"   r   r   	<genexpr>=   s      z'DelayedMulTensor.sum.<locals>.<genexpr>c                    s   g | ]}| kr|qS r   r   )r-   r   r.   r   r   
<listcomp>>   s      z(DelayedMulTensor.sum.<locals>.<listcomp> c                 3   s   | ]} |V  qd S r
   r   r,   r+   r   r   r/   ?   s     ,c                 3   s   | ]} |V  qd S r
   r   r,   r2   r   r   r/   @   s     ->c                 3   s   | ]} |V  qd S r
   r   r,   r2   r   r   r/   A   s     T)r3   )r4   )r   ordr   r   r   r   tupler"   jointorchZeinsumr   Zfrom_positional)
r   ZdimZplhsZ	levelslhsZprhsZ	levelsrhsZnew_dimsZ
new_levelsfmtZresult_datar   )r)   r"   r*   r+   r   sum4   s       zDelayedMulTensor.sum)__name__
__module____qualname__r   propertyr   r   r   r    r"   r:   __classcell__r   r   r#   r   r	   
   s   
	


r	   )
r8   r1   r   r   	referencer   r   r   r   r	   r   r   r   r   <module>   s   