a
    hlO                     @   sn  d dl Z d dlmZ ddlmZ ddlmZ ddlm	Z	mZ ej
Z
d dlZd dlmZ eejZdd	 Zd
d Zdd Zdd Zdd Zdd Zd9ddZdd ZG dd dZG dd deeZG dd deeZi Zeefdd Zd!d" Z d#d$ Z!d%d& Z"e# Z$d'd( Z%d)d* Z&d:d-d.Z'd/d0 Z(e)dZ*e j+j,Z-G d1d2 d2Z.d3d4 Z/d;d5d6Z0e j+j1Z2d<d7d8Z1dS )=    Ndim   )op_properties)_enable_layers)tree_flattentree_map)reducec                 C   s   t tj| dS Nr   )r	   operatormul)x r   S/var/www/html/assistant/venv/lib/python3.9/site-packages/functorch/dim/reference.pyprod   s    r   c                 C   s>   ddl m} t| |r&|r"J d| S | dkr6| | S | S d S )Nr   Dimz8cannot preserve first-class dimensions with keepdim=Truer    r   
isinstance)dNkeepdimr   r   r   r   	_wrap_dim   s    
r   c                    sV   ddl m} t| |tfr,tt|  fS |r>J d|  t fdd| D S )Nr   r   z.expected a single dimension or int but found: c                 3   s   | ]}t | V  qd S N)r   ).0r   r   r   r   r   	<genexpr>/       z_dims.<locals>.<genexpr>)r   r   r   intltupler   )r   r   r   
single_dimr   r   r   r   _dims)   s
    r"   c              	   C   s   ddl m} tdd t|D }t|dkr|d \}}tdd |D }| | dkr~tdd |D }|d|  d	| | | }	|	|_nnt|dkrtd
d |D }|d| d| n:tdd |D }
| |
kr|d|  d|
 d| d| d S )Nr   )DimensionMismatchErrorc                 s   s    | ]\}}|j s||fV  qd S r   )is_bound)r   irr   r   r   r   5   r   z%_bind_dims_to_size.<locals>.<genexpr>r   c                 s   s   | ]}|j r|jV  qd S r   )r$   sizer   r&   r   r   r   r   8   r   c                 s   s"   | ]}|j sd nt|jV  qdS ?Nr$   strr'   r(   r   r   r   r   :   r   z>inferred dimension does not evenly fit into larger dimension:  vs c                 s   s"   | ]}|j sd nt|jV  qdS r)   r+   r(   r   r   r   r   A   r   z1cannot infer the size of two dimensions at once: z with sizes c                 s   s   | ]}|j V  qd S r   r'   r(   r   r   r   r   F   r   z!Dimension sizes to do not match (z != z) when matching z to )r   r#   tuple	enumeratelenr   r'   )Zlhs_sizerhsZ	lhs_debugr#   Z	not_boundidxr   Z
rhs_so_farZrhs_snew_sizeZrhs_sizer   r   r   _bind_dims_to_size2   s,    r5   c                 C   sF   ddl m} t| |r*| jt| j| jfS | tt| j ddfS d S )Nr   _Tensorr   T)	r   r7   r   _tensorllist_levels_has_devicerangendim)inpr7   r   r   r   _tensor_levelsM   s    
r?   c           	   	   C   s   g }g }d}|   }|D ]L}z&||}|| |||  W q tyb   |d d}Y q0 q|ttt|kr| j| } |r| j| } | S )NFr   T)	r'   indexappend
ValueErrorlistr<   r1   permuteview)	vZfrom_levelsZ	to_levelsrE   rD   requires_viewr'   tr3   r   r   r   _match_levelsV   s"    




