a
    h                     @   s  d dl Z d dlZd dlZd dlZd dlmZmZ d dlZd dlZd dl	Zd dl
mZ d dlmZ d dlmZmZmZmZmZmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ ej j!Z"g d	Z#i Z$g Z%ej&j'j(Z(d
d Z)dd Z*e)e(j+j,e(j+j-e(j.j,e(j.j-e(j/j,e(j/j-e(j0j,e(j0j-e(j1j,e(j1j-e(j2j,e(j2j3e(j2j4e(j2j-e(j2j5e(j2j6e(j7j,e(j7j-e(j8j,e(j8j-e(j9j,e(j9j-e(j:j,e(j:j-e(j;j,e(j;j-e(j<j,e(j<j-Z=e)e(j>j,e(j?j,e(j?j-e(j@j,e(jAjBe(jAjCe(jDj,e(jEj,e(jEj-e(jFj,e(jFj-ZGe(jHfZIdd ZJe jKedddZLeeegeMf ef dddZNdd ZOdd ZPeNe$jQdd ZReNeLeNg e=dd ZSeNe(jDj,dd ZTeNe(jAjCeNe(jAjBd d! ZUd"d# ZVeNeVd$d% ZWeNe(jXj,d&d' ZXeNe(jYj,d(d) ZYeNd*d+ d,d- ZZdzd/d0d1d2Z[eNe(j\j,d{d3d4Z]eNe(j^j,d|d5d6Z^eNe(j_j,d}d7d8Z`eNe(jaj3d~d9d:ZbeNej'j(jcj,eNej'j(jdj,d;d< ZeeNej'j(jfj,d=d> ZfeNej'j(jgj,d?d@ ZgeNej'j(jhj,ddAdBZheNej'j(jij,dCdD ZieNej'j(jjj,ddddEddFdGdHZkeNdId+ dJdK ZldLdM ZmdNdO Zne)dPdQdRZodSdT ZpdUdV ZqeNdWd+ dXdY ZreNe(jsj3dZd[ ZteNe(juj,d\d] ZveNe(jwj,eNe(jxj,eNe(jyj,eNe(jzj,d^d_ Z{eNe(jxj-eNe(jzj-d`da Z|eNe(j}j,eNe(j~j,dbdc ZeNe(j?j,eNe(j?j-eNe(jj,eNe(jj,ddde ZeNdfdg eGD dhdi ZeNe(jj,e(jj,gdjdk ZeNej'j(jj,ddldmZeNej'j(jj,dndo Zi ZeddpdqZdrds ZejfdtduZddvdwZe jKdxdy ZdS )    N)CallableUnion)no_python_dispatcher)
OpOverload)'definitely_contiguous_for_memory_formatelementwise_dtypesELEMENTWISE_TYPE_PROMOTION_KINDis_boolean_dtypeis_float_dtypeis_integer_dtype)DataDependentOutputExceptionDynamicOutputShapeException
FakeTensorin_kernel_invocation_managerrun_fallback_kernelUnsupportedOperatorException)normalize_functioncount_label)op_implementations_checksget_fast_op_implsstride_incorrect_ophas_metac                  G   s   t | dS )NT)dictfromkeys)items r   J/var/www/auris/lib/python3.9/site-packages/torch/_subclasses/fake_impls.pyordered_set2   s    r   c                 C   s
   | j dkS )NZhpu)typedevicer   r   r   is_noncontiguous_supported8   s    r"   c                 C   s,   t jj }| |p*tdd |  D S )Nc                 s   s   | ]}t |V  qd S N)contains_tensor_types).0er   r   r   	<genexpr>p   s   z(contains_tensor_types.<locals>.<genexpr>)torch_C
TensorTypegetZisSubtypeOfanyZcontainedTypes)r   Ztensor_typer   r   r   r$   n   s    r$   funcc                 C   sR   t | tsJ | j}tdd |jD r,dS t|jdkoP|jd jtj	j
 u S )Nc                 s   s   | ]}t |jV  qd S r#   )r$   r   r%   argr   r   r   r'   y       z)_is_tensor_constructor.<locals>.<genexpr>F   r   )
isinstancer   Z_schemar,   	argumentslenreturnsr   r(   r)   r*   r+   )r.   Zschemar   r   r   _is_tensor_constructoru   s    $r7   run_impl_checkc                    s    fdd}|S )Nc                    sn   t  tr* tvs J d  | t < n@t  ttfrP D ]}t||  q<nt s\J t | f | S )Nzduplicate registration: )	r3   r   op_implementations_dictlisttupleregister_op_implcallabler   append)op_implopr8   r   r   impl_decorator   s    

z(register_op_impl.<locals>.impl_decoratorr   )r9   rB   r   r8   r   r=      s    r=   c                 C   s   | t v S r#   r:   rA   r   r   r   _is_op_registered_to_fake_rule   s    rE   c                 C   s:   | t v rt | = tD ]"\}}|| u rt||f  q6qd S r#   )r:   r   remove)rA   checkimplr   r   r   _deregister_op_impl   s    rI   c                 O   s   t | | |g|R i |S r#   rC   	fake_moder.   argskwargsr   r   r   #dispatch_to_op_implementations_dict   s    rN   c           	      O   s   |t vsJ t|||dd\}}d|v r0td|tv rP|d j}|df}ntd}d}|dd }|d urv|n|}td	|d< t|  ||i |}W d    n1 s0    Y  t| ||S )
NTrL   rM   normalize_to_only_use_kwargsnamesz+torch.compile doesn't support named tensorsinputcpur   r!   meta)	_non_kwarg_device_constructorsr   r   _like_tensor_constructorsr!   popr(   r   r   )	rK   r.   rL   rM   _
new_kwargsZdefault_device
out_devicerr   r   r   constructors   s&    



,r\   c                 O   sR   t |||dd\}}|d}t|  ||}W d    n1 sD0    Y  |S )NTrP   rR   )r   rW   r   )rK   r.   rL   rM   rX   rY   inpr[   r   r   r   non_kwarg_is_pinned   s    


&r_   c           
      O   s   t |||dd\}}|d }|r$|n|d j}td|d< |d}t|   ||fi |}	W d    n1 st0    Y  | j| |	|S )NTr]   r!   rR   rT   )r   r!   r(   rW   r   fake_tensor_converterfrom_meta_and_device)
rK   r.   rL   rM   rX   rY   Zinput_devicerZ   r^   r[   r   r   r   non_kwarg_to   s    


.rb   c                 C   s   dS )NFr   rD   r   r   r   r      s    r   c                    sb   dd  | j rVt fddt|| D }|sVt||f\}}t| |||d S t|d S )Nc                 S   s.   t | tr| jS t | tjtjtjfr*dS dS )NTF)r3   r   Z_has_symbolic_sizes_stridesr(   ZSymIntZSymFloatZSymBool)xr   r   r   is_symbolic   s
    
