U
    ªÊ¹j`O  ã                   @   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   úV/var/www/html/bwave/python/venv/lib/python3.8/site-packages/functorch/dim/reference.pyÚprod   s    r   c                 C   s>   ddl m} t| |ƒr&|r"tdƒ‚| S | dkr6| | S | S d S )Nr   ©ÚDimz8cannot preserve first-class dimensions with keepdim=Truer   )Ú r   Ú
isinstanceÚAssertionError)Ú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>t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>.   s     z_dims.<locals>.<genexpr>)r   r   r   ÚintÚltupler   r   )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rÂt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   4   s      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   7   s      c                 s   s"   | ]}|j sd nt|jƒV  qdS ©ú?N©r#   Ústrr&   r'   r   r   r   r   9   s     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   @   s     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   E   s     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_size1   s,    ÿÿÿr4   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   r6   r   Ú_tensorÚllistÚ_levelsÚ_has_deviceÚrangeÚndim)Úinpr6   r   r   r   Ú_tensor_levelsL   s    
r>   c           	   	   C   s˜   g }g }d}|   ¡ }|D ]N}z&| |¡}| |¡ | || ¡ W q tk
rd   | d¡ d}Y qX q|ttt|ƒƒƒkr†| j|Ž } |r”| j|Ž } | S )NFr   T)	r&   ÚindexÚappendÚ
ValueErrorÚlistr;   r0   ÚpermuteÚview)	ÚvZfrom_levelsZ	to_levelsrD   rC   Úrequires_viewr&   Útr2   r   r   r   Ú_match_levelsU   s"    




rH   Fc           	      C   sÈ   ddl m} | jt| jƒ }}z| |¡}W n@ tk
rl   |sB‚ d}|j|jf| ¡ žŽ }| 	dd¡ Y nX d}t
|ƒD ]*}t|| tƒrz||  d8  < |d7 }qz| d ||< | ||| j¡|fS )Nr   )ÚTensorr   )r   rI   r7   r8   r9   r?   rA   Úexpandr&   Úinsertr;   r   r   Úfrom_positionalr:   )	Úselfr   Ú
expand_dimrI   ÚptensorÚlevelsr2   Zidx_batchedr$   r   r   r   Ú_positional_no_permutel   s"    
rQ   c                 C   sB   ddl m} t| |ƒt||ƒkr$dS t| |ƒr6| |kS | |kS d S )Nr   r   F©r   r   r   )ÚaÚbr   r   r   r   Úseq�   s    
rU   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Úisinc                 C   s   | D ]}t ||ƒr dS qdS )NTF)rU   )rM   Úitemr   r   r   r   Ú__contains__�   s    
zisin.__contains__c                 C   s,   t | ƒD ]\}}t||ƒr|  S qt‚d S r   )r/   rU   rA   )rM   rW   r$   r   r   r   r   r?   “   s    

z
isin.indexN)Ú__name__Ú
__module__Ú__qualname__rX   r?   r   r   r   r   rV   Œ   s   rV   c                   @   s   e Zd ZdS )r8   N©rY   rZ   r[   r   r   r   r   r8   š   s   r8   c                   @   s   e Zd ZdS )r   Nr\   r   r   r   r   r   ž   s   r   c              
      s4  ddl m‰m‰ m‰ ddlm} |tjjk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 ]}||kr¤| |¡ q¤q„‡‡fdd„‰|tk�rÈt
ƒ ‰t
ƒ }g }t|	ƒD ]‚\}}t|ˆƒrît|ƒ\}}}t|ˆƒ�r:|j�s:ˆd k	�r:|jˆjd�}||	|< |D ]}|ˆk�rFˆ |¡ �qF| ||f¡ qî|D ]\}}t|	| |ˆƒ|	|< �qv|
|	ƒ\}}|||Ž}‡ ‡‡‡fdd	„}t||ƒS ‡ ‡‡fd
d	„}t|ƒ�J td|› �ƒ |
‡fdd„|	D ƒƒ\}}|||Ž}t||ƒW  5 Q R £ S Q R X d S )Nr   )r6   rI   Ú
TensorLike)ÚDelayedMulTensorr   c                    s4   t | ˆ ƒr0| j}ˆd k	r,| js,|jˆjd�}|S | S )N©Údevice)r   Ú_batchtensorr:   Útor`   )rG   r%   )r6   Údevice_holding_tensorr   r   Úunwrap¾   s    
z"__torch_function__.<locals>.unwrapr_   c                    s    t | ˆƒrˆ  | ˆˆd k	¡S | S r   )r   rL   ©rG   )rI   r]   rc   Úresult_levelsr   r   ÚwrapÞ   s    
  ÿz __torch_function__.<locals>.wrapc                    s   t | ˆƒrˆ  | ˆd k	¡S | S r   )r   Úfrom_batchedre   )rI   r]   rc   r   r   rg   è   s    
