U
    5-eq                     @   sT  d dl mZ d dlmZmZmZmZmZmZ d dl	m
  mZ d dlmZ d dlmZmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z' d	d
gZ(ddgZ)dddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*gZ*d+gZ+ee  eeee$e f f d,d-d.Z,ee- e-d/d0d1Z.eed2d3d4Z/eed2d5d6Z0eeee# ee f d2d7d8Z1eed2d9d:Z2e e$ee eeed; f f d<d=d>Z3ee  eeee"ef f dd?d@dAZ4ee#dBf ee- e-dCdDdEZ5ee-ee- dFdGdHZ6ee!ee- dIdJdKZ7ee!ee- dIdLdMZ8dS )N    )defaultdict)DictListOptionalSequenceTupleUnionN)	translate)BindingDispatcherSignatureExpr)with_native_function)
AnnotationArgumentBackendIndexBackendMetadataBaseOperatorNameBaseTyBaseTypeDEFAULT_KERNEL_NAMESPACEDeviceCheckTypeDispatchKeyFunctionSchemaNativeFunctionNativeFunctionsGroupOperatorNameReturn
SchemaKindVariant)	concatMapz'adaptive_avg_pool3d_backward.grad_inputz _slow_conv2d_backward.grad_inputZ_cummax_helperZ_cummin_helperZ_assert_asyncz_assert_async.msgZ_dimIZ_dimVZ_has_same_storage_numelZ_linalg_check_errorsZ_local_scalar_denseZ%_nested_tensor_from_mask_left_alignedZ_nnzZ_use_cudnn_ctc_lossz_use_cudnn_ctc_loss.TensorZ#_validate_compressed_sparse_indicesZallcloseZ	dense_dimequalZis_coalesced	is_pinnedZis_same_sizeZ	is_set_toZq_per_channel_axisZq_scaleZq_zero_pointZqschemeZrecord_streamZ
sparse_dimZsym_constrain_rangeZsym_constrain_range_for_sizeZ_nested_tensor_storage_offsetsZ'_chunk_grad_outputs_efficient_attentionZ_fused_sdp_choiceZ
polygamma_)native_functionsreturnc                 C   sD   t t}| D ]2}||j  }|j |ks0t|||j < q|S N)r   dictfunc	signaturekindAssertionError)r"   pre_grouped_native_functionsfd r-   d/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/torchgen/native_function_generation.pypre_group_native_functionsa   s    r/   )overload_namer#   c                 C   s   | sdS |  dS )NoutZ_outr-   )r0   r-   r-   r.   &get_expected_out_variant_overload_nameo   s    r2   )r&   r#   c              
   C   sp   |   tjkst| jjd k	s"tt| j 	t
| jj| j td| jjjjd | jjjjdg| jdS )Nr1   nametypedefault
annotationr4   	argumentsreturns)r(   r   inplacer)   r9   Zself_argr   r4   remove_inplacewith_overloadr2   r0   Zremove_self_annotationwith_out_argsr   argumentr5   r7   r:   )r&   r-   r-   r.   self_to_out_signaturex   s"    





r@   c                 C   sL   |   tjkstt| \}}t| jt| jj	| j
 |t|dS Nr8   )r(   r   
functionalr)   generate_out_args_from_schemar   r4   r=   r2   r0   r9   r'   r>   tupler&   new_returnsnew_out_argsr-   r-   r.   functional_to_out_signature   s    

rH   c           
   	      s  t dd | jD rtdd | jD }t|dks8ttdd | jj  fddd	D }td
d | jD }g }g }t| jD ]\}}|j	
 rtt| jdkrdnd| |j	d t||  dd}|| |rtd |j	|jd}	||	 q|| q||fS )Nc                 s   s    | ]}|j d k	o|j jV  qd S r$   )r7   is_write.0rr-   r-   r.   	<genexpr>   s    z0generate_out_args_from_schema.<locals>.<genexpr>c                 S   s   g | ]}|j  r|qS r-   r5   is_tensor_likerJ   r-   r-   r.   
<listcomp>   s     
 z1generate_out_args_from_schema.<locals>.<listcomp>r   c                 S   s   | j d krg S | j jS r$   )r7   Z	alias_set)ar-   r-   r.   <lambda>       z/generate_out_args_from_schema.<locals>.<lambda>c                    s   g | ]}| kr|qS r-   r-   )rK   xZused_annotationsr-   r.   rP      s     abcdefghijklmnopqrstuvwxyzc                 s   s   | ]}|j ttjkV  qd S r$   )r5   r   r   ZTensorrJ   r-   r-   r.   rM      s        r1   !r3   )r4   r5   r7   )anyr:   r)   lenr   r9   Zflat_allall	enumerater5   rO   r   r   parseappendr   r7   )