z3wordaround_stride_incorrect_op.<locals>.is_symbolicc                 3   s   | ]} |V  qd S r#   r   r%   rc   rd   r   r   r'      s   z1wordaround_stride_incorrect_op.<locals>.<genexpr>)	Zallow_fallback_kernelsr,   	itertoolschainvaluespytreeZtree_flattenr   r   )rK   r.   rL   rM   Zrequire_dynamicZ	flat_argsZ	args_specr   rf   r   wordaround_stride_incorrect_op   s    rk   c                 O   s:   t |  ||i |W  d    S 1 s,0    Y  d S r#   )r   rJ   r   r   r   
resize_as_  s    
rl   c                 O   s   t | |g|R i |S r#   )r\   rJ   r   r   r   (_sparse_coo_tensor_with_dims_and_tensors  s    rm   c                 C   s(   t jj| jv o&| tjjtjjtj	jfvS r#   )
r(   TagZdynamic_output_shapetagsatenindexTensornonzerodefaultrepeat_interleaver-   r   r   r   <lambda>  s   rv   c                 O   s   t |d S r#   )r   rJ   r   r   r   	dyn_shape  s    rw   TFunique_consecutivec                C   s  | j d u s| j jst||r$|jn|j}|d us:|d u rddlm}	m}
 |
| sh| dkrhd}nJ| j 	 }t
jd }|d u r| n||}|
|st|}|	||d |d u r|r||_n||_|d u r||fg}n2|jg |jd | ||j|d d  R  g}|d uo.|jtdk}|s<|r`||d u rP|jn
|j| f}n
|d}|| |s|r||d u r|d jn|d j| f}n
|d}|| t|S )Nr   _constrain_range_for_sizehas_free_symbolsr2   maxrS   )	shape_envallow_dynamic_output_shape_opsr   Zunique_consecutive_memoZunique_memo%torch.fx.experimental.symbolic_shapesr{   r|   numelcreate_unbacked_symintsysmaxsizesizeint	new_emptyshapefake_devicer(   r!   r?   r<   )rK   r.   r0   dimsortedreturn_inversereturn_countsry   nnzr{   r|   maxvalr   retZreturn_if_dim_and_cpuZinversecountsr   r   r   _unique  sB    	

2$

,

r   c                 C   s   t | ||d |||S r#   r   )rK   r.   r0   r   r   r   r   r   r   unique2c  s    r   c                 C   s,   t | |||dkr|n|t|jd |||S )Nr   r2   )r   r~   ndim)rK   r.   r0   r   r   r   r   r   r   r   
unique_dimj  s    r   c              
   C   s   t | |||d||ddS )NFTrx   r   )rK   r.   r0   r   r   r   r   r   r   rX   z  s    rX   c                 C   sJ   |d u r@| j d u s| j js"t|| j  }ddlm} || ||S Nr   r{   )r   r   r   r   r   r{   r   )rK   r.   ZrepeatsZoutput_sizer{   r   r   r   repeat_interleave_tensor  s    
r   c                 C   s   |j  }d ur|S | jd u s*| jjs2| js2t|t|jrH| j }n<t|jr^| j }n&t	|jrt| j
 }ntd|j ||_ |S )Nz local_scalar_dense/item NYI for )Z	item_memor   Zallow_scalar_outputsr   r
   dtypeZcreate_unbacked_symfloatr   r   r	   Zcreate_unbacked_symboolNotImplementedError)rK   r.   r0   r[   r   r   r   local_scalar_dense  s"    



r   c                 C   s   t jjj|dS )Nr2   )r(   opsrp   rs   rt   Zunbind)rK   r.   r0   r   r   r   nonzero_numpy  s    r   c                 C   s  | j d u s| j jst||j }d u rddlm}m} ddlm} ddl	m
} || sn| dkrnd}nv| j  }tjd }|| st| }n<t|jj}	||	j|	j j}
t|
j|rtjd }n|
j}|||d ||_|j|| fd|ftjdS )Nr   rz   IntInfinitybound_sympyr2   r}   )r   )r   r   r   Znonzero_memor   r{   r|   torch.utils._sympy.numbersr   torch.utils._sympy.value_rangesr   r   r   r   r   r   mathprodr   nodeexprvar_to_ranger3   uppernew_empty_stridedr   r(   int64)rK   r.   r0   r   r{   r|   r   r   r   	prod_node
prod_ranger   r   r   rs     s2    	


rs   c           	      C   s   t |dksJ |sx| jd u s&| jjs.t|| j }tjd }ddlm}m	} ||
 sjt|
 }||d|d |g|jdd  R }||S )Nr2   r   rz   )minr~      )r5   r   r   r   r   r   r   r   r{   r|   r   r   r   r   )	rK   r.   paddedoffsetsZtotal_Lr   r{   r|   Zoutput_shaper   r   r   _padded_dense_to_jagged_forward  s    

r   c                 C   s   | j d u s| j jst|| j  }tjd }ddlm}m} ddl	m
} ddlm}	 || spt| }
n<t|jj}|	|j|j j}t|j|rtjd }
n|j}
|
dkr|
}|||d ||fS )Nr2   r   rz   r   r   r   r}   )r   r   r   r   r   r   r   r{   r|   r   r   r   r   r   r   r   r   r   r   r   r   r3   r   r   )rK   r.   selfmaskr   r   r{   r|   r   r   Znum_elementsr   r   r   r   r   masked_select  s*    

r   )r!   layout)returnc                C   s   |d ur,|  |ks,J d| d|   |d urX| |ksXJ d| d|  |d ur|j|ksJ d| d|j |d ur|j|ksJ d| d|  |d ur|j|ksJ d| d|j d S )Nz!Tensor sizes mismatch! Expected: z, Got: z#Tensor strides mismatch! Expected: z!Tensor dtype mismatch! Expected: z"Tensor layout mismatch! Expected: z"Tensor device mismatch! Expected: )r   strider   r   r!   )rK   r.   tsizesstridesr   r!   r   r   r   r   assert_tensor_metadata5  s2    

r   c                 C   s   t jj| jv S r#   )r(   rn   Zdata_dependent_outputro   r-   r   r   r   rv   X  r1   c                 O   s   t |d S r#   )r   rJ   r   r   r   data_depX  s    r   c                 C   s0   |D ]&}|d ur|j tjtjfv rt| qd S r#   )r   r(   boolZuint8r   )r.   r   indicesrq   r   r   r   check_no_bool_index_tensors_  s    r   c                 C   s   t |||dd\}}|d j}t| 2 ||i |}t|sJ||j}W d    n1 s^0    Y  ||d u rx|S t| ||S NTrO   rR   )r   r!   r   r"   r   r   r   )rK   r.   rL   rM   rX   rY   rZ   outr   r   r   )run_and_return_new_tensor_of_input_devicee  s    


*r   rp   ZprimsZprimc                 C   s
   | j tv S r#   )	namespace_is_builtin_namespacesrD   r   r   r   
is_builtinx  s    r   c                 C   s   t j|  dS )NZMeta)r(   r)   Z._dispatch_has_computed_kernel_for_dispatch_keynamer-   r   r   r   r   |  s    r   c                 C   s   t | o|  dot| S )Nzaten::_foreach_)r   r   
startswithr   r-   r   r   r   rv     s   c           
         s   dd t || D }z:t|  ||i |}W d    n1 sH0    Y  W n tyj   t Y S 0 |st|S |s|J g }t|D ]<\ }t| fdd|D \}}	|	| j
| || q|S )Nc                 S   s6   g | ].}t |ttfrt|rt |d  tjr|qS )r   )r3   r;   r<   r5   r(   rr   r/   r   r   r   
<listcomp>  s
   z4foreach_run_and_map_input_device.<locals>.<listcomp>c                    s   g | ]}|  qS r   r   )r%   tlir   r   r     r1   )rg   rh   ri   r   r   NotImplemented	enumerater   Z_find_common_devicer?   r`   ra   )