zbatch_tensor for c                 3   s   | ]}ˆ |ƒV  qd S r   r   )r   Úf)rd   r   r   r   ï   s     z%__torch_function__.<locals>.<genexpr>)r   r6   rI   r]   Zdelayed_mul_tensorr^   ÚtorchÚ__mul__r   r<   r8   r   r:   ra   Údimsr@   Ú	pointwiser/   r>   rb   r`   rH   r   r   Úprint)rM   ÚorigÚclsÚargsÚkwargsr^   Úlhsr1   Zall_dimsZ	flat_argsZ	unflattenri   r   Z
arg_levelsÚ	to_expandr$   rO   rP   Ú_ÚlÚresultrg   r   )rI   r]   r6   rc   rf   rd   r   Ú__torch_function__¥   sn    ÿþýü




ÿþý




rx   c                 G   s  ddl m}m} | jt| jƒ }}tƒ }g }d}| j}	|D ]¨}
t|
tƒrh| 	|
¡ | 	dd„ |
D ƒ¡ q:t|
|ƒrŠ| 
|
¡ | 
|
j¡ q:t|
tƒr¼t|
|	dƒ}
| 
|
¡ | 
| |
¡¡ q:| 	|
¡ | 
tdd„ |
D ƒƒ¡ d}q:ttt|ƒƒƒ}t|ƒ}t|ƒD ]‚\}}
z| |
¡}W n< tk
�rV } ztd| j› d	|
› �ƒ|‚W 5 d }~X Y nX || }||= ||= | |d
¡ | ||¡ �q|j|Ž }d
}tt|ƒd ddƒD ](}t|| tƒ�rª|d7 }| ||< �qª| ||| j¡}|�r|j|| ¡ t|ƒd … žŽ }|S )Nr   )r   rI   Fc                 s   s   | ]}|j V  qd S r   r-   ©r   Úer   r   r   r      s     zpositional.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r   r-   ry   r   r   r   r   
  s     Tztensor of dimensions z does not contain dim r   éÿÿÿÿ)r   r   rI   r7   r8   r9   r<   r   ÚDimListÚextendr@   r&   r   r   r   rB   r;   r0   r/   r?   rA   ÚDimensionBindErrorrl   rK   rC   rL   r:   Zreshape)rM   rl   r   rI   rO   rP   Z	flat_dimsrD   Z
needs_viewr<   r   rC   Znflatr$   r2   rz   ÚpÚseenrw   r   r   r   Ú
positionalõ   s\    






ÿþ
r�   c                 C   s*   ddl m} | D ]}t||ƒr dS qd S )Nr   r   TrR   )Úinputr   r$   r   r   r   Ú_contains_dim'  s    
rƒ   c                 G   sP   t |ƒs |  tjjd | f|˜¡S |}dd„ |D ƒdg| j  }| j|Ž } | | S )Nc                 S   s   g | ]
}|j ‘qS r   r-   ©r   r   r   r   r   Ú
<listcomp>3  s     zexpand.<locals>.<listcomp>r{   )rƒ   rx   rj   rI   rJ   r<   )rM   Úsizesrl   r   r   r   rJ   /  s    
rJ   c                 C   s    t |ƒ|kr|| S | | |¡S r   )r0   Úget)ÚnameÚoffsetrq   rr   Údefaultr   r   r   Ú_getarg;  s    r‹   c                 C   s"   t |ƒ|kr|||< n||| < d S r   )r0   )rˆ   r‰   rq   rr   Úvaluer   r   r   Ú	_patchargA  s    
r�   r   Tc              	      s4   ddl m‰ m‰m‰ ‡ ‡‡‡‡‡‡‡‡f	dd„}|S )Nr   )r   rI   r]   c           	   
      sj  t ˆˆ||tƒ}|tks&ˆrnt|ˆƒsntˆjƒ�8 tdˆ
› �ƒ ˆ ˆ
ˆjf|ž|Žˆj¡W  5 Q R £ S Q R X ˆr‚t 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ˆƒ�6 tdˆ
› �ƒ ˆ
|f|ž|Ž}t||ƒW  5 Q R £ S Q R X d S )Nzdim fallback batch_tensor for r   Fc                 3   s   | ]}ˆ   |¡V  qd S r   ©r?   r„   )rP   r   r   r   Z  s     z$_wrap.<locals>.fn.<locals>.<genexpr>c                    s   g | ]\}}|ˆ kr|‘qS r   r   )r   r$   rv   )Údim_indicesr   r   r…   \  s      z%_wrap.<locals>.fn.<locals>.<listcomp>r   r   c                    s   t | ˆƒrˆ  | ˆˆj¡S | S r   )r   rL   r:   re   )rI   r]   Ú
new_levelsrM   r   r   rg   g  s    
z_wrap.<locals>.fn.<locals>.wrapzdim used batch_tensor for )r‹   Ú_not_presentr   r   rl   rn   rh   ra   r:   r7   r8   r9   r!   r<   r.   r/   r0   rB   r�   r   )	rM   rq   rr   r   r   rG   rl   rg   r%   ©	r   rI   r]   Údim_nameÚ
dim_offsetÚkeepdim_offsetro   r	   r    )r�   rP   r�   rM   r   ÚfnM  s6     ÿÿÿ
z_wrap.<locals>.fn)r   r   rI   r]   )ro   r”   r•   r“   r    r	   r–   r   r’   r   Ú_wrapH  s    $r—   c                 O   s4   ddl m} ttj| ƒ}t|| t|f|ž|Žƒ d S )Nr   r5   )r   r6   Úgetattrrj   rI   Úsetattrr—   )rˆ   rq   rr   r6   ro   r   r   r   Ú_deft  s    rš   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Údim_trackerc                 C   s   t ƒ | _g | _d S r   )r8   rl   Úcount)rM   r   r   r   Ú__init__�  s    zdim_tracker.__init__c                 C   s&   || j kr"| j  |¡ | j d¡ d S r
   )rl   r@   rœ   ©rM   r   r   r   r   Úrecord…  s    
zdim_tracker.recordc                 C   s   | j | j |¡ S r   )rœ   rl   r?   rž   r   r   r   Ú__getitem__Š  s    zdim_tracker.__getitem__N)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ksÊt||ƒrî|jsî|	d k	rêd|› d|	› �}||ƒ‚|}	t||ƒ�r||j�rt|ƒnd7 }|
 |¡ qª|d k	rª|dk	rª|d7 }qª| j
}||k�r^td|› d|› d	�ƒ‚|	d k	�r¤|| }||	 }|dk�rštg| ||	|	d …< n
| |¡ t|
ƒD ]}|| |||d …< �q¬d}d
}|  ¡ }g }tƒ ‰‡ ‡fdd„}|| ƒ g }t|ƒD ]è\}}|d k�r.t||< | d¡ d}n¼|| }t||ƒ�r^||_ˆ |¡ | |¡ n„t|tt	fƒ�rÐ|�rÐt|d |ƒ�rÐ|D ]}ˆ |¡ �qˆt||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�rÔt||< | |#¡ npt|#|ƒ�r6d}"| d k�röt|ƒ} t|#ƒ\}$}}%||!|< |$||< |D ]}&|&|k�r| |&¡ �qnd}"| d¡ �qž| d k	�r^||| | …< |!  ¡ D ]\}}t!|| ||ƒ||< �qf|"�r˜t||ƒ}'n|}'d}(|dk�rº| dg| ¡ tt|ƒƒD ]*\}})t|)t"ƒ�rÆ|(|d| < |(d8 }(�qÆ| #|'||¡S )Nr   )r6   r   r~   r|   rI   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   rl   rŸ   )rG   r   )r6   Ú	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   ò  s     zt__getitem__.<locals>.<genexpr>c                    s"   g | ]}t |tƒrtˆ ƒn|‘qS r   )r   r   Únext)r   rv   )Úinput_itr   r   r…     s     z t__getitem__.<locals>.<listcomp>r{   )$r   r6   r   r~   r|   rI   r]   r   r.   rB   r<   rx   Ú_orig_getitemr/   r#   r0   r@   Ú
IndexErrorÚno_sliceZbind_lenÚreversedr&   r›   rŸ   r4   r}   rD   r7   r9   Úiterr:   r>   ÚitemsrH   r   rL   )*rM   r‚   r   r~   r|   rI   r]   Z	is_simpleZdims_indexedZexpanding_objectZdimlistsr$   ÚsÚmsgr<   Zexpanding_ndimsÚobjrF   r&   Z
view_sizesr¢   Z	dim_packsr2   Úszr   Zptensor_selfrP   Zflat_inputsZ
has_deviceZto_padrf   Zindex_levelsZtensor_insert_pointrt   Zrequires_getindexr=   rO   ru   rv   rw   Znext_positionalr%   r   )r6   r¡   r¤   r   Út__getitem__Ž  sò     ÿû


ÿ

ÿ

ÿþ



&






r¯   c           
      C   s²   t |tƒr t | ||¡ ||¡S d }|d k	r>t||dd�\}}g }| D ]B}t||dd�\}}|d k	rz||krz| ||¡}n|}| |¡ qFtj|||d�}	|	 ||d f||f¡S )NT)rN   )Úoutr   )r   r   rj   Ústackr?   rQ   Zmove_dimr@   )
ZtensorsZnew_dimr   r°   r?   ZptensorsrG   Ú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| |ƒsntdˆ › �ƒ‚t	| ˆ ƒ\} ‰ |  
ˆ ¡}d}g }g }t|ƒD ]:\}	}
|
jrÀ| |
j
¡ ||
j
7 }qš| d¡ | |	¡ qš|�rL||k�std	|› d
|› d|› d�ƒ‚|| }| t|ƒ  }|D ]*}t||ƒ}||| _
|||< ||8 }�qn&||k�srtd|› d
|› d|› d�ƒ‚t‡ fdd„t|t| |ˆ d�ƒD ƒƒS )Nr   )r6   r   c                 s   s   | ]}t |tƒV  qd S r   )r   r   )r   rG   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   rG   r   r   r   r   ‚  s   ÿ)r   r6   r   r   r   ÚanyrA   Ú_orig_splitr   rQ   r&   r/   r#   r@   r0   Úminr.   Úzip)rM   Zsplit_size_or_sectionsr   r6   r   r&   Ztotal_bound_sizeÚunboundr†   r$   r   Zremaining_sizeÚ
chunk_sizeÚur®   r   r   r   ÚsplitW  sR    ÿ
ÿ


ÿþ

ÿþþr½   )F)r   r   r   FT)r   N)r   )3rj   Zfunctorch._Cr   Z_Cr   r   Zbatch_tensorr   r   r   r|   r   Ú	functoolsr	   Úsetrm   r   r   r!   r4   r>   rH   rQ   rU   rV   rB   r8   r.   r   Z
empty_dictÚclassmethodrx   r�   rƒ   rJ   Úobjectr‘   r‹   r�   r—   rš   Úslicer§   rI   r    r¥   r›   r¯   r±   r½   r·   r   r   r   r   Ú<module>   sV   
		
O2	         ÿ
, 5
