U
    ªÊ¹jæþ ã                   @   sì  U d dl Z d dlZd dlZd dlmZ d dl mZmZ d dlmZm	Z	 d dl
mZmZmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlm  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% d d	l&m'Z'm(Z(m)Z)m*Z* d d
l+m,Z,m-Z- d dl.m/Z/m0Z0 ej1j2Z2g Z3ee4 e5d< ej6j7j8Z8G dd„ deƒZ9�dÖeej:e;dœdd„Z<ee<ej:j=dd�Z>ee<ej:j=d�Z?ee<ej:j@d�ZAeeBedœdd„ZCe!e8jDƒe?eedœdd„ƒƒZDe!e8jEƒe?eedœdd„ƒƒZEe!e8jFƒe?eeeGeGdœdd „ƒƒZFe!e8jHƒe?eeGeGeGe;ed!œd"d#„ƒƒZHe!e8jIjJgƒd$d%„ ƒZKe!e8jIjgƒed&œd'd(„ƒZLe!e8jMƒe?eed)œd*d+„ƒƒZMe!e8jNƒe?eed,œd-d.„ƒƒZNe!e8jOƒeeeGeGd/œd0d1„ƒZOe!e8jPƒe?eed)œd2d3„ƒƒZPe!e8jQƒe?eeed4œd5d6„ƒƒZQe!e8jRƒeeeGd7œd8d9„ƒZRe!e8jSƒe?eeeGe;d:œd;d<„ƒƒZSe!e8jTƒe?�d×eee4d>œd?d@„ƒƒZTe!e8jUƒe?eedAœdBdC„ƒƒZUe!e8jVƒe?eed)œdDdE„ƒƒZVe!e8jWƒe?eeed4œdFdG„ƒƒZWe!e8jXƒeeedHœdIdJ„ƒZXe!e8jYƒeeeeeef dKœdLdM„ƒZYe!e8jZƒe8jZj[ \e2j]¡e?�dØeeeGeGe;eej^ edNœdOdP„ƒƒƒZZe!e8j_ƒe8j_j[ \e2j]¡e?�dÙeeeGeGe;eej^ edNœdQdR„ƒƒƒZ_e!e8j`ƒe?eeeeGeGe;e;edSœdTdU„ƒƒZ`e!e8jaƒe?eeeedVœdWdX„ƒƒZaeeBdYœdZd[„Zbejcd\œd]d^„Zde!e8jeƒe?e9jfjgfeeeBed_œd`da„ƒƒZee!e8jhƒe?eeeeBdbœdcdd„ƒƒZhe!e8jiƒe?e9jfjgdefeeeBeGdfœdgdh„ƒƒZie!e8jjj[ƒe?eeeeBeGdiœdjdk„ƒƒZje!e8jjjkƒe?eeeeBeGedlœdmdn„ƒƒZle!e8jmj[ƒe?eeeeBeGdoœdpdq„ƒƒZme!e8jmjnƒe?eeeeBeGedrœdsdt„ƒƒZoeeeee eBeBeeduœdvdw„Zpe!e8jqƒe?eeeBedxœdydz„ƒƒZqe!e8jrƒeeeee eBeBeeduœd{d|„ƒZre!e8jsƒeeeee eBeBeeduœd}d~„ƒZse!e8jtƒe?de9jfjgfeeee eBedœd€d�„ƒƒZte!e8juƒe?de9jfjgfeeeee eBed‚œdƒd„„ƒƒZue!e8jvƒe*ƒ e?e9jfjgfeeeBed…œd†d‡„ƒƒƒZve!e8jwƒe?e9jfjgfeeeeBedˆœd‰dŠ„ƒƒZwe!e8jxƒ�dÚeeeGdŒœd�dŽ„ƒZxe!e8jyƒeeed�œd�d‘„ƒZye!e8jzƒeeeB eBeBeBeBd’œd“d”„ƒZze!e8j{jƒ�dÛeeBeeB eeB eBd–œd—d˜„ƒZ|e!e8j}ƒeeeB eBeBd™œdšd›„ƒZ}e!e8j~ƒeeeB eBeBeBdœœd�dž„ƒZ~eeejcdŸœd d¡„Ze!e8j€ƒe>eeeBejcd¢œd£d¤„ƒƒZ€e!e8j�ƒe>eeeBejcd¢œd¥d¦„ƒƒZ�d§d¨„ Z‚e!e8jƒƒe*ƒ e?eeeB eeB eeB eeB ed©œdªd«„ƒƒƒZƒe!e8j„ƒe*ƒ e?eeeB eeB eeB eeB eeB ed¬œd­d®„ƒƒƒZ„e!e8j…ƒeeeGd¯œd°d±„ƒZ…e!e8j†ƒeeeB eBeBeBed²œd³d´„ƒZ†e!e8j‡j[ƒe?�dÜeeeeG edµœd¶d·„ƒƒZ‡e!e8jˆƒe8jˆj[ \e2j‰¡e8jˆj[ \e2jŠ¡eeGee; d¸œd¹dº„ƒƒƒZˆe!e8j‹ƒeeGee; d¸œd»d¼„ƒZ‹e!e8jŒƒe*ƒ eeBe;d½œd¾d¿„ƒƒZŒe!e8j�ƒe*ƒ eeBe;d½œdÀdÁ„ƒƒZ�e!e8jŽjƒ�dÝeeeGedÂœdÃdÄ„ƒZ�e!e8jŽjJƒ�dÞeeGeGedÂœdÅdÆ„ƒZ�e!e8j‘ƒ�dßeeeBe;e;edÈœdÉdÊ„ƒZ‘e!e8j’ƒeeeBeBe;dËœdÌdÍ„ƒZ’eeB dÎœdÏdÐ„Z“e!e8j”e8j•gƒ�dàeeeB eBee dÑœdÒdÓ„ƒZ”e!e8j–je8j—jgƒ�dáeeBeBeedÔf dÕœdÖd×„ƒZ–e!e8j˜ƒe*ƒ e?�dâeeeeBeBdØœdÙdÚ„ƒƒƒZ˜e!e8j™ƒe*ƒ e?�dãeeeeBeBe;dÛœdÜdÝ„ƒƒƒZ™e!e8jšƒe*ƒ e?�däeeeeBeBdÞœdßdà„ƒƒƒZše!e8j›ƒe?eeeeee eBeBeBeBee; eee ee ee f dáœdâdã„ƒƒZ›ee ee däœdådæ„Zœe!e8j�ƒeeeeB eeee ee ee; eee ee ee f dçœ	dèdé„ƒZ�eee ee ee ee e;eGeGe;eeeeee ee f dêœ
dëdì„Zže!e8jŸƒeee ee ee ee e;eGeGeeeef díœ	dîdï„ƒZŸe8jŸj[ \e2jŠ¡e8jŸj[ \e2j‰¡eee ee ee ee e;eGeGeeeef díœ	dðdñ„ƒƒZ e8j¡j[ \e2j‰¡�dåee dòœdódô„ƒZ¢e!e8j£j[ƒeee ee eeeGeGeeeef dõœdöd÷„ƒZ£e!e8j¤j[ƒeee ee eee;eGeGeeeef díœ	dødù„ƒZ¤e!e8j¤j¥ƒeee ee e;eGeGeeeef dúœdûdü„ƒZ¦e!e8j§j[ƒeee ee eee;eGeGeeeeeef díœ	dýdþ„ƒZ§e!e8j¨ƒe?�dædÿ�d „ƒƒZ©�d�d„ Zª�d�d„ Z«e!e8j¬ƒdddddd�dœeeejc eej­ e;e;eej® �dœ�d�d„ƒZ¬e!e8j¯e8j°e8j±gƒ�d	�d
„ ƒZ²e8j³j[ \e2jŠ¡e!e8j³ƒeeee ee ee e;eGeG�dœ�d�d„ƒƒZ³�d�d„ Z´e!e8jµƒeeee ee ee ee ee e;eGee; eeee ee f �dœ�d�d„ƒZµe!e8j¶ƒeeeee ee ee ee eGe�dœ	�d�d„ƒZ¶e!e8j·ƒe?eeeBeBf �dœ�d�d„ƒƒZ¸e!e8j¹ƒd•�dœe$eBe$e$e#�dœ�d�d„ƒZ¹e!e8jºƒe*ƒ d•�dœe$eBe$e$e#�dœ�d�d„ƒƒZºd•�dœe$eBe$e$e;e#�dœ�d �d!„Z»e!e8j¼ƒe$eBe$e$�d"œ�d#�d$„ƒZ¼e!e8j½ƒe*ƒ e$eBe$e$�d"œ�d%�d&„ƒƒZ½e$eBe$e$e;�d'œ�d(�d)„Z¾e!e8j¿ƒe*�d*�d+ƒe?eeeef d)œ�d,�d-„ƒƒƒZ¿e!e8jÀƒ�dçeee;eBeGf ee;eBeGf �d/œ�d0�d1„ƒZÀe!e8jÁƒ�dè�d2�d3„ƒZÁ�d4�d5„ ZÂ�d6�d7„ ZÃe!e8jÄjÅƒe8jÄjÅ \e2j‰¡e8jÄjÅ \e2jŠ¡�d8�d9„ ƒƒƒZÆe!e8jÇjÅƒe8jÇjÅ \e2j‰¡e8jÇjÅ \e2jŠ¡�d:�d;„ ƒƒƒZÈe!e8jÉjÅƒe8jÉjÅ \e2j‰¡e8jÉjÅ \e2jŠ¡�d<�d=„ ƒƒƒZÊ�d>�d?„ ZËe!e8jÄj[ƒe8jÄj[ \e2jŠ¡e?�déeeeB eeG e�d@œ�dA�dB„ƒƒƒZÄe!e8jÇj[ƒe8jÇj[ \e2jŠ¡e?�dêeeeB eeG eeG e�dCœ�dD�dE„ƒƒƒZÇe!e8jÉj[ƒe8jÉj[ \e2jŠ¡e?�dëeeeB eeG eeG eeG e�dFœ�dG�dH„ƒƒƒZÉ�dI�dJ„ ZÌ�dK�dL„ ZÍ�dM�dN„ ZÎ�dO�dP„ ZÏ�dì�dQ�dR„ZÐ�dS�dT„ ZÑ�dU�dV„ ZÒ�dí�dW�dX„ZÓ�dî�dY�dZ„ZÔ�d[�d\„ ZÕe!e8jÖj×ƒe8jÖj× \e2j‰¡e8jÖj× \e2jŠ¡�d]�d^„ ƒƒƒZØe!e8jÙj×ƒe8jÙj× \e2j‰¡e8jÙj× \e2jŠ¡�d_�d`„ ƒƒƒZÚe!e8jÙjÛƒe8jÙjÛ \e2j‰¡e8jÙjÛ \e2jŠ¡�da�db„ ƒƒƒZÜe!e8jÖjÛƒe8jÖjÛ \e2j‰¡e8jÖjÛ \e2jŠ¡�dc�dd„ ƒƒƒZÝ�de�df„ ZÞ�dï�dg�dh„Zß�dð�di�dj„Zà�dk�dl„ Záe!e8jâj×ƒe8jâj× \e2j‰¡e8jâj× \e2jŠ¡�dm�dn„ ƒƒƒZãe!e8jâjÛƒe8jâjÛ \e2j‰¡e8jâjÛ \e2jŠ¡�do�dp„ ƒƒƒZä�dq�dr„ Zå�ds�dt„ Zæe!e8jçjÛƒe8jçjÛ \e2j‰¡e8jçjÛ \e2jŠ¡�du�dv„ ƒƒƒZèe!e8jçj×ƒe8jçj× \e2j‰¡e8jçj× \e2jŠ¡�dw�dx„ ƒƒƒZée!e8jêjÅƒe8jêjÅ \e2j‰¡e8jêjÅ \e2jŠ¡�dy�dz„ ƒƒƒZëe!e8jìjÅƒe8jìjÅ \e2j‰¡e8jìjÅ \e2jŠ¡�d{�d|„ ƒƒƒZíe!e8jìj[ƒe8jìj[ \e2jŠ¡e?�dñeeeB e;eeG eeG e�d}œ�d~�d„ƒƒƒZìe!e8jîj[ƒeee;�d€œ�d��d‚„ƒZîe!e8jïe8jðgƒ�dƒ�d„„ ƒZïe!e8jñgƒ�d…�d†„ ƒZòeeee eBeBeeef �d‡œ�dˆ�d‰„Zóe!e8jôƒeeee eBeBeeef �d‡œ�dŠ�d‹„ƒZôe!e8jõƒeeee eBeBeeef �d‡œ�dŒ�d�„ƒZõeeGe�dŽœ�d��d�„ZöeeGe�dŽœ�d‘�d’„Z÷ee%�d“œ�d”�d•„Zøe%ee�d–œ�d—�d˜„Zùee e�d™œ�dš�d›„ZúeBe;ejcej­�dœœ�d��dž„ZûeeBeBe;�dŸœ�d �d¡„ZüeeBeBeBe;�d¢œ�d£�d¤„ZýeeeB e;�d¥œ�d¦�d§„ZþeeeB e;�d¥œ�d¨�d©„Zÿe!e8�j ƒe?eeeB e;�d¥œ�dª�d«„ƒƒ�Z e!e8�jƒe?�dòeeeBeBe;e�d¬œ�d­�d®„ƒƒ�Ze!e8�jƒe*ƒ e?�d¯�d°„ ƒƒƒ�Ze!e8�jƒe*ƒ e?�d±�d²„ ƒƒƒ�Ze!e8�jƒdde9jfjgf�d³�d´„ƒ�Zejeje;�dµœ�d¶�d·„�Ze8�jj[ \e2j‰¡e*ƒ �d¸�d¹„ ƒƒ�Ze!e8�jj[ƒe?�dóeeeBeBf e;eeG eeG e�dºœ�d»�d¼„ƒƒ�Ze!e8�jjÅƒe8�jjÅ \e2j‰¡e8�jjÅ \e2jŠ¡e*ƒ e?�dôeeeeBeBf  e;eeeGeGf  e�d½œ�d¾�d¿„ƒƒƒƒƒ�Z	e!e8�j
ƒe*�dÀ�dÁƒdd�dÂœ�dÃ�dÄ„ƒƒ�Z
e!e8�jƒe*ƒ �dõdd\œ�dÅ�dÆ„ƒƒ�Ze!e8�jj[e8�jjngƒe*ƒ de�jdd�dÇœe#eejc e�jeej­ e;�dÈœ�dÉ�dÊ„ƒƒ�Ze!e8�j�jgƒde�jdd�dÇœe#e#eejc e�jeej­ e;�dËœ�dÌ�dÍ„ƒ�Ze!e8�jƒe8�jj[ \e2jŠ¡e*ƒ d•d•de9jfjgfeee#e#ee eBe�dÎœ�dÏ�dÐ„ƒƒƒ�Ze!e8�jƒe8�jj[ \e2jŠ¡e*�d*�dÑƒeeeBeeef d…œ�dÒ�dÓ„ƒƒƒ�Z�dÔ�dÕ„ �Z�ee8�je8�jƒ �ee8�je8j˜ƒ �ee8�je8jšƒ �ee8�je8�jƒ �ee8�je8jIƒ �ee8�je8�jƒ �ee8�je8jPƒ �ee8�je8�j ƒ �ee8�j!e8jMƒ �ee8�j"e8�j#ƒ �ee8�j$e8�j%ƒ �ee8�j&e8�j'ƒ �ee8�j(e8�j)ƒ �ee8�j*e8�j+ƒ �ee8�j,e8�j-ƒ �ee8�j.e8�j/ƒ �ee8�j0e8�j1ƒ �ee8�j2e8�j3ƒ �ee8�j4e8�j5ƒ �ee8�j6e8�j7ƒ �ee8�j8e8�j9ƒ �ee8�j:e8�j;ƒ �ee8�j<e8�j=ƒ �ee8�j>e8�j?ƒ �ee8�j@e8jVƒ dS (ö  é    N)ÚEnum)ÚpartialÚreduce)ÚchainÚproduct)ÚCallableÚcastÚIterableÚListÚOptionalÚTupleÚUnion)Ú	sym_floatÚsym_intÚTensor©Úregister_decomposition)ÚIntLikeÚ
NumberTypeÚ
TensorLikeÚTensorSequenceType)Ú_maybe_convert_to_dtypeÚ_maybe_resize_outÚ_safe_copy_outÚout_wrapper)Úexpect_trueÚ	guard_int)Útree_flattenÚtree_mapÚ__all__c                   @   s   e Zd ZdZdZdZdS )Ú	Reductionr   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚNONEÚMEANÚSUM© r)   r)   ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_decomp/decompositions.pyr    "   s   r    F)ÚfÚtype_promotionÚcompute_dtype_onlyc                    s   t  ˆ¡‡ ‡‡fdd„ƒ}|S )Nc                     sr   dd„ t | |fƒd D ƒ}tj|dˆiŽ\‰ ‰‡ fdd„}‡fdd„}ˆt|| ƒt||ƒŽ}ˆrd|S t||ƒS d S )	Nc                 S   s   g | ]}t |tƒr|‘qS r)   )Ú
isinstancer   ©Ú.0Úxr)   r)   r*   Ú
<listcomp>2   s    
 z-type_casts.<locals>.inner.<locals>.<listcomp>r   Útype_promotion_kindc                    s   t | tƒr|  ˆ ¡S | S d S ©N©r.   r   Úto©r1   ©Úcomputation_dtyper)   r*   Úincrease_prec:   s    

