U
    •Ê¹jÅ•  ã                   @   sf  d dl 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 d dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZ ed	d
�G dd„ dƒƒZ ed	d
�G dd„ dƒƒZ!ed	d
�G dd„ dƒƒZ"ed	d
�G dd„ dƒƒZ#ee# e$e%dœdd„Z&ee# e%dœdd„Z'ee# e%dœdd„Z(ed	d
�G dd„ dƒƒZ)ed	d
�G dd„ dƒƒZ*ed	d
�G dd „ d ƒƒZ+e+e$d!œd"d#„Z,ee%d$œd%d&„Z-d'hZ.d(hZ/eee%d)œd*d+„Z0d9eeeee$e#f f eeee$e#f f e$eee# e%f d-œd.d/„Z1ee eeee$e#f f ee+ d0œd1d2„Z2e$eee# e%d3œd4d5„Z3d:e+e$ee* d6œd7d8„Z4dS );é    N)Ú	dataclass)ÚcastÚDictÚListÚMatchÚOptionalÚSequenceÚSetÚTuple)Úlocal)Úcpp)Ú	BaseCTypeÚBindingÚ
NamedCTypeÚtensorListT)ÚBaseTyÚBaseTypeÚFunctionSchemaÚListTypeÚNativeFunctionÚNativeFunctionsViewGroupÚ
SchemaKindÚType)ÚIDENT_REGEXT)Úfrozenc                   @   s   e Zd ZU eed< eed< dS )ÚSavedAttributeÚnctypeÚexprN)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__Ústr© r#   r#   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchgen/api/autograd.pyr      s   
r   c                   @   sZ   e Zd ZU eed< eed< eedf ed< eedf ed< eedf ed< ee ed< dS )	Ú
DerivativeÚformulaÚoriginal_formula.Ú	var_namesÚsaved_inputsÚsaved_outputsÚnamed_gradientsN)r   r   r    r"   r!   r
   r   r	   r#   r#   r#   r$   r%   &   s   
r%   c                   @   sn   e Zd ZU eed< eedf ed< eedf ed< eeedf  ed< eeedf  ed< eed< eed< d	S )
ÚForwardDerivativer&   .r(   Ú	var_typesÚrequired_inputs_fw_gradÚrequired_inputs_primalÚrequired_original_self_valueÚis_reusing_outplace_formulaN)	r   r   r    r"   r!   r
   r   r   Úboolr#   r#   r#   r$   r,   B   s   
r,   c                   @   sÐ   e Zd ZU eed< eed< ee ed< ee ed< ee	 ed< ee
 ed< ee
 ed< ee ed< ee ed	< ee ed
< ee ed< eee  ed< eee  ed< eedœdd„ƒZeed  dœdd„ZdS )ÚDifferentiabilityInfoÚnameÚfuncÚopÚderivativesÚforward_derivativesÚall_saved_inputsÚall_saved_outputsÚavailable_named_gradientsÚused_named_gradientsÚargs_with_derivativesÚnon_differentiable_arg_namesÚoutput_differentiabilityÚ#output_differentiability_conditions)Úreturnc                 C   s   t | jƒdkS )Nr   )Úlenr=   ©Úselfr#   r#   r$   Úhas_derivatives£   s    z%DifferentiabilityInfo.has_derivatives)ÚgrA   c                 C   s”   |j d krd S |j }| jjddd�}|d › d�d |dd … ¡ }| jd krRd n
| j› d�}t|||| j| j| j| j	| j
| j| j| j| j| jd�S )	NÚ.é   )Úmaxsplitr   z_copy.é   Z_copy©r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   )Z	view_copyr4   ÚsplitÚjoinr6   r3   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   )rD   rF   ÚfZname_split_by_periodZview_copy_nameZview_copy_op_namer#   r#   r$   Ú%create_view_copy_from_view_derivative¬   s.    

ÿñz;DifferentiabilityInfo.create_view_copy_from_view_derivativeN)r   r   r    r"   r!   r   r   r   r%   r,   r   r	   r   r   r2   ÚpropertyrE   r   rO   r#   r#   r#   r$   r3   a   s$   
	þr3   )ÚinfoÚidentrA   c                 C   s:   | d krdS | j D ]"}|j}t t |¡|¡r dS qdS )NFT)r7   r&   ÚreÚsearchr   Úformat)rQ   rR   Ú