rI   Fc           	      C   s   ddl m} | jt| j }}z||}W n@ tyl   |s@ d}|j|jg| R  }|	dd Y n0 d}t
|D ]*}t|| trz||  d8  < |d7 }qz| d ||< |||| j|fS )Nr   )Tensorr   )r   rJ   r8   r9   r:   r@   rB   expandr'   insertr<   r   r   from_positionalr;   )	selfr   
expand_dimrJ   ptensorlevelsr3   Zidx_batchedr%   r   r   r   _positional_no_permutem   s"    
rR   c                 C   sB   ddl m} t| |t||kr$dS t| |r6| |u S | |kS d S )Nr   r   Fr   )abr   r   r   r   seq   s    
rU   c                   @   s    e Zd ZdZdd Zdd ZdS )isinr   c                 C   s   | D ]}t ||r dS qdS )NTF)rU   )rN   itemr   r   r   r   __contains__   s    
zisin.__contains__c                 C   s,   t | D ]\}}t||r|  S qtd S r   )r0   rU   rB   )rN   rW   r%   r   r   r   r   r@      s    

z
isin.indexN)__name__
__module____qualname__	__slots__rX   r@   r   r   r   r   rV      s   rV   c                   @   s   e Zd ZdZdS )r9   r   NrY   rZ   r[   r\   r   r   r   r   r9      s   r9   c                   @   s   e Zd ZdZdS )r    r   Nr]   r   r   r   r   r       s   r    c                    sD  ddl mm m ddlm} |tjju rf|\}}t|rft|rf|j	dkrf|j	dkrf|||S t
 }t||f\}	}
d |	D ]8}t|r|jr|j|jD ]}||vr|| qqfdd|tv rt
 g }t|	D ]\}}t|rt|\}}}t|r4|js4d ur4|jjd}||	|< |D ]}|vr@| q@|||f q|D ]\}}t|	| ||	|< qp|
|	\}}||i |} fdd	}t||S  fd
d	}t|P td|  |
fdd|	D \}}||i |}t||W  d    S 1 s60    Y  d S )Nr   )r7   rJ   
TensorLike)DelayedMulTensorr   c                    s4   t |  r0| j}d ur,| js,|jjd}|S | S )Ndevice)r   _batchtensorr;   tora   )rH   r&   )r7   device_holding_tensorr   r   unwrap   s    
z"__torch_function__.<locals>.unwrapr`   c                    s    t | r | d uS | S r   )r   rM   rH   )rJ   r^   rd   result_levelsr   r   wrap   s
    

z __torch_function__.<locals>.wrapc                    s   t | r | d uS | S r   )r   from_batchedrf   )rJ   r^   rd   r   r   rh      s    
zbatch_tensor for c                 3   s   | ]} |V  qd S r   r   )r   f)re   r   r   r      r   z%__torch_function__.<locals>.<genexpr>)r   r7   rJ   r^   Zdelayed_mul_tensorr_   torch__mul__r   r=   r9   r   r;   rb   dimsrA   	pointwiser0   r?   rc   ra   rI   r   r   print)rN   origclsargskwargsr_   lhsr2   Zall_dimsZ	flat_argsZ	unflattenrj   r   	to_expandr%   rP   rQ   _lresultrh   r   )rJ   r^   r7   rd   rg   re   r   __torch_function__   sl    







ry   c                 G   s  ddl m}m}m} | jt| j }}t }g }d}	| j}
|D ]}t|t	rl|
| |
dd |D  q>t||r|| ||j q>t|trt||
d}|| ||| q>|
| |tdd |D  d}	q>ttt|}t|D ]\}}z||}W n> tyT } z$|d| j d	| |W Y d }~n
d }~0 0 || }||= ||= ||d
 ||| q |j| }d
}tt|d ddD ](}t|| tr|d7 }| ||< q|||| j}|	r|jg || t|d  R  }|S )Nr   )r   DimensionBindErrorrJ   Fc                 s   s   | ]}|j V  qd S r   r.   r   er   r   r   r     r   zpositional.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r   r.   r{   r   r   r   r     r   Tztensor of dimensions z does not contain dim r   )r   r   rz   rJ   r8   r9   r:   r=   r   DimListextendrA   r'   r   r   r   rC   r<   r1   r0   r@   rB   rm   rL   rD   rM   r;   Zreshape)rN   rm   r   rz   rJ   rP   rQ   Z	flat_dimsrE   Z
needs_viewr=   r   rD   r%   r3   r|   pseenrx   r   r   r   
positional   sZ    