z0type_casts.<locals>.inner.<locals>.increase_precc                    s   t | tƒr|  ˆ ¡S | S d S r4   r5   r7   )Úresult_dtyper)   r*   Údecrease_prec@   s    

z0type_casts.<locals>.inner.<locals>.decrease_prec)r   ÚutilsÚelementwise_dtypesr   )ÚargsÚkwargsZ	flat_argsr:   r<   Úr©r-   r+   r,   )r9   r;   r*   Úinner0   s    ÿÿÿ
ztype_casts.<locals>.inner)Ú	functoolsÚwraps)r+   r,   r-   rC   r)   rB   r*   Ú
type_casts+   s    rF   T)r,   r-   )r,   )r1   ÚdimÚreturnc                 C   s$   t ||  ¡  ƒD ]}|  d¡} q| S )Néÿÿÿÿ)ÚrangerG   Ú	unsqueeze)r1   rG   Ú_r)   r)   r*   Ú_unsqueeze_to_dim]   s    rM   ©Úout_gradÚyc                 C   s   | d||    ¡  S ©Nr!   ©Zconj_physicalrN   r)   r)   r*   Útanh_backwardc   s    rS   c                 C   s   | |d|    ¡  S rQ   rR   rN   r)   r)   r*   Úsigmoid_backwardi   s    rT   )rO   r1   ÚbetaÚ	thresholdc                 C   s.   ||   ¡ }t || |k| | | |d  ¡S ©Nç      ð?)ÚexpÚtorchÚwhere)rO   r1   rU   rV   Úzr)   r)   r*   Úsoftplus_backwardo   s    r]   )Úgrad_outputÚalphaÚscaleÚinput_scaleÚ	is_resultÚself_or_resultc           	      C   sf   || }|}|}|r6t  |dk| | ||  | | ¡S t  |dk| | | t  || ¡ | | ¡S d S ©Nr   )rZ   r[   rY   )	r^   r_   r`   ra   rb   rc   ZnegcoefZposcoefZ
negiptcoefr)   r)   r*   Úelu_backwardv   s    
ýýre   c                 C   s   t  | |¡S r4   )rZ   Z	full_like©ÚselfÚvaluer)   r)   r*   Úfill_scalar‘   s    ri   ©rh   c                    s(   t  ˆ  ¡ dk‡ fdd„¡ t | ˆ ¡S )Nr   c                      s   dˆ   ¡ › d�S )Nz@fill only supports 0-dimension value tensor but got tensor with z dimensions©rG   r)   rj   r)   r*   Ú<lambda>š   ó    zfill_tensor.<locals>.<lambda>)rZ   Ú_checkrG   ÚatenÚcopyrf   r)   rj   r*   Úfill_tensor–   s
    

þrq   )rg   rH   c                 C   s    t jt j| d dd�dd�d S ©Né   r   ©Úminé   ©Úmax©rZ   Úclamp©rg   r)   r)   r*   ÚhardsigmoidŸ   s    r|   ©r^   rg   c                 C   s   t  |dk|dk @ | d d¡S )Ng      Àg      @gUUUUUUÅ?ç        ©rZ   r[   r}   r)   r)   r*   Úhardsigmoid_backward¥   s
    ýr€   ©r^   rg   Zmin_valÚmax_valc                 C   s   t  ||k||kB d| ¡S ©Nr~   r   r�   r)   r)   r*   Úhardtanh_backward¯   s    r„   c                 C   s$   | t jt j| d dd�dd� d S rr   ry   r{   r)   r)   r*   Ú	hardswish¶   s    r…   )r^   rg   rH   c              
   C   s,   t  |dk dt  |dk| |d d  | ¡¡S )Néýÿÿÿr~   rs   ç      à?r   r}   r)   r)   r*   Úhardswish_backward¼   s
    ýrˆ   ©r^   rg   rV   c                 C   s   t  ||kd| ¡S rƒ   r   r‰   r)   r)   r*   Úthreshold_backwardÆ   s    rŠ   ©r^   rg   Únegative_slopeÚself_is_resultc                 C   s   t  |dk| | | ¡S rd   r   r‹   r)   r)   r*   Úleaky_relu_backwardË   s    rŽ   Únone)Úgradrg   Úapproximatec                 C   sî   d}d}d}|dkrž|| d }d}|| }|| }	||||	   }
t  |
¡}d| }d| }d| }d||  }|dd| |   }|| | }| ||  S |}|| d }ddt  || ¡  }|t  || d	 ¡ }| |||   S d S )
NgÍ;fž ö?gÍ;fž æ?gm›BP×ò?Útanhr‡   g÷Hmâä¦?r!   rs   g      à¿)rZ   r’   ÚerfrY   )r�   rg   r‘   ZM_SQRT2Z	M_SQRT1_2Z
M_2_SQRTPIZkBetaZkKappaZx_sqZx_cuberC   Z
tanh_innerÚleftÚrightZleft_derivativeZtanh_derivativeZinner_derivativeZright_derivativeZkAlphaZcdfZpdfr)   r)   r*   Úgelu_backwardÓ   s,    
r–   )r^   Úinputc                 C   s:   t  t |¡¡}t  |¡}|| d||   }| ||  S rQ   )rZ   r’   ÚFZsoftplusÚsigmoid)r^   r—   Zinput_tanh_softplusZinput_sigmoidÚoutr)   r)   r*   Úmish_backwardó   s    
r›   c                 C   s   | t  | ¡ S r4   )rZ   r™   r{   r)   r)   r*   Úsiluü   s    rœ   c                 C   s,   ddt  | ¡  }| | d|d|    S rQ   )rZ   rY   )r^   rg   r™   r)   r)   r*   Úsilu_backward  s    r�   )rg   ÚweightrH   c                 C   s   t  | dk| ||  ¡S rd   r   )rg   rž   r)   r)   r*   Ú_prelu_kernel	  s    rŸ   )r^   rg   rž   rH   c                 C   s4   t  |dk| ||  ¡}t  |dkd||  ¡}||fS )Nr   r~   r   )r^   rg   rž   Z
input_gradZweight_gradr)   r)   r*   Ú_prelu_kernel_backward  s    r    )rg   ÚnoiseÚlowerÚupperÚtrainingÚ	generatorrH   c           
      C   sl   |d kst ‚|rP| dk}t | ||¡}t || | | ¡}| t ||d¡¡ |S || d }	t | |	¡S d S ©Nr   r!   r"   )ÚAssertionErrorro   ÚuniformrZ   r[   Úcopy_Ú
leaky_relu)
rg   r¡   r¢   r£   r¤   r¥   Znot_positiverA   ÚoutputrŒ   r)   r)   r*   Úrrelu_with_noise  s    r¬   c              	   C   s   |   t| |||||ƒ¡S r4   )r©   r¬   )rg   r¡   r¢   r£   r¤   r¥   r)   r)   r*   Úrrelu_with_noise_0  s    r­   )r^   rg   r¡   r¢   r£   r¤   r�   rH   c                 C   s:   |r|| dkr|   |¡S || d }t | |||¡S d S )Ng�íµ ÷Æ°>r"   )Úmulro   rŽ   )r^   rg   r¡   r¢   r£   r¤   r�   rŒ   r)   r)   r*   Úrrelu_with_noise_backward>  s    
   ÿr¯   )r^   rg   ÚbufferrH   c                 C   sN   |dk }t  |dd¡}t  |dd¡}t  t  |¡ ¡}| |||d|     S )Nr   r!   rI   )rZ   r[   rY   Úabs)r^   rg   r°   Zin_negativeZ	max_derivÚsignr\   r)   r)   r*   Úlog_sigmoid_backwardR  s
    r³   ©ÚlossÚ	reductionc                 C   s4   |t jjkrt | ¡S |t jjkr,t | ¡S | S d S r4   )r    r'   rh   rZ   Úmeanr(   Úsumr´   r)   r)   r*   Úapply_loss_reduction^  s
    

r¹   ©Údtypec                 C   s4   | t jkrt jS | t jkr t jS | t jkr0t jS d S r4   )rZ   Z	complex32Zfloat16Z	complex64Zfloat32Z
complex128Zfloat64rº   r)   r)   r*   Úto_real_dtypeg  s    


r¼   )rg   Útargetr¶   rH   c                 C   s   | | d }t ||ƒS )Nr"   )r¹   )rg   r½   r¶   rµ   r)   r)   r*   Úmse_lossv  s    r¾   )r^   r—   r½   r¶   c                 C   s,   |t jjkrd| ¡  nd}|||  |  S )Nç       @)r    r'   rh   Únumel)r^   r—   r½   r¶   Únormr)   r)   r*   Úmse_loss_backward  s    rÂ   rX   )rg   r½   r¶   rU   c                 C   s<   | |   ¡ }t ||k d|d  | |d|  ¡}t||ƒS )Nr‡   r"   )r±   rZ   r[   r¹   )rg   r½   r¶   rU   rµ   r)   r)   r*   Úsmooth_l1_lossˆ  s    &rÃ   )r^   rg   r½   r¶   rU   c           	      C   sZ   |t jjkrd| ¡  nd}|| }t |¡}||  }t ||k || | |t |¡ ¡S rW   )r    r'   rh   rÀ   rZ   r±   r[   r²   )	r^   rg   r½   r¶   rU   rÁ   r1   Zabs_xZ	norm_gradr)   r)   r*   Úsmooth_l1_loss_backward•  s    

ýrÄ   )r^   rg   r½   r¶   rU   Ú
grad_inputc                 C   s*   t | ||||ƒ}t||jƒ t||dd�S ©NT)Z	copy_fromZcopy_toZexact_dtype)rÄ   r   Úshaper   )r^   rg   r½   r¶   rU   rÅ   Úresultr)   r)   r*   Úsmooth_l1_loss_backward_out¥  s    
rÉ   )r^   rg   r½   r¶   Údeltac              
   C   s`   |t jjkrd| ¡  nd}|| }t || k | |  | t ||k||  | || |  ¡¡S rW   )r    r'   rh   rÀ   rZ   r[   )r^   rg   r½   r¶   rÊ   rÁ   r1   r)   r)   r*   Úhuber_loss_backward´  s     ýrË   )r^   rg   r½   r¶   rÊ   rÅ   c                 C   s*   t | ||||ƒ}t||jƒ t||dd�S rÆ   )rË   r   rÇ   r   )r^   rg   r½   r¶   rÊ   rÅ   rÈ   r)   r)   r*   Úhuber_loss_backward_outÃ  s    
rÌ   )r^   rg   r½   rž   r¶   Úignore_indexÚtotal_weightrH   c                 C   sà   |  ¡ dk rdnd}|tjjkr(| | } | |¡}t ||k|d¡}t |¡}	t |	||d¡}	|	  ¡ |   ¡   krzdkrˆn n
|  |¡} |d k	rÆdd„ t	|  ¡ ƒD ƒ}
|j
d |
|< | |
¡}| | } t ||k| d¡} |	|  S )Nr"   r   r!   g      ð¿c                 S   s   g | ]}d ‘qS )r!   r)   ©r0   rL   r)   r)   r*   r2   è  s     z&_nll_loss_backward.<locals>.<listcomp>)rG   r    r'   rh   rK   rZ   r[   Ú
zeros_likeÚscatterrJ   rÇ   Úreshape)r^   rg   r½   rž   r¶   rÍ   rÎ   Úchannel_dimÚsafe_targetrÅ   Z	new_shaper)   r)   r*   Ú_nll_loss_backwardÒ  s     	

 

rÕ   )r^   rg   rG   rH   c           
      C   sª   |  ¡ dkstdƒ‚t |  ¡ |¡}| |¡}|d dksNtd|› d|› �ƒ‚|d }| |d|¡}| |||¡}t |¡}d| | | |  }	||  }tj||	g|d�S )Nr   z*glu does not support 0-dimensional tensorsr"   z.Halving dimension must be even, but dimension z	 is size rX   rk   )	rG   r§   r=   Úcanonicalize_dimÚsizeÚnarrowrZ   r™   Úcat)
r^   rg   rG   Zwrap_dimZnInZ	inputSizeZ	firstHalfZ
secondHalfZgradInputFirstHalfZgradInputSecondHalfr)   r)   r*   Úglu_backwardò  s    

ÿþ
ÿrÚ   c                 C   sx  d|  ¡   krdks"n tdƒ‚|  ¡ dks6tdƒ‚|  ¡ dkoL|  ¡ dk}|s€|jd |jd ks€td|j› d|j› d�ƒ‚| ¡ dksªtd	|j› d
| ¡ › d�fƒ‚|d ksÌ| ¡ |jd ksÌtdƒ‚|tjjk�r8|  ¡ dk�r8|   ¡ dk�r| jd |jd k�sdtd|jd › d|   ¡ › d| jd › �ƒ‚n,|   ¡ dk�rT|  ¡ dk�sdtd| j› �ƒ‚t| ||||||ƒS )Nr   r"   úinput tensor should be 1D or 2Dr!   ú;0D or 1D target tensor expected, multi-target not supportedúsize mismatch (got input: ú
, target: ú)ú:expected total_weight to be a single element tensor, got: z (z
 elements)rI   z<weight tensor should be defined either for all or no classesz7Expected a tensor of dimension 1 and tensor.size[0] == z but got: dimension z and tensor.size[0] == z7Expected a single element grad_output tensor, but got: )rG   r§   rÇ   rÀ   r    r&   rh   rÕ   )r^   rg   r½   rž   r¶   rÍ   rÎ   Úno_batch_dimr)   r)   r*   Únll_loss_backward  sP    