r&   Ztensorlike_retsZvalid_annotationsZall_rets_are_tensorsrG   rF   irL   Znew_outZnew_retr-   rU   r.   rC      sB    


  rC   c                 C   sL   |   tjkstt| \}}t| j t	| jj
| j|t|dS rA   )r(   r   mutabler)   rC   r   r4   r<   r=   r2   r0   r9   r>   rD   rE   r-   r-   r.   mutable_to_out_signature   s    


ra   )r   r   )r+   kr#   c                 C   s  ddl m} |tjkrv| j tjks*t| jjddt	t
| jjjjd| jjjj| j tjkd| jjjd}np|tjkr| j tjkrt| j}q| j tjkrt| j}q| j tjkrt| j}qtdntd	| tjkr|j n||}| j r|d
7 }tj|jt|dtdii}dht| jddh@ B }t|| jtj hdd d d g i ddd d dt!j"| j#t | j$dddd|| j%d|fS )Nr   )cppT)Zkeep_return_namesF)baser;   dunder_methodZfunctional_overload)r4   r0   z^We only bother generating out= functions from either inplace or mutable or functional variantszDWe currently only generate either functional or out= NativeFunctions_symint)Zkernel
structuredZcpp_namespace	generatedZnondeterministic_seededZ	view_copy)r&   !use_const_ref_for_mutable_tensorsvariantsrg   Zstructured_delegateZstructured_inheritsZprecomputedautogenZufunc_inner_loopZmanual_kernel_registrationmanual_cpp_bindingZpython_moduleZcategory_overrideZdevice_guardZdevice_checklocZcpp_no_default_argsis_abstract&has_composite_implicit_autograd_kernelZ4has_composite_implicit_autograd_nested_tensor_kernelZ&has_composite_explicit_autograd_kernelZ5has_composite_explicit_autograd_non_functional_kerneltags	namespace)&Ztorchgen.apirc   r   rB   r&   r(   r)   r'   	with_namer   r   r4   rd   re   r`   r0   r1   r;   r@   ra   rH   unambiguous_name
has_symintr   ZCompositeExplicitAutogradr   r   setrp   r   ri   r   functionr   ZNoCheckrm   rn   rq   )r+   rb   rc   r&   Zkernel_nameZbackend_metadatarp   r-   r-   r.   generate_function  s    



	 	rw   )rsindicesr#   c                 C   sL  t | }| D ]4}tj|k}tj|k}tj|k}tj|k}|sN|sN|sN|rtdd | D }tdd | D }	tdd | D }