derivativer&   r#   r#   r$   Ú
uses_identÍ   s    
rW   )rQ   rA   c                 C   s
   t | dƒS )NZretain_variables©rW   ©rQ   r#   r#   r$   Úuses_retain_variables×   s    rZ   c                 C   s
   t | dƒS )NÚgradrX   rY   r#   r#   r$   Úuses_single_gradÛ   s    r\   c                   @   s&   e Zd ZU eed< eed< eed< dS )ÚDifferentiableInputr4   ÚtypeÚcpp_typeN©r   r   r    r"   r!   r   r#   r#   r#   r$   r]   ä   s   
r]   c                   @   s&   e Zd ZU eed< eed< eed< dS )ÚDifferentiableOutputr4   r^   r_   Nr`   r#   r#   r#   r$   ra   õ   s   
ra   c                   @   sB   e Zd ZU eed< eeeef  ed< eeee	e
 f  ed< dS )Ú'NativeFunctionWithDifferentiabilityInfor5   rQ   Úfw_derivativesN)r   r   r    r   r!   r   r   r"   r3   r   r,   r#   r#   r#   r$   rb   þ   s   
rb   )ÚfnrA   c                 C   s6   | j js*| jdk	r.tdd„ | j ¡ D ƒƒr.dS dS dS )a  How are we going to call the underlying implementation of a
    declaration?  There are two strategies:
        - use_derived: we want to call the implementation on CPUDoubleType
          (or a similar, derived Type instance).  Because these derived
          instances deal in Tensors, not Variables (it's a completely different
          object, so it doesn't dispatch back to VariableType), code on
          this dispatch path needs to wrap/unwrap tensors.  If the
          derived implementation takes and returns tensors, the
          implementation is usually differentiable (although we also use
          the derived dispatch path for non-differentiable functions
          that we still want to dispatch on the derived Type instance;
          e.g., size())
        - use_type: we want to call the implementation on Type, because
          it is implemented concretely, and the functions it invokes will
          get dispatched back to VariableType (which will ensure that they
          are differentiable.)
    Nc                 s   s   | ]}|j V  qd S ©N)rE   ©Ú.0rQ   r#   r#   r$   Ú	<genexpr>  s     z$dispatch_strategy.<locals>.<genexpr>Zuse_derivedZuse_type)r5   Zis_abstractrQ   ÚanyÚvalues)rd   r#   r#   r$   Údispatch_strategy  s    ÿÿrk   ©rN   rA   c                 C   s   | j jjj d¡S )NÚ	_foreach_)r5   r4   ÚbaseÚ
startswith)rN   r#   r#   r$   Úis_foreach_func7  s    rp   Z_foreach_zero_z_foreach_mul.Tensor)rN   Úfunction_schemarA   c                 C   s^   | j jjj d¡d |jjjko\|jjj s<t| j jƒtko\tdd„ t| j j	j
|j	j
ƒD ƒƒS )Nrm   éÿÿÿÿc                 s   s,   | ]$\}}|j |j t|j d dƒfkV  qdS )ÚelemN)r^   Úgetattr)rg   ÚargÚref_argr#   r#   r$   rh   N  s   ÿz+is_reference_for_foreach.<locals>.<genexpr>)r5   r4   rn   rL   Úinplacer"   Ú_foreach_with_inplace_refÚallÚzipÚ	argumentsÚflat_non_out)rN   rq   r#   r#   r$   Úis_reference_for_foreachD  s     ýþþúr}   ÚDefault)Úforeach_functionÚfunctional_info_by_signatureÚ non_functional_info_by_signatureÚdispatch_keyrA   c           &         s`  d}|  ¡ D ](\}}t| |ƒs q|| }|dk	r q6q|dkr�| j ¡ tjkr�t| jjƒtkr�|  ¡ D ](\}}t| |ƒszqf|| }|dk	rf q�qf|dkrœdS | j ¡ tjkr´|dfS i i  ‰}t	t
| jjj|jjƒƒD ]"\}\}	}
|	jˆ|
j< |	||	j< qÖg g g   }}‰ g }t	|jƒD �]Œ\}}|j dd¡ dd¡}g g  }}tj| j| jd��ê |jD ]˜}|j d	¡d
 }ˆ| }t|| jtƒ�r”|d }n|}|j ||¡}| tt|jjƒ|¡}tj|| |d�}t|j|j ¡ ƒ}|  t!||d�¡ �q\|j"D ]<}|jjdk�r.|  t!tdt#t$ƒd�dd�¡ nt%dƒ‚�qüW 5 Q R X ‡fdd„|j&D ƒ}ˆ  '|¡ | '|¡ | '|¡ t(||jt)|ƒt)|ƒt)|ƒt*ƒ d�}|  |¡ �qtj| j| jd�� ‡ fdd„| jjjD ƒ}W 5 Q R X g }|j+D �]"}t,|j&ƒ}t,|j-ƒ}g } g }!|j.dk	�r t,|j.ƒ} |j/�r2t,|j/ƒ}!|j}d|k�rP|j dd¡}t