"
ÿþÿþþÿÿþ&$ÿ
ÿ
ÿ
þ      ÿrâ   c                 C   sÌ   |  ¡ dkstd|  ¡ › �ƒ‚|  ¡ dks<td|  ¡ › �ƒ‚|jd |jd krx|jd |jd krx|jd |jd ks�td|j› d	|j› �ƒ‚| ¡ dks¸td
|j› d| ¡ › d�ƒ‚t| ||||||ƒS )Né   zSonly batches of spatial inputs supported (4D tensors), but got input of dimension: rs   zUonly batches of spatial targets supported (3D tensors) but got targets of dimension: r   r"   r!   rÝ   rÞ   rà   z ( z, elements))rG   r§   rÇ   rÀ   rÕ   )r^   rg   r½   rž   r¶   rÍ   rÎ   r)   r)   r*   Únll_loss2d_backward1  s8    
ÿþ
ÿþÿþýüÿ      ÿrä   )rg   r½   rž   r¶   rH   c              	   C   s\   |d t  t  |  ¡|  dd¡¡ |t  t  | ¡|  dd¡¡  }|d k	rR|| }t||ƒS )Nr!   r)   iœÿÿÿ)rZ   ÚmaximumÚlog1pÚnew_fullÚlogr¹   )rg   r½   rž   r¶   rµ   r)   r)   r*   Úbinary_cross_entropyS  s    

 
ÿþré   )r^   rg   r½   rž   r¶   rH   c                 C   sR   d}| ||  t j|d|  |d� }|d k	r6|| }|tjjkrN|| ¡  }|S )Ngê-�™—q=r!   rt   )rZ   rz   r    r'   rh   rÀ   )r^   rg   r½   rž   r¶   ZEPSILONrÈ   r)   r)   r*   Úbinary_cross_entropy_backwardh  s    	"rê   )r—   r½   r¶   rH   c                 C   s    t  t  |  | ¡¡}t||ƒS r4   )rZ   ræ   rY   r¹   )r—   r½   r¶   rµ   r)   r)   r*   Úsoft_margin_lossz  s    rë   )r^   rg   r½   r¶   rH   c                 C   s6   ||  t  || ¡d  }|tjjkr2|| ¡  }|S rQ   )rZ   r™   r    r'   rh   rÀ   )r^   rg   r½   r¶   rÅ   r)   r)   r*   Úsoft_margin_loss_backward†  s    rì   r"   ©r—   ÚotherÚpc                 C   s   t j| | |d�S )N)rï   )ro   rÁ   rí   r)   r)   r*   Údist”  s    rð   )Úx1Úx2rH   c           	      C   sˆ   |   d¡ dd¡}tj|tjd�}|  d¡ dd¡}tj|tjd�}t |  d¡||gd¡}t |||gd¡}| |j¡}| 	d¡ 
¡ S )Nr"   rI   T©Úmemory_formatéþÿÿÿr   )Úpowr¸   rZ   Ú	ones_likeÚcontiguous_formatrÙ   r®   ÚmatmulÚmTÚ	clamp_minÚsqrt)	rñ   rò   Zx1_normZx1_padZx2_normZx2_padZx1_Zx2_rÈ   r)   r)   r*   Ú_euclidean_dist™  s    rý   )r^   Úinput_sizesrG   ÚstartÚendÚstepc                 C   s   |   |¡}t || ||||¡S r4   )Ú	new_zerosrZ   Zslice_scatter)r^   rþ   rG   rÿ   r   r  rÅ   r)   r)   r*   Úslice_backward¥  s    	
r  r!   )rg   rG   rÿ   r   r  c                 C   sB  |   ¡ }|dkrtdƒ‚t |   ¡ |¡}t|  ¡ ƒ}t|  ¡ ƒ}|dkrPtdƒ‚|d k	r\|nd}|d k	rl|ntj}	|dk r†||| 7 }|	dk rš|	|| 7 }	|dk r¨d}n||| kr¼|| }|	|k rÊ|}	n|	|| krÞ|| }	|  	¡ |||   }
|	| }|| d | ||< ||  |9  < | j
�r0tdƒ‚n|  |||
¡S d S )Nr   z,slice() cannot be applied to a 0-dim tensor.zslice step must be positiver!   z<Slice decomposition for quantized tensors aren't implemented)rG   ÚRuntimeErrorr=   rÖ   Úlistr×   ÚstrideÚsysÚmaxsizeÚstorage_offsetZis_quantizedÚNotImplementedErrorZ
as_strided)rg   rG   rÿ   r   r  ÚndimÚsizesÚstridesZ	start_valZend_valr	  Úlenr)   r)   r*   Úslice_forward²  s>    	ÿr  )r^   rþ   rG   Úindexc                 C   s   |   |¡}t || ||¡S r4   )r  rZ   Zselect_scatter)r^   rþ   rG   r  rÅ   r)   r)   r*   Úselect_backwardå  s    
r  )r^   rþ   ÚoffsetÚdim1Údim2c                 C   s   |   |¡}t || |||¡S r4   )r  rZ   Zdiagonal_scatter)r^   rþ   r  r  r  rÅ   r)   r)   r*   Údiagonal_backwardë  s    
r  ©r^   rÅ   Úinput_dtypec                 C   s   | j |kr| |¡}|S r4   )r»   r6   r  r)   r)   r*   Ú_cast_grad_to_input_dtypeó  s    

r  )r^   r«   rG   r  c                 C   s0   | | }||t j||dd�  }t| ||ƒ ¡ S ©NT©rG   Úkeepdim)rZ   r¸   r  Ú
contiguous)r^   r«   rG   r  Znew_grad_outputrÅ   r)   r)   r*   Ú_softmax_backward_dataû  s      ÿ
r  c                 C   s*   | t  |¡t j| |dd�  }t| ||ƒS r  )rZ   rY   r¸   r  )r^   r«   rG   r  rÅ   r)   r)   r*   Ú_log_softmax_backward_data  s      ÿ
r  c           
      C   sZ   | |d  ||d   }t tjtj|d�}|d||ƒ d¡}|d|| |ƒ d¡}	||	 S )z/Utility function to implement im2col and col2imr"   r!   ©r»   Údevicer   rI   )r   rZ   ÚarangeÚint64rK   )
Zinput_dZkernel_dZ
dilation_dZ	padding_dZstride_dr   Zblocks_dZ	arange_kwZblocks_d_indicesZkernel_gridr)   r)   r*   Ú _im2col_col2im_indices_along_dim  s
    r#  )r—   Úkernel_sizeÚdilationÚpaddingr  rH   c              	      s(  t  tˆƒdkdd„ ¡ t  tˆ ƒdkdd„ ¡ t  tˆƒdkdd„ ¡ t  tˆƒdkdd„ ¡ ddd	„}|ˆd
ƒ |ˆ dƒ |ˆ ddd� |ˆdƒ | j‰tˆƒ}t  |dkoÈtdd„ ˆdd … D ƒƒ‡fdd„¡ tdd„ tˆdd … ˆˆ ˆˆƒD ƒƒ‰t  tdd„ ˆD ƒƒ‡ ‡‡‡‡‡fdd„¡ |dk}|�s@|  d¡} | j\}}	}
}ˆ\}}ˆ\}}ˆ \}}ˆ\}}t|
||||| j	ƒ}t|||||| j	ƒ}t
 | ||||f¡}| d¡ d¡}|d d …d d …||f }| dddddd¡}| d¡}| d¡}| ||	| | || ¡}|�s$| d¡}|S ) Nr"   c                   S   s   dS )Nz"im2col(): only 2D kernel supportedr)   r)   r)   r)   r*   rl   4  rm   zim2col.<locals>.<lambda>c                   S   s   dS )Nz$im2col(): only 2D dilation supportedr)   r)   r)   r)   r*   rl   5  rm   c                   S   s   dS )Nz#im2col(): only 2D padding supportedr)   r)   r)   r)   r*   rl   6  rm   c                   S   s   dS )Nz"im2col(): only 2D stride supportedr)   r)   r)   r)   r*   rl   7  rm   Tc                 S   s<   |rt dd„ | D ƒƒnt dd„ | D ƒƒ}t |dd„ ¡ d S )Nc                 s   s   | ]}|d kV  qdS ©r   Nr)   ©r0   rï   r)   r)   r*   Ú	<genexpr>:  s     z1im2col.<locals>.check_positive.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS r'  r)   r(  r)   r)   r*   r)  :  s     c                   S   s   dS )Nz<{param_name} should be greater {'than' zero, but got {param}r)   r)   r)   r)   r*   rl   <  rm   z0im2col.<locals>.check_positive.<locals>.<lambda>©ÚallrZ   rn   ©ÚparamÚ
param_nameÚstrictÚcondr)   r)   r*   Úcheck_positive9  s
    ( ÿzim2col.<locals>.check_positiver$  r%  r&  F©r/  r  ©rs   rã   c                 s   s   | ]}|d kV  qdS r'  r)   ©r0   Údr)   r)   r*   r)  G  s     zim2col.<locals>.<genexpr>r†   c                      s   dt ˆ ƒ› �S )NzmExpected 3D or 4D (batch mode) tensor for input with possible 0 batch size and non-zero dimensions, but got: ©Útupler)   ©rÇ   r)   r*   rl   H  rm   c                 s   s<   | ]4\}}}}}d |d|  ||d    d  |  V  qdS )r!   r"   Nr)   ©r0   rš   ÚpadZdilZkerÚstr)   r)   r*   r)  K  s   ÿrõ   c                 s   s   | ]}|d kV  qdS r'  r)   )r0   Úcr)   r)   r*   r)  R  s     c                      s6   dt ˆdd … ƒ› dˆ› dˆ › dˆ› dˆ› dˆ› d�S )	Nz!Given an input with spacial size rõ   ú, kernel_size=ú, dilation=ú
, padding=ú	, stride=z9, the calculated shape of the array of sliding blocks is z*, but its components must be at least one.r6  r)   ©r%  r$  Úoutput_sizer&  rÇ   r  r)   r*   rl   S  rm   rã   r   rI   r!   rs   é   )T)rZ   rn   r  rÇ   r+  r7  ÚziprK   r#  r   r˜   r:  Úpermuter×   rÒ   Úsqueeze)r—   r$  r%  r&  r  r1  r  Úbatched_inputZ	batch_dimrÓ   Zinput_hZinput_wÚstride_hÚstride_wÚ	padding_hÚ	padding_wÚ
dilation_hÚ
dilation_wÚkernel_hÚkernel_wZblocks_row_indicesZblocks_col_indicesZpadded_inputr«   Znum_blocks_rowZnum_blocks_colr)   rA  r*   Úim2col*  s„    




 
þ
    ÿþþ
     ÿ     ÿ

 
 ÿ
rP  )r—   rB  r$  r%  r&  r  rH   c              
      sÒ  t  tˆƒdkdd„ ¡ t  tˆƒdkdd„ ¡ t  tˆƒdkdd„ ¡ t  tˆƒdkdd„ ¡ t  tˆƒdkdd„ ¡ d$d	d
„}|ˆdƒ |ˆdƒ |ˆddd� |ˆdƒ |ˆdƒ | j‰tˆƒ}t  |dkoêtdd„ ˆdd … D ƒƒ‡fdd„¡ ˆd ˆd  }t  ˆd | dk‡‡fdd„¡ dd„ tˆˆˆˆˆƒD ƒ}	|	d |	d  ‰ t  ˆd ˆ k‡ ‡‡‡‡‡‡fdd„¡ t  ˆ dk‡ ‡‡‡‡‡‡fdd„¡ |dk}
|
�s¸|  d¡} | j‰ˆ\}}ˆ\}}ˆ\}}ˆ\}}ˆ\}}|  ˆd ˆd | gˆ |	 ¡} |  dddd dd!¡} t	|||||| j
ƒ}t|d ƒ}t	|||||| j
ƒ}d"d„ tˆˆƒD ƒ}|  ˆd ˆd tˆƒ g| ¡}d d ||f}tj||| dd#�}t || | | | f¡}|
�sÎ| d¡}|S )%Nr"   c                   S   s   dS )Nzonly 2D output_size supportedr)   r)   r)   r)   r*   rl   ˆ  rm   zcol2im.<locals>.<lambda>c                   S   s   dS )Nzonly 2D kernel supportedr)   r)   r)   r)   r*   rl   ‰  rm   c                   S   s   dS )Nzonly 2D dilation supportedr)   r)   r)   r)   r*   rl   Š  rm   c                   S   s   dS )Nzonly 2D padding supportedr)   r)   r)   r)   r*   rl   ‹  rm   c                   S   s   dS )Nzonly 2D stride supportedr)   r)   r)   r)   r*   rl   Œ  rm   Tc                 S   s<   |rt dd„ | D ƒƒnt dd„ | D ƒƒ}t |dd„ ¡ d S )Nc                 s   s   | ]}|d kV  qdS r'  r)   r(  r)   r)   r*   r)  �  s     z1col2im.<locals>.check_positive.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS r'  r)   r(  r)   r)   r*   r)  �  s     c                   S   s   dS )Nz9{param_name} should be greater than zero, but got {param}r)   r)   r)   r)   r*   rl   ‘  rm   z0col2im.<locals>.check_positive.<locals>.<lambda>r*  r,  r)   r)   r*   r1  Ž  s
    ( ÿzcol2im.<locals>.check_positiver$  r%  r&  Fr2  r  rB  )r"   rs   c                 s   s   | ]}|d kV  qdS r'  r)   r4  r)   r)   r*   r)  �  s     zcol2im.<locals>.<genexpr>rõ   c                      s   dt ˆ ƒ› �S )NzmExpected 2D or 3D (batch mode) tensor for input with possible 0 batch size and non-zero dimensions, but got: r6  r)   r8  r)   r*   rl   ž  rm   r   r!   c                      s   dˆd › dˆ › �S )Nz|Expected size of input's first non-batch dimension to be divisible by the product of kernel_size, but got input.shape[-2] = rõ   z and kernel_size=r)   r)   )r$  rÇ   r)   r*   rl   ¤  rm   c                 S   s:   g | ]2\}}}}}d |d|  ||d    d  |  ‘qS ©r!   r"   r)   r9  r)   r)   r*   r2   ¨  s   ÿzcol2im.<locals>.<listcomp>rI   c                      s4   dˆ› dˆ› dˆ› dˆ› dˆ› dˆ › dˆd › d	�S ©
NzGiven output_size=r=  r>  r?  r@  z , expected input.size(-1) to be ú	 but got rI   Ú.r)   r)   ©ÚLr%  r$  rB  r&  rÇ   r  r)   r*   rl   ±  rm   c                      s4   dˆ› dˆ› dˆ› dˆ› dˆ› dˆ › dˆd › d	�S rR  r)   r)   rU  r)   r*   rl   ·  rm   rs   rã   rC  c                 S   s   g | ]\}}|d |  ‘qS )r"   r)   )r0   Úorï   r)   r)   r*   r2   Ó  s     ©Ú
accumulate)T)rZ   rn   r  rÇ   r+  rD  rK   rÒ   rE  r#  r   rM   r  Úprodro   Ú_unsafe_index_putr˜   r:  rF  )r—   rB  r$  r%  r&  r  r1  r  Zprod_kernel_sizeÚcolrG  Úout_hÚout_wrH  rI  rJ  rK  rL  rM  rN  rO  Zindices_rowZindices_colZoutput_padded_sizer«   Úidxr)   rU  r*   Úcol2im}  sœ    




 
þþ    ÿþ
þþ
"     ÿ
     ÿÿ
