o
    ߗi                     @   st  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 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'j/j+e'j/j,e'j0j+e'j0j,e'j1j+e'j1j,e'j1j2e'j1j3e'j4j+e'j4j,e'j5j+e'j5j,e'j6j+e'j6j,e'j7j+e'j7j,e'j8j+e'j8j,e'j9j+e'j9j,Z:e(e'j;j+e'j<j+e'j<j,e'j=j+e'j>j?e'j>j@e'jAj+e'jBj+e'jBj,e'jCj+e'jCj,ZDe'jEfZFdd ZGe HddefddZIdeeegeJf ef fddZKdd ZLdd ZMeKe#jNdd ZOeKeIeKg e:dd ZPeKe'jAj+dd ZQeKe'j>j@eKe'j>j?d d! ZRd"d# ZSeKeSd$d% ZTeKe'jUj+d&d' ZUeKe'jVj+d(d) ZVeKd*d+ d,d- ZW	/dqd0d1ZXeKe'jYj+	/dqd2d3ZZeKe'j[j+	/dqd4d5Z[eKe'j\j]drd6d7Z^eKej&j'j_j+eKej&j'j`j+d8d9 ZaeKej&j'jbj+d:d; ZbeKej&j'jcj+d<d= ZceKej&j'jdj+drd>d?ZdeKej&j'jej+d@dA ZeeKdBd+ dCdD ZfdEdF ZgdGdH Zhe(dIdJdKZidLdM ZjdNdO ZkeKdPd+ dQdR ZleKe'jmj]dSdT ZneKe'joj+dUdV ZpeKe'jqj+eKe'jrj+eKe'jsj+eKe'jtj+dWdX ZueKe'jrj,eKe'jtj,dYdZ ZveKe'jwj+eKe'jxj+d[d\ ZyeKe'j<j+eKe'j<j,eKe'jzj+eKe'j{j+d]d^ Z|eKd_d` eDD dadb Z}eKe'j~j+e'jj+gdcdd ZeKej&j'jj+dedf Zi ZdefdgdhZdidj Zdkdl Zdmdn Ze Hddodp ZdS )s    N)CallableUnion)no_python_dispatcher)
OpOverload)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   Z/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_subclasses/fake_impls.pyordered_set1   s   r   c                 C   s
   | j dkS )Nhpu)typedevicer   r   r   is_noncontiguous_supported7      
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>m       
z(contains_tensor_types.<locals>.<genexpr>)torch_C
TensorTypegetisSubtypeOfanycontainedTypes)r   tensor_typer   r   r   r%   k   s   r%   funcc                 C   sR   t | tsJ | j}tdd |jD rdS t|jdko(|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(   v   s    z)_is_tensor_constructor.<locals>.<genexpr>F   r   )
isinstancer   _schemar/   	argumentslenreturnsr   r*   r+   r,   r-   )r2   schemar   r   r   _is_tensor_constructorr   s   $r<   run_impl_checkc                        fdd}|S )Nc                    sr   t  tr tvsJ d  | t < | S t  ttfr* D ]}t||  q| S t s0J t | f | S )Nzduplicate registration: )	r6   r   op_implementations_dictlisttupleregister_op_implcallabler   append)op_implopr=   r   r   impl_decorator   s   

z(register_op_impl.<locals>.impl_decoratorr   )r=   rH   r   rG   r   rB   ~   s   rB   c                 C   s   | t v S r$   r?   rF   r   r   r   _is_op_registered_to_fake_rule   s   rK   c                 C   s<   | t v rt | = tD ]\}}|| u rt||f  d S q	d S r$   )r?   r   remove)rF   checkimplr   r   r   _deregister_op_impl   s   rO   c                 O   s   t | | |g|R i |S r$   rI   	fake_moder2   argskwargsr   r   r   #dispatch_to_op_implementations_dict   s   rT   c           	      O   s   |t vsJ t|||dd\}}d|v rtd|tv r(|d j}|df}ntd}d}|dd }|d ur;|n|}td	|d< t|  ||i |}W d    n1 sZw   Y  t| ||S )
NTrR   rS   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   )	rQ   r2   rR   rS   _
new_kwargsdefault_device
out_devicerr   r   r   constructors   s(   



rc   c                 O   sT   t |||dd\}}|d}t|  ||}W d    |S 1 s#w   Y  |S )NTrV   rX   )r   r]   r   )rQ   r2   rR   rS   r^   r_   inprb   r   r   r   non_kwarg_is_pinned   s   