| jjj|jjjjƒD �]n\}"}
t|"jtƒ�r¢|"j 0¡ �s¢| |
j|"jd ¡}n¬|"j 0¡ �r0t|"jtƒ�sø|"jt1t2j3ƒk�ràt| jjƒt4k�søt5| jj› d|"j› �ƒ‚dD ]0}#|
j|# }$|$|k�rü|"j|# }| |$|¡}�qün|"j|
jk�rN| |
j|"j¡}t	|ƒD ]*\}}%|%|
jk�rV|"j||< |"j||< �qVt	| ƒD ] \}}%|%|
jk�rŠ|"j| |< �qŠt	|!ƒD ] \}}%|%|
jk�r´|"j|!|< �q´�qh|  t6|t)|ƒt)|ƒt)| ƒt)|!ƒ|j7|j8d�¡ �qèt9| jjjj:| d|j;› | jjj<› �||t)t*|ƒƒt)t*|ƒƒdt*ƒ |g ddd�dfS )zÀGenerate DifferentiabilityInfo for out-place foreach function, return the existing one for in-place.

    The second return value indicates whether the info is generated in this function.
    N©NFFr[   zgrads[i]Úresultz	result[i])Ú!use_const_ref_for_mutable_tensorsZuse_ilistref_for_tensor_listsrG   r   z[i]©Zbinds)r   r   )r4   r^   Ú c                    s   g | ]}ˆ | ‘qS r#   r#   )rg   Úvar)Úmap_refarg2foreachargr#   r$   Ú
<listcomp>¸  s     z.gen_foreach_derivativeinfo.<locals>.<listcomp>)r&   r'   r(   r)   r*   r+   c                    s4   g | ],}|j ˆ krt|j tj||j d �|dd�‘qS )r†   N)r4   r   ÚargumentÚdefault)r4   r   r   Úargument_type)rg   ru   )Úall_var_namesr#   r$   rŠ   Ê  s   
ùüz, )Ú_pÚ_t©r&   r(   r-   r.   r/   r0   r1   ZForeachr#   rK   T)=Úitemsr}   r5   Úkindr   rw   r"   r4   rx   Ú	enumeraterz   r{   r|   r7   r&   Úreplacer   Zparametrizer…   Zpart_of_structured_groupr)   r   rL   Ú
isinstancer^   r   r   r   r   r�   r   Zremove_const_refÚappendr   r*   r   r   ÚRuntimeErrorr(   Úextendr%   ÚtupleÚsetr8   Úlistr-   r.   r/   Úis_tensor_liker   r   ZTensorÚ_foreach_with_tensor_overloadÚAssertionErrorr,   r0   r1   r3   rn   r6   Zoverload_name)&r   r€   r�   r‚   Zref_diff_inforq   Ú	diff_infoZmap_name2argÚiru   rv   r9   r:   Zmodified_derivative_formulasrV   Zmodified_formular)   r*   Z	ref_inputZref_input_jit_nameZmapped_nameZmapped_exprZnew_exprr   Zcanonical_nctypeZ
ref_outputr(   Zmodified_derivativer=   r8   Zfw_derivativer-   r.   r/   Zforeach_argÚsuffixZ	curr_exprr4   r#   )rŽ   r‰   r$   Úgen_foreach_derivativeinfoY  s`   
ÿþý

þÿ ÿ
þ

 ÿ ÿ
ÿ
 ÿüÿ	


úþ
ù





þ
ÿþ ÿÿþý


 ÿ
ùÿ


óðr£   )Únative_functionsÚdifferentiability_infosrA   c                    s  dd„ ˆ   ¡ D ƒ‰dd„ ˆ   ¡ D ƒ‰ttttttf  tf dœ‡ ‡‡fdd„}g }| D �]´}||ƒ\}}|j 	¡ t
jkrÌ|dk	rÌ| ¡ D ]@}|jD ]4}d|jkr”|jD ]}	d	|	jks¨td
|j› �ƒ‚q¨q”qŠ|sæ| t|ddd�¡ qXi }
|  ¡ D �]\}}|j�sg |
|< qò|j}|j 	¡ t
jk�rðt|jƒdk�s:t‚|jd }|j}tttdœdd„}t t d¡|¡�r |�rŒtd|jj› d�ƒ‚n||dƒ}||dƒ}tt tdœdd„}t t d¡||¡}|j}t t d¡|¡�rô|�rð|d nd}|�s¤d}d}d}d}t  d|¡}|�rZ| !d¡| !d¡ }}ttdœdd „}||ƒ}|�oX||jk}|�r”|dk	�snt‚|dk	�s|t‚d!|› d"|› d#|› �}nd$|› d#|› �}tt t d%¡|¡ƒ�pÐtt t d&¡|¡ƒ}t"|d|j#|j$||| d'�g}||
|< qò| t|||
d�¡ qX|S )(zÄSets the "derivative" key on declarations to matching autograd function
    In-place functions will use the out-of-place derivative definition if there
    is no in-place specific derivative.
    c                 S   s,   i | ]$\}}|  ¡ tjkr|jd d�|“qS ©T©Zstrip_default©r“   r   Z