r`  )r^   Úmaskr`   c                 C   s$   | |  | ¡|  jt | ¡d�}|S )Nró   )Útype_asÚcloner=   Úsuggest_memory_format)r^   ra  r`   rA   r)   r)   r*   Únative_dropout_backwardà  s    ÿre  )r�   Ú
input_sizeÚ	dimensionr×   r  rH   c           	      C   sœ   t |ƒdkrt | d¡S t t |ƒ|¡}tj|| | jtjd�}| d||¡ 	¡ }|  
d|d ¡ 	||d ¡} |  |¡}d| |f }tj||| dd� ¡ S )Nr   ©r   r»   rI   r!   r4   TrX  )r  rZ   Zsqueeze_copyr=   rÖ   r!  r   Úint32ZunfoldÚflattenZmovedimr  ro   r[  r  )	r�   rf  rg  r×   r  rG   r_  rÅ   r  r)   r)   r*   Úunfold_backwardî  s    
rk  )r^   rg   ÚepsrH   c              	   C   sx   |d k	r>|}d| }t  t  ||k||k¡| |d|   d¡S t  t  |dk|dk¡| |d|   | dtdƒ¡¡S d S )NrX   r~   r)   Únan)rZ   r[   Úlogical_andrç   Úfloat)r^   rg   rl  ÚloÚhir)   r)   r*   Úlogit_backward   s    ýýrr  ©r—   rï   Útrainc                 C   s*   |r|dkrt  | ||¡d S |  ¡ S d S rd   )ro   Únative_dropoutrc  rs  r)   r)   r*   Údropout  s    rv  c                 C   st   |r\|dkr\|dkr.t  | ¡t j| t jd�fS t  | ¡|k}||  tdd|  ƒ }||fS | t j| t jd�fS d S )Nr   r!   rº   rX   )rZ   rÐ   ÚboolÚ	rand_likero  r÷   )r—   rï   rt  Z	bool_maskÚresr)   r)   r*   ru    s    ru  )r1   rG   Úhalf_to_floatc                 C   s˜   |   ¡ } |r| jtjkst‚tj| tjjd�\}}|  	|¡} |  
¡ dkrTt | ¡}ntj| |dd�}t | | ¡}|tj||dd� }|s”| 	|¡}|S ©N©r3   r   T)r  )r  r»   rZ   Úhalfr§   r=   r>   ÚELEMENTWISE_TYPE_PROMOTION_KINDÚDEFAULTr6   rÀ   rY   Úamaxr¸   )r1   rG   rz  r9   r;   ZunnormalizedÚx_maxrÈ   r)   r)   r*   Ú_softmax+  s      ÿ


r‚  c           	      C   sœ   |   ¡ } |r| jtjkst‚tj| tjjd�\}}|  	|¡} |  
¡ dkrN| }ntj| |dd�}| | }t tjt |¡|dd�¡}|| }|s˜| 	|¡}|S r{  )r  r»   rZ   r}  r§   r=   r>   r~  r  r6   rÀ   r€  rè   r¸   rY   )	r1   rG   rz  r9   r;   Zshiftedr�  Zshifted_logsumexprÈ   r)   r)   r*   Ú_log_softmaxB  s"     ÿ


rƒ  )rg   rî   r_   rH   c                 C   s   t j|| |d�S ©N©r_   ©rZ   Úsub©rg   rî   r_   r)   r)   r*   Úrsub_TensorZ  s    r‰  c                 C   s   t j|| |d�S r„  r†  rˆ  r)   r)   r*   Úrsub_Scalar_  s    rŠ  rI   )rž   ÚindicesÚpadding_idxÚscale_grad_by_freqÚsparserH   c                 C   sN   |   ¡ dkstdƒ‚|jdkrB|  d|¡}|jdkr>| d¡}|S | | S d S )Nr"   z'weight' must be 2-Dr!   r   )rG   r§   r  Zindex_selectrF  )rž   r‹  rŒ  r�  rŽ  rš   r)   r)   r*   Ú	embeddingd  s    


r�  )r^   r‹  Únum_weightsrŒ  r�  c                 C   sÂ   t j| t jjd�\}}|  |¡} t|tjƒ}|rp| |f¡}t 	|¡}t
j||g|dd�}|| }	| |	 d¡ } t||k| jƒ}
|  |
d¡}|  |f| j|jd …  ¡}t
j||g|dd� |¡S )Nr|  TrX  rI   r   )r=   r>   r~  r  r6   r   rZ   Úlongr  r÷   ro   r[  rK   rM   r  Úmasked_fillrÇ   )r^   r‹  r�  rŒ  r�  r9   r;   ÚcountsÚonesZgrad_weights_scalera  r�   Úgrad_weightr)   r)   r*   Úembedding_dense_backwardx  s(     ÿ


ÿÿr–  r7   c                 C   s   d}| D ]}||9 }q|S rQ   r)   )r1   rA   Úir)   r)   r*   rZ  –  s    
rZ  )rg   Úsplit_sizesrG   rH   c                 C   s�   t  tt|ƒ| j| kdd„ ¡ t|ƒ}g }d}t|ƒD ]R}|| }t  |dkdd„ ¡ t|| | j| kƒ | 	|  
|||¡¡ ||7 }q8|S )Nc                   S   s   dS )NzDSplit sizes don't add up to the tensor's size in the given dimensionr)   r)   r)   r)   r*   rl   ¤  rm   z"split_with_sizes.<locals>.<lambda>r   c                   S   s   dS )NzCsplit_with_sizes expects split_sizes have only non-negative entriesr)   r)   r)   r)   r*   rl   ­  rm   )rZ   Z_check_withÚ
ValueErrorr¸   rÇ   r  rJ   rn   r   ÚappendrØ   )rg   r˜  rG   Z
num_splitsZsplitsZ	start_idxr—  Úlengthr)   r)   r*   Úsplit_with_sizes�  s$    ýþ
rœ  .)rg   Ú
split_sizerG   rH   c                    sx   | j }|| }ˆ dkr(|dks"t‚| fS |ˆ  d ˆ  }t|ƒ}‡ fdd„t|ƒD ƒ}ˆ ˆ | |  |d< t | ||¡S )Nr   r!   c                    s   g | ]}ˆ ‘qS r)   r)   ©r0   r—  ©r�  r)   r*   r2   À  s     zsplit.<locals>.<listcomp>rI   )rÇ   r§   r   rJ   rZ   Úsplit)rg   r�  rG   rþ   Údim_sizeÚchunksr˜  r)   rŸ  r*   r   ·  s    r   )rg   Úmat1Úmat2rU   r_   c                 C   sH   |   ¡ s |  ¡ s t|ƒ}t|ƒ}|t ||¡ }|dkr<|S |||   S rd   )Úis_floating_pointÚ
is_complexÚintrZ   Úmm)rg   r£  r¤  rU   r_   rš   r)   r)   r*   ÚaddmmÆ  s    r©  )rg   r£  r¤  rU   r_   Úuse_geluc                 C   s<   t | ||||ƒ}|r2| jr(tj|dd�S t |¡S t |¡S )Nr’   )r‘   )r©  Úis_cudaro   ÚgeluÚrelu)rg   r£  r¤  rU   r_   rª  rš   r)   r)   r*   Ú_addmm_activationÚ  s    
r®  )rg   r£  ÚvecrU   r_   c                 C   sH   |   ¡ s |  ¡ s t|ƒ}t|ƒ}|t ||¡ }|dkr<|S |||   S rd   )r¥  r¦  r§  rZ   Úmv)rg   r£  r¯  rU   r_   rš   r)   r)   r*   Úaddmvî  s    r±  )r^   r—   r·   ÚrstdÚgammaÚNÚCÚHxWÚgroupÚoutput_maskrH   c
              	      sâ  t j| |ˆ|dd� t j|| dd� t jˆ|dd� t | ¡ ˆˆ  ˆ k‡ ‡‡fdd„¡ t ˆjˆˆfk‡‡‡fdd„¡ t ˆd kp”ˆ ¡ ˆ k‡ ‡fdd„¡ tˆ ˆƒ\}
}t |dk‡ ‡fdd„¡ t | |¡ 	ˆˆ ˆ¡j
d	gd
�}|  	ˆˆ ˆ¡j
d	gd
�}d }d }d }|	d �rvdˆ|
  }ˆd k	�r’t |ˆ d¡¡ ˆˆ|
¡ 
d	¡}t |ˆ d¡¡ ˆˆ|
¡ 
d	¡}t | d¡ˆ dˆ|
¡¡}nL| ˆˆ|
¡ 
d	¡}| ˆˆ|
¡ 
d	¡}t | d¡tjdˆ|
f|jd�¡}|ˆ | | | | | }| ˆ || |  }| d¡}t|dƒ}t|dƒ}t |  ˆˆ|
ˆ¡|¡t | ˆˆ|
ˆ¡|¡ | }| |j¡ |j¡}|	d �rÀ| 	ˆˆ|
¡| 	ˆˆ|
¡ˆ d¡  | d¡ j
dgd
� ˆ ¡}|	d	 �rØ|j
dgd
�}|||fS )NF)Zallow_cpu_scalar_tensorsc                      s   dˆˆ  ˆ › d�S )NzExpect input to have z	 elementsr)   r)   )rµ  r¶  r´  r)   r*   rl     rm   z,native_group_norm_backward.<locals>.<lambda>c                      s   dˆ › dˆ› dˆj › �S )NzExpect mean to have shape (ú, z
, but got r8  r)   )r´  r·  r·   r)   r*   rl     rm   c                      s    dˆ › dˆd k	rˆ  ¡ nd› �S )NzExpect gamma to have z elements but got rI   ©rÀ   r)   )rµ  r³  r)   r*   rl     rm   r   c                      s   dˆ › dˆ› �S )NzExpect number of channels z, to be evenly-divisible by number of groups r)   r)   )rµ  r·  r)   r*   rl     rm   r"   rk   rX   rI   r!   ©r   rã   )r=   Zcheck_same_deviceZcheck_same_shaperZ   rn   rÀ   rÇ   Údivmodr®   Úviewr¸   rK   rÒ   r”  r   rM   r6   r»   )r^   r—   r·   r²  r³  r´  rµ  r¶  r·  r¸  ZcpgZ_remZdsÚdbÚd_inputZd_gammaÚd_biasÚsZds_valZdb_valÚc1Úc2Úc3r)   )rµ  r¶  r´  r³  r·  r·   r*   Únative_group_norm_backwardû  sŒ        ÿþþþþ 

""þþ


ÿþÿ
$ÿýüþ
rÅ  )r1   rH   c                 C   s   | d k	r|   |¡S | S r4   ©r6   )r1   r»   r)   r)   r*   Ú_maybe_castS  s    
rÇ  )	Úgrad_outr—   Únormalized_shaper·   r²  rž   Úbiasr¸  rH   c           !         s<  |j }| ¡ }	t |j¡‰ ‡ fdd„| |||fD ƒ\}
}}}|
d k	sHt‚|	t|ƒ }||d … }|d |… }g }g }t|	ƒD ]"}||kr”| |¡ q|| |¡ q|t	|ƒ}t	|ƒ}|dksÂ|dk�r|d rÔ| 
|¡nd |d rð| 
||d … ¡nd |d �r| 
||d … ¡nd fS || | }|d k	�r4|
| }n|
}|| }t ||d¡}t ||¡}t ||d¡}t ||¡}|| | }d }d }d } |d �r¢|| | }|d �rà|d k	�ràt|ƒdk�rØt |
| |d¡}n|
| }|d �r|d k	�rt|ƒdk�rt |
|d¡} n|
 ¡ } t||jƒt||jƒt| |jƒfS )Nc                 3   s(   | ] }|d k	r|  ˆ ¡ ¡ n|V  qd S r4   )r6   r  r/   r8   r)   r*   r)  h  s   ÿz-native_layer_norm_backward.<locals>.<genexpr>r   r!   r"   TF)rÇ   rG   r=   Úget_computation_dtyper»   r§   r  rJ   rš  rZ  r  rZ   r¸   r®   rc  rÇ  )!rÈ  r—   rÉ  r·   r²  rž   rÊ  r¸  Úinput_shapeZ
input_ndimÚgrad_out_castÚ
input_castÚweight_castZ	bias_castÚaxisZ
inner_dimsZ
outer_dimsZinner_dim_indicesZouter_dim_indicesr—  r´  ÚMZx_hatZ
grad_x_hatÚaÚbrÂ  rÃ  rÄ  rC   r¿  Zd_weightrÀ  r)   r8   r*   Únative_layer_norm_backwardZ  sd    

þý





ýrÔ  )
r—   rž   rÊ  Úrunning_meanÚrunning_varr¤   Úmomentumrl  Ú
functionalrH   c	                 C   sb  dgt td|  ¡ ƒƒ }	t | j¡}
|}|}|�rt | j¡}
| j|
d�}tj||	ddd�\}}t 	|| ¡}| | | }t 
||	¡}t 
||	¡}|d k	r¼|| d| |  }|s¼| |¡ |d k	�rÈ|  ¡ | jd  }t 
||	¡}|||d   }|| d| |  }|�sÈ| |¡ n®|d k	�r.|d k	�s2t‚|j|
dd�}|}|j|
dd�}|}|}dt || ¡ }| jjdk�r„|}|}n|  d	¡}|  d	¡}t||  ¡ d ƒ}t||  ¡ d ƒ}| | | }|d k	�rô| ¡ }t||  ¡ d ƒ}|| }|d k	�r | ¡ }t||  ¡ d ƒ}|| }| jjdk�rJ|j| jd�}|j| jd�}|j| jd�||||fS )
Nr   r"   rº   T)rG   Z
correctionr  r!   )r»   rp   Úcpu©r   )r  rJ   rG   r=   rË  r»   r6   rZ   Zvar_meanÚrsqrtrF  r©   rÀ   rÇ   r§   rü   r   Útyper  rM   rj  )r—   rž   rÊ  rÕ  rÖ  r¤   r×  rl  rØ  Zreduction_dimsr9   Únew_running_meanÚnew_running_varZ	input_accZ
biased_varr·   r²  r«   Ú	save_meanÚ	save_rstdÚnZsqueezed_varZunbiased_varÚinvstdr)   r)   r*   Únative_batch_norm_helper§  sx       ÿ






ûrã  )	r—   rž   rÊ  rÕ  rÖ  r¤   r×  rl  rH   c              
   C   s,   t | |||||||dƒ	\}}	}
}}||	|
fS ©NF©rã  ©r—   rž   rÊ  rÕ  rÖ  r¤   r×  rl  r«   rß  rà  rL   r)   r)   r*   Únative_batch_normù  s            ÿrç  c              
   C   sz   |d kr$|d kr$t  | |||||¡S |d kr4tdƒ‚|d krDtdƒ‚|r`t  | |||||||¡S t  | ||||||¡S d S )Nz`running_mean is None, but running_var is provided. They should both be None or both be provided.z`running_var is None, but running_mean is provided. They should both be None or both be provided.)ro   Ú_native_batch_norm_legitr  Ú$_native_batch_norm_legit_no_training)r—   rž   rÊ  rÕ  rÖ  r¤   r×  rl  r)   r)   r*   Únative_batch_norm_decomposition  sJ         ÿÿÿ       ÿ      ÿrê  )rH   c                    s|   |   |¡}|| d | ‰ ˆ dkrh|dkrh‡ fdd„|D ƒ}ˆ ˆ | |  ||d < tjjj | ||¡S tjjj | ˆ |¡S )Nr!   r   c                    s   g | ]}ˆ ‘qS r)   r)   rÏ   rŸ  r)   r*   r2   ?  s     z(unsafe_chunk_py_impl.<locals>.<listcomp>)r×   rZ   Úopsro   Úunsafe_split_with_sizesÚdefaultÚunsafe_splitr   )Útensorr¢  rG   r¡  r˜  r)   rŸ  r*   Úunsafe_chunk_py_impl9  s    
rð  )r—   rž   rÊ  rÕ  rÖ  r×  rl  rH   c              
   C   s   t j | ||||d||¡S rä  )ro   rè  rí  )r—   rž   rÊ  rÕ  rÖ  r×  rl  r)   r)   r*   ré  E  s    
øré  c              
   C   s,   t | |||||||dƒ	\}}	}
}}||	|
fS rä  rå  ræ  r)   r)   r*   rè  [  s            ÿrè  )r—   rž   rÊ  r¤   r×  rl  rH   c           
   
   C   s,   t | ||d d |||dƒ	\}}}}	}	|||fS rä  rå  )
