U
    zh	                     @   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   R/var/www/html/venv/lib/python3.8/site-packages/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   Z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!   3   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_char<   s    z%DelayedMulTensor.sum.<locals>.to_charc                 3   s   | ]}| kr|V  qd S r
   r   .0r'   r!   r   r   	<genexpr>A   s      z'DelayedMulTensor.sum.<locals>.<genexpr>c                    s   g | ]}| kr|qS r   r   )r,   r   r-   r   r   
<listcomp>B   s      z(DelayedMulTensor.sum.<locals>.<listcomp> c                 3   s   | ]} |V  qd S r
   r   r+   r*   r   r   r.   E   s     ,c                 3   s   | ]} |V  qd S r
   r   r+   r1   r   r   r.   G   s     ->c                 3   s   | ]} |V  qd S r
   r   r+   r1   r   r   r.   I   s     T)r2   )r3   )r   ordr   r   r   r   tupler!   jointorchZeinsumr   Zfrom_positional)
r   dimZplhsZ	levelslhsZprhsZ	levelsrhsZnew_dimsZ
new_levelsfmtZresult_datar   )r(   r!   r)   r*   r   sum7   s(      	zDelayedMulTensor.sum)__name__
__module____qualname__r   propertyr   r   r   r   r!   r:   __classcell__r   r   r"   r   r	      s   
	


r	   )
r7   r0   r   r   	referencer   r   r   r   r	   r   r   r   r   <module>   s   