|s|	s|
rq|rt	| dkrt
|tj jjtkrtdt
|tj j q|rt
|tj jjtkrq|r|tj n(|r$|tj n|r4|tj n|tj }|j tjkpdtdd |jjD }tdd |jD }| o|o|}|s|st
|jjtkrt
|jjtkrtd	t
|j d
|rt|tj\}}||tj< t|| | | |s|s|rt|tj\}}||tj< t|| | | qd S )Nc                 s   s   | ]}|j V  qd S r$   )rl   rK   r+   r-   r-   r.   rM     s     z1add_generated_native_functions.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r$   )Z
is_view_oprz   r-   r-   r.   rM     s     c                 s   s   | ]}|j V  qd S r$   )ro   rz   r-   r-   r.   rM     s    rW   zEFound an out= operator that we could not find any other variants of: c                 s   s   | ]}|j  V  qd S r$   rN   rJ   r-   r-   r.   rM     s    c                 s   s   | ]}d t |kV  qdS )r1   N)str)rK   Zop_namer-   r-   r.   rM     s     zBFound an operator that we could not generate an out= variant for: z.
This type of operators don't have tensor-like return, making it difficult to generate a proper out= variant. If
out= variant is not needed, please add the function name into FUNCTIONAL_OPS_THAT_CANNOT_GET_AN_OUT_VARIANT list.)r/   valuesr   rB   r;   r`   r1   r[   rY   rZ   r{   r&   r4   &OUT_OPS_THAT_DONT_GET_GROUPED_PROPERLYr)   *INPLACE_OPS_THAT_DONT_GET_GROUPED_PROPERLYr(   r:   rk   *MUTABLE_OPS_THAT_CANNOT_GET_AN_OUT_VARIANT-FUNCTIONAL_OPS_THAT_CANNOT_GET_AN_OUT_VARIANTrw   r   Z
grow_indexr^   )rx   ry   r*   r,   Zhas_functionalZhas_inplaceZhas_mutableZhas_outZ
are_manualZhas_view_opsZare_composite_implicitZbase_fnZbase_fn_validZ	needs_outZgets_out_variantfnmetadatar-   r-   r.   add_generated_native_functionsr  s    








r   .)retsnamesr#   c                 C   sf   t | t |kstt | dkr$dS t | dkr@d|d  dS dt|   dd| dS d S )	Nr    rW   zreturn ;(, );)rZ   r)   
dispatcherZreturns_typeZcpp_typejoin)r   r   r-   r-   r.   
return_str  s    r   )r&   out_varr#   c                 C   sX   |   }g }t| jdk}t|D ]0\}}|d kr"||rLd| d| dn| q"|S )NrW   	std::get<>())aliased_return_namesrZ   r:   r\   r^   )r&   r   Zaliased_retsZnon_aliased_namesZis_out_var_a_tupler_   rL   r-   r-   r.   gather_nonaliased_inner_rets  s    r   )gr#   c                 C   s  d| j jkrd S | jd k	r.d| jjkr.| j}n.| jd k	rLd| jjkrL| j}ntt| j jt| j j}t|j}g }g }g }tt	
| j jt	
|jD ]\}}|jd k	r|jjr|d|j d|j d |t|j dt	j||jdd ||j d q|t	| qdd	d
 t|| D }	d}
t|jjdkr`d|
 dnd}t|j|
}t| j jj|| }d|}d|j| | jj rdnd d d| d| d|jj  d|	 d| dS )Nrh   zauto z_clone = clone_arg(r   Z_clone)Zbinds)exprr5   r   c                 S   s   g | ]
}|j qS r-   r   rK   er-   r-   r.   rP   -  s     z3gen_composite_functional_kernel.<locals>.<listcomp>outputr   z = r   
rf   r4   z {
  
  z
at::_ops::::call();
  
}
)rB   rp   r;   r`   r)   r{   r&   r   zipr   Zjit_argumentsr7   rI   r^   r4   r   Zargument_typer?   r   r	   r9   rZ   r:   r   r   defnr1   rt   rs   )r   Ztarget_fsig
target_sigcontextZclone_mutable_inputsZcloned_return_namesZa_currZa_tgtexprsout_nameZmaybe_assignZinner_return_namesZret_strZclone_mutable_inputs_strr-   r-   r.   gen_composite_functional_kernel  sd    


" 
$
r   c                 C   s  d| j jkrd S t| j j}t| jj}ddd t| | D }g }d}t| j jjj D ]X\}}t	| jjj
dkr|nd| d| d	}|d
|j d| d|j d| d	 qbg }	t| j j D ]P\}}
|
d k	r|	|
 qt	| jjj
dkr|nd| d| d	}|	| qd|}d|j| j jj | j j rPdnd d d| d| jjj  d| d| dt| j jj
|	 dS )Nrh   r   c                 S   s   g | ]
}|j qS r-   r   r   r-   r-   r.   rP   P  s     z,gen_composite_out_kernel.<locals>.<listcomp>Z
tmp_outputrW   r   r   r   z  resize_out_helper(z);
  copy_arg(r   r   rf   r   r   z
 {
  auto z = at::_ops::r   r   r   r   )r1   rp   r   r&   rB   r   r	   r9   r\   rZ   r:   r^   r4   r   r   rs   rt   r   )r   r   r   r   Z	copy_outsr   r_   Zout_argZfunctional_return_namer   Zret_nameZcopy_outs_strr-   r-   r.   gen_composite_out_kernelB  s`    
*r   )9collectionsr   typingr   r   r   r   r   r   Ztorchgen.api.dispatcherapir   Ztorchgen.api.translater	   Ztorchgen.api.typesr
   r   r   Ztorchgen.contextr   Ztorchgen.modelr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztorchgen.utilsr   r}   r   r   r~   r/   r{   r2   r@   rH   rC   ra   rw   r   r   r   r   r   r-   r-   r-   r.   <module>   s    L	'	!5$ mw>