r—   rž   rÊ  r¤   r×  rl  r«   rß  rà  rL   r)   r)   r*   Ú!_native_batch_norm_legit_no_statsl  s    	        ÿrñ  c              
   C   sP   t | |||||||dƒ	\}}	}
}}|d k	s2tdƒ‚|d k	sBtdƒ‚||	|
||fS )NTz#new_running_mean should not be Nonez"new_running_var should not be None)rã  r§   )r—   rž   rÊ  rÕ  rÖ  r¤   r×  rl  r«   rß  rà  rÝ  rÞ  r)   r)   r*   Ú#_native_batch_norm_legit_functional{  s(            ÿúrò  c                 C   sB   |d kst ‚t | ¡|k jtjd�}| | ¡|  d|  }||fS )Nrº   rX   )r§   rZ   rx  r6   Úuint8rb  )r—   rï   r¥   ra  ry  r)   r)   r*   Ú_fused_dropout_decomposition”  s    rô  c                 C   s   t | tjjƒr| jS d S d S r4   )r.   rZ   Z_subclassesZ
FakeTensorZfake_device)rï  r)   r)   r*   Údevice_hint�  s    rõ  c                 C   sD   |d k	r@| j jdkr@ddlm} |ƒ }d|_|j}| || |¡S | S )NÚmetar   )ÚFakeTensorModeT)r   rÜ  Ztorch._subclasses.fake_tensorr÷  Zin_kernel_invocationZfake_tensor_converterZfrom_meta_and_device)r1   Úcommon_devicer÷  Z	fake_modeÚ	converterr)   r)   r*   Úwrap_output_with_input_device_¤  s    rú  )r»   Úlayoutr   Ú
pin_memoryÚnon_blockingrô   )r1   r»   r   rü  rý  rô   c          	      C   sØ   |r|t jkstdƒ‚|r"tdƒ‚|d krB|d krB|d krB|  ¡ S d}t| ƒ}|d k	r’|| jkr’|d k	r„|jdkr„t j | |¡} d}t j 	| |¡} |d k	r°|s°t j | |¡} d}|r¾t
| |ƒ} |d k	rÔt j| |d�S | S )NÚTODOFrÙ  Tró   )rZ   Ústridedr§   rc  rõ  r   rÜ  Ú_primsZconvert_element_typeZ
device_putrú  )	r1   r»   rû  r   rü  rý  rô   Zdtype_convertedrø  r)   r)   r*   Ú_to_copy±  s&    
r  c                 C   s
   t  | ¡S r4   )ro   Úaliasr7   r)   r)   r*   Únop_decomposition×  s    r  )r—   rž   rÊ  rÕ  rÖ  r¤   Úexponential_average_factorÚepsilonc              
   C   s^   t  | |||||||¡\}}	}
|r:||	|
| jdtjd�fS || d¡| d¡| jdtjd�fS )NrÚ  rº   )ro   rç  r  rZ   ró  )r—   rž   rÊ  rÕ  rÖ  r¤   r  r  rÒ  rÓ  r<  r)   r)   r*   Úcudnn_batch_normÞ  s"    ø
ür  c                 C   sD   t |ƒD ]6\}}|dkr|| jk r4| j| || ks|  |¡} q| S rQ   )Ú	enumerater  rÇ   rK   )r1   Úbroadcast_maskrÐ  ra  r)   r)   r*   Ú_broadcast_batch_norm_backwardÿ  s    $r	  )rÈ  r—   rž   rÕ  rÖ  rß  Úsave_invstdrt  rl  r¸  rH   c
           &         s  |j }
|d k	r|j }n|
}t |j ¡‰ ‡ fdd„| ||||||fD ƒ\}}}}}}}|j}| ¡ }|dksrtdƒ‚d}tt|ƒƒ||  }|}|}|r¬|d k	r¦|d k	sÒt‚n&|d k	r¼|d k	sÀt‚|}t 	|| ¡}dg| }|| ||< g }t
|ƒD ]}||krô| |¡ qôt||ƒ}d| }t ||¡}t |||  |¡}t|| |ƒ}tt || || ¡|ƒ} |d k�r€t||ƒd }!nt|| |ƒ}!|�r²|| |  }"||" | |! }#n||! }#|	d �rÎ|| }$nd }$|	d �râ|}%nd }%|# |
¡t|$|ƒt|%|ƒfS )Nc                 3   s$   | ]}|d k	r|  ˆ ¡n|V  qd S r4   rÆ  r/   r8   r)   r*   r)  !  s   ÿz-native_batch_norm_backward.<locals>.<genexpr>r"   z$rank of the input must be at least 2r!   rX   )r»   r=   rË  rÇ   rG   r§   rZ  r  rZ   rÛ  rJ   rš  r	  r¸   r®   r6   rÇ  )&rÈ  r—   rž   rÕ  rÖ  rß  r
  rt  rl  r¸  r  Zweight_dtyperÍ  rÎ  rÏ  Zrunning_mean_castZrunning_var_castZsave_mean_castZsave_invstd_castrÌ  Z
input_rankrÐ  Znum_featuresr·   râ  r  Zreduction_axesr—  rÁ   Zgrad_output_sumZdot_pZ	grad_meanZ
proj_scaleZ
grad_scaleZprojrÅ   r•  Z	grad_biasr)   r8   r*   Únative_batch_norm_backward  s†    	
ùþø


 ÿ


ýr  ©	r—   r^   rž   rÕ  rÖ  rß  Zsave_varr  ZreserveSpacec	           	      C   s"   t  || |||||d|dddg¡
S )NT)ro   r  r  r)   r)   r*   Úcudnn_batch_norm_backwardj  s    ör  )r—   rB  c                    s.  | j ‰ | j‰tˆƒ‰t ˆdk‡fdd„¡ | jdd … D ]}t |dk‡fdd„¡ q:| jtjtjtjtj	tj
fkr†tjj | |¡S ˆd |d  dk�rˆd |d  dk�rtdd	„ tˆdd … |ƒD ƒƒ}td
d	„ tˆdd … ||ƒD ƒƒ}tjj | ||¡S dd„ ‰dd„ ‰‡ ‡‡fdd„}|ˆd |d ƒ\}}}}	|ˆd |d ƒ\}
}}}| dt|dƒ|
f }|	�sˆ|�sˆtj|dd�S dd„ }|||||	dd�\}}|||||dd�\}}d }tt|jd ƒt|jd ƒƒD ]B\}}|d k�r|d|d d …|f }n||d|d d …|f  }�qÞ|||  S )Nr3  c                      s
   dˆ › �S )Nz9adaptive_avg_pool2d(): Expected 3D or 4D tensor, but got r)   r)   ©r  r)   r*   rl   �  rm   z%adaptive_avg_pool2d.<locals>.<lambda>rõ   r   c                      s   dt ˆ ƒ› d�S )Nzjadaptive_avg_pool2d(): Expected input to have non-zero size for non-batch dimensions, but input has shape rT  r6  r)   r8  r)   r*   rl   ’  rm   rI   c                 s   s   | ]\}}|| V  qd S r4   r)   )r0   r—  rW  r)   r)   r*   r)  œ  s     z&adaptive_avg_pool2d.<locals>.<genexpr>c                 s   s$   | ]\}}}||d  |  V  qdS )r!   Nr)   )r0   r—  rW  rÁ  r)   r)   r*   r)  �  s    c                 S   s   t j| | |dd�S )NÚtrunc©Zrounding_mode©rZ   Údiv©rÒ  rÓ  r<  r)   r)   r*   Ústart_index¢  s    z(adaptive_avg_pool2d.<locals>.start_indexc                 S   s    t j| d | | d |dd�S )Nr!   r  r  r  r  r)   r)   r*   Ú	end_index¥  s    z&adaptive_avg_pool2d.<locals>.end_indexc                    sÔ   t j|ˆ t jd�}ˆ||| ƒ}| | d }| | }|dkpD|| dk }|rV|d7 }n|dkrf|d8 }t j|ˆ t jd�}| d¡| }|rÄt j| d |j|jd�}	t  ||	¡}ˆ||| ƒ}
|
| }n|}||||fS )Nrh  r!   r   rI   r  )rZ   r!  r"  rK   Zscalar_tensorr»   r   Úminimum)Úin_sizeÚout_sizeZorangeZi0Z	maxlengthZin_size_modÚadaptiveÚ	range_maxr_  ÚmaxvalÚi1r›  )r   r  r  r)   r*   Úcompute_idx¨  s,    
  ÿ
z(adaptive_avg_pool2d.<locals>.compute_idx.rã   )r†   rI   rk   c                 S   sd   t |tƒr| |fS |dk st‚|| d¡k}|dkr>t|dƒ}t | |d¡} t|| ƒ}| |fS d S )Nr   rI   rõ   rã   r~   )r.   r   r§   rK   rM   rZ   r’  )Úvalsr›  r  r  rG   ra  r)   r)   r*   Ú
maybe_maskÐ  s    

z'adaptive_avg_pool2d.<locals>.maybe_mask)r  rG   r†   )r   rÇ   r  rZ   rn   r»   Úint8ró  Zint16ri  r"  ÚnnrØ  Úadaptive_avg_pool2dr7  rD  Z
avg_pool2drM   r·   r   rJ   )r—   rB  r5  r  Zkernelr  ZidxhZlength_hZrange_max_hZ
adaptive_hZidxwZlength_wZrange_max_wZ
adaptive_wr  r  Úretr—  Újr)   )r   r  r  rÇ   r  r*   r"  „  sb    
þ
þ, ÿ     ÿ
    ÿ
&
r"  r…  ©r1   rG   r  rï  r_   c                C   s   t | |||d|d�S )NT©Úinplacer_   ©Ú
_index_addr%  r)   r)   r*   Ú
index_add_ð  s    	r*  c                C   s   t | |||d|d�S )NFr&  r(  r%  r)   r)   r*   Ú	index_addü  s    
r+  )r1   rG   r  rï  r'  r_   c                   sÚ   t  | j|¡}t ˆjdk‡fdd„¡ ˆ dkrnt  | j¡‰t ˆtkpVt  t	ˆ ƒˆ¡‡ ‡fdd„¡ |ˆ  }| jdk}|r†|  
d¡n| }d| ˆf }|r¢tjntj}	|	|||dd�}
|rÀ| S |rÎ|
 d¡S |
 ¡ S d S )	Nr!   c                      s   dˆ j › d�S ©Nz(Index should have dimension 1 or 0 (got rß   r  r)   ©r  r)   r*   rl     rm   z_index_add.<locals>.<lambda>c                      s   dt ˆ ƒ› dˆ› d�S )Nzalpha argument of type z cannot be safely cast to type ú!)rÜ  r)   )r_   Úpython_typer)   r*   rl     rm   r   r4   TrX  )r=   Úcanonicalize_dimsr  rZ   rn   Zdtype_to_typer»   rw  Zis_weakly_lesser_typerÜ  rK   ro   Ú
index_put_Ú	index_putrF  r  )r1   rG   r  rï  r'  r_   Úzero_dimrñ   r_  r2  rš   r)   )r_   r  r/  r*   r)  	  s*    	
þý
r)  ©r1   rG   r  rï  c                 C   s   t | |||dd�S )NT©r'  ©Ú_index_copyr4  r)   r)   r*   Úindex_copy_+  s    r8  c                 C   s   t | |||dd�S )NFr5  r6  r4  r)   r)   r*   Ú
index_copy0  s    r9  )r1   rG   r  rï  r'  c          
         s�   t  | j|¡}t ˆ jdk‡ fdd„¡ | jdk}|r@|  d¡n| }d| ˆ f }|r\tjntj}||||ƒ}	|rv| S |r„|	 	d¡S |	 
¡ S d S )Nr!   c                      s   dˆ j › d�S r,  r  r)   r-  r)   r*   rl   <  rm   z_index_copy.<locals>.<lambda>r   r4   )r=   r0  r  rZ   rn   rK   ro   r1  r2  rF  r  )
r1   rG   r  rï  r'  r3  rñ   r_  r2  rš   r)   r-  r*   r7  6  s    
þ
r7  r«   r°   c                 C   sL   t  |  d¡| ¡}t  t  | ¡ ¡}| jr6|  d¡}n|}|t  |¡ |fS )Nr)   rÚ  )rZ   r  r  rY   r±   r«  ræ   )rg   ru   r\   r°   r)   r)   r*   Úlog_sigmoid_forwardK  s    r:  r~   ©r1   ÚlowÚhighc                 C   s"   t j| jt|ƒt|ƒ| j| jd�S )N)r<  r=  r»   r   )ÚprimsZ_uniform_helperrÇ   r   r»   r   r;  r)   r)   r*   r¨   X  s    ûr¨   c                 C   s   |d kst ‚|  t| ||ƒ¡S r4   )r§   r©   r¨   )rg   r<  r=  r¥   r)   r)   r*   Úuniform_g  s    r?  c                 C   sè   t | ƒd }|d k	rDt |d kdd„ ¡ t t |ƒ|kdd„ ¡ |S |d k	rÔt |d kdd„ ¡ t t |ƒ|kdd„ ¡ g }t|ƒD ]J\}}t|ƒ|kr´| | |d  t|ƒ ¡ q„| t| |d  | ƒ¡ q„|S t ddd„ ¡ d S )	Nr"   c                   S   s   dS ©Nz9Must specify exactly one of output_size and scale_factorsr)   r)   r)   r)   r*   rl   s  rm   z.upsample_compute_output_size.<locals>.<lambda>c                   S   s   dS ©NÚ r)   r)   r)   r)   r*   rl   u  rm   c                   S   s   dS r@  r)   r)   r)   r)   r*   rl   {  rm   c                   S   s   dS rA  r)   r)   r)   r)   r*   rl   }  rm   Fc                   S   s   dS r@  r)   r)   r)   r)   r*   rl   †  rm   )r  rZ   rn   r  r§  rš  r   )rf  rB  Úscale_factorsZspatial_dimensionsr—  rÁ  r)   r)   r*   Úupsample_compute_output_sizen  s0    þþ ÿrD  c                 C   s   | d krd S | | S r4   r)   )Úscalesr_  r)   r)   r*   Úget_scale_valueŠ  s    rF  c                 C   s&   t |  ¡ ||ƒ}t|dƒ}t| ||ƒS rd   )rD  r×   rF  Úupsample_nearest1d)r—   rB  rC  Úosizer`   r)   r)   r*   Úupsample_nearest1d_vec�  s    
rI  c                 C   s2   t |  ¡ ||ƒ}t|dƒ}t|dƒ}t| |||ƒS ©Nr   r!   )rD  r×   rF  Úupsample_nearest2d)r—   rB  rC  rH  Úscale_hÚscale_wr)   r)   r*   Úupsample_nearest2d_vecš  s    

rN  c                 C   s>   t |  ¡ ||ƒ}t|dƒ}t|dƒ}t|dƒ}t| ||||ƒS r¦   )rD  r×   rF  Úupsample_nearest3d)r—   rB  rC  rH  Zscale_drL  rM  r)   r)   r*   Úupsample_nearest3d_vec¥  s
    


rP  c                 C   sÂ   g }t |ƒ}| jtjkrtjn| j}t|ƒD ]Œ}|| }tj||| jd�}| j| |  }	|| d k	rv|	|	||   n|	| }
||
  	tj
¡}t|d | ƒD ]}| d¡}qž| |¡ q,t|ƒS )Nr  r!   rI   )r  r»   rZ   ró  ro  rJ   r!  r   rÇ   r6   r"  rK   rš  r7  )r—   rB  rE  r‹  Znum_spatial_dimsr  r5  rH  Zoutput_indicesÚisizer`   Zinput_indicesrL   r)   r)   r*   Ú!_compute_upsample_nearest_indices±  s    $rR  )r—   rB  rE  rH   c                 C   s"   t | ||fƒ\}t | d d |f¡S r4   ©rR  ro   Ú_unsafe_index)r—   rB  rE  Z	l_indicesr)   r)   r*   rG  È  s    rG  )r—   rB  Úscales_hÚscales_wrH   c           
      C   sj   t | |||fƒ\}}t | d d ||f¡}t | ¡}| j\}}	}}| jjdkrZ|	dk rZtj	}|j
|d�}|S )NÚcudarã   ró   )rR  ro   rT  r=   rd  rÇ   r   rÜ  rZ   rø   r  )
r—   rB  rU  rV  Ú	h_indicesÚ	w_indicesrÈ   rô   rL   Ú
n_channelsr)   r)   r*   rK  Ô  s    	  ÿ
rK  )r—   rB  Úscales_drU  rV  rH   c           	      C   s2   t | ||||fƒ\}}}t | d d |||f¡}|S r4   rS  )	r—   rB  r[  rU  rV  Z	d_indicesrX  rY  rÈ   r)   r)   r*   rO  ï  s    
  ÿ