rf   c           
      O   s   t |||dd\}}|d }|r|n|d j}td|d< |d}t|  ||fi |}	W d    n1 s:w   Y  | j| |	|S )NTrd   r!   rX   rZ   )r   r!   r*   r]   r   fake_tensor_converterfrom_meta_and_device)
rQ   r2   rR   rS   r^   r_   input_devicera   re   rb   r   r   r   non_kwarg_to   s   


rj   c                 C   s6   | j dvrdS | tjju rdS |  }d|v rdS dS )N)atenprimsFfftT)	namespacerk   _fft_c2cdefaultname)rF   op_namer   r   r   r      s   
r   c                    s^   dd  | j r+t fddt|| D }|s+t||f\}}t| |||d S t|)Nc                 S   s.   t | tr| jS t | tjtjtjfrdS dS )NTF)r6   r   _has_symbolic_sizes_stridesr*   SymIntSymFloatSymBool)xr   r   r   is_symbolic   s
   
z3wordaround_stride_incorrect_op.<locals>.is_symbolicc                 3   s    | ]} |V  qd S r$   r   r&   rw   rx   r   r   r(      r)   z1wordaround_stride_incorrect_op.<locals>.<genexpr>)	allow_fallback_kernelsr/   	itertoolschainvaluespytreetree_flattenr   r   )rQ   r2   rR   rS   require_dynamic	flat_args	args_specr   rz   r   wordaround_stride_incorrect_op   s   r   c                 O   s:   t |  ||i |W  d    S 1 sw   Y  d S r$   )r   rP   r   r   r   
resize_as_  s   
$r   c                 O   s   t | |g|R i |S r$   )rc   rP   r   r   r   (_sparse_coo_tensor_with_dims_and_tensors  s   r   c                 C   s(   t jj| jv o| tjjtjjtj	jfvS r$   )
r*   Tagdynamic_output_shapetagsrk   indexTensornonzerorp   repeat_interleaver2   r   r   r   <lambda>  s    r   c                 O      t |r$   )r   rP   r   r   r   	dyn_shape  s   r   TFc                 C   s  | j d u s	| j jst||d us|j }d u r[ddlm}m}	 |	| s/| dkr/d}n%| j  }t	j
d }
|d u rA| n||}|	|sNt|}
|||
d |d u r[||_|d u rg||fg}n|jg |jd | ||j|d d  R  g}|d uo|jtdk}|s|r||d u r|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_symbolsr5   maxrY   )	shape_envallow_dynamic_output_shape_opsr   unique_memo%torch.fx.experimental.symbolic_shapesr   r   numelcreate_unbacked_symintsysmaxsizesizeint	new_emptyshapefake_devicer*   r!   rD   rA   )rQ   r2   r4   dimsortedreturn_inversereturn_countsnnzr   r   maxvalr   retreturn_if_dim_and_cpuinversecountsr   r   r   _unique  s:   
	

2"

*

r   c                 C   s   t | ||d |||S r$   )r   )rQ   r2   r4   r   r   r   r   r   r   unique2[  s   r   c                 C   s,   t | |||dkr
|n|t|jd |||S )Nr   r5   )r   r   ndim)rQ   r2   r4   r   r   r   r   r   r   r   
unique_dimb  s   r   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   )rQ   r2   repeatsoutput_sizer   r   r   r   repeat_interleave_tensorr  s   


