U
    •Ê¹jéq  ã                   @   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-   úb/var/www/html/bwave/python/venv/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	 
¡ rútt| jƒdkr¨dnd|› �|j	d t || › d�¡d�}| |¡ |røt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rœt| jƒ}qæ| j ¡ tjkr¸t| jƒ}qæ| j ¡ tjkrÔt| jƒ}qæt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|
ržq|rät	| ¡ ƒdkrät
|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Ò|�sÒt
|jjƒtk�rÒt
|jjƒtk�rÒt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	 |¡¡ qšd 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 ¡ �r¬d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ì|	 |
¡ qÐt	| jjj
ƒdk�r|nd|› d|› d	�}|	 |¡ qÐd |¡}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>