rO  c                    sb   |r|rd‰ n|rd‰ n|r"d‰ nd‰ t ˆƒˆ  dksBtt ˆƒƒ‚‡ ‡fdd„tdt ˆƒˆ ƒD ƒS )NrC  rã   rs   r"   r   c                    s    g | ]}t ˆ||ˆ  … ƒ‘qS r)   r6  rž  ©Z
group_sizeÚparamsr)   r*   r2   	  s    z!gather_params.<locals>.<listcomp>)r  r§   rJ   )r]  Ú
has_biasesÚhas_projectionsr)   r\  r*   Úgather_params	  s    ÿr`  c                 C   sh   |rB| d|  |d|   }}| d| d  |d| d   }}n| | ||  }}d\}}||||fS )Nr"   r!   ©NNr)   )r]  Úhiddensr—  ÚbidirectionalÚ
cur_paramsÚ
cur_hiddenÚbidir_paramsÚbidir_hiddenr)   r)   r*   Úparams_hiddens	  s    $rh  c                 C   s2   ||kst ‚| |  d||| ¡¡ |  dd|¡S rd   )r§   rš  rØ   )re  Úlast_batch_sizeÚ
batch_sizerb  r)   r)   r*   Úupdate_hidden_for_packed	  s    rk  c              	   C   s4   ||kr| S ||k st ‚t | | d||| ¡f¡S rd   )r§   rZ   ÚconcatrØ   )re  ri  rj  Z
inp_hiddenr)   r)   r*   Ú update_hidden_for_packed_reverse"	  s    þÿrm  c                 C   s&  |d }|d }|r|d nd }	|r,|d nd }
g }g }|rD|d n|d }|  dd|¡}t | t|ƒ¡}|r||d d d… }|D ]Z} | jd }||kr˜n"|r¬t||||ƒ}nt||||ƒ}|| |||	||
ƒ}|}| |¡ q€|rê| ¡  n| |¡ | ¡  t 	|d¡}|�st 	|d¡n|}||fS )Nr   r!   r"   rs   rI   )
rØ   rZ   r   r  rÇ   rm  rk  rš  ÚreverserÙ   )ÚinpÚhiddenr]  r^  Ú	hidden_fnÚbatch_sizesrn  Ú	ih_weightÚ	hh_weightÚih_biasÚhh_biasÚstep_outputrb  ri  re  Ú	split_inpr—  rš   Ú
hidden_outr)   r)   r*   Úone_layer_rnn_data0	  sL    
   ÿ   ÿ

rz  c                    s   ‡ fdd„}|S )Nc                    s   ˆ t  |||¡|  ƒS r4   ©r˜   Úlinear©r—  re  rs  ru  rt  rv  ©Únonlinearityr)   r*   rC   _	  s    zrnn_cell.<locals>.innerr)   ©r  rC   r)   r~  r*   Úrnn_cell^	  s    r�  c                    s   ‡ fdd„}|S )Nc                    s$   t  | ||¡} ˆ t  |||¡|  ƒS r4   r{  r}  r~  r)   r*   rC   f	  s    zrnn_cell_data.<locals>.innerr)   r€  r)   r~  r*   Úrnn_cell_datae	  s    r‚  c                 C   sª   |d }|d }|r|d nd }|r,|d nd }	t  | ||¡}
|rL|
 d¡n|
}
| d¡}g }|
D ] }|||||||	ƒ}| |¡ qb|r�| ¡  t |d¡}|| d¡fS )Nr   r!   r"   rs   )	r˜   r|  ÚfliprK   rš  rn  rZ   rÙ   rF  )ro  rp  r]  r^  rq  rn  rs  rt  ru  rv  Úprecomputed_inputre  rw  r—  rš   r)   r)   r*   Úone_layer_rnnm	  s    
r…  c                 C   sú   |d }|d }|r&|d }|d }nt  | ¡ ¡}t  | ¡ ¡}|d  d¡}	|d  d¡}
g }d}|	 d¡}d}d}d}d}|  ¡ } |	 ¡ }	|
 ¡ }
t jjj | |||||	|
|||||||||¡}|d |d |d   }}}|| 	d¡| 	d¡ffS )Nr   r!   r"   rs   F)
rZ   Zzerosr×   rK   r  rë  ro   Zmkldnn_rnn_layerrí  rF  )ro  rp  r]  r^  rn  Zw0Zw1Zw2Zw3ÚhxÚcxrr  ÚmodeZhidden_sizeÚ
num_layersrc  Úbatch_firstrt  ÚoutputsrP   ÚhyÚcyr)   r)   r*   Úmkldnn_one_layer_lstmƒ	  sN    


ðrŽ  c
                 C   sú   |r|   dd¡n| } g }
t|ƒD ]¼}t||||ƒ\}}}}|rN||d k rN|nd}|	| |||ƒ\}}|
 |¡ |r’|	| |||dd�\}}|
 |¡ |r°t ||g| ¡ d ¡} n|} |dkr |r ||d k r tj| |dd�} q |rî|   dd¡n| } | |
fS )Nr   r!   r~   T)rn  )rt  )Ú	transposerJ   rh  rš  rZ   rÙ   rG   rv  )r—   rp  r]  r^  r‰  rv  rt  rc  rŠ  Úlayer_fnÚfinal_hiddensr—  rd  re  rf  rg  Zfwd_inpZ
fwd_hiddenZbwd_inpZ
bwd_hiddenr)   r)   r*   Ú_rnn_helperµ	  s8       ÿ
    ÿ

r’  c	                 C   sR   |  d¡}	t||dƒ}t| |	|||||||ttttjƒd�ƒ
\}
}|
t |d¡fS ©Nr   F©rq  )	Úunbindr`  r’  r   r…  r�  rZ   r’   Ústack©r—   r†  r]  r^  r‰  rv  rt  rc  rŠ  rp  rš   r‘  r)   r)   r*   Úrnn_tanh_inputÞ	  s    
ör˜  c	                 C   sR   |  d¡}	t||dƒ}t| |	|||||||ttttjƒd�ƒ
\}
}|
t |d¡fS r“  )	r•  r`  r’  r   r…  r�  rZ   r­  r–  r—  r)   r)   r*   Úrnn_relu_inputý	  s    
ör™  c	                 C   sT   |  d¡}	t||dƒ}t| |	||||||dtt|ttjƒd�ƒ
\}
}|
t |d¡fS ©Nr   F©rr  rq  )	r•  r`  r’  r   rz  r‚  rZ   r­  r–  ©Údatarr  r†  r]  r^  r‰  rv  rt  rc  rp  rš   r‘  r)   r)   r*   Úrnn_relu_data
  s&    
ýörž  c	                 C   sT   |  d¡}	t||dƒ}t| |	||||||dtt|ttjƒd�ƒ
\}
}|
t |d¡fS rš  )	r•  r`  r’  r   rz  r‚  rZ   r’   r–  rœ  r)   r)   r*   Úrnn_tanh_data?
  s&    
ýörŸ  c                 C   sŒ   t  |||¡|  }| d|¡}|d  ¡ }	|d  ¡ }
|d  ¡ }|d  ¡ }|
| |	|  }|| ¡  }|d krv|nt  ||d ¡}||fS )Nrã   r   r!   r"   rs   ©r˜   r|  Úchunkr™   r’   )ro  r†  r‡  rt  rv  Ú	hr_weightÚ	chunk_dimZgatesZchunked_gatesZin_gateZforget_gateZ	cell_gateZout_gater�  rŒ  r)   r)   r*   Ú	lstm_cellb
  s    r¤  c              
   C   sú   |d }|d }|r|d nd }|r,|d nd }t |ƒdkrD|d nt |ƒdkrX|d nd }	|d  d¡}
|d  d¡}t | ||¡}|r”| d¡n|}g }|D ](} t| |
||||	dd�\}
}| |
¡ q |rÖ| ¡  t 	|d¡}||
 
d¡| 
d¡ffS )Nr   r!   r"   rs   rC  rã   ©r£  )r  rK   r˜   r|  rƒ  r¤  rš  rn  rZ   rÙ   rF  )ro  rp  r]  r^  rn  rs  rt  ru  rv  r¢  r†  r‡  r„  rw  rš   r)   r)   r*   Úone_layer_lstmp
  s$    *ÿr¦  c              
   C   s  |d }|d }|r|d nd }|r,|d nd }	t |ƒdkrD|d nt |ƒdkrX|d nd }
g }g }|rp|d n|d }t | t|ƒ¡}|rš|d d d… }|d }|d }| dd|¡| dd|¡ }}|D ]Ü} | jd }t | ||¡} ||k �r:| | d||| ¡| d||| ¡f¡ | dd|¡| dd|¡ }}||k�r€t 	|| d||| ¡fd¡}t 	|| d||| ¡fd¡}t
| ||||	|
dd�\}}|}| |¡ qÌ|�rÂ| ¡  ||f}n:| ||f¡ | ¡  t|Ž \}}t |d¡t |d¡f}t |d¡}||fS )	Nr   r!   r"   rs   rC  rã   rI   r¥  )r  rZ   r   r  rØ   rÇ   r˜   r|  rš  rl  r¤  rn  rD  rÙ   )ro  rp  r]  r^  rr  rn  rs  rt  ru  rv  r¢  rw  rb  ri  rx  Zorig_hxZorig_cxr†  r‡  r—  ry  Zhidden0Zhidden1rš   r)   r)   r*   Úone_layer_lstm_data‹
  sd    *ÿ  ÿ

þÿ
 ÿ ÿ
r§  c                 C   s    dd„ }|| ||ƒrt S tS dS )a   Check whether we could use decompose lstm with mkldnn_rnn_layer.
    All the below conditions need to be met:
        * ``torch._C._has_mkldnn`` returns ``True``.
        * All the input args are on CPU.
        * The dtypes of args are either torch.float or torch.bfloat16.
        * Inference.
        * ``has_projections`` returns ``False``.

    Args:
        * input: the input sequence to LSTM
        * hx: a tuple of the input hidden state and cell state ``(h_0, c_0)`` to LSTM
        * params: the weight and bias tensors of LSTM
    c           	      S   sÀ   t jjsdS | gt|ƒ tt |¡ƒ }dd„ |D ƒ}t|ƒdkrFdS | ¡ }|t  d¡kr`dS dd„ |D ƒ}|D ]}|t j	t j
fkrr dS qr| jr˜dS |d  d¡|d  d¡k}|r¼dS d	S )
NFc                 S   s   h | ]
}|j ’qS r)   r»  ©r0   Útr)   r)   r*   Ú	<setcomp>Þ
  s     zEselect_one_layer_lstm_function.<locals>.use_mkldnn.<locals>.<setcomp>r!   rÙ  c                 S   s   h | ]
}|j ’qS r)   rº   r¨  r)   r)   r*   rª  æ
  s     r   r"   T)rZ   Ú_CZ_has_mkldnnr  r   Úfrom_iterabler  Úpopr   ro  Zbfloat16Úrequires_gradr×   )	r—   r†  r]  ZtensorsZdevicesr   Zdtypesr»   r_  r)   r)   r*   Ú
use_mkldnnÙ
  s&    z2select_one_layer_lstm_function.<locals>.use_mkldnnN)rŽ  r¦  )r—   r†  r]  r¯  r)   r)   r*   Úselect_one_layer_lstm_functionÊ
  s    r°  c	                 C   s¦   t |ƒdkstdƒ‚t|||d  d¡|d  d¡kƒ}tt|d |d ƒƒ}	t| ||ƒ}
t| |	||||||||
ƒ
\}}tt|Ž ƒ}|t 	|d d¡t 	|d d¡fS )Nr"   úlstm expects two hidden statesr   r!   )
r  r§   r`  r×   r  rD  r°  r’  rZ   r–  )r—   r†  r]  r^  r‰  rv  rt  rc  rŠ  rp  r�  rš   r‘  r)   r)   r*   Ú	lstm_implü
  s$    $ör²  c	                 C   s¢   t |ƒdkstdƒ‚t|||d  d¡|d  d¡kƒ}tt|d |d ƒƒ}	t| |	||||||dtt|d�ƒ
\}
}tt|Ž ƒ}|
t	 
|d d¡t	 
|d d¡fS )Nr"   r±  r   r!   F)rr  )r  r§   r`  r×   r  rD  r’  r   r§  rZ   r–  rœ  r)   r)   r*   Úlstm_data_impl  s"    $
ör³  c                 C   sr   |   dd¡}t |||¡  dd¡}|d |d   ¡ }|d |d   ¡ }	|d |d |   ¡ }
||
 |	 |
 S )Nrs   r!   r"   r   )r¡  r˜   r|  r™   r’   ©ro  re  rs  ru  rt  rv  Zchunked_igatesZchunked_hgatesZ
reset_gateZ
input_gateZnew_gater)   r)   r*   Úgru_cell?  s    rµ  c                 C   s|   t  | ||¡ dd¡}t  |||¡ dd¡}|d |d   ¡ }|d |d   ¡ }	|d |d |   ¡ }
||
 |	 |
 S )Nrs   r!   r   r"   r   r´  r)   r)   r*   Úgru_cell_dataH  s    r¶  c	                 C   sJ   t ||dƒ}t| | d¡||||||dtt|td�ƒ
\}	}
|	t |
d¡fS )NFr   r›  )r`  r’  r•  r   rz  r¶  rZ   r–  )r�  rr  r†  r]  r^  r‰  rv  rt  rc  rš   r‘  r)   r)   r*   Úgru_impl_dataQ  s    ör·  c	                 C   sH   t ||dƒ}t| | d¡|||||||tttd�ƒ
\}	}
|	t |
d¡fS )NFr   r”  )r`  r’  r•  r   r…  rµ  rZ   r–  )r—   r†  r]  r^  r‰  rv  rt  rc  rŠ  rš   r‘  r)   r)   r*   Úgru_implo  s    
ör¸  c                 C   s:   t |  ¡ ||ƒ}t|dƒ}t|dƒ}tjj | ||||¡S rJ  )rD  r×   rF  rZ   rë  ro   Ú_upsample_bilinear2d_aa©r—   rB  Úalign_cornersrC  rH  rL  rM  r)   r)   r*   Úupsample_bilinear2d_aa_vec�  s    

    ÿr¼  c                 C   s4   t |  ¡ ||ƒ}t|dƒ}t|dƒ}t| ||||ƒS rJ  )rD  r×   rF  Úupsample_bilinear2drº  r)   r)   r*   Úupsample_bilinear2d_vec™  s    

r¾  )r—   rB  r»  rU  rV  rH   c           $      C   sf  | j \}}}}|d }	|d }
|	dkrV|r<|d |	d  }qZ|d k	rLd| n||	 }nd}|
dkr’|rx|d |
d  }q–|d k	rˆd| n||
 }nd}tj|	| j| jd�}tj|
| j| jd�}|rÔ|| }|| }n0||d  d jdd�}||d  d jdd�}| tj¡}t |¡j|d d� tj¡}| tj¡}t |¡j|d d� tj¡}| 	d¡}| 	d¡}| 	d¡}t
 | d d ||g¡}t
 | d d ||g¡}t
 | d d ||g¡}t
 | d d ||g¡}|| }d| }|| }d| }t ||¡t ||¡ } t ||¡t ||¡ }!t | |¡t |!|¡ }"t | ¡}#| jjd	k�rV|d
k �rVtj}#|"j|#d�}"|"S )Nr   r!   rX   r~   r  r‡   rt   rw   rW  é   ró   )rÇ   rZ   r!  r»   r   rz   r6   r"  ÚceilrK   ro   rT  r®   r=   rd  rÜ  rø   r  )$r—   rB  r»  rU  rV  Zn_batchrZ  Zin_hZin_wr]  r^  Zh_scale_factorZw_scale_factorr—  r$  r1   rP   Zx_floorZx_ceilZy_floorZy_ceilZx_viewZx_floor_viewZx_ceil_viewZv1Zv2Zv3Zv4Zxscale2Zxscale1Zyscale2Zyscale1Úq1Úq2rÈ   rô   r)   r)   r*   r½  £  sV    