$r   c                 C   s*   ddl m} | D ]}t||r dS qd S )Nr   r   Tr   )inputr   r%   r   r   r   _contains_dim(  s    
r   c                 G   sR   t |s"| tjjd | g|R S |}dd |D dg| j  }| j| } | | S )Nc                 S   s   g | ]
}|j qS r   r.   r   r   r   r   r   
<listcomp>4  r   zexpand.<locals>.<listcomp>r}   )r   ry   rk   rJ   rK   r=   )rN   sizesrm   r   r   r   rK   0  s    
rK   c                 C   s    t ||kr|| S || |S r   )r1   get)nameoffsetrr   rs   defaultr   r   r   _getarg<  s    r   c                 C   s"   t ||kr|||< n||| < d S r   )r1   )r   r   rr   rs   valuer   r   r   	_patchargB  s    
r   r   Tc              	      s4   ddl m mm  f	dd}|S )Nr   )r   rJ   r^   c           	         s  t ||t}|tu s&rt|stj@ td
  
jg|R i |jW  d    S 1 sv0    Y  rt d	||dnd}j	t
j }t|jj|}tfdd|D   r| s fddtD nt dkr d	  t|}t||  fd
d}t> td
  
|g|R i |}t||W  d    S 1 s0    Y  d S )Nzdim fallback batch_tensor for r   Fc                 3   s   | ]}  |V  qd S r   r@   r   )rQ   r   r   r   [  r   z$_wrap.<locals>.fn.<locals>.<genexpr>c                    s   g | ]\}}| vr|qS r   r   )r   r%   rw   )dim_indicesr   r   r   ]  r   z%_wrap.<locals>.fn.<locals>.<listcomp>r   r   c                    s   t | r | jS | S r   )r   rM   r;   rf   )rJ   r^   
new_levelsrN   r   r   rh   h  s    
z_wrap.<locals>.fn.<locals>.wrapzdim used batch_tensor for )r   _not_presentr   r   rm   ro   ri   rb   r;   r8   r9   r:   r"   r=   r/   r0   r1   rC   r   r   )	rN   rr   rs   r   r   rH   rm   rh   r&   	r   rJ   r^   dim_name
dim_offsetkeepdim_offsetrp   r	   r!   )r   rQ   r   rN   r   fnN  s4    "
z_wrap.<locals>.fn)r   r   rJ   r^   )rp   r   r   r   r!   r	   r   r   r   r   _wrapI  s    $r   c                 O   s:   ddl m} ttj| }t|| t|g|R i | d S )Nr   r6   )r   r7   getattrrk   rJ   setattrr   )r   rr   rs   r7   rp   r   r   r   _defu  s    r   c                   @   s*   e Zd ZddddZdd Zdd ZdS )	dim_trackerN)returnc                 C   s   t  | _g | _d S r   )r9   rm   count)rN   r   r   r   __init__  s    zdim_tracker.__init__c                 C   s&   || j vr"| j | | jd d S r
   )rm   rA   r   rN   r   r   r   r   record  s    
zdim_tracker.recordc                 C   s   | j | j| S r   )r   rm   r@   r   r   r   r   __getitem__  s    zdim_tracker.__getitem__)rY   rZ   r[   r   r   r   r   r   r   r   r     s   r   c           *         s   ddl m m}m}m}m}m} t|| oPt|tt	f oPt||oN|j
dk }|r|t|  rr td | |fS t| |S t|ts|g}nt	|}d}d }	g }
t|D ]\}}|du st||r|js|	d urd| d|	 }|||}	t||r||jrt|nd7 }|
| q|d ur|dur|d7 }q| j
}||kr^td| d| d	|	d ur|| }||	 }|du rtg| ||	|	d < n
|| t|
D ]}|| |||d < qd}d
}|  }g }t  fdd}||  g }t|D ]\}}|d u r.t||< |d d}n|| }t||r^||_| || nt|tt	fr|rt|d |r|D ]}| qt||d|  |dd |D  d}|| n|| || |d7 }q|r| j| } t|D ]}|| |||d < qt|  rf| jt	| j }}t|fdd|D }| j}d}n| | }}|j
t| }d}g }g }d } i }!d
}"t|D ]\}}#t|#|rԈ|# dkrt||< ||# npt|#|r6d}"| d u rt|} t|#\}$}}%||!|< |$||< |D ]}&|&|vr||& qnd}"|d q| d ur^||| | < |!  D ]\}}t!|| ||||< qf|"rt||}'n|}'d}(|dkr|dg|  tt|D ]*\}})t|)t"r|(|d| < |(d8 }(q|#|'||S )Nr   )r7   r   rz   r~   rJ   r^   r   .z\at most one ... or unbound dimension list can exist in indexing list but found 2 at offsets z and z	at least z/ indices were supplied but the tensor only has z dimensions.Fc                    s(   t |  sd S | jD ]}| qd S r   )r   rm   r   )rH   r   )r7   	dims_seenr   r   add_dims  s    

