U
    9%e`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/Darija-Ai-API/env/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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   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|| qqfdd|tkrt
 t
 }g }t|	D ]\}}t|rt|\}}}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rt|
|	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 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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st||r|js|	d k	rd| 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rtg| ||	|	d < n
|| t|
D ]}|| |||d < qd}d
}|  }g }t  fdd}||  g }t|D ]\}}|d k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 krt|} t|#\}$}}%||!|< |$||< |D ]}&|&|kr||& qnd}"|d q| d k	r^||| | < |!  D ]\}}t!|| ||||< qf|"rt||}'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