r½  )rÒ  rÓ  rH   c                 C   s   | j |j kS r4   r8  )rÒ  rÓ  r)   r)   r*   Úis_same_sizeô  s    rÃ  c                 G   s   t  | |¡S r4   )ro   r½  )r1   rÇ   r?   r)   r)   r*   Ú_reshape_aliasù  s    rÄ  c                 C   s   t  | |¡S r4   )ro   r  )r1   r‹  r)   r)   r*   Ú_indexþ  s    rÅ  )rg   r½   rž   r¶   rÍ   rH   c                 C   sV  |   ¡ }d}|dk rd}|d k	rX|dkrLdg| }|jd ||< | |¡}n|}| | } t ||k|d¡}	|	 |¡}
t | ||
¡ |¡ }t ||k|d¡}|tj	j
krÄ|dkrÄ|  dd¡}||fS |d k	�r
| | j¡}t |||
¡ |¡}t ||k|d¡}| ¡ }n||k ¡  | ¡}|tjj
k�r4| ¡ }n|tjj
k�rN| ¡ | }||fS )Nr!   r"   r   r)   r~   )rG   rÇ   r½  rZ   r[   rK   ÚgatherrF  r    r&   rh   rç   Úexpandr¸   r6   r(   r'   )rg   r½   rž   r¶   rÍ   Zn_dimsrÓ   rÇ   ÚwrÔ   Zsafe_target_rÈ   rÎ   Zwsumr)   r)   r*   Ú_nll_loss_forward  s@    
ÿþ



rÉ  c                 C   sÎ   |   ¡ dkr|   ¡ dks tdƒ‚|  ¡ dks4tdƒ‚|   ¡ dkoJ|  ¡ dk}|s~| jd |jd ks~td| j› d|j› d�ƒ‚| jd	 }|d ks¾|  ¡ dkr¨| ¡ |ks¾td
|› d|j› �ƒ‚t| ||||ƒS )Nr   r"   rÛ   r!   rÜ   rÝ   rÞ   rß   rI   z/weight tensor should be defined either for all z7 classes or no classes but got weight tensor of shape: )rG   r§   rÇ   rÀ   rÉ  )rg   r½   rž   r¶   rÍ   rá   Z	n_classesr)   r)   r*   Únll_loss_forward8  s(     
ÿþÿþ

ÿ
ÿþrÊ  c                 C   s   t | ||||ƒS r4   )rÉ  )rg   r½   rž   r¶   rÍ   r)   r)   r*   Únll_loss2d_forwardS  s    rË  )r1   ÚArH   c                 C   s    |d |  |d  |  |  d S )Nr"   rs   r!   r)   ©r1   rÌ  r)   r)   r*   Ú_upsample_cubic_convolution1`  s    rÎ  c                 C   s(   ||  d|  |  d|  |  d|  S )NrC  é   rã   r)   rÍ  r)   r)   r*   Ú_upsample_cubic_convolution2d  s    rÐ  )r©  rH   c                 C   s4   d}t | d |ƒt| |ƒtd|  |ƒt d|  |ƒfS )Ng      è¿rX   r¿   )rÐ  rÎ  )r©  rÌ  r)   r)   r*   Ú _upsample_get_cubic_coefficientsh  s    ürÑ  )ÚcoeffsÚtsrH   c                 C   s    t |ƒ}tdd„ t| |ƒD ƒƒS )Nc                 s   s   | ]\}}|| V  qd S r4   r)   )r0   rÂ  rÃ  r)   r)   r*   r)  t  s     z+_upsample_cubic_interp1d.<locals>.<genexpr>)rÑ  Ú_sum_tensorsrD  )rÒ  rÓ  Zcoeffs2r)   r)   r*   Ú_upsample_cubic_interp1dr  s    rÕ  )rÓ  rH   c                 C   s   t tj| ƒS r4   )r   rZ   Úadd)rÓ  r)   r)   r*   rÔ  x  s    rÔ  )Ú	num_stepsr»  r»   r   c                 C   sB   | dkrt jd||d�S |s(| d |  nd}t j| || ||d�S )Nr!   r   rh  )Zstepsr   r»   )rZ   rï  Zlinspace)r×  r»  r»   r   rÒ  r)   r)   r*   Ú_linspace_from_neg_one|  s    rØ  )ÚthetaÚhrÈ  r»  c           	      C   sš   | j }| j}t||||ƒ d|d¡}t||||ƒ |dd¡}tjd||d�}tjjj|dddd�}tjjj|dddd�}tjjj|d	ddd�}|| | S )
Nr!   )r!   r!   r!   r  )r   r"   Úconstantr   ©r:  rˆ  rh   )r!   r!   )r"   r   ©	r»   r   rØ  r½  rZ   r”  r!  rØ  r:  )	rÙ  rÚ  rÈ  r»  r»   r   Úgrid_xÚgrid_yÚgrid_oner)   r)   r*   Ú_make_base_grid_4d†  s    rá  )rÙ  r5  rÚ  rÈ  r»  c                 C   sÒ   | j }| j}t||||ƒ dd|d¡}t||||ƒ d|dd¡}t||||ƒ |ddd¡}	tjd||d�}
tjjj|dddd�}tjjj|dddd�}tjjj|	d	ddd�}	tjjj|
d
ddd�}
|| |	 |
 S )Nr!   )r!   r!   r!   r!   r  )r   rs   rÛ  r   rÜ  rQ  )r"   r!   )rs   r   rÝ  )rÙ  r5  rÚ  rÈ  r»  r»   r   rÞ  rß  Zgrid_zrà  r)   r)   r*   Ú_make_base_grid_5d—  s    râ  ©rÙ  r×   r»  c           	      C   sL   |\}}}}t | |||d�}| ddd¡| j d¡  d¡}| |||d¡S )N©r»  rI   rs   r!   rõ   r"   )rá  r½  rú   rK   r¸   )	rÙ  r×   r»  rá  rL   rÚ  rÈ  Ú	base_gridÚgridr)   r)   r*   Ú_affine_grid_generator_4d¨  s     rç  c           
      C   sR   |\}}}}}t | ||||d�}| ddd¡| j d¡  d¡}	|	 ||||d¡S )Nrä  rI   rã   r!   rõ   rs   )râ  r½  rú   rK   r¸   )
rÙ  r×   r»  rá  rL   r5  rÚ  rÈ  rå  ræ  r)   r)   r*   Ú_affine_grid_generator_5d²  s     rè  c                 C   sD   t  t|ƒdkdd„ ¡ t|ƒdkr2t| ||d�S t| ||d�S d S )N)rã   rC  c                   S   s   dS )NzCaffine_grid_generator needs 4d (spatial) or 5d (volumetric) inputs.r)   r)   r)   r)   r*   rl   Á  rm   z'affine_grid_generator.<locals>.<lambda>rã   rä  )rZ   rn   r  rç  rè  rã  r)   r)   r*   Úaffine_grid_generator¼  s    
þré  )rÒ  ræ  Úinterpolation_modeÚpadding_moder»  rH   c                    sà  t  ˆdk‡fdd„¡ t  ˆdk‡fdd„¡ tttdœ‡fdd„‰ttttdœd	d
„‰tttdœ‡‡‡fdd„‰tttdœ‡‡fdd„}ˆj\‰}‰
‰|j\}‰‰}tttdœ‡
‡fdd„‰t jˆˆjd� ˆddd¡‰t j|ˆjd� d|dd¡‰ ttttdœ‡‡‡‡fdd„‰tttdœ‡ ‡‡‡fdd„‰|d }|d }	ˆdk�r||ˆƒ}
||	ˆ
ƒ}|
 	¡ | 	¡  ‰‰ˆd ˆ }}ˆˆd  }}|| }}||
 ||  }|
| ||  }||
 ||  }|
ˆ |ˆ  }t
‡fdd„ˆˆ|f|||f|||f|||ffD ƒƒS ˆdk�rH||ˆƒ}
||	ˆ
ƒ}|
 ¡ }| ¡ }ˆ||dƒS ˆ|ˆƒ}
ˆ|	ˆ
ƒ}|
 	¡ ‰| 	¡ ‰|
ˆ ‰|ˆ }tttdœ‡‡‡
‡fdd „‰	ttd!œ‡	‡‡‡fd"d#„‰t‡fd$d„td%ƒD ƒƒ}t|| d¡ƒS d S )&N)r   r!   r"   c                      s
   dˆ › �S )NzInvalid interpolation mode r)   r)   )rê  r)   r*   rl   Ô  rm   z!grid_sampler_2d.<locals>.<lambda>c                      s
   dˆ › �S )NzInvalid padding mode r)   r)   )rë  r)   r*   rl   ×  rm   )Úcoordsr×   rH   c                    s0   ˆ r|d d n|d }|d d }| | | S ©Nr‡   r)   )rì  r×   r®   Úofsrä  r)   r*   ÚunnormalizeÚ  s    z$grid_sampler_2d.<locals>.unnormalize)rì  Ú	twice_lowÚ
twice_highrH   c                 S   sv   ||krt  | ¡S |d }|| d }| |  ¡ }t  ||¡}||  ¡ jt jd�}t  |d@ dk|| || | ¡S )Nr"   rº   r!   r   )rZ   rÐ   r±   ÚfmodÚfloorr6   r   r[   )rì  rð  rñ  Z
coords_minZcoords_spanZcoords2ÚextraZflipsr)   r)   r*   Úreflect_coordinateså  s    

  
ÿz,grid_sampler_2d.<locals>.reflect_coordinatesc                    sj   ˆdkr| S ˆdkr&t  | d|d ¡S ˆ r@ˆ| dd|d  ƒ}nˆ| dd| d ƒ}t  |d|d ¡S d S )Nr   r!   r"   rI   ry   )rì  r×   Zcoords_reflected)r»  rë  rõ  r)   r*   Úcompute_coordinatesñ  s    z,grid_sampler_2d.<locals>.compute_coordinatesc                    s   ˆ| |ƒ}ˆ ||ƒS r4   r)   )rì  r×   Z	coords_un)rö  rï  r)   r*   Úcompute_source_indexý  s    
z-grid_sampler_2d.<locals>.compute_source_index)ÚxsÚysrH   c                    s,   t  d| kt  | ˆk t  d|k|ˆ k ¡¡¡S rd   )rZ   rn  )rø  rù  )ÚiHÚiWr)   r*   Úin_bounds_cond  s     ÿz'grid_sampler_2d.<locals>.in_bounds_condr»  r!   )rø  rù  ÚwsrH   c                    s@   ˆ| |ƒ‰ t ‡‡ ‡‡fdd„| jtjd�|jtjd�|fD ƒƒS )Nc                 3   s(   | ] }t  ˆ|d ¡ ˆ dˆˆ¡V  qdS )r   r!   N)rZ   r[   r½  r¨  )r´  r0  ÚoHÚoWr)   r*   r)    s   ÿz0grid_sampler_2d.<locals>.clip.<locals>.<genexpr>rº   )r7  r6   rZ   r"  )rø  rù  rý  )r´  rü  rþ  rÿ  )r0  r*   Úclip  s    
þzgrid_sampler_2d.<locals>.clip)ÚixÚiyrH   c                    s&   ˆ| ||ƒ\}}}ˆˆˆ ||f | S r4   r)   )r  r  rÈ  Zidx_xZidx_yZw_)ÚC_idxÚN_idxrÒ  r   r)   r*   Úget_summand  s    z$grid_sampler_2d.<locals>.get_summand).r   ).r!   r   c                 3   s    | ]\}}}ˆ |||ƒV  qd S r4   r)   )r0   r  r  rÈ  )r  r)   r*   r)  -  s   ÿz"grid_sampler_2d.<locals>.<genexpr>c                    s    ˆ | ˆƒ}ˆ |ˆƒ}ˆ||dƒS rQ   r)   )r  r  r1   rP   )rö  r  rú  rû  r)   r*   Úget_value_boundedH  s    

z*grid_sampler_2d.<locals>.get_value_bounded)rî  rH   c                    sL   ˆ| d  }ˆ ˆd |ƒˆ ˆ|ƒˆ ˆd |ƒˆ ˆd |ƒf}t |ˆ d¡ƒS )Nr!   r"   )rÕ  rK   )rî  Ziy_ofsÚcs)r  Úix_nwÚiy_nwÚtxr)   r*   Ú	get_coeffM  s    üz"grid_sampler_2d.<locals>.get_coeffc                 3   s   | ]}ˆ |ƒV  qd S r4   r)   )r0   rî  )r  r)   r*   r)  W  s     rã   )rZ   rn   r   r§  rÇ   r!  r   r½  r   ró  rÔ  Úroundr7  rJ   rÕ  rK   )rÒ  ræ  rê  rë  r»  r÷  rµ  rL   r1   rP   r  r  Zix_neZiy_neZix_swZiy_swZix_seZiy_seZw_nwZw_neZw_swZw_seZ
ix_nearestZ
iy_nearestÚtyrÒ  r)   )r  r´  r  rÒ  r»  r   rö  r  r  r  rú  rû  rü  rê  r  r	  rþ  rÿ  rë  rõ  r
  rï  r*   Úgrid_sampler_2dÉ  sn    	
þ 
ÿ



üþ	