r   c                 C   s   |j  }d ur	|S | jd u s| jjs| jst|t|jr$| j }nt|jr/| j }nt	|jr:| j
 }ntd|j ||_ |S )Nz local_scalar_dense/item NYI for )	item_memor   allow_scalar_outputsr   r	   dtypecreate_unbacked_symfloatr
   r   r   create_unbacked_symboolNotImplementedError)rQ   r2   r4   rb   r   r   r   local_scalar_dense  s"   



r   c                 C   s   t jjj|dS )Nr5   )r*   opsrk   r   rp   unbind)rQ   r2   r4   r   r   r   nonzero_numpy  s   r   c                 C   s  | j d u s	| j jst||j }d u ruddlm}m} ddlm} ddl	m
} || s7| dkr7d}n;| j  }tjd }|| sNt| }nt|jj}	||	j|	j j}
t|
j|ritjd }n|
j}|||d ||_|j|| ftjdS )Nr   r   IntInfinitybound_sympyr5   r   )r   )r   r   r   nonzero_memor   r   r   torch.utils._sympy.numbersr   torch.utils._sympy.value_rangesr   r   r   r   r   r   mathprodr   nodeexprvar_to_ranger6   upperr   r   r*   int64)rQ   r2   r4   r   r   r   r   r   r   	prod_node
prod_ranger   r   r   r     s0   
	


r   c           	      C   s   t |dksJ |s<| jd u s| jjst|| j }tjd }ddlm}m	} ||
 s5t|
 }||d|d |g|jdd  R }||S )Nr5   r   r   )minr      )r9   r   r   r   r   r   r   r   r   r   r   r   r   r   )	rQ   r2   paddedoffsetstotal_Lr   r   r   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}	 || s8t| }
nt|jj}|	|j|j j}t|j|rStjd }
n|j}
|
dkr\|
}|||d ||fS )Nr5   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   r   r   r6   r   r   )rQ   r2   selfmaskr   r   r   r   r   r   num_elementsr   r   r   r   r   masked_select  s(   


r   c                 C   s   t jj| jv S r$   )r*   r   data_dependent_outputr   r   r   r   r   r      s    c                 O   r   r$   )r   rP   r   r   r   data_dep   s   r   c                 C   s0   |D ]}|d ur|j tjtjfv rt| qd S r$   )r   r*   booluint8r   )r2   r   indicesr   r   r   r   check_no_bool_index_tensors'  s
   r   c                 C   s   t |||dd\}}|d j}t|  ||i |}t|s%||j}W d    n1 s/w   Y  ||d u r<|S t| ||S NTrU   rX   )r   r!   r   r"   r   r   r   )rQ   r2   rR   rS   r^   r_   ra   outr   r   r   )run_and_return_new_tensor_of_input_device-  s   


r   rk   rl   primc                 C   s
   | j tv S r$   )rn   _is_builtin_namespacesrJ   r   r   r   
is_builtin@  r#   r   c                 C   s   t j|  dS )NMeta)r*   r+   ._dispatch_has_computed_kernel_for_dispatch_keyrq   r   r   r   r   r   D  s   r   c                 C   s   t | od|  v ot| S )Nforeach)r   rq   r   r   r   r   r   r   I  s    c              
      s   dd t || D }zt|  ||i |}W d    n1 s$w   Y  W n ty> } ztW  Y d }~S d }~ww |sC|S |sGJ g }t|D ]\ }t| fdd|D \}	}
|	| j
| ||	 qM|S )Nc                 S   s6   g | ]}t |ttfrt|rt |d  tjr|qS )r   )r6   r@   rA   r9   r*   r   r3   r   r   r   
<listcomp>L  s    z4foreach_run_and_map_input_device.<locals>.<listcomp>c                    s   g | ]}|  qS r   r   )r&   tlir   r   r   a  s    )r|   r}   r~   r   r   NotImplemented	enumerater   _find_common_devicerD   rg   rh   )rQ   r2   rR   rS   tensor_listsout_metanot_implemented_errorout_fakemeta_tr!   r^   r   r   r    foreach_run_and_map_input_deviceH  s0   
r   c           	      O   sj   ddl m} t|||dd\}}|d j}|  ||i |}||W  d    S 1 s.w   Y  d S )Nr   )meta_index_TensorTrU   rX   )torch._meta_registrationsr   r   r!   to)	rQ   r2   rR   rS   r   r^   r_   ra   r   r   r   r   index_tensorn  s   