zt__getitem__.<locals>.add_dimsTzoffset c                 s   s   | ]}|j V  qd S r   r.   r   r   r   r   r     r   zt__getitem__.<locals>.<genexpr>c                    s"   g | ]}t |trt n|qS r   )r   r   next)r   rw   )input_itr   r   r     r   z t__getitem__.<locals>.<listcomp>r}   )$r   r7   r   rz   r~   rJ   r^   r   r/   rC   r=   ry   _orig_getitemr0   r$   r1   rA   
IndexErrorno_sliceZbind_lenreversedr'   r   r   r5   r   rE   r8   r:   iterr;   r?   itemsrI   r   rM   )*rN   r   r   rz   r~   rJ   r^   Z	is_simpleZdims_indexedZexpanding_objectZdimlistsr%   smsgr=   Zexpanding_ndimsobjrG   r'   Z
view_sizesr   Z	dim_packsr3   szr   Zptensor_selfrQ   Zflat_inputsZ
has_deviceZto_padrg   Zindex_levelsZtensor_insert_pointru   Zrequires_getindexr>   rP   rv   rw   rx   Znext_positionalr&   r   )r7   r   r   r   t__getitem__  s     










&






r   c           
      C   s   t |tr t| ||||S d }|d ur>t||dd\}}g }| D ]B}t||dd\}}|d urz||krz|||}n|}|| qFtj|||d}	|	||d f||fS )NT)rO   )outr   )r   r   rk   stackr@   rR   Zmove_dimrA   )
ZtensorsZnew_dimr   r   r@   ZptensorsrH   ptpiprr   r   r   r   B  s    
r   c              	      s  ddl m}m} t|ts,tdd |D rLt |r>tdt| | dS t |r|t| |snJ d  t|  \}  | 	 }d}g }g }t
|D ]:\}	}
|
jr||
j	 ||
j	7 }q|d ||	 q|rL||ksJ d	| d
| d| d|| }| t|  }|D ]*}t||}||| _	|||< ||8 }qn&||ksrJ d| d
| d| dt fddt|t| | dD S )Nr   )r7   r   c                 s   s   | ]}t |tV  qd S r   )r   r   )r   rH   r   r   r   r   Z  s   zsplit.<locals>.<genexpr>zKwhen dim is specified as a Dim object, split sizes must also be dimensions.r   zTensor does not have dimension r   z,result dimensions are larger than original: r-   z ()z)result dimensions do not match original: c                 3   s   | ]\}}|  |V  qd S r   r   )r   r   rH   r   r   r   r     s   )r   r7   r   r   r   anyrB   _orig_splitrR   r'   r0   r$   rA   r1   minr/   zip)rN   Zsplit_size_or_sectionsr   r7   r   r'   Ztotal_bound_sizeunboundr   r%   r   Zremaining_size
chunk_sizeur   r   r   r   splitW  sN    





r   )F)r   r   r   FT)r   N)r   )3rk   Zfunctorch._Cr   Z_Cr   r   Zbatch_tensorr   r   r   r~   r   	functoolsr	   setrn   r   r   r"   r5   r?   rI   rR   rU   rV   rC   r9   r/   r    Z
empty_dictclassmethodry   r   r   rK   objectr   r   r   r   r   slicer   rJ   r   r   r   r   r   r   r   r   r   r   r   <module>   sN   
		
N1	 
, 4