functionalÚ	signature©rg   ZschemaÚ	info_dictr#   r#   r$   Ú
<dictcomp>:  s   þ
 z0match_differentiability_info.<locals>.<dictcomp>c                 S   s,   i | ]$\}}|  ¡ tjkr|jd d�|“qS r¦   r¨   rª   r#   r#   r$   r¬   ?  s   þ
 rl   c                    s  d| j kr| j ¡ tjkrdS | jˆ kr6ˆ | j dfS | jjdd�}|ˆkr`t| ƒs`ˆ| dfS d| j kr®|ˆkr®ˆ| }tdd„ | ¡ D ƒƒr¦t	dt
| jƒ› d	�ƒ‚|dfS t| ƒ�r| jˆ ksÆt	‚t| ˆˆƒ\}}|d krâdS d
|i}|�r|ˆ | j< |ˆ| j< ||fS dS )NÚ	generatedrƒ   Tr§   Fc                 s   s"   | ]}t d d„ |jD ƒƒV  qdS )c                 s   s   | ]}d t |jjƒkV  qdS )rD   N)r"   r   r4   )rg   Zinptr#   r#   r$   rh   b  s     zLmatch_differentiability_info.<locals>.find_info.<locals>.<genexpr>.<genexpr>N)ri   r9   rf   r#   r#   r$   rh   a  s   ÿzBmatch_differentiability_info.<locals>.find_info.<locals>.<genexpr>zzAttempted to convert a derivative formula for a mutable operator
 to be used by automatically by its functional variant ("zV").
 this is not currently supported (we'd need to fix up the formula in the codegen).r~   )Útagsr5   r“   r   Úoutr©   rp   ri   rj   rŸ   r"   r£   )rN   Zf_sigr«   r    Zis_generatedZdiff_info_dict©r¥   r€   r�   r#   r$   Ú	find_infoE  s@    
þ
þý
ý

z/match_differentiability_info.<locals>.find_infoNrD   Zstrides_or_errorz`Calling '.strides()' in the 'self' derivative formula of an in-place function is not supported: )r5   rQ   rc   rJ   r   )r&   ÚpostfixrA   c                    s2   t t tdœ‡ fdd„}t t dˆ › �¡|| ¡S )N©ÚmrA   c                    s   |   d¡› dˆ › |   d¡› �S )NrJ   Zoriginal_selfrH   ©Úgroup©r´   ©r²   r#   r$   Úrepl¹  s    zSmatch_differentiability_info.<locals>.replace_self_with_original_self.<locals>.replrD   )r   r"   rS   Úsubr   rU   )r&   r²   r¹   r#   r¸   r$   Úreplace_self_with_original_self¸  s    zEmatch_differentiability_info.<locals>.replace_self_with_original_selfÚself_pzThe formula for "zš" is using the original value of self that is being modified inplace. This would lead to wrong forward gradients. Please use "result" in the formula only.r�   r�   r³   c                 S   s   |   d¡› d|   d¡› �S )NrJ   r¼   rH   rµ   r·   r#   r#   r$   r¹   Î  s    z*match_differentiability_info.<locals>.replr„   rC   Fzself_t.([\w]*)\((.*)\)rH   )ÚsrA   c                 S   s@   d}| D ]2}|dkr*|d8 }|dkr* dS |dkr|d7 }qdS )NrJ   ú)r   Fú(Tr#   )r½   ÚlevelÚchr#   r#   r$   Úcheck_parens_nest_level_gt_zeroð  s    
zEmatch_differentiability_info.<locals>.check_parens_nest_level_gt_zeroz"self_t_raw.defined() ? self_t_raw.z_(z) : z(self_t_raw.defined() ? self_t_raw.copy_(Zoriginal_self_pZoriginal_self_tr‘   )%r’   r   r
   r   r   r"   r3   r2   r5   r“   r   rw   rj   r7   r(   r)   r   rŸ   r—   rb   r8   rB   r&   rS   rT   r   rU   r˜   r4   r   rº   r/   Ú	fullmatchr¶   r,   r-   r.   )r¤   r¥   r±   r„   rN   r«   Zis_exact_matchrQ   rV   Zsaved_inputZfw_derivative_dictÚkeyr8   Zfw_infor&   r»   r¹   Zrequired_primalsZis_single_method_on_self_tZdirectly_do_inplaceZop_nameZbetween_parensÚmatchrÂ   r0   r#   r°   r$   Úmatch_differentiability_info1  sÂ    	þþþ8




ÿ
  ÿÿÿ
ÿ	

ÿÿÿÿþùÿ
  ÿÿrÆ   )r4   r^   rQ   rA   c                 C   s   |  ¡ o|d kp| |jkS re   )r�   r>   )r4   r^   rQ   r#   r#   r$   Úis_differentiable&  s    ÿrÇ   )rd   rÄ   rA   c           	         sø   | j }| jr| j| nd ‰ dd„ tt |¡|j jƒD ƒ}ˆ rBˆ jnd }|d k	rÆt|ƒt|ƒkr|tdt|ƒ› dt|ƒ› d�ƒ‚g }d|kr |j  	¡ t
jkr tdƒ‚t||ƒD ]\}}|rª| |¡ qª|S tt‡ fdd	„|ƒƒ}tˆ ƒrð|d d
… S |S d S )Nc              	   S   s.   g | ]&\}}t ||jtj|d d� ¡ d�‘qS )T)Zsymint)r4   r^   r_   )ra   r^   r   Úreturn_typer_   )rg   r4   Úretr#   r#   r$   rŠ   3  s   ûýz.gen_differentiable_outputs.<locals>.<listcomp>z(The length of output_differentiability (z)), does not match the number of outputs (z).FzXoutput_differentiability=False for inplace operation (version_counter won't get updated)c                    s   t | j| jˆ ƒS re   )rÇ   r4   r^   )ÚrrY   r#   r$   Ú<lambda>L  ó    z,gen_differentiable_outputs.<locals>.<lambda>rJ   )r5   rQ   rz   r   Zreturn_namesZreturnsr?   rB   r˜   r“   r   rw   r—   rœ   Úfilterr\   )	rd   rÄ   rN   Úoutputsr?   Zdifferentiable_outputsZdifferentiableÚoutputZ candidate_differentiable_outputsr#   rY   r$   Úgen_differentiable_outputs.  s4    úÿÿÿrÐ   )r~   )r~   )5rS   Údataclassesr   Útypingr   r   r   r   r   r   r	   r
   Ztorchgenr   Ztorchgen.apir   Ztorchgen.api.typesr   r   r   r   Ztorchgen.modelr   r   r   r   r   r   r   r   Ztorchgen.utilsr   r   r%   r,   r3   r"   r2   rW   rZ   r\   r]   ra   rb   rk   rp   rx   rž   r}   r£   rÆ   rÇ   rÐ   r#   r#   r#   r$   Ú<module>   sz   ((
k
	1ý øÿÿ÷ Zý w  þ	 ÿ þ