rK   r.   rL   rM   Ztensor_listsZout_metaZout_fakeZmeta_tr!   rX   r   r   r    foreach_run_and_map_input_device  s(    
0
r   c           	      O   sj   ddl m} t|||dd\}}|d j}| ( ||i |}||W  d    S 1 s\0    Y  d S )Nr   )meta_index_TensorTrO   rR   )torch._meta_registrationsr   r   r!   to)	rK   r.   rL   rM   r   rX   rY   rZ   r   r   r   r   index_tensor  s    

r   c                 O   sB   ddl m} |  ||i |W  d    S 1 s40    Y  d S )Nr   )meta_embedding_bag)r   r   )rK   r.   rL   rM   r   r   r   r   embedding_bag  s    r   c                 O   s   t | |||S r#   )r   rJ   r   r   r   multi_device_op_default  s    r   c                 O   sR   t |  ||i | W d    n1 s,0    Y  t|||dd\}}|d S r   )r   r   )rK   r.   rL   rM   rX   rY   r   r   r   multi_device_op_out  s    
,
r   c                    s   t  ||dd\}}|d |d jtjkpHjdkoH dk fdd t|  ||} tjj	u r||d S |S d S )	NTrO   ri   rR   r   r2   c                      s   d  d dj  dS )NzMismatching z device between self (z) and values ()r    r   r.   Zself_deviceri   r   r   rv     r1   z index_put_impl.<locals>.<lambda>)
r   r   r(   _checkr   r   r   rp   
index_put_rt   )rK   r.   rL   rM   rX   rY   r   r   r   r   index_put_impl  s    