$r   c                 O   sB   ddl m} |  ||i |W  d    S 1 sw   Y  d S )Nr   )meta_embedding_bag)r   r   )rQ   r2   rR   rS   r   r   r   r   embedding_bag  s   $r   c                 O   s   t | |||S r$   )r   rP   r   r   r   multi_device_op_default  s   r   c                 O   sR   t |  ||i | W d    n1 sw   Y  t|||dd\}}|d S r   )r   r   )rQ   r2   rR   rS   r^   r_   r   r   r   multi_device_op_out  s   

r   c                    s   t  ||dd\}}|d |d jtjkp$jdko$ dk fdd t|  ||} tjj	u r>|d S |S )	NTrU   r~   rX   r   r5   c                      s   d  d dj  dS )NzMismatching z device between self (z) and values ()r    r   r2   self_devicer~   r   r   r     s    z index_put_impl.<locals>.<lambda>)
r   r   r*   _checkr   r   r   rk   
index_put_rp   )rQ   r2   rR   rS   r^   r_   r   r   r   r   index_put_impl  s   

r  c                 O   s   t d)Nz3torch.compile does not support strided NestedTensor)r   rP   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   )rk   	is_pinnedrp   r   r!   prim_Device_nested_tensor_from_tensor_listr   ry   r   r   r   r     s    r   c                 O   s   |t vsJ d| d S )NzNYI: )_device_not_kwarg_opsrP   r   r   r   nyi  s   r
  c                    s  t |||dd\}}|d j p |d j}|d jd }ddlm} ||s+d }nO|dkr<|d js<|d js<d }n>|tj	j
u rLtjjdi |}	n"tjj|d |d d |d |d	 |d
 |d |d |d |d d
}	tj|d |d |	}W d    n1 sw   Y   fdd}
t5 |di |}|tj	j
u r|
||W  d    S |
|d ||
|d ||
|d d fW  d    S 1 sw   Y  d S )NTrU   rX   weightr   )has_hint   stridepaddingdilation
transposedoutput_paddinggroups
bias_sizes)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   )tmem_fmtr!   rQ   r   r   convert  s
   zconv.<locals>.convertr5   r   r   )r   r   r   r   r   r  	is_mkldnnis_xpurk   convolutionrp   r*   r+   _select_conv_backend%_conv_determine_backend_memory_formatr   )rQ   r2   rR   rS   r^   kbatchr  r  conv_backendr  r   r   r  r   conv  sT   


"
$r$  c           
      C   st   | j d u s	| j jst|| j  }ddlm} || |s$|dd}|jdd  }||}||f}	||	fS )Nr   r   r5   )	r   r   r   r   r   r   	transposer   r   )
rQ   r2   inputslengthsbatch_firstnew_batch_sizer   res_sizepacked_data
batch_sizer   r   r   _pack_padded_sequence  s   


r-  c                    r>   )Nc                    s   | t  < | S r$   )FAST_OP_IMPLEMENTATIONS)rE   r   r   r   rH   ,  s   z-register_fast_op_impl.<locals>.impl_decoratorr   )r2   rH   r   r   r   register_fast_op_impl+  s   r/  c           
         s   ddl m} t| }t|}t||}dg| }t|d ddD ]N |d   }|d | }|d | }	|dkr<| | nd|	dkrF||	 ndt|dkpY|dkpYk fdd |dkrjn| < q t|S )Nr   )guard_size_obliviousr5   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   sizeAsizeBr   r   r   Q  s
    zinfer_size.<locals>.<lambda>)r   r0  r9   r   ranger*   r  rA   )