r  c                    s`   t  ˆ  ¡ dkoˆ ¡ dk‡ ‡fdd„¡ t  ˆ  d¡ˆ d¡k‡ ‡fdd„¡ ˆ ˆ jdd�S )Nr"   r!   c                      s   dˆ   ¡ › dˆ  ¡ › �S )Nzmatrix @ vector expected, got r¹  rk   r)   ©rg   r¯  r)   r*   rl   a  rm   zmv.<locals>.<lambda>r   c                      s*   dˆ   d¡› dˆ   d¡› dˆ  d¡› d�S )Nzsize mismatch, got input (r   r1   r!   z), vec (rß   )r×   r)   r  r)   r*   rl   e  rm   rk   )rZ   rn   rG   r×   r¸   r  r)   r  r*   r°  [  s    þþr°  c                    sÔ   ˆ  ¡ rZˆ ¡ rBˆ  ¡ r0t ˆ ¡ ˆ  ¡ ¡ ¡ S t ˆ ¡ ˆ ¡S nˆ  ¡ rZt ˆ  ¡ ˆ¡S t ˆ ¡ dkotˆ  ¡ dk‡ ‡fdd„¡ t ˆjˆ jk‡ ‡fdd„¡ ‡ ‡fdd„}t ˆ 	¡ ˆ  	¡ k|¡ ˆˆ   
¡ S )Nr!   c                      s   dˆ  ¡ › dˆ   ¡ › d�S )Nz1D tensors expected, but got zD and z	D tensorsrk   r)   ©rî   rg   r)   r*   rl   y  rm   zdot.<locals>.<lambda>c                      s   dˆj › dˆ j › �S )Nz:dot : expected both vectors to have same dtype, but found ú and rº   r)   r  r)   r*   rl   }  rm   c                	      s.   dˆ  ¡ › dˆ   ¡ › dˆ  ¡ › dˆ   ¡ › d�	S )Nz+inconsistent tensor size, expected tensor [z] and src [z.] to have thesame number of elements, but got r  z elements respectivelyrº  r)   r  r)   r*   Únumel_error€  s    ,ÿzdot.<locals>.numel_error)r¦  Zis_conjrZ   ÚdotZconjZvdotrn   rG   r»   rÀ   r¸   )rg   rî   r  r)   r  r*   r  j  s$    þ
þr  c                 C   sœ   |    d¡}|d k	rV|d | d }d| |  ||  ¡ |  |  ¡   ¡ |   }n,d| |  | |  ¡ |  |  ¡   ¡  }|d k	r’|| }t||ƒS rJ  )rû   rY   rè   r¹   )rg   r½   rž   Z
pos_weightr¶   r‚   Z
log_weightrµ   r)   r)   r*   Ú binary_cross_entropy_with_logits‹  s    ÿ
ÿþÿr  )Útensor1Útensor2rH   c                 C   s    | j |j kr| |fn|| f\}}|j dkr4|j dks8dS |jrBdS | j dkrPdS | ¡ dkr`dS |j}| ¡ }tdd„ t|d d… |d	d
… |d	d
… ƒD ƒƒS )Nrs   r"   FTr   c                 s   s    | ]\}}}||| kV  qd S r4   r)   )r0   Zst1Zst2Ús2r)   r)   r*   r)  ²  s   ÿzshould_fold.<locals>.<genexpr>rõ   r!   rI   )r  r®  rÀ   rÇ   r  r+  rD  )r  r  Út1Út2Zt1_shapeZ	t1_strider)   r)   r*   Úshould_fold¢  s     
"þr  c                 C   s€  |   ¡ }|  ¡ }|dkr |dks$t‚|dkr@|dkr@t | |¡S |dkr\|dkr\t | |¡S |dkrˆ|dkrˆt t t | d¡|¡d¡S |dkr¤|dkr¤t | |¡S t| |ƒ�rt||k}|rÂ|j	n| }|sÎ|n|dkrÞ|  
¡ n| }|j}t|d d… ƒ}ttj|ƒ}	|  ¡ dk}
|
�r&| |jd ¡ | |	|d ¡}|
�r`| |¡ |¡}|�r\|j	 ¡ S |S | |¡ |¡S �n|dk�rl|dk�rl|dk�rœ|  d¡nd}|  d¡}| jd d… }|dk�rÌ| d¡n| d¡}|dk�rê| d¡nd}g }t|d ƒD ]}| | |¡¡ �qþ|dk�rˆ|dk�rˆ|d |d k�rˆ|d dk�rb| j�rbt|  d¡|ƒS |d dk�rˆ|j�rˆt| | d¡ƒS tt ||¡ƒ}|||g }t|ƒ}|  |¡ |||¡}|dk}|�rò||g }| |¡ ||¡ d¡}n |||g }| |¡ |||¡}|}|dk�r*| |¡ |dk�r>| |¡ |�rZ| |¡ d¡ |¡S | |¡ |¡S nt ddd	„ ¡ d S )
Nr   r!   r"   rI   rõ   rs   Fc                   S   s   dS )Nz/both arguments to matmul need to be at least 1Dr)   r)   r)   r)   r*   rl   .  rm   zmatmul.<locals>.<lambda>)rG   r§   rZ   r  r°  rF  r¨  rK   r  rú   r©  rÇ   r  r   Úoperatorr®   rš  rÒ   r½  r  r×   rJ   r®  rù   Zbroadcast_shapesrZ  rÇ  Zbmmrn   )r  r  Zdim_tensor1Zdim_tensor2r�  r  r  Zsizes_1Zoutput_shapeZfolded_dim1Zt2_is_matrixZ	t1_foldedr«   rá  Úm1Zbatch_tensor1Úm2rï   Zbatch_tensor2r—  Zexpand_batch_portionZtensor1_expand_sizeZexpand_batch_productZtensor1_expandedZ
vector_rhsZtensor2_expand_sizeZtensor2_expandedr)   r)   r*   rù   ¸  s¢    ÿ	
ÿþý
ÿ
  ÿ

 ÿþÿ
  ÿ



rù   )rÒ  rB  r»  rL  rM  rH   c                    sš  ˆj \}}‰‰|\}}ddd„}	dd„ }
|	ˆ|||ƒ}|	ˆ|||ƒ}tj|ˆjd� |ddd¡‰tj|ˆjd� d|dd¡‰ tj|ˆjd� dd|df¡}tj|ˆjd� ddd|f¡}|
|||ƒ}| ¡ }|| ‰|jtjd�}|
|||ƒ}| ¡ }|| }|jtjd�}|d ||d |d f}|d ||d |d f‰‡ ‡‡‡‡fd	d
„‰‡‡‡fdd„‰t‡fdd„|D ƒƒ}t	||ƒ}t
 ˆ¡}|j|d�}|S )Nc                 S   sD   |r |dkr| d |d  S dS |d k	r8|dkr8d| S | | S d S )Nr!   r   r)   )r  r  r»  r`   r)   r)   r*   Úcompute_scale=  s    z1upsample_bicubic2d_default.<locals>.compute_scalec                 S   s    |r| | S | |d  d S d S rí  r)   )r`   Z	dst_indexr»  r)   r)   r*   r÷  C  s    z8upsample_bicubic2d_default.<locals>.compute_source_indexr»  r!   rº   r"   c                    s8   t  | dˆd ¡}t  |dˆd ¡}t ˆˆˆ ||g¡S rJ  )rZ   rz   ro   rT  )rù  rø  Zy_idxZx_idx)r  r  rÒ  rú  rû  r)   r*   Úload_bounded^  s    z0upsample_bicubic2d_default.<locals>.load_boundedc                    s"   t ‡‡ fdd„ˆD ƒƒ}t|ˆƒS )Nc                 3   s   | ]}ˆ ˆ|ƒV  qd S r4   r)   )r0   Zx_ofs)r  rP   r)   r*   r)  d  s     zCupsample_bicubic2d_default.<locals>.get_x_interp.<locals>.<genexpr>)r7  rÕ  )rP   Zcoeffs_x)Úixs_ofsr  Út_x)rP   r*   Úget_x_interpc  s    z0upsample_bicubic2d_default.<locals>.get_x_interpc                 3   s   | ]}ˆ |ƒV  qd S r4   r)   )r0   Zy_ofs)r"  r)   r*   r)  g  s     z-upsample_bicubic2d_default.<locals>.<genexpr>ró   )N)rÇ   rZ   r!  r   r½  ró  r6   r"  r7  rÕ  r=   rd  r  )rÒ  rB  r»  rL  rM  r´  rµ  rþ  rÿ  r  r÷  Zheight_scaleZwidth_scaleZout_yZout_xZreal_xZin_xr  Zreal_yZin_yZt_yr  Ziys_ofsZcoeffs_yrÈ   rô   r)   )	r  r  rÒ  r"  rú  rû  r   r  r!  r*   Úupsample_bicubic2d_default1  s6    	


r#  )rÒ  rB  r»  rC  rH   c                 C   s„   t  t|ƒt|ƒ dkdd„ ¡ |d krd|d k	s4t‚ttttf tdd„ t| j	dd … |ƒD ƒƒƒ}|rl|nd\}}t
| ||||ƒS )Nr!   c                   S   s   dS )Nz:Must specify exactly one of output_size and scale_factors.r)   r)   r)   r)   r*   rl   }  rm   z(upsample_bicubic2d_vec.<locals>.<lambda>c                 s   s"   | ]\}}t t|ƒ| ƒV  qd S r4   )r   r   )r0   rÈ  r`   r)   r)   r*   r)  ƒ  s   ÿz)upsample_bicubic2d_vec.<locals>.<genexpr>r"   ra  )rZ   rn   rw  r§   r   r   r§  r7  rD  rÇ   r#  )rÒ  rB  r»  rC  rL  rM  r)   r)   r*   Úupsample_bicubic2d_vecp  s    þ
þþr$  ru   rx   r  c                C   s(   t j| ||d�}t j| ||d�}||fS )Nr  )rZ   Úaminr€  )rg   rG   r  r%  r€  r)   r)   r*   ÚaminmaxŒ  s    r&  c                C   s"   t jt t | ¡d| ¡|||d�S )Nr   rº   )ro   r¸   rZ   r[   Úisnan)rg   rG   r  r»   r)   r)   r*   Únansum”  s    r(  ©r»   rû  r   rü  ©r   r»   rû  r   rü  c             	   C   s   t jjd| d||||d�S )Nr   r!   r)  ©ro   r!  Z
start_stepr*  r)   r)   r*   Úarange_defaultš  s    
      ÿr,  ©rÿ   r   r»   rû  r   rü  c             	   C   s   t jj| |d||||d�S )Nr!   r)  r+  r-  r)   r)   r*   Úarange_start©  s    
      ÿr.  )r—   r½   rï   Úmarginrž   r¶   rH   c           	         sŒ  t  ˆ¡‰t  ˆ¡‰ˆjd ‰ˆjd ‰ t  |dkp:|dkdd„ ¡ t  ˆjdkoXˆ dk‡fdd„¡ t  ˆjdko~ˆ ¡ ˆk‡‡fdd„¡ ˆd k	rÈt  ˆ¡‰t  ˆjdko¸ˆ ¡ ˆ k‡ ‡fdd„¡ ˆ d¡‰t jˆdˆd	�}|| ˆ }| 	d¡}|dk�r|n|| }ˆd k	�r$|ˆˆ  }t j
ˆ ˆjd
�}t  |ˆk|d¡}|tjjk�r\| ¡ S |tjjk�r|| ¡ |jd  S |jdd�S d S )Nr   r!   r"   c                   S   s   dS )Nz only p == 1 and p == 2 supportedr)   r)   r)   r)   r*   rl   Ç  rm   z#multi_margin_loss.<locals>.<lambda>c                      s   dˆ j › �S ©NzMExpected non-empty vector or matrix with optional 0-dim batch size, but got: r8  r)   )r—   r)   r*   rl   Ê  rm   c                      s   dˆ › dˆj › �S )Nz#inconsistent target size, expected rS  r8  r)   )Únframer½   r)   r*   rl   Î  rm   c                      s   dˆ › dˆj › �S )Nz#inconsistent weight size, expected rS  r8  r)   )rG   rž   r)   r*   rl   Ô  rm   ©rG   r  r»  rk   )rZ   Ú
atleast_2dZ
atleast_1drÇ   rn   r  rÀ   rK   rÆ  rû   r!  r   r[   r    r'   rh   r·   r(   r¸   )	r—   r½   rï   r/  rž   r¶   Úur\   r_  r)   )rG   r—   r1  r½   rž   r*   Úmulti_margin_loss¸  sB    




þþ
þ


r5  Ú	is_targetc                    sˆ  | j ‰ |j ‰t | ¡} t |¡}| j d }t tˆ ƒdko@|dk‡ fdd„¡ t tˆƒdkodˆˆ k‡ ‡fdd„¡ tj||jd�}|dk}tjt |||¡dd	d
�}||k }t ||d¡}tj	| d|d�}	t ||d¡}
tj
||
jdd�kdd�}d|	jjdd� |  }| d¡}|| }t |d|¡}|tjjk�rJ|jdd� ¡ }n$|tjjk�rb| ¡ }n|jdd�}| | j¡ ˆ¡}||fS )Nr!   r"   r   c                      s
   dˆ › �S r0  r)   r)   )Úorig_input_shaper)   r*   rl   ö  rm   z0multilabel_margin_loss_forward.<locals>.<lambda>c                      s   dˆ› dˆ › �S )Nzinconsistent target size: z for input of size: r)   r)   ©r7  Zorig_target_shaper)   r*   rl   ú  rm   r»  rI   Tr  r2  rk   rX   )r   rI   )rÇ   rZ   r3  rn   r  r!  r   r%  r[   rÆ  ÚanyrK   ÚTrû   r    r'   rh   r¸   r·   r(   r6   r»   rÒ   )r—   r½   r¶   rG   r_  Zis_endZend_idxZtarget_maskZtidx0r4  Ztidx1r6  r\   r)   r8  r*   Úmultilabel_margin_loss_forwardç  s@    



þþ

r;  c                    s   t | ƒ‡ fdd„ƒ}|S )Nc                     s   ˆ | |Ž}| d   |¡S rd   )r©   )r?   r@   rš   ©Úoutplace_opr)   r*   Ú
inplace_op  s    
z$register_inplace.<locals>.inplace_opr   )Zaten_opr=  r>  r)   r<  r*   Úregister_inplace  s    r?  )F)r�   )FN)FN)r"   )r   NNr!   )N)r!   )r!   )rI   FF)r   )r   )r!   r!   )r!   r!   F)r!   r!   )r   )N)r~   rX   )r   r!   N)N)NN)NNN)F)F)F)F)F)NN)r   r   F)NN)N)NF(A  rD   r  r  Úenumr   r   r   Ú	itertoolsr   r   Útypingr   r   r	   r
   r   r   r   rZ   Ztorch._primsr   r>  Ztorch._prims_commonZ_prims_commonr=   Ztorch.nn.functionalr!  rØ  r˜   r   r   r   Ztorch._decompr   r   r   r   r   Ztorch._prims_common.wrappersr   r   r   r   Z%torch.fx.experimental.symbolic_shapesr   r   Ztorch.utils._pytreer   r   r«  ZDispatchKeyr   ÚstrÚ__annotations__Z_opsrë  ro   r    r~  rw  rF   r  Zcompute_only_pw_cast_for_opmathZpw_cast_for_opmathZINT_TO_FLOATZpw_cast_for_int_to_realr§  rM   rS   rT   r]   ro  re   ÚfillZScalarri   rq   r|   r€   r„   r…   rˆ   rŠ   rŽ   r–   r›   rœ   r�   rŸ   r    r¬   rí  Zpy_implZAutogradCUDAÚ	Generatorr­   r¯   r³   r¹   r»   r¼   r¾   r'   rh   rÂ   rÃ   rÄ   rÅ   rÉ   rË   rš   rÌ   rÕ   rÚ   râ   rä   ré   rê   rë   rì   rð   rý   r  Úslicer  r  r  r  r  r  r#  rP  r`  re  rk  rr  rv  ZCompositeImplicitAutogradZAutogradru  r‚  rƒ  Zrsubr‰  rŠ  r�  r–  rZ  rœ  rì  r   rî  r©  r®  r±  rÅ  rÇ  rÔ  rã  rç  rê  Zunsafe_chunkrð  ré  rè  Zno_statsrñ  rò  Z_fused_dropoutrô  rõ  rú  r  r   rô   ÚdetachZliftZ
lift_freshr  r  r	  r  r  Z_adaptive_avg_pool2dr"  r*  r+  r)  r8  r9  r7  r:  r¨   r?  rD  rF  rG  r¯  rI  rK  rN  rO  rP  rR  r`  rh  rk  rm  rz  r�  r‚  r…  rŽ  r’  Zrnn_tanhr—   r˜  Zrnn_relur™  r�  rž  rŸ  r¤  r¦  r§  r°  Zlstmr²  r³  rµ  r¶  Zgrur·  r¸  r¹  r¼  r½  r¾  rÃ  rÄ  Z_unsafe_viewrT  rÅ  rÉ  rÊ  rË  rÎ  rÐ  rÑ  rÕ  rÔ  rØ  rá  râ  rç  rè  ré  r  r°  r  r  r  rù   Zupsample_bicubic2dr#  r$  r&  r(  r!  rÿ  rû  r,  rÿ   r.  r5  r;  r?  Zaddbmm_ZaddbmmZaddmm_Zaddmv_Zbaddbmm_ZbaddbmmZfill_Zgelu_r¬  Z
hardswish_Z	hardtanh_ZhardtanhZhardsigmoid_Ú__iand__Ú__and__Ú__ilshift__Ú
__lshift__r1  r2  Zindex_reduce_Zindex_reduceÚ__ior__Ú__or__Ú__irshift__Ú
__rshift__Ú__ixor__Ú__xor__Zleaky_relu_rª   Zlogit_ZlogitZrelu_r­  Zrenorm_ZrenormZround_r  Zscatter_rÑ   Zscatter_add_Zscatter_addZscatter_reduce_Zscatter_reduceZsilu_r)   r)   r)   r*   Ú<module>   s–   $
ýý$ý ÿ ÿú
   ÿ   ÿ
ü
 úù úùø
	ÿ  þ   ÿüü
    ÿ
ú
    ÿ
úø ø*ø!üûûúýü	üûú
   úú2    ÿ  ÿ   ÿ   ÿ	úPù`    þ
ÿ  þ

  ûúûÿ  þ"   úú 
õV÷MöR÷÷#
ø
÷
ù
÷øø%øõc÷"júúúúùù"    ÿ"
 ýý


	
ýü	
 üû
  ûúÿ.2)


 
 ?2

		


	

 ûúN


ú5
ú
ú
   ÿ



"
  ûú 


  ÿw û
ú=üû

úúùù
úù,

ü0	