r   c                 O   s   t dd S )Nz3torch.compile does not support strided NestedTensor)r   rJ   r   r   r   nested_tensors_unsupported  s    r   c                 C   s6   g | ].}|t jjt jjt jjt jjt jjfvr|qS r   )rp   	is_pinnedrt   r   r!   prim_Device_nested_tensor_from_tensor_listr   re   r   r   r   r     s   r   c                 O   s   |t vsJ d| d S )NzNYI: )_device_not_kwarg_opsrJ   r   r   r   nyi  s    r   c                    s  t |||dd\}}|d j  |d j}|d jd }ddlm} ||sVd }n|dkrx|d jsx|d jsxd }n||tj	j
u rtjjf i |}	nDtjj|d |d d |d |d	 |d
 |d |d |d |d d
}	tj|d |d |	}W d    n1 s
0    Y   fdd}
tz |f i |}|tj	j
u r`|
||W  d    S |
|d ||
|d ||
|d d fW  d    S W d    n1 s0    Y  d S )NTrO   rR   Zweightr   )has_hint   r   paddingdilation
transposedoutput_paddinggroups
bias_sizes)Zbiasr   r   r   r   r   r   r   c                    s,   | d u r| S |d ur | j |d} t|  S )Nmemory_format)r   r   )r   mem_fmtr!   rK   r   r   convert4  s
    zconv.<locals>.convertr2   r   )r   r   r   r   r   r   Z	is_mkldnnZis_xpurp   convolutionrt   r(   r)   Z_select_conv_backendZ%_conv_determine_backend_memory_formatr   )rK   r.   rL   rM   rX   kbatchr   r   Zconv_backendr   r   r   r   r   conv  sL    


$
r   c                 C   sP   | j d u s| j jst|| j  }ddlm} || t||k ||S r   )	r   r   r   r   r   r{   r(   r   r   )rK   r.   inputsweightsZ	minlengthZnew_sizer{   r   r   r   bincountH  s    
r   c           
      C   st   | j d u s| j jst|| j  }ddlm} || |sH|dd}|jdd  }||}||f}	||	fS )Nr   r   r2   )	r   r   r   r   r   r{   Z	transposer   r   )
rK   r.   r   lengthsZbatch_firstZnew_batch_sizer{   Zres_sizeZpacked_dataZ
batch_sizer   r   r   _pack_padded_sequenceZ  s    

r   c                    s    fdd}|S )Nc                    s   | t  < | S r#   )FAST_OP_IMPLEMENTATIONS)r@   r-   r   r   rB   y  s    z-register_fast_op_impl.<locals>.impl_decoratorr   )r.   rB   r   r-   r   register_fast_op_implx  s    r   c           
         s   ddl m} t| }t|}t||}dg| }t|d ddD ] |d   }|d | }|d | }	|dkrx| | nd|	dkr||	 ndt|dkp|dkpk fdd |dkrԈn| < q@t|S )Nr   )guard_or_falser2   c                      s   d d d  dS )NzThe size of tensor a (z#) must match the size of tensor b (z) at non-singleton dimension r   r   r   r   ZsizeAZsizeBr   r   rv     s   zinfer_size.<locals>.<lambda>)r   r   r5   r~   ranger(   r   r<   )
abr   ZdimsAZdimsBr   ZexpandedSizesoffsetZdimAZdimBr   r   r   
infer_size  s"    

r  c                    s    fdd}|S )Nc                    sz   fdd}t d  }d }|D ]0}t|tjr<|jnd}|d u rL|}t||}q&|d usdJ ddlm}m}	 |D ]6}t|tjrxt	|jt	|krx||	|j|rx qqx|dS t
d}
|
}d }d	}|D ]T}t|tjsd
}q||
kr|j
jdks|j
}|d u r|j}q||jkrd
}q|r@t|di\}}d}d}|D ]t}t|tjsbqL||
kr| dkr|j
|
kr||kr|d  S |d7 }n|j
|krL|d  S qLd
}d
}t|r|D ]@}t|tjsq|o t|tjd}|ot|tjd}q|rFt d ttj||dtjd|dS |rrt d ttj||dtjd|dS |dS )Nc                    sD   t d|     i W  d    S 1 s60    Y  d S )Nzslow r   )msg)rL   rM   modeslow_refr   r   slow  s    z=make_fast_binary_impl.<locals>.fast_binary_impl.<locals>.slowzattempt fastr   r   )r   sym_eqz#both tensors nontrivially broadcastrS   FTtype_promotion_kindr2   errorr   zfast is_contiguousrT   )r   r!   r   r    zfast channels_lastzno contiguity match)r   r3   r(   rr   r   r  r   r   r	  r5   r!   r   r   r   r   r"   r   Zcontiguous_formatZchannels_lastr   empty)r  rL   rM   r  ZoperandsZfinal_shaperA   r   r   r	  rS   Zcommon_deviceZcommon_dtypeZhas_different_input_dtypesrX   Zcurrent_cpu_scalars_on_non_cpuZmax_cpu_scalars_on_non_cpuZdefinitely_contiguousZdefinitely_channels_lastr  r
  )rL   rM   r  r   fast_binary_impl  s    





$



z/make_fast_binary_impl.<locals>.fast_binary_implr   )r  r
  r  r   r  r   make_fast_binary_impl  s     	r  c              	   C   s   t  H t|   tjjj|}W d    n1 s60    Y  W d    n1 sT0    Y  |rvt| ||j|j	dS t| ||jS )N)real_tensor)
r   r   r(   r   rp   detachrt   r   r!   r  )rK   rc   Zinclude_realr   r   r   r   fast_detach4  s
    Lr  c                  C   s   dd l } t| jjjjt| jj t| jjjjt| jj t| jjj	jt| jj	 t| jjj
jt| jj
tjd t| jjjjt tS )Nr   )r
  )Ztorch._refsr   r   rp   addrr   r  Z_refssubmuldivr   ZINT_TO_FLOATr  rt   r  r   )r(   r   r   r   r   <  s     

r   )TFF)TFF)TFF)FFN)N)N)NNN)Nr   )F)	functoolsrg   r   r   typingr   r   r(   Ztorch._custom_opZtorch._loggingZtorch._dispatch.pythonr   Z
torch._opsr   Ztorch._prims_commonr   r   r   r	   r
   r   Ztorch._subclasses.fake_tensorr   r   r   r   r   r   Ztorch.fx.operator_schemasr   Ztorch.utils._statsr   utilsZ_pytreerj   __all__r:   r   Z_opsr   rp   r   r"   Z
empty_likert   r   Z	full_likeZ	ones_likeZ	rand_likeZ
randn_likeZrandint_likerr   Z
Tensor_outZ	low_dtypeZlow_dtype_outZ
zeros_liker   r   Znew_fullZ	new_zerosZnew_onesrV   Z_resize_output_r   Z
pin_memoryr   r!   r   r   Z_pin_memoryZ_resize_outputr   Z_list_to_tensorrU   r$   cacher7   r   r=   rE   rI   __contains__rN   r\   r_   rb   r   rk   rl   rm   rw   r   Z_unique2r   r   ry   rX   ru   r   itemZ_local_scalar_denser   r   rs   r   r   Z_assert_tensor_metadatar   r   r   r   r   r   r   r   rq   r   Z_embedding_bagr   Z_unsafe_index_putcopyZcopy_Zslice_scatterr   r   Z	index_putr   r   Z_nested_view_from_bufferZ_nested_view_from_buffer_copyr   r   r   Zconvolution_backwardr   r   r   r   r   r  DEFAULTr  r  r   r   r   r   r   <module>   sh    
  	











	   	L
 
 



3
)   
"


#

















<
	$
 