abr0  dimsAdimsBr   expandedSizesoffsetdimAdimBr   r2  r   
infer_size4  s(   


r>  c                    r>   )Nc                    s   fdd}t d  }d}d}d }|D ]#}t|tjr"|jnd}	t|	dkr-d}nd}|d u r5|	}t||	}q|d usAJ ddlm}
m	} |D ]}t|tjrft|jt|krf|
||j|rf nqK|d	S t
d
}|}d }d }d}|D ]'}t|tjsd}qz||kr|j
jd
ks|j
}|d u r|j}qz||jkrd}qz|rt|dtji\}}d}d}|D ]2}t|tjsq||kr| dkr|j
|kr||kr|d  S |d7 }q|j
|kr|d  S qd}d}t|r|D ]}t|tjsq|o|jtjd}|o|jtjd}q|r&t d ttj||dtjd|dS |r<t d ttj||dtjd|dS |dS )Nc                    sD   t d|     i W  d    S 1 sw   Y  d S )Nzslow r   )msg)rR   rS   modeslow_refr   r   slow[  s   $z=make_fast_binary_impl.<locals>.fast_binary_impl.<locals>.slowzattempt fastFr   r   T)r0  sym_eqz#both tensors nontrivially broadcastrY   type_promotion_kindr5   errorr  zfast is_contiguousrZ   )r   r!   r  r    zfast channels_lastzno contiguity match)r   r6   r*   r   r   r9   r>  r   r0  rC  r!   r   r   r   r   DEFAULTr   r"   is_contiguouscontiguous_formatchannels_lastr   empty)r@  rR   rS   rB  operandshas_scalarshas_tensorsfinal_shaperF   r   r0  rC  rY   common_devicecommon_dtypeoutput_dtypehas_different_input_dtypesr^   current_cpu_scalars_on_non_cpumax_cpu_scalars_on_non_cpurG  is_channels_lastrA  )rR   rS   r@  r   fast_binary_implZ  s   










z/make_fast_binary_impl.<locals>.fast_binary_implr   )rA  rW  r   rV  r   make_fast_binary_implY  s    rX  c              	   C   sl   t  $ t|  tjjj|}W d    n1 sw   Y  W d    n1 s*w   Y  t| ||jS r$   )	r   r   r*   r   rk   detachrp   r   r!   )rQ   rw   r   r   r   r   fast_detach  s    rZ  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jjjt tS )Nr   )torch._refsr/  r   rk   addr   rX  _refssubmuldivrY  rp   rZ  r.  )r*   r   r   r   r     s   


r   )TFFr$   )	functoolsr|   r   r   typingr   r   r*   torch._custom_optorch._loggingtorch._dispatch.pythonr   
torch._opsr   torch._prims_commonr   r   r   r	   r
   torch._subclasses.fake_tensorr   r   r   r   r   r   torch.fx.operator_schemasr   torch.utils._statsr   utils_pytreer   __all__r?   r   _opsr   rk   r   r"   
empty_likerp   r   	full_like	ones_like	rand_like
randn_likerandint_like	low_dtypelow_dtype_out
zeros_liker   new_empty_stridednew_full	new_zerosnew_onesr\   _resize_output_r  
pin_memoryr   r!   r  r  _pin_memory_resize_outputr	  _list_to_tensorr[   r%   	lru_cacher<   r   rB   rK   rO   __contains__rT   rc   rf   rj   r   r   r   r   r   r   _unique2r   r   r   r   r   item_local_scalar_denser   r   r   r   r   r   r   r   r   r   r   r   r   r   _embedding_bagr   _unsafe_index_putcopycopy_slice_scatterr   r   	index_putr  r  _nested_view_from_buffer_nested_view_from_buffer_copyr  r
  r  convolution_backwardr$  r-  r.  r/  r>  rX  rZ  r   r   r   r   r   <module>   s@   
 	













?



3

*


#
















<
	% 