U
    ªÊ¹jÛW ã                   @   sT&  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZmZ d dlZd dlZd dlZd dlm  mZ d dlmZmZmZmZmZmZmZmZmZm Z m!Z! d dl"m#Z#m$Z$ d dlm%Z% d dl&m'Z'm(Z(m)Z) d	d
l*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3 ddl/m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddlm?Z?m@Z@mAZAmBZB ddlCmDZDmEZE e FeG¡ZHi ZIi ZJeKƒ ZLejDjMZMejDjNZNejDjOZOeKƒ ZPeKƒ ZQdd„ ZRdd„ ZSdd„ ZTeSeMjUeMjVeMjWeMjXeMjYeMjZeMj[eMj\eMj]eMj^eMj_eMj`gƒ ejaejbejcejdejeejfejgejhejiejjejiejkejldœZmendœdd„Zodd„ Zpdd„ Zqedœd d!„Zrd"d#„ Zsd$d%„ Ztd&d'„ Zud(d)„ Zvd*ejwd*fd+d,„Zxd-d.„ Zy�dÛd/d0„Zz�dÜd1d2„Z{�dÝd3d4„Z|�dÞe<ej}d5œd6d7„Z~exeOjdd�e<ej}d5œd8d9„ƒZ€d*d:œe<ej}d5œd;d<„Z�exeMj‚j}dd�e<ej}d5œd=d>„ƒZƒd*d:œe<ej„d?œd@dA„Z…exeOj†dd�e<ej„d?œdBdC„ƒZ‡ddDejwd*ddd*d*fdEdF„Zˆ�dßdGdH„Z‰exeMjŠd*ddI�dJdK„ ƒZŠexeMj‹d*ddI�dLdM„ ƒZ‹exeMjŒeMj�eMjŽeMj�eOj�gƒdNdO„ ƒZ‘e’eMdPƒ�rexeMj“ƒe‘ƒ exeMj”dd��dàdQdR„ƒZ”exeMj•dd��dádSdT„ƒZ•exeMj–gƒ�dâdUdV„ƒZ–exeMj—ƒdWdX„ ƒZ—exeMj˜ƒdYdZ„ ƒZ˜exeMj™ƒd[d\„ ƒZ™exeMjšƒd]d^„ ƒZšexeMj›ƒd_d`„ ƒZ›exeMjœƒdadb„ ƒZœexeMj�dd�dcdd„ ƒZ�exeOjždd�dedf„ ƒZžexeMjŸdd�dgdh„ ƒZŸexeMj ƒdidj„ ƒZ exeMj¡dd�exeMj‚dd�exeMj¢dd�dkdl„ ƒƒƒZ‚exeMj£dd�dmdn„ ƒZ£exeMj¤dd��dãdpdq„ƒZ¥exeMj¦dd�e§ƒ fdrds„ƒZ¦exeMjUdd��dädtdu„ƒZUexeMj¨dd��dådvdw„ƒZ¨exeMj©dd��dædxdy„ƒZ©exeMjªƒ�dçdzd{„ƒZªexeMj«dd��dèenenend|œd}d~„ƒZ«exeMj¬dd��déenenend|œdd€„ƒZ¬exeMj­dd��dêenenend|œd�d‚„ƒZ­exeMj®dd�dƒd„„ ƒZ®exeMj¯dd��dëd…d†„ƒZ¯exeMj°dd��dìd‡dˆ„ƒZ°exeMj±dd��díd‰dŠ„ƒZ±exeMj²dd�d‹dŒ„ ƒZ²exeMj³dd�d�dŽ„ ƒZ³exeMj´dd�d�d�„ ƒZ´�dîd‘d’„ZµexeMj¶ƒ�dïd”d•„ƒZ¶d–d—„ Z·e·ƒ  �dðd˜d™„Z¸e  ¹d¡dšd›„ ƒZºej»j¼dœœd�dž„Z½ej»j¼dœœdŸd „Z¾�dñej¿jÀd¡œd¢d£„ZÁ�dòd¤d¥„ZÂd¦d§„ ZÃexejDjÄjÅdd�d¨d©„ ƒZÅexeMjÆdd�dªd«„ ƒZÆexeMjÇdd�d¬d­„ ƒZÇexeMjÈjÉdd�d®d¯„ ƒZÊexeMjËƒd°d±„ ƒZËe  ¹d¡d²d³„ ƒZÌd´dµ„ ZÍe¸eMjÎƒZÏe¸eMjÐƒZÑeÂeMjÒƒ exeMjÎƒd¶d·„ ƒZÎexeMjÐƒd¸d¹„ ƒZÐexe.jÓdd�dºd»„ ƒZÔexe.jÕdd�ej„d¼œd½d¾„ƒZÖexe.j×dd�d¿dÀ„ ƒZØexe.jÙdd�dÁdÂ„ ƒZÚexe.jÛdd�d dÃœeen e<eÜendÄœdÅdÆ„ƒZÝexe.jÒdd�d dÃœeneneen e<endÇœdÈdÉ„ƒZÞexeMjßdd�d*d*dÊœe<e<ekekdËœdÌdÍ„ƒZßdÎdÏ„ ZàdÐdÑ„ ZádÒdÓ„ ZâdÔdÕ„ ZãdÖhZäeÂeMjåeàƒ eÂeMjZeãƒ eÂeMjæeàƒ eÂeMjçeáƒ eÂeMjèeàd*d×� eÂeMjéeàd*d×� eÂeMjêeáƒ eÂeMjëeáƒ eÂeMjìƒ eÂeMjíƒ eÂeMjîƒ eÂeMjïƒ eÂeMjðeàƒ eÂeMjñƒ eÂeMjòƒ eÂeMjóƒ eÂeMjôƒ eÂeMjõƒ eÂeMjöƒ eÂeMjöj÷ƒ eÂeMjøƒ eÂeMjùeàƒ eÂeMjúƒ eÂeMjûeáƒ eÂeMjüeáƒ eÂeMjýƒ eÂeMjþƒ eÂeMjÿƒ eÂeM�j ƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jd*d×� eÂeM�jd*d×� eÂeM�jƒ eÂeM�jƒ eÂeM�j	ƒ eÂeM�j
ƒ eÂeM�jƒ eÂeMjéd*d×� eÂeM�jd*d×� eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jd*d×� eÂeM�jd*d×� eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�jƒ eÂeM�j ƒ eÂeM�j!ƒ eÂeM�j"ƒ eÂeM�j#ƒ eÂeM�j$ƒ eÂeM�j%ƒ eÂeM�j&ƒ eÂeM�j'ƒ eÂeM�j(ƒ eÂeM�j)ƒ eÂeM�j*ƒ eÂeM�j+ƒ eÂeM�j,ƒ eÂeM�j-ƒ eÂeM�j.ƒ eÂeM�j/ƒ eÂeM�j0ƒ eÂeM�j1ƒ eÂeM�j2ƒ eÂeM�j3ƒ eÂeM�j4ƒ eÂeM�j5ƒ eÂeM�j6ƒ eÂeM�j7ƒ eÂeM�j8ƒ eÂeM�j9ƒ eÂeM�j:ƒ eÂeM�j;ƒ eÂeM�j<ƒ eÂeM�j=ƒ eÂeM�j>ƒ eÂeM�j?d*d×� eÂeM�j@d*d×� eÂeM�jAd*d×� eÂeM�jBƒ eÂeM�jCƒ eÂeM�jDƒ eÂeM�jEd*d×� eÂeM�jFƒ eÂeM�jGƒ eÂeM�jHd*d×� eÂeM�jId*d×� eÂeM�jJd*d×� eÂeM�jKƒ eÂeM�jLƒ eÂeM�jMƒ eÂeM�jNƒ eÂeM�jOƒ eÂeM�jPd*d×� eÂeM�jQƒ eÂeM�jRƒ eÂeM�jSd*d×� eÂeM�jTd*d×� eÂeM�jUƒ eÂeM�jVƒ eÂeM�jWd*d×� eÂeM�jXd*d×� eÂeM�jYƒ eÂeM�jZƒ eÂeM�j[ƒ eÂeM�j\ƒ eÂeM�j]ƒ eÂeM�j^ƒ eÂeM�j_ƒ eÂeM�j`ƒ eÂeM�jaƒ eÂeM�jbƒ eÂeM�jcƒ eÂeM�jdƒ eÂeM�jeƒ eÂeM�jfƒ eÂeM�jgd*d×� eÂeM�jh�jiƒ eÂeM�jj�jkƒ eÂeM�jl�jkƒ eÂeM�jmƒ eÂeM�jnƒ eÂeM�joƒ eÂeM�jpƒ eÂeM�jq�jrƒ eÂeM�js�jkƒ eÂeM�jt�jkƒ eÂeM�juƒ eÂeM�jvƒ eÂeM�jwƒ eÂeM�jxƒ eÂeM�jyƒ eÂeM�jz�jkd*d×� eÂeM�j{ƒ eÂeM�j|�j}ƒ eÂe�j~�j�j€ƒ eÂe�j~�j�j�ƒ eÂeM�j‚�jkd*d×� exeM�jƒdd��dódØdÙ„ƒ�ZƒexeM�j„ƒddÚœdÛdÜ„ƒ�Z„e’eMdÝƒ�r’exeM�j…ƒ�e„ƒ exeO�j†ƒdÞdß„ ƒ�Z†exeM�j‡dd�enendàœdádâ„ƒ�Z‡exeM�jˆdd��dôdãdä„ƒ�Zˆdådæ„ �Z‰exe�jŠeM�j‹gƒdddd*dçœdèdé„ƒ�ZŠexe�jŒƒ�dõdêdë„ƒ�ZŒexe�j�ƒdìdí„ ƒ�ZŽexeM�j�ƒdîdï„ ƒ�Z�dðdñ„ �Z�exeM�j‘dd�dòdó„ ƒ�Z‘dôdõ„ �Z’exe�j“eM�j“gƒdddddddöœd÷dø„ƒ�Z“dùdú„ �Z”dûdü„ �Z•exeM�j–ƒ�e”�e“ƒƒ�Z–�e”�e’dƒƒ�Z—�e”�e’d ƒƒ�Z˜dýdþ„ �Z™exeM�jšƒdddddÿœ�d �d„ƒ�ZšexeM�j›ƒdddddÿœ�d�d„ƒ�Z›exeM�jœƒdddddÿœ�d�d„ƒ�ZœexeO�j��jkƒ�d�d„ ƒ�Z�exe�jžeM�jžgƒ�d�d	„ ƒ�ZžexeM�jŸdd��dö�d
�d„ƒ�ZŸexeM�j dd��d÷�d�d„ƒ�Z �d�d„ �Z¡�d�d„ �Z¢exeM�j£dd��d�d„ ƒ�Z£exeM�j¤dd��d�d„ ƒ�Z¤exeM�j¥ƒ�dø�d�d„ƒ�Z¥exeM�j¦ƒ�dù�d�d„ƒ�Z¦�d�d„ �Z§�d�d„ �Z¨exeM�j©dd��dú�d�d„ƒ�Z©�d �d!„ �ZªexeM�j«dd��dû�d"�d#„ƒ�Z«exeM�j¬dd�en�d$œ�d%�d&„ƒ�Z¬ddD�d'œeneeÜ ek�d(œ�d)�d*„�Z­exeM�j®dd�d�d+œeneeÜ �d,œ�d-�d.„ƒ�Z®exeM�j¯dd�en�d$œ�d/�d0„ƒ�Z¯exeM�j°dd�en�d$œ�d1�d2„ƒ�Z°exeM�j±dd�en�d$œ�d3�d4„ƒ�Z±exeM�j²dd�dD�d5œenek�d6œ�d7�d8„ƒ�Z²�düee�e³ �d9f en�d:œ�d;�d<„�Z´exeM�jµ�jkƒ�dýe�e³ �d=œ�d>�d?„ƒ�ZµexeMj^�jkƒ�dþe�e³ e�e³ �d@œ�dA�dB„ƒZ^exeM�j¶�jkƒ�dÿe�e³ e�e³ e�e³ �dCœ�dD�dE„ƒ�Z¶�dF�dG„ �Z·exeMj_�jkƒ�d eke�e³ e�e³ �dHœ�dI�dJ„ƒ�Z¸exeM�j¹ƒ�dK�dL„ ƒ�Z¹exeM�jºƒ�dM�dN„ ƒ�ZºexeO�j»�jkƒ�dO�dP„ ƒ�Z»exeM�j¼dd��d�dQ�dR„ƒ�Z¼e�j½ee�j½enf �dSœ�dT�dU„�Z¾e�j½e�j½�dVœ�dW�dX„�Z¿e�j½e�j½e�j½�dYœ�dZ�d[„�ZÀ�d�d]�d^„�ZÁ�d_�d`„ �ZÂe¸eMj[ƒ�ZÃexeMj[dd��d�da�db„ƒZ[e¸eMj\ƒ�ZÄexeMj\dd��dc�dd„ ƒZ\�de�df„ �ZÅ�dg�dh„ �ZÆe¸eM�jÇƒ�ZÈexeM�jÇƒ�di�dj„ ƒ�ZÇexeM�jÉ�jkƒ�d�dk�dl„ƒ�ZÉe¸eMjVƒ�ZÊexeMjVdd��d�dn�do„ƒZVe¸eMjWƒ�ZËexeMjWdd��d�dp�dq„ƒZW�dr�ds„ �ZÌ�dt�du„ �ZÍ�deÜ�dvœ�dw�dx„�ZÎexeM�jÏƒ�dddœ�dy�dz„ƒ�ZÏ�d{�d|„ �ZÐ�d}�d~„ �ZÑ�d�d€„ �ZÒexeM�jÓeO�jÓgƒ�d	dd*�d�œ�d‚�dƒ„ƒ�ZÔexeM�jÕƒ�d
dd*�d�œ�d„�d…„ƒ�ZÕ�d†�d‡„ �ZÖe{�dˆ�d‰„ ƒ�Z×e¸eM�jØƒ�ZÙexeM�jØdD�dŠ��d‹�dŒ„ ƒ�ZØ�d��dŽ„ �ZÚexeM�jÛƒ�d��d�„ ƒ�ZÛexeM�jÜdd��d�d‘�d’„ƒ�ZÜe{�d“�d”„ ƒ�ZÝe{�d•�d–„ ƒ�ZÞexeM�jßdD�dŠ��d�d—�d˜„ƒ�ZàexeM�jágdD�dŠ��d™�dš„ ƒ�ZáexeO�jßgdD�dŠ��d›�dœ„ ƒ�ZâexeM�jãeM�jß�jägdDe�jådI��eâƒ�ZßexeM�jæeO�jægdD�dŠ��d��dž„ ƒ�ZæexeM�jçƒ�dŸ�d „ ƒ�ZçexeM�jèeO�jègƒ�dddœ�d¡�d¢„ƒ�ZéexeM�jêƒ�dddœ�d£�d¤„ƒ�ZêexeM�jëƒ�d�d¥�d¦„ƒ�ZìexeM�jíƒ�d�d§�d¨„ƒ�ZîexeM�jïƒ�d�d©�dª„ƒ�ZðexeO�jñƒ�eÎ�d«ƒƒ exeM�jòƒ�eÎ�d¬ƒƒ�ZóexeM�jôƒ�eÎ�d­ƒƒ�ZõexeM�jöƒ�eÎ�d®eje�d¯�ƒ�Z÷exeM�jøƒ�eÎ�d°eje�d¯�ƒ�ZùeˆeM�júdD�d±�d²��Zú�d³�d´„ �Zû�dµ�d¶„ �Zü�eüeM�jýƒ�Zý�eûeM�jþƒ�Zþ�eûeM�jÿƒ�ZÿeˆeM�j ƒ�Z �eüeM�jƒ�Z�eüeM�jƒ�ZeˆeM�jƒ�ZeˆeM�jdD�d·��Z�eüeM�jƒ �eüeM�jƒ eˆeM�jƒ eˆeM�jƒ�ZeˆeM�j	ƒ�Z	eˆeM�j
�d¸�d¹��Z
eˆeM�jƒ�ZeˆeM�jƒ�ZeˆeM�jƒ�Z�eûeM�jƒ �eûeM�jƒ�ZexeM�je�jåd��eƒ �eûeM�jƒ �eûeM�jƒ �eûeM�jƒ �eüeMjHƒ eˆeM�jddDejk�dº��ZeˆeM�jddDejk�dº��ZeˆeM�jddDejk�dº��ZeˆeM�jddDejk�dº��ZeˆeM�jƒ�ZeˆeM�jƒ�ZexeM�jƒ�eƒ exeM�jƒ�eƒ eˆeM�jƒ�Z�eûeM�jƒ�ZeˆeM�jƒ eˆeM�j�d»�d¹��ZeˆeMj™ƒ eˆeM�j ejk�d¯� eˆeM�j!ejk�d¯� eˆeM�j"ejk�d¯� eˆeM�j#ejk�d¯� eˆeM�j$ejk�d¯��Z$eˆeM�j%ejk�d¯� eˆeM�j&ejk�d¯� �eûeM�j'ƒ �eûeM�j(ƒ �eûeM�j)ƒ �eûeM�j*ƒ �eûeM�j+ƒ �eûeM�j,ƒ �eûeM�j-ƒ �eûeM�j.ƒ �eûeM�j/ƒ �eûeM�j0ƒ �eûeM�j1ƒ �eûeM�j2ƒ �eûeM�j3ƒ �eûeM�j4ƒ �eûeM�j5ƒ e‰eM�j6j�eúdD�d·� e‰eM�j6�j7�eúdD�d·� e‰eM�j8j�eáƒ e‰eM�j8�j7�eáƒ e‰eM�j9j�eƒ e‰eM�j9�j7�eƒ e‰eM�j:�jk�eƒ e‰eM�j;�j7�eØƒ e‰eM�j;�j<�eØƒ e‰eM�j=j�eßƒ e‰eM�j=�j7�eßƒ e‰eM�j>�eƒ e‰eM�j?j�eƒ e‰eM�j?�j7�eƒ e‰eM�j@�eƒ e‰eM�jA�eƒ e‰eM�jB�eƒƒ �d¼�d½„ �ZC�eCeM�jD�eúƒ �eCeM�jE�eƒ �eCeM�jF�e	ƒ �eCeM�jG�e
ƒ �eCeM�jH�eƒ �eCeM�jI�eƒ �eCeM�jJ�eƒ �eCeM�jK�eáƒ �eCeM�jL�jä�eßƒ �eCeM�jL�jM�eàƒ �eCeM�jN�eƒ �eCeM�jO�eƒ �eCeM�jP�eƒ �eCeM�jQ�eƒ �eCeM�jR�eƒ �eCeM�jS�e ƒ �eCeM�jT�eƒ exeM�jUƒ�eƒ exeM�jVƒ�e	ƒ exeM�jWƒ�eƒ exeM�jXƒ�eƒ exeM�jYƒ�eƒ �eCeM�jZeM�jUƒ �eCeM�j[eM�jVƒ �eCeM�j\eM�jWƒ �eCeM�j]eM�jXƒ �eCeM�j^eM�jYƒ exeM�j_ƒ�d¾�d¿„ ƒ�Z_exeM�j`ƒ�dÀ�dÁ„ ƒ�Z`exeM�jaƒ�dÂ�dÃ„ ƒ�ZaexeM�jbƒ�dÄ�dÅ„ ƒ�Zbe#� c¡ D ]"\�Zd�Zeexe$�edƒƒ�eeƒ �$q´exeMjËƒ�dÆ�dÇ„ ƒ�ZfexejD�jg�jhƒ�dÈ�dÉ„ ƒ�ZizÞd d�ljZejD�jk�Zkex�ek�jlƒ�dÊ�dË„ ƒ�Zmex�ek�jnƒ�dÌ�dÍ„ ƒ�Zoex�ek�jpƒ�dÎ�dÏ„ ƒ�Zpex�ek�jqƒ�dÐ�dÑ„ ƒ�Zqex�ek�jrƒ�dÒ�dÓ„ ƒ�Zrex�ek�jsƒ�dÔ�dÕ„ ƒ�Zsex�ek�jtƒ�dÖ�d×„ ƒ�ZtW n& �euk
�&r   eH� v�dØ¡ Y nX d�dÙl,�mw�Zw e+�ewƒ d�dÚl,�mx�Zx �ex� y¡  dS (  é    N)Údefaultdict)ÚIterable)ÚAnyÚListÚOptionalÚTupleÚUnion)Úcanonicalize_dimÚcanonicalize_dimsÚcheckÚdtype_to_typeÚelementwise_dtypesÚELEMENTWISE_TYPE_PROMOTION_KINDÚis_boolean_dtypeÚis_float_dtypeÚis_integer_dtypeÚNumberÚtype_to_dtype)Úmagic_methodsÚmethod_to_operator)Útree_flatten)ÚCeilDivÚFloorDivÚModularIndexingé   )Úimport_submoduleé   )ÚconfigÚinductor_primsÚirÚtest_operators)ÚdecompositionsÚget_decompositions)Ú
ExpandViewÚIndexingConstantÚ	is_tritonÚops_wrapperÚPermuteViewÚ	PointwiseÚ	ReductionÚSqueezeViewÚ	TensorBoxÚvalidate_irÚView)ÚceildivÚdecode_deviceÚpad_listlikeÚsympy_product)ÚopsÚVc                 C   s   | st d|› �ƒ‚d S )Nzinductor does not support ©ÚNotImplementedError)ÚcondÚmsg© r8   úW/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_inductor/lowering.pyÚ
assert_nyi>   s    r:   c                 C   sX   t | tttfƒrdd„ | D ƒS t | ¡ t | tjjƒrT|  	¡ D ]}t t
| |ƒ¡ q>d S )Nc                 S   s   g | ]}t |ƒ‘qS r8   )Úadd_needs_realized_inputs©Ú.0Úxr8   r8   r9   Ú
<listcomp>E   s     z-add_needs_realized_inputs.<locals>.<listcomp>)Ú
isinstanceÚlistÚtupleÚsetÚneeds_realized_inputsÚaddÚtorchÚ_opsÚOpOverloadPacketÚ	overloadsÚgetattr)ÚfnÚoverloadr8   r8   r9   r;   C   s    
r;   c                 C   s8   t | tjjƒr,|  ¡ D ]}|tt| |ƒ< qn|t| < d S ©N)r@   rF   rG   rH   rI   Úlayout_constraintsrJ   )rK   Ú
constraintrL   r8   r8   r9   Úadd_layout_constraintL   s    rP   )r   r   r   é   é   é   é   é   é   é	   é
   é   é   ©Údtypec                 C   s2   t | tƒs| S | tks&td| › d�ƒ‚t|  } | S )Nzid z missing from DTYPE_ID_LOOKUP)r@   ÚintÚDTYPE_ID_LOOKUPÚAssertionErrorr[   r8   r8   r9   Údecode_dtype~   s
    
r`   c                 C   sF   t | tƒr"t|  ¡ ƒp t|  ¡ ƒS t | tjƒr8| jdkS t | tƒS d S ©NT)	r@   r+   r   Ú	get_dtyper   ÚsympyÚSymbolÚ
is_integerr]   ©r>   r8   r8   r9   Úis_integer_type†   s
    

rg   c                 C   s$   t | tƒrt|  ¡ ƒS t | tƒS d S rM   )r@   r+   r   rb   Úboolrf   r8   r8   r9   Úis_boolean_type�   s    
ri   ©Útype_promotion_kindc                    s0   dd„ ‰ ‡ fdd„|D ƒ}t |d| iŽ\}}|S )Nc                 S   sJ   t | ttjfƒr| S t| dƒs"t‚t|  ¡ ƒ}tj	dg| |  
¡ d�S d S )Nrb   r   r[   )r@   r   rc   rd   Úhasattrr_   ÚlenÚget_sizerF   Úzerosrb   )ÚinpÚdimr8   r8   r9   Úconstruct_input—   s
    z+get_promoted_dtype.<locals>.construct_inputc                    s   g | ]}ˆ |ƒ‘qS r8   r8   )r=   Úarg©rr   r8   r9   r?       s     z&get_promoted_dtype.<locals>.<listcomp>rk   )r   )rk   ÚargsZinpsÚ_r\   r8   rt   r9   Úget_promoted_dtype–   s    	rw   c                 C   sh   t | ttfƒs| g} nt| ƒ} t| ƒD ]<}t |tjjƒr&| ¡ D ] }t||ƒ}|tkr@|  	|¡ q@q&| S rM   )
r@   rA   rB   rF   rG   rH   rI   rJ   Ú	loweringsÚappend)Úaten_fnrK   rL   Zother_fnr8   r8   r9   Úget_overloads¥   s    
r{   c                    sè   dd„ t ˆ ƒD ƒ‰|s|rhˆrh|r*tj‰ndd„ ˆ D ƒ}t|d|iŽ‰‡ ‡‡fdd„‰‡fdd„ˆ D ƒ‰ |räˆrätˆt‡ fdd„ˆD ƒŽ ƒD ]\}}|ˆ |< qŒttˆ ƒƒD ]8}tˆ | t	j
ƒrªt ˆ | tˆ ˆd	   ¡ ƒ¡ˆ |< qªˆ S )
Nc                 S   s   g | ]\}}t |tƒr|‘qS r8   ©r@   r+   ©r=   Úir>   r8   r8   r9   r?   ¶   s     
 z"transform_args.<locals>.<listcomp>c                 S   s$   g | ]}t |tƒst|d ƒr|‘qS ©rb   )r@   r   rl   ©r=   Úar8   r8   r9   r?   ¼   s    
 
 rk   c                    sD   t | tƒrt| ˆƒS t | tjƒr<t | jˆˆ ˆd   ¡ ¡S | S d S ©Nr   )r@   r+   Úto_dtyper   ÚConstantÚvalueÚ
get_device)rs   )ru   r\   Úindicesr8   r9   ÚpromoteÄ   s
    

ztransform_args.<locals>.promotec                    s   g | ]}ˆ |ƒ‘qS r8   r8   r€   )rˆ   r8   r9   r?   Ì   s     c                    s   g | ]}ˆ | ‘qS r8   r8   ©r=   r~   ©ru   r8   r9   r?   Î   s     r   )Ú	enumeraterF   rh   rw   ÚzipÚbroadcast_tensorsÚrangerm   r@   r   r„   r#   ÚcreaterA   rn   )ru   Ú	broadcastrk   Úconvert_input_to_boolZpromoting_argsr~   r>   r8   )ru   r\   r‡   rˆ   r9   Útransform_argsµ   s*    ÿÿÿ$
&r’   c                    sD   t  ˆ ¡‡ fdd„ƒ‰t| ƒ}t |¡ t ‡fdd„|D ƒ¡ ˆS )a¯  
    Add a foreach lowering to lowerings dict.

    Arguments:
        aten_fn: torch.ops.aten.* fn we are lowering
        decomp_fn: alternate implementation on our IR
        broadcast: True to apply broadcasting to tensor inputs
        type_promotion_kind: kind of type promotion applied to tensor inputs, `None` means no type promotion
        convert_input_to_bool: some logical ops require inputs are converted to bool
    c                     s&   t | ƒdkst‚ˆ | |Ž}t|ƒ |S )Nr   )rm   r_   r,   )ru   ÚkwargsÚout)Ú	decomp_fnr8   r9   Úwrappedã   s    
z+_register_foreach_lowering.<locals>.wrappedc                    s   i | ]
}|ˆ “qS r8   r8   ©r=   rK   ©r–   r8   r9   Ú
<dictcomp>ì   s      z._register_foreach_lowering.<locals>.<dictcomp>)Ú	functoolsÚwrapsr{   Úforeach_opsÚupdaterx   )rz   r•   Zaten_fnsr8   )r•   r–   r9   Ú_register_foreach_lowering×   s    
rž   c                    sB   t  ˆ¡‡ ‡‡‡‡fdd„ƒ‰tˆ ƒ‰ t ‡fdd„ˆ D ƒ¡ ˆS )a¦  
    Add a lowering to lowerings dict

    Arguments:
        aten_fn: torch.ops.aten.* fn we are lowering
        decomp_fn: alternate implementation on our IR
        broadcast: True to apply broadcasting to tensor inputs
        type_promotion_kind: kind of type promotion applied to tensor inputs, `None` means no type promotion
        convert_input_to_bool: some logical ops require inputs are converted to bool
    c                     s®   t | ƒ} d}t| ƒdkr6t| d t tfƒr6d}| d } tdd„ | ¡ D ƒƒrTtdƒ‚tdd„ | ¡ D ƒƒr€td	d„ ˆ D ƒƒs€t‚t	| ˆˆˆƒ} |r˜| g} ˆ| |Ž}t
|ƒ |S )
NFr   r   Tc                 s   s   | ]}|d kV  qdS )r”   Nr8   r<   r8   r8   r9   Ú	<genexpr>  s    z6_register_lowering.<locals>.wrapped.<locals>.<genexpr>zout= ops aren't yet supportedc                 s   s   | ]}t |tƒV  qd S rM   r|   r<   r8   r8   r9   rŸ     s     c                 s   s   | ]}|t kV  qd S rM   )Ú	fallbacksr—   r8   r8   r9   rŸ     s    )rA   rm   r@   rB   ÚanyÚkeysr_   ÚvaluesÚallr’   r,   )ru   r“   Úunpackedr”   )rz   r�   r‘   r•   rk   r8   r9   r–   þ   s0    ÿ
þÿ   ÿ
z#_register_lowering.<locals>.wrappedc                    s   i | ]
}|ˆ “qS r8   r8   r—   r˜   r8   r9   r™     s      z&_register_lowering.<locals>.<dictcomp>)rš   r›   r{   rx   r�   )rz   r•   r�   rk   r‘   r8   )rz   r�   r‘   r•   rk   r–   r9   Ú_register_loweringð   s
    r¦   Fc                 C   s   t jt| |||d�S )z+
    Shim to support decorator syntax.
    ©r�   rk   r‘   )rš   Úpartialr¦   )rz   r�   rk   r‘   r8   r8   r9   Úregister_lowering"  s    	ûr©   c                 C   s¦   g }t jt| ƒt|ƒt d¡d�D ]v\} }|dkr>| | ¡ q"| dkrR| |¡ q"tjj 	| |¡ t
t |¡jƒt
t | ¡jƒk rŽ| |¡ q"| | ¡ q"tt|ƒƒS )zŸ
    Broadcasting logic based on symbolic shapes.

    We give the shapes 0 and 1 concrete values, while all other shapes
    are symbolic sympy formulas.
    r   )Ú	fillvalue)Ú	itertoolsÚzip_longestÚreversedrc   ÚIntegerry   r3   ÚgraphÚsizevarsÚguard_equalsrm   ÚexpandÚfree_symbolsrB   )r�   ÚbÚoutputr8   r8   r9   Úbroadcast_symbolic_shapes4  s      ÿ r¶   c                    sì   t dd„ | D ƒƒs| S tdd„ | D ƒƒrZ|p:t| dtjiŽ‰‡fdd„‰ ‡ fdd„| D ƒS td	d„ | D ƒƒ}g }| D ]r}t|ttfƒr´| 	t
 t || ¡ | ¡ ¡t| ¡ ƒ¡¡ qtt|tjƒrÜ| 	t|| ¡ | ¡ ƒ¡ qt| 	|¡ qt|S )
Nc                 s   s    | ]}t |tjttfƒV  qd S rM   )r@   rc   ÚExprr]   Úfloatr<   r8   r8   r9   rŸ   M  s     z$promote_constants.<locals>.<genexpr>c                 s   s    | ]}t |tttjfƒV  qd S rM   )r@   r]   r¸   rc   rd   r<   r8   r8   r9   rŸ   O  s     rk   c                    s4   t | tjƒrt | ˆ td ƒ¡S t | ˆ td ƒ¡S d S rM   )r@   rc   rd   r   r$   r/   r„   rf   r[   r8   r9   Ú
const_funcT  s    z%promote_constants.<locals>.const_funcc                    s   g | ]}ˆ |ƒ‘qS r8   r8   r<   )r¹   r8   r9   r?   Z  s     z%promote_constants.<locals>.<listcomp>c                 s   s    | ]}t |ttfƒr|V  qd S rM   )r@   r+   r#   r<   r8   r8   r9   rŸ   [  s      )r¡   r¤   rw   r   ÚDEFAULTÚnextr@   r]   r¸   ry   r#   r�   r   r„   rb   r†   rA   rn   rc   r·   r$   )ÚinputsÚoverride_return_dtypeÚexr”   r>   r8   )r¹   r\   r9   Úpromote_constantsL  s0    ÿÿ 
ÿÿr¿   c                    s*   d dœt t dœ‡ ‡‡‡‡‡fdd„}|S )N©Úalpha©r¼   c              	      sL  t |ˆ	ƒ}ˆr:| d k	rF| dkrFt|ƒ}t|d | ƒ|d< n| d ksFt‚dd„ |D ƒ‰|d  ¡ ‰ˆ	pn|d  ¡ ‰ t|d  ¡ ƒjdk‰|dd … D ]B}t	|t
jƒs’tˆƒt| ¡ ƒks’tdˆ› dˆ› d| ¡ › �ƒ‚q’‡ ‡‡‡‡‡‡fd	d
„}ˆ�s0d }|D ] }| ¡ jdkrü| ¡ } �qqü|�s0|d  ¡ }ˆ�p8|}tj|ˆ |ˆd�S )Nr   éÿÿÿÿc                 S   s   g | ]}|  ¡ ‘qS r8   ©Úmake_loaderr<   r8   r8   r9   r?   |  s     z1make_pointwise.<locals>.inner.<locals>.<listcomp>r   Úcudazndim mismatch ú c                    sŽ   t ˆ ƒt ˆƒks$tdˆ › dˆ› �ƒ‚ˆtjkrLˆd k	rLˆ‡ fdd„ˆD ƒŽ S ˆrtˆrtˆtjkrtˆ‡ fdd„ˆD ƒŽ S ˆ‡ fdd„ˆD ƒŽ S d S )Nzwrong ndim rÇ   c                    s   g | ]}|ˆ ƒ‘qS r8   r8   ©r=   Úload©Úindexr8   r9   r?   ‰  s     zCmake_pointwise.<locals>.inner.<locals>.inner_fn.<locals>.<listcomp>c                    s   g | ]}|ˆ ƒ‘qS r8   r8   rÈ   rÊ   r8   r9   r?   ‹  s     c                    s   g | ]}|ˆ ƒ‘qS r8   r8   rÈ   rÊ   r8   r9   r?   �  s     )rm   r_   rF   rh   Úfloat64rÊ   )r\   rK   Úis_cudaÚloadersÚoverride_fn_when_cuda_float64Úoverride_fn_when_input_boolÚrangesrÊ   r9   Úinner_fn†  s    $z/make_pointwise.<locals>.inner.<locals>.inner_fn©Údevicer\   rÒ   rÑ   )r¿   rA   Úmulr_   rn   rb   r/   r†   Útyper@   r   ÚBaseConstantrm   r(   r�   )rÁ   r¼   ÚotherrÒ   rÔ   r~   ©Úallow_alpharK   Úoverride_devicerÏ   rÐ   r½   )r\   rÍ   rÎ   rÑ   r9   Úinnert  s@    
ÿþ	
üzmake_pointwise.<locals>.inner©r   r+   )rK   r½   rÛ   rÐ   rÏ   rÚ   rÜ   r8   rÙ   r9   Úmake_pointwisel  s    &-rÞ   c                    s&   ddœt t t  dœ‡ ‡fdd„}|S )Nr   rÀ   rÂ   c                    sp  dd„ ‰ ‡ fdd„}d}t jjjD ](}|jD ]}|jdkrD|jtks,d}q,q"d }|D ]}t|tt	fƒrT|} qpqT|d k	s€t
dƒ‚g }|D ]2}t|tt	fƒs°| |gt|ƒ ¡ qˆ| |¡ qˆ|t|Ž ƒ}	d gt|ƒ }
|	 ¡ D ]t\\}}}g }|D ]N\}}ˆ�rˆ|d	| iŽ}nˆ|Ž }||
|< |jd
krò|rò|rò| | ¡ ¡ qò|rÞt j |¡ qÞtdd„ |
D ƒƒ�slt
‚|
S )Nc                  W   s   t dd„ | D ƒƒS )Nc                 s   s0   | ](}t |tƒo&td d„ |j ¡ D ƒƒV  qdS )c                 s   s   | ]}|j V  qd S rM   )r³   r<   r8   r8   r9   rŸ   ©  s     zVmake_foreach_pointwise.<locals>.inner.<locals>.is_dynamic.<locals>.<genexpr>.<genexpr>N)r@   r+   r¡   Údatarn   )r=   Útr8   r8   r9   rŸ   §  s   þ
zLmake_foreach_pointwise.<locals>.inner.<locals>.is_dynamic.<locals>.<genexpr>)r¡   rŠ   r8   r8   r9   Ú
is_dynamic¦  s    ýz9make_foreach_pointwise.<locals>.inner.<locals>.is_dynamicc                    st   t tƒ}t| ƒD ]^\}}ˆ |Ž  }d }|D ]}t|tƒr*|j ¡ } qHq*|d k	sXtdƒ‚|||f  ||f¡ q|S )Nz.foreach op should have at least one tensor arg)	r   rA   r‹   r@   r+   rß   r†   r_   ry   )Z	arg_pairsr”   r~   ru   Úuse_foreachrÔ   rà   ©rá   r8   r9   Ú
group_args¯  s    


ÿþz9make_foreach_pointwise.<locals>.inner.<locals>.group_argsFZcall_functionTz1at least one input must be a list to a foreach oprÁ   rÆ   c                 s   s   | ]}|d k	V  qd S rM   r8   r<   r8   r8   r9   rŸ   ë  s     z8make_foreach_pointwise.<locals>.inner.<locals>.<genexpr>)r3   r¯   Zcurrent_nodeZusersÚopÚtargetrœ   r@   rA   rB   r_   ry   rm   rŒ   ÚitemsrÖ   ÚrealizeZregister_listr¤   )rÁ   r¼   rä   Zrealize_outputsÚnodeÚuserZa_list_inputÚinputZbroadcast_inputsÚgroupsÚoutputsrÔ   râ   ÚgroupZbuffer_listZ
output_indru   rµ   ©rÚ   Úpw_fnrã   r9   rÜ   ¥  sN    	
ÿþýz%make_foreach_pointwise.<locals>.innerrÝ   )rð   rÚ   rÜ   r8   rï   r9   Úmake_foreach_pointwise¤  s    "Irñ   ©r>   r\   c                    s8   |   ¡ ˆ kr|rt| ƒS | S ‡ fdd„}t|ˆ d�| ƒS )Nc                    s   t  | ˆ ¡S rM   )r2   rƒ   rf   r[   r8   r9   Ú	_to_dtypeõ  s    zto_dtype.<locals>._to_dtype©r½   )rb   ÚclonerÞ   )r>   r\   Úcopyró   r8   r[   r9   rƒ   ñ  s    rƒ   c                 C   s   t | |dd�S ©NT©rö   ©rƒ   rò   r8   r8   r9   Ú_convert_element_typeû  s    rú   rø   c                   sv   |   ¡ ˆ kr|rt| ƒS | S dd„ }||   ¡ ƒ}|ˆ ƒ}||krZtd|   ¡ › dˆ › d�ƒ‚‡ fdd„}t|ˆ d�| ƒS )	Nc                 S   s"   | j rt | ¡jS t | ¡jS d S rM   )Zis_floating_pointrF   ZfinfoÚbitsÚiinfor[   r8   r8   r9   Ú_get_primitive_bitwidth  s    z1to_dtype_bitcast.<locals>._get_primitive_bitwidthzbitcast z to different bitwidth type z is not supported yet.c                    s   t  | ˆ ¡S rM   )r2   Úto_dtype_bitcastrf   r[   r8   r9   Ú_to_dtype_bitcast  s    z+to_dtype_bitcast.<locals>._to_dtype_bitcastrô   )rb   rõ   r5   rÞ   )r>   r\   rö   rý   Zsrc_bitsZdst_bitsrÿ   r8   r[   r9   rþ      s    ÿrþ   c                 C   s   t | |dd�S r÷   )rþ   rò   r8   r8   r9   Ú_view_dtype  s    r   ©r>   rÔ   c                C   s8   t |ƒ}|  ¡ |kr$|r t| ƒS | S t tj | |¡¡S rM   )r/   r†   rõ   r+   r�   r   Z
DeviceCopy)r>   rÔ   rö   r8   r8   r9   Ú	to_device  s    r  c                 C   s   t | |dd�S r÷   )r  r  r8   r8   r9   Ú_device_put#  s    r  Tc	                 C   s†   |p| j }t|ƒ}	|r"td| ƒ}
|dk	r2t|ƒ}t|	|||rB|
nd|d�}	t| |||d�|	ƒ}	tt|ƒr‚ttt|ƒd|d�|	ƒ |	S )z3A pointwise function that maps ops.{name} to inputsZ
libdevice_N)r½   rÐ   rÏ   rÚ   r§   )rk   r‘   )Ú__name__r&   rÞ   r©   rl   ÚprimsrJ   )rz   Únamer�   rk   r‘   r½   rÐ   rÚ   Úuse_libdevice_for_f64rK   Zfn_libdevicer8   r8   r9   Úregister_pointwise(  s<    

ûüû
ýür  c                 C   s   t ||d�}t| |ƒ}|S )N©rÚ   )rñ   rž   )rz   Zpointwise_lowering_fnrÚ   rK   r8   r8   r9   Úregister_foreach_pointwiseR  s    
r
  )r�   rk   c                    s  dd„ }t |ttfƒr"t|ƒ|ƒ}t |ttfƒr<t|ƒ|ƒ}| ||g‰ tˆ d ˆ d tjd�}dd„ tˆ ƒD ƒ}t|t	‡ fdd„|D ƒŽ ƒD ]\}}|ˆ |< qŒt
tˆ ƒƒD ]8}t ˆ | tjƒrªt ˆ | tˆ |d	   ¡ ƒ¡ˆ |< qªt||d
�ˆ d	 tˆ d |ƒtˆ d |ƒƒS )Nc                  W   s
   t j| Ž S rM   )r2   ÚwhererŠ   r8   r8   r9   rK   ^  s    zwhere.<locals>.fnr   r   rj   c                 S   s   g | ]\}}t |tƒr|‘qS r8   r|   r}   r8   r8   r9   r?   j  s     
 zwhere.<locals>.<listcomp>c                    s   g | ]}ˆ | ‘qS r8   r8   r‰   rŠ   r8   r9   r?   k  s     r   rô   )r@   r¸   r]   Úconstant_likerw   r   rº   r‹   rŒ   r�   rŽ   rm   r   r„   r#   r�   rA   rn   rÞ   rƒ   )r6   r�   r´   rK   r\   r‡   r~   r>   r8   rŠ   r9   r  \  s,    
  ÿ$
&
  ÿr  c                  G   s˜   t | ƒdkr*t| d ttfƒr*t| d Ž S t tdd„ | D ƒg ¡}g }| D ]H}| ¡ }t |ƒt |ƒks~t	dd„ t
||ƒD ƒƒrˆt||ƒ}| |¡ qJ|S )Nr   r   c                 S   s   g | ]}|  ¡ ‘qS r8   ©rn   r<   r8   r8   r9   r?   z  s     z%broadcast_tensors.<locals>.<listcomp>c                 s   s2   | ]*\}}|d kr|d kp(|d ko(|d kV  qdS ©r   Nr8   ©r=   r�   r´   r8   r8   r9   rŸ     s    z$broadcast_tensors.<locals>.<genexpr>)rm   r@   rA   rB   r�   rš   Úreducer¶   rn   r¡   rŒ   r²   ry   )r¼   ræ   rí   r>   Úsizesr8   r8   r9   r�   u  s       ÿÿ
r�   c                 C   s   | S rM   r8   rf   r8   r8   r9   Únop‡  s    r  Ú
lift_freshc                 C   s¬   t | tƒst‚|d kr&tt | j¡ƒS tt|  ¡ ƒ|ƒ}t	t |t
ƒsJ|fn|ƒ}g }t|  ¡ ƒD ]0\}}||kr†tjj t |d¡¡s`| |¡ q`||  ¡ kr¨t| |ƒS | S ©Nr   )r@   r+   r_   r*   r�   rß   r
   rm   rn   rC   rB   r‹   r3   r¯   r°   Úevaluate_exprrc   ÚEqry   Úview)r>   rq   ÚdimsÚ	new_shapeÚdÚsr8   r8   r9   Úsqueeze�  s    r  c                 C   s   t t| |ƒƒS rM   )rõ   r  )r>   rq   r8   r8   r9   Úsqueeze_copy¢  s    r  c                 C   s2   t | |ƒ}t| tƒst‚t|tƒs&t‚|j| _| S rM   )r  r@   r+   r_   rß   ©r>   rq   Úvalr8   r8   r9   Úsqueeze_§  s
    
r   c                 C   s2   t | ƒrt| dtjd�S tdƒ}t|tjd�| ƒS )NFr[   Úisinfrô   ©rg   Ú	full_likerF   rh   r&   rÞ   ©r>   rK   r8   r8   r9   r!  °  s    r!  c                 C   s2   t | ƒrt| dtjd�S tdƒ}t|tjd�| ƒS )NFr[   Úisnanrô   r"  r$  r8   r8   r9   r%  ¸  s    r%  c                 C   s$   t | ƒrt| ƒS tdƒ}t|ƒ| ƒS )NÚceil©rg   rõ   r&   rÞ   r$  r8   r8   r9   r&  À  s    r&  c                 C   s$   t | ƒrt| ƒS tdƒ}t|ƒ| ƒS )NÚfloorr'  r$  r8   r8   r9   r(  È  s    r(  c                 C   s$   t | ƒrt| ƒS tdƒ}t|ƒ| ƒS )NÚroundr'  r$  r8   r8   r9   r)  Ð  s    r)  c                 C   s$   t | ƒrt| ƒS tdƒ}t|ƒ| ƒS )NÚtruncr'  r$  r8   r8   r9   r*  Ø  s    r*  c                 C   s°   t | gƒ\} t| tjƒr(t | t|ƒ¡S t| tƒs6t‚t|t	tfƒsHt‚t|  
¡ ƒt|ƒkr`| S tjj t|  
¡ ƒ¡}|dkrš|  tjj t|ƒ¡| ¡ tt | jt|ƒ¡ƒS r‚   )r¿   r@   r   r×   r#   r�   rB   r+   r_   rA   rn   r3   r¯   r°   Ú	size_hintr1   Ú
mark_reuserß   )r>   r  Zx_size_productr8   r8   r9   r²   à  s    r²   c                 C   sL   t |ƒ}|D ]}d||< q| }t|ƒD ]\}}|dkr&t||ƒ}q&t||ƒS )NrÃ   )rA   r‹   Ú	unsqueezer²   )r�   ÚshapeZbroadcast_dimensionsr  Zbroadcast_dimensionÚvÚidxr>   r8   r8   r9   Úbroadcast_in_dimñ  s    
r1  c                 C   s   t | | ¡ ƒS rM   )r²   rn   ©r>   Úyr8   r8   r9   Ú	expand_asÿ  s    r4  c                    sR  t |  ¡ ƒ‰ tˆƒtˆ ƒkrJt d¡gtˆƒtˆ ƒ  ˆ  ‰ t| t ˆ ƒƒ} tˆƒt|  ¡ ƒksbt‚t |  ¡ ƒ}d}ttˆƒƒD ](}ˆ| dkr’d}|| ˆ|  ||< q~|rÂt||  	¡ |  
¡ d�S tdd„ tˆˆ ƒD ƒƒrät| |ƒS ‡ ‡‡fdd	„}tjj tˆ ƒ¡}|dk�r,|  tjj t|ƒ¡| ¡ |  ¡ ‰tj|  
¡ |  	¡ |t |ƒd
�S )Nr   Fr   T©r\   rÔ   c                 s   s"   | ]\}}|d kp|d kV  qdS r  r8   r  r8   r8   r9   rŸ     s     zrepeat.<locals>.<genexpr>c                    sv   t | ƒt ˆƒkst‚t| ƒ} tt ˆƒƒD ]D}ˆ| dkr(ˆ | dkrTt d¡| |< q(t| | dˆ | ƒ| |< q(ˆ| ƒS ©Nr   r   )rm   r_   rA   rŽ   rc   r®   r   )rË   r~   ©Zold_sizeÚrepeatsÚx_loaderr8   r9   rÒ     s    zrepeat.<locals>.inner_fnrÓ   )rA   rn   rm   rc   r®   r  r_   rŽ   Úemptyrb   r†   r¤   rŒ   r²   r3   r¯   r°   r+  r1   r,  rÅ   r(   r�   )r>   r8  Únew_sizeZzero_tensorr~   rÒ   Zold_size_productr8   r7  r9   Úrepeat  s8     

ÿür<  c                 C   s2   t | tƒst‚t |ttfƒs t‚tt | j|¡ƒS rM   )r@   r+   r_   rA   rB   r-   r�   rß   )r>   r  r8   r8   r9   r  4  s    r  c                 C   s6   t | tƒst‚t |ttfƒs t‚tt | jt|ƒ¡ƒS rM   )r@   r+   r_   rA   rB   r'   r�   rß   )r>   r  r8   r8   r9   Úpermute=  s    r=  ì            c                 C   s|   t | tƒst‚t| |dƒ}|  ¡ | }tjj t	 
|| d¡¡rDd}tjj t	 
|| d¡¡rbd}ttj | j||||¡ƒS r‚   )r@   r+   r_   Ú_validate_dimrn   r3   r¯   r°   r  rc   ÚLtr   Z	SliceViewr�   rß   )r>   rq   ÚstartÚendÚstepÚdim_sizer8   r8   r9   Úslice_D  s    rE  c                    sv  t |tƒs|f}t |tƒs |f}‡ fdd„|D ƒ}tˆ  ¡ ƒdkrJtˆ ƒS t|ƒ}t|ƒ}|dksl|dk�r|dkr|tdƒ‚|dkr¾|dkr¾tˆ tˆ  ¡ ƒgƒ}t||dƒ}t|t	ˆ  ¡ ƒƒS ||krÚtd|› d|› �ƒ‚|dd… }|dd… }tˆ |d |d ƒ}	t|	||ƒS |\‰t
jj ˆ  ¡ ˆ ¡‰ˆ|d  ˆ ‰ˆ  ¡ ‰‡‡‡‡fd	d
„}
tjˆ  ¡ ˆ  ¡ |
ˆ  ¡ d�S )zÊ
    This is based on torch._refs.roll(), but uses ModularIndexing().

    We can't use the ref here because it is based on multiple calls to
    torch.cat() that this will result in terrible code.
    c                    s   g | ]}t ˆ |ƒ‘qS r8   )r?  ©r=   r  ©r�   r8   r9   r?   ]  s     zroll.<locals>.<listcomp>r   r   z`shifts` requiredz*shifts and dimensions must align. shifts: z, dims: Nc                    s4   t | ƒ} t| ˆ ˆ t d¡t ˆ¡ƒ| ˆ< ˆ | ƒS r  )rA   r   rc   r®   r²   rÊ   )Úa_loaderrq   ÚsizerA  r8   r9   rK   |  s    
  ÿzroll.<locals>.fnrÓ   )r@   r   r1   rn   rõ   rm   ÚRuntimeErrorr  ÚrollrA   r3   r¯   r°   Úevaluate_static_shaperÅ   r(   r�   r†   rb   )r�   Zshiftsr  Z
len_shiftsZlen_dimsZflatZrolledZtail_shiftsZ	tail_dimsZfirst_dim_rolledrK   r8   )r�   rH  rq   rI  rA  r9   rK  P  sF    	

ÿürK  c              	   C   s–   t | tƒr"t | jtjƒr"| j ¡ } |  ¡  t | ¡sDtd| › d�ƒ‚t 	| ¡\}}t 
|j|jdd„ |D ƒdd„ |D ƒt |p€d¡¡}tt ||¡ƒS )Nzunrealized as_strided(z, ...)c                 S   s   g | ]}t  |¡‘qS r8   ©rc   r²   ©r=   r  r8   r8   r9   r?   —  s     zas_strided.<locals>.<listcomp>c                 S   s   g | ]}t  |¡‘qS r8   rM  rN  r8   r8   r9   r?   ˜  s     r   )r@   r+   rß   r   ZBaseViewZunwrap_viewrè   Zis_storage_and_layoutr5   Zas_storage_and_layoutÚFixedLayoutrÔ   r\   rc   r²   ZReinterpretView)r>   rI  ÚstrideÚstorage_offsetZstorageZ
old_layoutZ
new_layoutr8   r8   r9   Ú
as_strided‹  s    

ûrR  c                 C   s$   t | tƒst‚t| |||ƒj| _| S rM   )r@   r+   r_   rR  rß   )r>   rI  rP  rQ  r8   r8   r9   Úas_strided_ž  s    rS  c                 C   s   t | |||ƒ}t|ƒS rM   )rR  rõ   )r>   rI  rP  rQ  Úresultr8   r8   r9   Úas_strided_copy¥  s    rU  c                    s¶   t dd„ | D ƒƒrZ| D ]}| ¡  qt dd„ | D ƒƒrJttjf| žŽ \} }ttjƒ| |ƒS t| ƒdkrrt| d ƒS t| d |dƒ}t	| dt
jiŽ‰ ‡ fdd„| D ƒ} ttj | |¡ƒS )	Nc                 s   s   | ]}|  ¡ tjkV  qd S rM   )rb   rF   Úuint8©r=   rë   r8   r8   r9   rŸ   ­  s     zcat.<locals>.<genexpr>c                 s   s   | ]}t |jjƒd kV  qdS )rR   N)rm   ÚlayoutrI  rW  r8   r8   r9   rŸ   ²  s     r   r   rk   c                    s   g | ]}t |ˆ ƒ‘qS r8   rù   )r=   rp   r[   r8   r9   r?   ½  s     zcat.<locals>.<listcomp>)r¤   rè   Úrequire_channels_lastÚatenÚcatÚfallback_handlerrm   rõ   r?  rw   r   rº   r+   r   ZConcatKernelr�   )r¼   rq   rë   rv   r8   r[   r9   r[  «  s     
ÿÿr[  )ÚoffsetÚdim1Údim2c                    sú   |   ¡ ‰tˆƒ‰tˆˆd�‰tˆˆd�‰tˆˆk‡‡fdd„ƒ tjj t 	|d¡¡}|rxt
tˆˆ | ˆˆ ƒdƒ}nt
tˆˆ ˆˆ | ƒdƒ}d‰ |r¨| df‰ nd|f‰ ‡‡fdd„tˆƒD ƒ}| |¡ ‡ ‡‡‡‡fdd	„}ttj | ||¡ƒS )
N)r0  Zrankc                      s   dˆ › dˆ› �S )Nz(diagonal dimensions cannot be identical z, r8   r8   ©r^  r_  r8   r9   Ú<lambda>É  ó    zdiagonal.<locals>.<lambda>r   )r   r   c                    s    g | ]\}}|ˆ ˆfkr|‘qS r8   r8   )r=   r~   r  r`  r8   r9   r?   Ø  s      zdiagonal.<locals>.<listcomp>c                    sˆ   | d }dgt ˆƒ }d}tˆƒD ]L}|ˆkr@|ˆ d  ||< q"|ˆkrZ|ˆ d  ||< q"| | ||< |d7 }q"|t ˆƒd ks„t‚|S )NrÃ   r   r   r   )rm   rŽ   r_   )r0  Zdiag_idxZoriginal_idxZcur_dimr  ©Zbase_idxr^  r_  Znum_dimsZoriginal_shaper8   r9   Ú	reindexerÛ  s    
zdiagonal.<locals>.reindexer)rn   rm   r	   r   r3   r¯   r°   r  rc   r@  ÚmaxÚminr‹   ry   r+   r   ÚGenericViewr�   )rë   r]  r^  r_  Zoffset_negativeZ	diag_sizer  rd  r8   rc  r9   ÚdiagonalÁ  s(     ÿ
rh  c                 C   s   t t| |||ƒƒS rM   )rõ   rh  )rë   r]  r^  r_  r8   r8   r9   Údiagonal_copyî  s    ri  c                 C   s$   t | ƒ}t||||ƒ}t||ƒ |S rM   )rõ   rh  Ú	mutate_to)rë   Úsrcr]  r^  r_  rµ   ræ   r8   r8   r9   Údiagonal_scatteró  s    
rl  c                 C   s,   t  ||  ¡ | ¡}tt| |||d ƒ|ƒS r  )r-   Zhandle_negative_indexrn   r  rE  )r>   rq   r0  r8   r8   r9   Úselectû  s    rm  c                 C   s˜   t | |dƒ}tjj |  ¡ | ¡}t|tjƒr<tjj |¡}t|t	tj
fƒrb|g|| d |  }g }d}|D ]$}|| }| t| |||ƒ¡ |}qn|S ©Nr   r   )r?  r3   r¯   r°   rL  rn   r@   rc   r·   r]   r®   ry   rE  )r>   r  rq   Úx_sizerT  rA  rI  rB  r8   r8   r9   Úsplit  s    rp  c                 C   s   t | ||ƒS rM   )rp  )r>   r  rq   r8   r8   r9   Úsplit_with_sizes  s    rq  c                 C   sJ   t | |dƒ}tjj |  ¡ | ¡}g }t|ƒD ]}| t| ||ƒ¡ q.|S r‚   )	r?  r3   r¯   r°   rL  rn   rŽ   ry   rm  )r>   rq   ro  rT  r~   r8   r8   r9   Úunbind  s    rr  c           
         sÒ   |   ¡ }t|ƒ}t||ƒ‰ |dkr4tt| dƒ|d�S tjj}| ||ˆ  ¡ | 	dˆ¡ t
|ˆ  | ˆƒd }|  | t|| |ˆ  ƒ¡¡ |d ˆ … |f|ˆ d d … |f•}‡ ‡fdd„}	ttj | ||	¡ƒS )Nr   )rB  r   c                    s4   | d | ˆ  ˆ  }| d ˆ … |f| ˆ d d… ˜S )NrÃ   r   r8   )r0  Zdim_idx©rq   rC  r8   r9   rd  5  s    zunfold.<locals>.reindexer)rn   rm   r	   rE  r-  r3   r¯   r°   Ú	guard_leqÚguard_ltr   r,  r+  r   r+   r   rg  r�   )
r>   Ú	dimensionrI  rC  r  Úndimr°   Znew_dim_sizeÚout_sizerd  r8   rs  r9   Úunfold#  s    
$ry  c                 C   s4   t | |dƒ}t|  ¡ ƒ}| |t d¡¡ t| |ƒS r  )r?  rA   rn   Úinsertrc   r®   r  )r>   rq   r  r8   r8   r9   r-  <  s    r-  c                 C   s2   t | |ƒ}t| tƒst‚t|tƒs&t‚|j| _| S rM   )r-  r@   r+   r_   rß   r  r8   r8   r9   Ú
unsqueeze_D  s
    
r{  c                 C   sP   t |tƒst‚t|  ¡ ƒ}|dk r.||| 7 }d|  krF|| k sLn t‚|S r‚   )r@   r]   r_   rm   rn   )r>   rq   r]  rw  r8   r8   r9   r?  M  s    r?  rÃ   c                 C   sT   t | |dƒ}tjj |  ¡ | ¡d }t| |d|ƒ}t| |||d ƒ}t|t|ƒƒS )Nr   r   )	r?  r3   r¯   r°   rL  rn   rE  rÕ   Úsigmoid)r>   rq   Znew_lenr�   r´   r8   r8   r9   ÚgluV  s
    r}  c                  C   s
  t jj�rt jjjt jjjt jjjt jjjt	j
jt jjjg} tt jjjƒtttdœdd„ƒ}tt jjjjƒttttdœdd„ƒ}tt jjjjƒttttdœdd„ƒ}tt jjjƒtttd	œd
d„ƒ}tt jjjjƒttttdœdd„ƒ}tt jjjƒtttdœdd„ƒ}tt	j
jƒtttttttttt tttttttdœdd„ƒ}tt jjjd d�tttttdœdd„ƒ}tt jjjjd d�ttttttdœdd„ƒ}	tt jjjd d�tttttdœdd„ƒ}
t jj�rü|  t jjj¡ tt jjjƒttttdœdd„ƒ}t| ƒ n d S ) N)r>   ÚweightÚbiasc
           
      S   s$   t  tj | |||||||||	¡
¡S rM   )r+   r�   r   ZConvolutionUnary)
r>   r~  r  ÚpaddingrP  Údilationrì   ÚattrÚscalarsÚ	algorithmr8   r8   r9   Úconvolution_unaryk  s    öÿz5register_onednn_fusion_ops.<locals>.convolution_unary)r>   rØ   r~  r  c                 S   s*   t  tj | |||||||||	|
||¡¡S rM   )r+   r�   r   ZConvolutionBinary©r>   rØ   r~  r  r€  rP  r�  rì   Úbinary_attrZbinary_alphaÚ
unary_attrÚunary_scalarsZunary_algorithmr8   r8   r9   Úconvolution_binary‡  s"    óÿz6register_onednn_fusion_ops.<locals>.convolution_binaryc                 S   s*   t  tj | |||||||||	|
||¡¡S rM   )r+   r�   r   ZConvolutionBinaryInplacer†  r8   r8   r9   Úconvolution_binary_inplace©  s"    óÿz>register_onednn_fusion_ops.<locals>.convolution_binary_inplace)r>   Úwr´   c              
   S   s   t  tj | |||||¡¡S rM   )r+   r�   r   ZLinearUnary)r>   rŒ  r´   r‚  rƒ  r„  r8   r8   r9   Úlinear_unaryË  s    ÿz0register_onednn_fusion_ops.<locals>.linear_unary)r>   r3  rŒ  r´   c              	   S   s   t  tj | ||||¡¡S rM   )r+   r�   r   ZLinearBinary)r>   r3  rŒ  r´   r‚  r8   r8   r9   Úlinear_binaryÓ  s    z1register_onednn_fusion_ops.<locals>.linear_binaryc                 S   s&   t  tj | |||||||||	|
¡¡S rM   )r+   r�   r   ZConvolutionTransposeUnary)r>   r~  r  r€  Zoutput_paddingrP  r�  rì   r‚  rƒ  r„  r8   r8   r9   Úconvolution_transpose_unary×  s    õÿz?register_onednn_fusion_ops.<locals>.convolution_transpose_unary©r>   Zw0Zw1Zw2Zw3ÚhxZcxÚreverseZbatch_sizesÚmodeZhidden_sizeZ
num_layersZ
has_biasesÚbidirectionalZbatch_firstÚtrainc                 S   s4   t  tjtj | |||||||||	|
|||||¡¡S rM   )ÚpytreeÚtree_mapr+   r�   r   ZMkldnnRnnLayerr�  r8   r8   r9   Úmkldnn_rnn_layerõ  s*    ðþz4register_onednn_fusion_ops.<locals>.mkldnn_rnn_layerrj   )r>   Úpacked_weightÚw_scaleÚw_zpr  c                 S   s2   t  tj | |||||||||	|
||||||¡¡S rM   )r+   r�   r   ZQConvPointWisePT2E)r>   Úx_scaleÚx_zpr™  rš  r›  r  rP  r€  r�  rì   Úo_inv_scaleÚo_zero_pointÚfp32_outputr‚  rƒ  r„  r8   r8   r9   Úqconvolution_unary  s*    ïÿz6register_onednn_fusion_ops.<locals>.qconvolution_unary)r>   Úaccumr™  rš  r›  r  c                 S   s<   t  tj | |||||||||	|
|||||||||||¡¡S rM   )r+   r�   r   ZQConvPointWiseBinaryPT2E)r>   rœ  r�  r¢  Zaccum_scaleZaccum_zpr™  rš  r›  r  rP  r€  r�  rì   rž  rŸ  r   r‡  rÁ   rˆ  r‰  Zunary_algorithmmr8   r8   r9   Úqconvolution_binaryH  s4    êÿz7register_onednn_fusion_ops.<locals>.qconvolution_binaryc                 S   s*   t  tj | |||||||||	|
||¡¡S rM   )r+   r�   r   ZQLinearPointwisePT2E)r>   rœ  r�  r™  rš  r›  r  rž  rŸ  r   r‚  rƒ  r„  r8   r8   r9   Úqlinear_unary~  s"    óÿz1register_onednn_fusion_ops.<locals>.qlinear_unary)r>   Úpacked_wÚorig_wr´   c                 S   s.   t  tj | |||¡¡}|d k	r*t||ƒ}|S rM   )r+   r�   r   ZMKLPackedLinearrE   )r>   r¥  r¦  r´   Z
batch_sizerT  r8   r8   r9   Úmkl_packed_linear£  s    ÿ
z5register_onednn_fusion_ops.<locals>.mkl_packed_linear)rF   Z_CZ_has_mkldnnr2   ZmkldnnZ_convolution_pointwiseZ_convolution_pointwise_Z _convolution_transpose_pointwiseZ_linear_pointwiserZ  r˜  ÚdefaultZonednnZqconv2d_pointwiser©   r+   Úbinaryrh   r   r]   Zqlinear_pointwiseZhas_mklry   ZmklZ_mkl_linearr;   )Zcpu_needs_realized_inputsr…  rŠ  r‹  r�  rŽ  r�  r˜  r¡  r£  r¤  r§  r8   r8   r9   Úregister_onednn_fusion_ops`  s´    
ú	ýü!ü!  ÿý
ð(ù)
 ÿö3ù!
ü
rª  c                    s   |rt  ˆ ¡ ‡ fdd„}|S )Nc                     s   t  tjtjjˆ f| ž|Ž¡S rM   )r–  r—  r+   r�   r   ÚFallbackKernel©ru   r“   ©Úkernelr8   r9   Úhandler¾  s     ÿz!fallback_handler.<locals>.handler)r    rE   )r®  Úadd_to_fallback_setr¯  r8   r­  r9   r\  º  s    
r\  c                   C   s   t  d¡ d S )NzjTorchinductor does not support code generation for complex operators. Performance may be worse than eager.)ÚwarningsÚwarnr8   r8   r8   r9   Ú_warn_complex_not_supportedÆ  s    ÿr³  ©rà   c                 C   s   |   ¡ rtƒ  dS dS )z0Do not support reading or writing to this tensorTF)Z
is_complexr³  r´  r8   r8   r9   Úunsupported_input_tensorÏ  s    rµ  c                 C   s   t | ƒrdS | jotjS )z2Do not support writing tensor but can read from itT)rµ  Zis_cpur   Zdisable_cpp_codegenr´  r8   r8   r9   Úunsupported_output_tensor×  s    r¶  )ré   c                 C   sd   | j tjjkrdS | j tjjkr$dS dd„ }t| j| jfƒd D ]}||dd�r@ dS q@|| dd�S )NFc                 S   sn   t | tjjƒsdS d| jkr dS t| jd ƒd D ]6}t |tjjƒsFq2|rZt|ƒrh dS q2t	|ƒr2 dS q2dS )NFr  r   T)
r@   rF   ÚfxÚNodeÚmetar   Ú_subclassesÚ
FakeTensorr¶  rµ  )ré   Ú	is_outputr¹  r8   r8   r9   Úcheck_skip_conditionç  s    
zCfallback_node_due_to_unsupported_type.<locals>.check_skip_conditionr   )r¼  T)ræ   rZ  Úview_as_complexr¨  Úlift_fresh_copyr   ru   r“   )ré   Zallow_cpu_inputsr½  rs   r8   r8   r9   Ú%fallback_node_due_to_unsupported_typeÞ  s    rÀ  c                 C   sŽ   | t kstd| › �ƒ‚t| gƒr`|r`tt d¡ƒr`tjjj	rPdtjj_	t
 d¡ td| › d�ƒ‚t| ƒ |d k	rzt| |ƒ t| d d�t| ƒƒS )Nz.both a fallback and a decomp for same kernel: ÚCIFzmA make_fallback error occured in suppress_errors config, and suppress_errors is being disabled to surface it.zmake_fallback(a.  ): a decomposition exists, we should switch to it. To fix this error, either add a decomposition to core_aten_decompositions (preferred) or inductor_decompositions, and delete the corresponding `make_fallback` line. Get help from the inductor team if unsure, don't pick arbitrarily to unblock yourself.rj   )r!   r_   r"   rh   ÚosÚgetenvrF   Z_dynamor   Zsuppress_errorsÚlogÚwarningr;   rP   r©   r\  )r®  Zlayout_constraintr²  r8   r8   r9   Úmake_fallback  s"    ÿþ

ÿ
ÿ
rÆ  c                 C   s$   d}| D ]}|| }qt |tjd�S )zÎ
    TorchInductor offset calculation differs from PyTorch eager offset
    calculation for random ops (tl.rand vs torch.rand). In future, we should
    strive for same impl for tl.rand and torch.rand.
    r   r[   ©ÚtensorrF   Úint64)r.  Znumelr  r8   r8   r9   Úphilox_rand_offset  s    
rÊ  c           	         sd   t  |ˆ | t j | ¡¡ ¡ ‰| ¡ ‰| ¡ ‰‡ ‡‡‡fdd„}tj|ˆ |t| ƒd�}t	| ƒ}||fS )Nc                    sV   t  ˆg ƒtj¡}t  ˆg ƒtj¡}t  t  ˆ| ƒtj¡|¡}t  ||¡}t  |ˆ ¡S rM   )r2   rƒ   rF   Úint32rE   Ú
index_exprÚrand)rË   Zseed_index_exprZoffset_index_exprZrand_index_exprrT  ©r\   Zoffset_loaderÚ
random_posÚseed_loaderr8   r9   rÒ   8  s     ÿþzphilox_rand.<locals>.inner_fnrÓ   )
r   rO  ÚFlexibleLayoutÚcontiguous_stridesÚmake_indexerrÅ   r(   r�   rA   rÊ  )	rI  Úseedr]  rP  rÔ   r\   rÒ   Zrandom_values_nodeZoffset_noder8   rÎ  r9   Úphilox_rand+  s"    
üürÕ  c              	   C   s0   t jr$t tjtj tj	| ||¡¡S t
dƒ‚d S )Nz&should be handled in replace_random.py)r   Úfallback_randomr–  r—  r+   r�   r   r«  rZ  Únative_dropoutr_   )r>   Úpr•  r8   r8   r9   r×  R  s     ÿr×  c                 G   s<   t js |  ¡ t d¡ks tdƒ‚|  ¡  tj| f|žŽ  | S ©NÚcpuzTthis should be handled in decomps unless config.fallback_random or the device is CPU)	r   rÖ  r†   rF   rÔ   r_   rè   r   ZInplaceBernoulliFallback©r>   ru   r8   r8   r9   Ú
bernoulli_\  s    ÿþrÜ  c                 G   s2   t js |  ¡ t d¡ks tdƒ‚tt| ƒf|žŽ S rÙ  )r   rÖ  r†   rF   rÔ   r_   rÜ  rõ   rÛ  r8   r8   r9   Úbernoulli_pf  s    ÿþrÝ  c                 C   s
   t ƒ ‚d S rM   ©r_   ©rv   r8   r8   r9   Ú_foobaro  s    rà  c                 C   s   t  d¡ d S )Nz1using triton random, expect difference from eager)rÄ  Úinfo)Úsaltr8   r8   r9   Ú_warn_triton_randomt  s    rã  c                   C   s   t tjjƒ d S rM   )rã  r3   r¯   Zcreation_timer8   r8   r8   r9   Úwarn_triton_randomy  s    rä  c                  O   s,   t js| dd ¡d k	r t| |ŽS tdƒ‚d S ©NÚ	generatorz-should have been handled in replace_random.py)r   rÖ  ÚgetÚfallback_randr_   r¬  r8   r8   r9   rÍ  ƒ  s    
rÍ  c                  O   s,   t js| dd ¡d k	r t| |ŽS tdƒ‚d S rå  )r   rÖ  rç  Úfallback_randnr_   r¬  r8   r8   r9   ÚrandnŠ  s    
rê  c                 C   s   t  |¡}t j | |¡S rM   )r   Úget_stride_orderÚExternKernelÚrequire_stride_order)Zinput_tensorrP  Ústride_orderr8   r8   r9   Úinductor_force_stride_order‘  s    
rï  ©rÔ   c                 C   s   t dƒ‚d S )Nz.should be handled in fuse_seed_creation_pass()rÞ  rð  r8   r8   r9   Úinductor_seed—  s    rñ  c                 C   s   t ƒ  t t | t|ƒ¡¡S rM   )rä  r+   r�   r   ZRandomSeedsr/   )ÚcountrÔ   r8   r8   r9   Úinductor_seedsœ  s    ró  c                    s(   ‡ ‡fdd„}t jˆ ¡ ˆ ¡ |g d�S )Nc                    s   t  ˆ ¡ ˆ ¡S rM   )r2   Z	load_seedÚget_namerß  ©rË   Úseedsr8   r9   rÒ   ¤  s    z&inductor_lookup_seed.<locals>.inner_fnrÓ   )r(   r�   r†   rb   )rö  rË   rÒ   r8   rõ  r9   Úinductor_lookup_seed¢  s    ür÷  ©r]  )rI  rÔ  r“  r]  c                   s‚   t jr
t‚ˆ dkst‚| •} tj}| ¡ }tj||| tj 	| ¡|d� 
¡ ‰| ¡ ‰‡ ‡‡fdd„}tj|||| •d�}| ¡  |S )N)rÍ  rê  rø  c                    s"   t tˆ ƒˆg ƒt ˆ| ƒtj¡ƒS rM   )rJ   r2   rÌ  rF   rË  rÊ   ©r“  rÏ  rÐ  r8   r9   rÒ   »  s    þz!inductor_random.<locals>.inner_fnrÓ   )r   rÖ  r_   rF   Úfloat32r†   r   rO  rÑ  rÒ  rÓ  rÅ   r(   r�   rè   )rI  rÔ  r“  r]  r\   rÔ   rÒ   rT  r8   rù  r9   Úinductor_random¯  s,    
   
 ÿ
ürû  )ÚlowÚhighrI  rÔ  r]  c                   sl   t jr
t‚|•}tj}| ¡ }tj|||tj 	|¡|d� 
¡ ‰| ¡ ‰‡ ‡‡‡fdd„}tj||||•d�S )Nrø  c                    s"   t  ˆg ƒt  ˆ| ƒtj¡ˆˆ ¡S rM   )r2   Z	randint64rÌ  rF   rË  rÊ   ©rý  rü  rÏ  rÐ  r8   r9   rÒ   Ø  s    üz"inductor_randint.<locals>.inner_fnrÓ   )r   rÖ  r_   rF   rÉ  r†   r   rO  rÑ  rÒ  rÓ  rÅ   r(   r�   )rü  rý  rI  rÔ  r]  r\   rÔ   rÒ   r8   rþ  r9   Úinductor_randintË  s&    
   
 ÿ
ürÿ  ©Ú	out_int32Úright)rë   Ú
boundariesr  r  c                   s¤   t ˆ  ¡ ƒdkst‚t| ƒr$tˆ ƒs>ttjdd�| ˆ |ˆd�S ˆ  ¡  ˆ  ¡ d ‰ˆ  ¡ }|  	¡ }|  ¡ ‰|rtt
jnt
j‰‡ ‡‡‡‡fdd„}tj|ˆ||  ¡ d�S )	Nr   F)r°  r   r   c                    s"   ˆ| ƒ}t  |ˆ  ¡ ˆˆˆ¡}|S rM   )r2   Ú	bucketizerô  )rË   r  r‡   ©r  Zboundaries_sizeZindex_dtypeZinput_loaderr  r8   r9   rÒ     s    ûzbucketize.<locals>.inner_fnrÓ   )rm   rn   r_   r%   r\  rZ  r  rè   rÅ   r†   rF   rË  rÉ  r(   r�   )rë   r  r  r  Zboundaries_loaderrÔ   rÒ   r8   r  r9   r  è  s*       ÿür  c                 O   s$   t  tjdd„ ||f¡\}}||fS )Nc                 S   s   t j | ¡S rM   )r   rì  Zrequire_stride1r´  r8   r8   r9   ra    rb  zrequire_dense.<locals>.<lambda>©r–  Ztree_map_onlyr   ÚIRNode©rv   ru   r“   r8   r8   r9   Úrequire_dense  s      ÿr	  c                 O   s$   t  tjdd„ ||f¡\}}||fS )Nc                 S   s   t j | ¡S rM   )r   rì  Úrequire_contiguousr´  r8   r8   r9   ra     rb  z$require_contiguous.<locals>.<lambda>r  r  r8   r8   r9   r
    s      ÿr
  c                 O   s$   t  tjdd„ ||f¡\}}||fS )Nc                 S   s   t j | ¡S rM   )r   rì  rY  r´  r8   r8   r9   ra  '  rb  z'require_channels_last.<locals>.<lambda>r  r  r8   r8   r9   rY  %  s      ÿrY  c                    sF   dd„ ‰ t ‡ fdd„t|ˆjƒD ƒƒ}‡ ‡fdd„| ¡ D ƒ}||fS )Nc                 S   s2   t | tjƒr.t |jd  ¡ ¡}tj | |¡S | S )Nr  )r@   r   r  rë  r¹  rP  rì  rí  )rs   Úfx_argrî  r8   r8   r9   Úapply_constraint-  s    z1constrain_to_fx_strides.<locals>.apply_constraintc                 3   s   | ]\}}ˆ ||ƒV  qd S rM   r8   )r=   rs   r  )r  r8   r9   rŸ   3  s    z*constrain_to_fx_strides.<locals>.<genexpr>c                    s"   i | ]\}}|ˆ |ˆj | ƒ“qS r8   )r“   )r=   Úkr/  ©r  Úfx_noder8   r9   r™   6  s      z+constrain_to_fx_strides.<locals>.<dictcomp>)rB   rŒ   ru   rç   )r  ru   r“   r8   r  r9   Úconstrain_to_fx_strides,  s    
ÿr  ztorchvision::roi_align)r²  c                 C   sn   |}|   ¡ |  ¡ kr"t||   ¡ ƒ}|  ¡ | ¡ kr@t||  ¡ ƒ}|  ¡ | ¡ krft||  ¡ ƒ}t|ƒS t|ƒS rM   )r†   r  rb   rƒ   rn   r²   rõ   )Úselfrk  Únon_blockingr>   r”   r8   r8   r9   rö   ç  s    rö   )Úmemory_formatc                C   s&   t j|  ¡ |  ¡ |  ¡ t|  ¡ ƒd�S ©NrÓ   )r(   r�   r†   rb   rÅ   rA   rn   )r>   r  r8   r8   r9   rõ   õ  s    
ürõ   r¿  c                   s(   ‡ ‡‡fdd„}t jt|ƒˆ || gd�S )Nc                    s   t jˆ| d  ˆ ˆ d�S )Nr   r[   ©r2   rÌ  rÊ   ©r\   rA  rC  r8   r9   rK     s    ziota.<locals>.fnrÓ   )r(   r�   r/   )ÚlengthrA  rC  r\   rÔ   Zrequires_gradrK   r8   r  r9   Úiota  s    
ür  )rq   rË   c                    sÆ   |   ¡ |  ¡ kst‚|  ¡ ‰t| ˆ dƒ‰ tjj t 	ˆd¡¡rNˆ|  
¡ ˆ   ‰tjj dˆ¡ tjj ˆ|  
¡ ˆ  ¡ tt|ˆ ƒ|  
¡ ƒ}| ¡ ‰‡ ‡‡‡fdd„}tj|  ¡ |   ¡ |t|  
¡ ƒd�S )Nr   c              	      s6   t  t  t  | ˆ  tj¡t  ˆtj¡¡ˆ| ƒˆ| ƒ¡S rM   )r2   r  ÚeqrÌ  rF   rË  ©r0  ©rq   rË   Ú
src_loaderr9  r8   r9   rÒ   %  s    þúz select_scatter.<locals>.inner_fnrÓ   )rb   r_   rÅ   r?  r3   r¯   r°   r  rc   r@  rn   rt  ru  r²   r-  r(   r�   r†   rA   )r>   rk  rq   rË   rÒ   r8   r  r9   Úselect_scatter  s     

ür  c                    s(  ˆ  ¡ |  ¡ kst‚ˆ ¡ ‰tˆˆ dƒ‰ ˆ ¡ ˆ  ‰ˆd k	rZtjj t	 
ˆd¡¡rZˆˆ ‰ˆd k	r€tjj t	 
ˆd¡¡r€ˆˆ ‰ˆd krŒd‰ˆd ks¬tjj ˆ ¡ ˆ  ˆ¡r°ˆ‰tˆ ¡ ƒ}tt	 ˆˆ ¡t	 ˆ¡ƒ|ˆ < t||ƒ}| ¡ ‰‡ ‡‡‡‡‡‡‡fdd„}tjˆ ¡ ˆ  ¡ |tˆ ¡ ƒd�S )Nr   c              
      s6  ˆdkr ˆˆkr ˆdkr ˆ| ƒS t  | ˆ tj¡}t| ƒ‰ t| ˆ ˆ ˆƒˆ ˆ< g }ˆdkr~| t  |t  t 	ˆ¡tj¡¡¡ ˆˆkr¨| t  
|t  t 	ˆ¡tj¡¡¡ ˆdkrè| t  t  t| ˆ ˆ dˆƒtj¡t  dtjj¡¡¡ |sðt‚t t j|¡}t  |‡ ‡fdd„tˆƒ�rdnd¡}t  ||ˆ| ƒ¡S )Nr   r   c                      s   ˆˆ ƒS rM   r8   r8   )Úsrc_idxr  r8   r9   ra  p  rb  z1slice_scatter.<locals>.inner_fn.<locals>.<lambda>ç        )r2   rÌ  rF   rÉ  rA   r   ry   Úgerc   r²   Últr  r   Úconstantr_   rš   r  Úand_Úmaskedrg   r  )r0  Zidx_dimÚmaskZsrc_val©rq   rD  rB  r  rA  rC  r>   r9  )r  r9   rÒ   K  sT    þÿþÿ ÿüÿýýzslice_scatter.<locals>.inner_fnrÓ   )rb   r_   rÅ   r?  rn   r3   r¯   r°   r  rc   r@  Zstatically_known_leqrA   r   r²   r(   r�   r†   )r>   rk  rq   rA  rB  rC  Zsrc_sizerÒ   r8   r&  r9   Úslice_scatter7  s.     
.
ür'  c                 C   s*   t | ttfƒr&t| ƒdkr&t| d ƒS | S r‚   )r@   rA   rB   rm   Ú_unwraprf   r8   r8   r9   r(  �  s    r(  ©r\   rÔ   rX  Ú
pin_memoryc                   s  t |d tjfkd|› �ƒ t | dƒ ttˆ ƒtƒr@ˆp<tj‰nˆpJt ¡ ‰g }tˆ tj	ƒrl‡ ‡fdd„}n„tˆ t
tfƒrŠ‡ ‡fdd„}nftˆ ƒdks´tˆ d t
tfƒrØtˆ ƒdkrØ| t tˆ ƒ¡¡ ‡ ‡fdd„}ntj tjˆ ˆ|d	�¡S tjt|ƒˆ||d
�S )Núlayout=r*  c                    s   t  ˆ ˆ¡S rM   r  rÊ   ©rß   r\   r8   r9   rÒ   ”  s    ztensor.<locals>.inner_fnc                    s   t  ˆ ˆ¡S rM   ©r2   r"  rÊ   r,  r8   r9   rÒ   ™  s    r   rV   c                    s8   ‡ ‡‡‡fdd„‰ t ˆƒdkr*t dˆ¡S ˆ dt ˆƒƒS )Nc              	      sr   | |k st ‚||  dkr(t ˆ|  ˆ¡S ||  d |  }t t t ˆd tj¡t |tj¡¡ˆ | |ƒˆ ||ƒ¡S )Nr   r   r   )r_   r2   r"  r  r!  rÌ  rF   rÉ  )rA  rB  Úmid)Úbinary_searchrß   r\   rË   r8   r9   r/  ¡  s    þúz/tensor.<locals>.inner_fn.<locals>.binary_searchr   )rm   r2   r"  rÊ   r,  )r/  rË   r9   rÒ      s    r5  rÓ   )r:   rF   Ústridedr@   r(  r]   rÉ  Úget_default_dtyperc   r·   r¸   rm   ry   r®   r3   r¯   Zadd_tensor_constantrÈ  r(   r�   r/   )rß   r\   rÔ   rX  r*  rÑ   rÒ   r8   r,  r9   rÈ  ‡  s,    *ÿürÈ  c                 C   s@   t | tƒr2|d k	rt| |ƒ} |d k	r.t| |ƒ} | S t| ||d�S )Nr5  )r@   r+   rƒ   r  rÈ  )rß   r\   rÔ   r8   r8   r9   Ú	as_tensorÀ  s    


r2  c                 C   s   t | tjd�S )Nr[   rÇ  ©rß   r8   r8   r9   Úlong_tensorË  s    r4  c                 C   s   t  ¡ S rM   )r   ZDynamicScalarr3  r8   r8   r9   Ú_local_scalar_denseÐ  s    r5  c                    sš   | ‰t | ttfƒs"tˆdƒr"ˆj‰t ˆttfƒr@‡ ‡fdd„}nDt ˆtjƒr\‡ ‡fdd„}n(tˆ ¡ ƒdkspt	‚ˆ 
¡ ‰‡fdd„}tj|ˆ |t|ƒd�S )Nr…   c                    s   t  ˆˆ ¡S rM   r-  rÊ   ©r\   r…   r8   r9   rÒ   Ü  s    z_full.<locals>.inner_fnc                    s   t  ˆˆ ¡S rM   r  rÊ   r6  r8   r9   rÒ   á  s    r   c                    s   ˆ g ƒS rM   r8   rÊ   )Úvalue_loaderr8   r9   rÒ   è  s    rÓ   )r@   r]   r¸   rl   r…   rc   r·   rm   rn   r_   rÅ   r(   r�   rA   )Ú
fill_valuerÔ   r\   rI  rÒ   r8   )r\   r…   r7  r9   Ú_fullÕ  s     ür9  c                 K   s   t t|ƒƒ| f|ŽS rM   ©Úcreate_tensor_likeÚtensor_constructor)r>   r8  r“   r8   r8   r9   r#  ó  s    r#  c                    s    d d d d dd dœ‡ fdd„
}|S )NF)Únamesr\   rÔ   rX  r*  r  c                    s’   t | d kdƒ t |d tjfkd|› �ƒ t | dƒ t|ƒ}|pFt ¡ }t|ƒdkrvt|d tttj	fƒrvt|d ƒ}dd„ |D ƒ}t
ˆ |||ƒS )Núnamed tensorsr+  r*  r   r   c                 S   s   g | ]}t  |¡‘qS r8   rM  rN  r8   r8   r9   r?   
	  s     z5tensor_constructor.<locals>.inner.<locals>.<listcomp>)r:   rF   r0  r/   r1  rm   r@   rA   rB   ÚSizer9  )r=  r\   rÔ   rX  r*  r  rI  ©r8  r8   r9   rÜ   ú  s    	"z!tensor_constructor.<locals>.innerr8   )r8  rÜ   r8   r@  r9   r<  ø  s    ùr<  )r=  r\   rX  rÔ   r*  r  c                 G   sX   t | d kdƒ t|ƒ}t|ƒdkrDt|d tttjfƒrDt|d ƒ}t|d ||||d�S )Nr>  r   r   ©r\   rX  rÔ   r*  )	r:   r/   rm   r@   rA   rB   rF   r?  Úempty_strided)r=  r\   rX  rÔ   r*  r  rI  r8   r8   r9   r:  	  s    
"     ÿr:  c                    s   ddddddœ‡ fdd„
}|S )zZ
    Shim to convert X_like(...) into X(...).  For example zeros_like() into zeros().
    NF)r\   rÔ   rX  r*  r  c                   sj   t | dƒ t |d tjfkd|› �ƒ |d kr8|  ¡ }nt|ƒ}|pJ|  ¡ }t|  ¡ ƒ}ˆ |||||d�S )Nr*  r+  r)  )r:   rF   r0  rb   r`   r†   rA   rn   )r>   r\   rÔ   rX  r*  r  rI  ©Úcreation_fnr8   r9   Ú_constant_like(	  s    
    ÿz*create_tensor_like.<locals>._constant_liker8   )rD  rE  r8   rC  r9   r;  #	  s        ÿr;  c                 C   s   t t| ƒƒS rM   r:  r@  r8   r8   r9   r  :	  s    r  c                    s   d d d d dœ‡ fdd„
}|S )NrA  c                   sp   t |ttfƒst‚t| dƒ t|d tjfkd|› �ƒ t|ƒpF|  ¡ }|pR|  	¡ }dd„ |D ƒ}t
ˆ |||ƒS )Nr*  r+  c                 S   s   g | ]}t  |¡‘qS r8   )rc   r®   rN  r8   r8   r9   r?   L	  s     z7new_constant.<locals>._new_constant.<locals>.<listcomp>)r@   rA   rB   r_   r:   rF   r0  r`   rb   r†   r9  ©r>   rI  r\   rX  rÔ   r*  r@  r8   r9   Ú_new_constantD	  s    z#new_constant.<locals>._new_constantr8   )r8  rG  r8   r@  r9   Únew_constantC	  s       ÿrH  rA  c                C   s4   |d kr|   ¡ }|d kr |  ¡ }t|d ||||d�S ©NrA  ©rb   r†   rB  rF  r8   r8   r9   Ú	new_emptyR	  s         ÿrK  c                C   sö   t | ttfƒst‚t |tttd ƒfƒs*t‚t| dƒ t|d tjfkd|› �ƒ t|ƒp^t 	¡ }|pnt 
d¡j}td||| d�}| ¡  |jj}dgt| ƒ |j_t |tjƒs²t‚dd„ | D ƒ} |rÒdd„ |D ƒn
tj | ¡}tj||| |d	�|_|S )
Nr*  r+  r  r   )r8  rÔ   r\   rI  c                 S   s   g | ]}t  |¡‘qS r8   rM  rN  r8   r8   r9   r?   m	  s     z!empty_strided.<locals>.<listcomp>c                 S   s   g | ]}t  |¡‘qS r8   rM  rN  r8   r8   r9   r?   o	  s     )rÔ   r\   rI  rP  )r@   rA   rB   r_   rÖ   r:   rF   r0  r`   r1  rÈ  rÔ   r9  rè   rß   rm   rÑ   r   ÚComputedBufferrÑ  rÒ  rO  rX  )rI  rP  r\   rX  rÔ   r*  Z	pointwiseÚbufferr8   r8   r9   rB  ]	  s.    ÿ
ýürB  c                C   s4   |d kr|   ¡ }|d kr |  ¡ }t||||||d�S rI  rJ  )r>   rI  rP  r\   rX  rÔ   r*  r8   r8   r9   Únew_empty_strided|	  s         ÿrN  c                 C   s2   dd„ |D ƒ}t tt|ƒƒ|jd�}tj | |¡S )Nc                 S   s   g | ]}t jj |¡‘qS r8   )r3   r¯   r°   r+  rN  r8   r8   r9   r?   ‹	  s     z copy_strided.<locals>.<listcomp>)Úkey)ÚsortedrŽ   rm   Ú__getitem__r   rì  rí  )r>   rP  rî  r8   r8   r9   Úcopy_strided‰	  s    rR  c                 K   s6   |  d¡}|d k	r|n
tt|ƒƒ|d< t|ƒ| f|ŽS )Nr\   )rç  r   rÖ   r<  )rI  r8  r“   r\   r8   r8   r9   Úfull�	  s    
rS  c                    s€   t | tƒst‚| ¡ tjks t‚|  ¡ ‰tˆƒdk}t| ˆ |ƒ‰ |  	¡ ‰| 	¡ ‰‡ ‡‡‡fdd„}t
j|  ¡ |  ¡ || ¡ d�S )Nr   c                    s4   t | ƒ} t| ƒdkr,t ˆ| ƒˆˆ  ¡| ˆ < ˆ| ƒS r‚   )rA   rm   r2   Úindirect_indexingr  ©rq   Úindex_loaderrI  r9  r8   r9   rK   ¤	  s    zgather.<locals>.fnrÓ   )r@   r+   r_   rb   rF   rÉ  rn   rm   r?  rÅ   r(   r�   r†   )r>   rq   rË   Zsparse_gradr]  rK   r8   rU  r9   Úgather—	  s    ürW  c                    sž   |rt ‚t| tƒst ‚t|tƒs$t ‚dt| ¡ ƒks8t ‚|  ¡ ‰| ¡ ‰ t| ¡ ƒ‰|  ¡ ‰| ¡ ˆdd … •‰‡ ‡‡‡‡fdd„}tj	|  
¡ |  ¡ |ˆd�S )Nr]   r   c                    sZ   t | ƒt ˆƒks"t| › dˆ› �ƒ‚ˆ | d ˆ… ƒ}t |ˆd ¡g| ˆd … • }ˆ|ƒS )Nz != r   )rm   r_   r2   rT  )r0  Z	var_indexZ
weight_idx©Úindices_loaderZindices_ndimr;  Zweight_loaderZweight_sizer8   r9   rK   ¿	  s    "
ÿzembedding.<locals>.fnrÓ   )r_   r@   r+   Ústrrb   rÅ   rm   rn   r(   r�   r†   )r~  r‡   Zpadding_idxZscale_grad_by_freqÚsparserK   r8   rX  r9   Ú	embedding²	  s     ür\  c           
         sB  t dd„ ˆ D ƒƒs*tddd„ ˆ D ƒ› �ƒ‚tdd„ ˆ D ƒƒrDtdƒ‚dd„ tˆ ƒD ƒ}t|ƒd	ksjtd
ƒ‚d gtˆ ƒ }t|t‡ fdd„|D ƒŽ ƒD ]0\}}| ¡ |kr°tdƒ‚|||< t| 	¡ ƒ}q”d	}t
|ƒ}|rì|d d krì| ¡  qÒ|�r|d	 d k�r| d	¡ |d7 }qìtdd„ |D ƒƒ�r0tdƒ‚|| }	|||	fS )Nc                 s   s2   | ]*}|d k	r|  ¡ tjtjtjtjfkV  qd S rM   )rb   rF   rÉ  rË  rh   rV  r‰   r8   r8   r9   rŸ   Ð	  s   þz.check_and_broadcast_indices.<locals>.<genexpr>z)indices must be int64, byte or bool. Got c                 S   s   g | ]}|d k	r|  ¡ ‘qS rM   r   r‰   r8   r8   r9   r?   Ô	  s      z/check_and_broadcast_indices.<locals>.<listcomp>c                 s   s*   | ]"}|d k	r|  ¡ tjtjfkV  qd S rM   )rb   rF   rh   rV  r‰   r8   r8   r9   rŸ   Õ	  s     zFallback for bool indicesc                 S   s   g | ]\}}t |tƒr|‘qS r8   r|   r}   r8   r8   r9   r?   Ú	  s     
 r   z"requires at least 1 non-None indexc                    s   g | ]}ˆ | ‘qS r8   r8   r‰   ©r‡   r8   r9   r?   Ý	  s     z.Fallback when indices is on a different devicerÃ   r   c                 s   s   | ]}|d kV  qd S rM   r8   r‰   r8   r8   r9   rŸ   í	  s     z.Fallback when None is in the middle of indices)r¤   r_   r¡   r5   r‹   rm   rŒ   r�   r†   rn   rA   Úpop)
r‡   rÔ   Z
valid_idxsZnew_indicesr~   r>   Z
output_dimÚstart_offsetÚtmpÚ
end_offsetr8   r]  r9   Úcheck_and_broadcast_indicesÏ	  s8    þ
üÿ$


rb  c                    sæ   t ˆttfƒst‚|  ¡ ‰tˆ|  ¡ ƒ\‰‰‰dd„ ˆD ƒ}dd„ ˆD ƒ‰t|d ƒ‰|  ¡ ‰‡‡fdd„tt	ˆƒƒD ƒ‰dˆkr’dˆkr’t
dƒ‚ˆd ˆ… ˆˆˆt	ˆƒ d … •‰‡ ‡‡‡‡‡‡fdd„}tj|  ¡ |  ¡ |ˆd	�S )
Nc                 S   s   g | ]}|d k	r|  ¡ ‘qS rM   r  r‰   r8   r8   r9   r?   û	  s      zindex_impl.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|  ¡ ‘qS rM   rÄ   r‰   r8   r8   r9   r?   ü	  s      r   c                    s    g | ]}ˆ | d k	rˆ| ‘qS rM   r8   r‰   ©r‡   ro  r8   r9   r?   
  s      z0index is out of bounds for dimension with size 0c                    sh   t ˆ ƒt ˆƒkst‚t ˆƒt ˆƒks(t‚‡‡‡ ‡fdd„tˆˆƒD ƒ}ˆ d ˆ… |ˆ ˆd … •}ˆ|ƒS )Nc                    s,   g | ]$\}}t j|ˆˆˆ… ƒ|ˆ d �‘qS ©©r   ©r2   rT  ©r=   ÚloaderrI  )r   ra  r0  r_  r8   r9   r?   
  s   ý  ÿz*index_impl.<locals>.fn.<locals>.<listcomp>©rm   r_   rŒ   )r0  Ú	new_index)r   ra  Úindexed_sizeÚindices_loadersÚoutput_sizer_  r9  r  r9   rK   
  s    üzindex_impl.<locals>.fnrÓ   )r@   rA   rB   r_   rÅ   rb  r†   rn   rŽ   rm   Ú
IndexErrorr(   r�   rb   )r>   r‡   r   Úindices_sizesrK   r8   )	r   ra  rk  r‡   rl  rm  r_  r9  ro  r9   Ú
index_implô	  s0     ÿ

ýürp  c                 C   sB   zt | |dd�W S  tk
r<   |  ¡  ttjƒ| |ƒ Y S X d S ©NTre  )rp  r5   rè   r\  rZ  rË   ©r>   r‡   r8   r8   r9   rË   !
  s
    rË   c                 C   s   t | |dd�S ©NFre  )rp  rr  r8   r8   r9   Ú_unsafe_index+
  s    rt  c                 C   s   t t| ƒ|||ƒS rM   )Ú
index_put_rõ   ©r>   r‡   r£   Ú
accumulater8   r8   r9   Ú	index_put8
  s    rx  c                 C   s   t t| ƒ|||dd�S rs  )Úindex_put_impl_rõ   rv  r8   r8   r9   Ú_unsafe_index_put=
  s    rz  c                 C   sB   |  ¡ |   ¡ krt||   ¡ ƒ}|r,t| |ƒ}t| t|d || ƒƒS r‚   )r†   r  rE   rj  r  )r  r‡   r…   rw  r8   r8   r9   Úindex_put_as_masked_fillB
  s
    
r{  c                 C   s4   t |ƒr |dkst ¡ r dtj_t | |||¡ | S ra   )r%   rF   Ú$are_deterministic_algorithms_enabledr3   r¯   Zdisable_cudagraphsr   ZIndexPutFallback©r  r‡   r£   rw  r8   r8   r9   Úindex_put_fallbackJ
  s    ÿÿr~  c                 C   s   t | |||dd�S rq  )ry  r}  r8   r8   r9   ru  S
  s    ru  c                    s†  |  ¡ dkrrtˆƒdkrrˆd  ¡ tjtjhkrrˆd }tt| ¡ ƒt|  ¡ ƒƒD ]}t|dƒ}qRt	| |g||ƒS t 
¡ rˆt| ˆ||ƒS ˆD ]2}|d k	rŒ| ¡ tjtjhkrŒt| ˆ||ƒ  S qŒ|  ¡ ‰tˆƒ}|  ¡ tjtjhk�r |dkrút| dgƒ} t| ˆ||ƒ} |dk�rt| g ƒ} | S t||  ¡ ƒ}ztˆ|  ¡ ƒ\‰‰‰W n$ tk
�rj   t| ˆ||ƒ Y S X dd„ ˆD ƒ}	dd„ ˆD ƒ‰t| tƒ�s˜t‚|  ¡  |dk�r¶t| dgƒ} t|	d ƒ}
ˆd ˆ… |
ˆˆt|	ƒ d … •‰‡‡fdd„ttˆƒƒD ƒ‰t|ˆƒ}‡ ‡‡‡‡‡fdd	„}tj|  ¡ |  ¡ | ¡ ˆ||�rDd
nd d�}t d t | ¡|¡}tj |¡|_ |dk�r‚t| g ƒ} | S )Nr   r   rÃ   c                 S   s   g | ]}|d k	r|  ¡ ‘qS rM   r  r‰   r8   r8   r9   r?   �
  s      z#index_put_impl_.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|  ¡ ‘qS rM   rÄ   r‰   r8   r8   r9   r?   ‚
  s      c                    s    g | ]}ˆ | d k	rˆ| ‘qS rM   r8   r‰   rc  r8   r9   r?   ‘
  s      c                    sP   t ˆ ƒt ˆƒkst‚‡‡‡ ‡fdd„tˆˆƒD ƒ}ˆ d ˆ… |ˆ ˆd … •}|S )Nc                    s,   g | ]$\}}t j|ˆˆˆ… ƒ|ˆ d �‘qS rd  rf  rg  )r   ra  rË   r_  r8   r9   r?   ˜
  s   ý  ÿz;index_put_impl_.<locals>.output_indexer.<locals>.<listcomp>ri  )rË   rj  )r   ra  Úexpected_vals_sizerk  rl  r_  rÊ   r9   Úoutput_indexer–
  s    üz'index_put_impl_.<locals>.output_indexerÚ
atomic_add©rÔ   r\   rÒ   rÑ   r€  Zscatter_mode)!Ú	get_numelrm   rb   rF   rh   rV  rŽ   rn   r-  r{  r|  r~  rÉ  r  rƒ   rb  r†   r5   r@   r+   r_   rè   rA   r²   r   ÚScatterrÅ   rL  ÚMutationLayoutr3   r¯   Úregister_bufferr  )r  r‡   r£   rw  r   r%  rv   rË   Zx_ndimro  rm  r€  ÚscatterrM  r8   )r   ra  r  rk  r‡   rl  r_  ro  r9   ry  X
  s~    
ÿ
þý

 ÿ

ý
úý

ry  c                 C   s$   t | ƒ}t||||ƒ}t||ƒ |S rM   )rõ   rR  Úcopy_)r  rk  rI  rP  rQ  rµ   Zoutput_viewr8   r8   r9   Úas_strided_scatterµ
  s    
r‰  )rq   c                 K   s   t t| ƒ|||f|ŽS rM   )Úscatter_rõ   )r>   rq   rË   rk  r“   r8   r8   r9   r‡  ½
  s    r‡  ©r  Úinclude_self)rq   r  rŒ  c             	   C   s`   | dkrdnd}|d |hks@||kr8|  ¡ tjtjhks@t ¡ r\tj| ||||||d� |S d S )Núaten.scatter_rE   Úsumr‹  )rb   rF   rh   rÉ  r|  r   ZScatterFallback)rK   r  rq   rË   rk  r  rŒ  Z	reduce_tyr8   r8   r9   Úscatter_fallbackÂ
  s(    

ÿþþý      ÿr�  ©r  )rq   r  c                C   sR   |dkst ‚td| ||||d�}|r(|S |dkr6d}n|dkrBd}t| ||||ƒS )N>   ÚmultiplyNrE   r�  r�  rE   rŽ  r‘  Úprod)r_   r�  Úscatter_reduce_)r  rq   rË   rk  r  Úfallback_resultr8   r8   r9   rŠ  Ú
  s          ÿrŠ  c                 C   s   t t| ƒ|||ƒS rM   )Úscatter_add_rõ   ©r>   rq   rË   rk  r8   r8   r9   Úscatter_addí
  s    r—  c                 C   s   t t| ƒ|||dƒS )NrŽ  ©r“  rõ   r–  r8   r8   r9   r•  ò
  s    r•  c                 K   s   t t| ƒ||||f|ŽS rM   r˜  )r>   rq   rË   rk  Úreduction_typer“   r8   r8   r9   Úscatter_reduce÷
  s    rš  )rŒ  )rq   rŒ  c             	      sÂ  |dkst ‚tdˆˆ |ˆ||d�}|r*|S tˆtƒs8t ‚dt| ¡ ƒksLt ‚tˆ ¡ ƒ}|dkrltˆdgƒ‰tˆtƒr’tˆ ¡ ƒdkr’tˆdgƒ‰t|tƒr¸t| ¡ ƒdkr¸t|dgƒ}t	ˆˆ ƒ‰ ˆ 
¡  | ¡ ‰tˆtƒräˆ ¡ nd ‰‡ ‡‡fdd„}‡‡‡fd	d
„}	dd„ }
|�sbtjˆ ¡ ˆ ¡ ‡fdd„| ¡ |d d�}t d t ˆ¡|¡}tj |¡|_tjˆ ¡ ˆ ¡ |	| ¡ ||
|ƒd�}t d t ˆ¡|¡}tj |¡|_|dk�r¾tˆg ƒ‰ˆS )N>   NÚamaxr’  rŽ  ÚaminÚmeanzaten.scatter_reduce_r‹  r]   r   r   c                    s@   ˆ  ¡ }t|ƒ}t| ƒ}t ˆ| ƒ|dkr.dn|ˆ  ¡|ˆ < |S rn  )rn   rm   rA   r2   rT  )r0  r.  rw  Zindirect_idx)rq   rV  r  r8   r9   r€     s     ÿz'scatter_reduce_.<locals>.output_indexerc                    s    ˆrˆ| ƒS t  ˆˆ  ¡ ¡S d S rM   ©r2   r"  rb   r  )r  rk  r  r8   r9   rK   *  s    zscatter_reduce_.<locals>.fnc                 S   s    | dkrdS | d kst ‚d S d S )NrŽ  r�  rÞ  r�  r8   r8   r9   Úbackend_reduce_str1  s    z+scatter_reduce_.<locals>.backend_reduce_strc                    s   t  dˆ  ¡ ¡S r‚   rž  rÊ   )r  r8   r9   ra  >  rb  z!scatter_reduce_.<locals>.<lambda>r‚  )r_   r�  r@   r+   rZ  rb   rm   rn   r  r?  rè   rÅ   r   r„  r†   rL  r…  r3   r¯   r†  r  )r  rq   rË   rk  r  rŒ  r”  rw  r€  rK   rŸ  Zzero_outrM  r‡  r8   )rq   rV  r  rk  r  r9   r“  ü
  sx    ù



úýúý

r“  .)Úscales_xÚnc           	         sÂ   |   ¡  |  ¡ ‰|  ¡ ˆ d … ‰ |  ¡ d ˆ … }dd„ ˆ D ƒ‰ t|ƒˆksRt‚|}dd„ tˆ |ƒD ƒ‰tˆƒD ]\}}|rr|ˆ|< qrdd„ ‰‡ ‡‡‡‡fdd„}tj|  	¡ |  
¡ |||•d�S )	Nc                 S   s   g | ]}t jj |¡‘qS r8   )r3   r¯   r°   rL  r‰   r8   r8   r9   r?   h  s     z&upsample_nearestnd.<locals>.<listcomp>c                 S   s   g | ]\}}|| ‘qS r8   r8   )r=   r~   Úor8   r8   r9   r?   m  s     c                 S   sB   t  | tj¡} t  | t  |tj¡¡} t  | tj¡} t j| |dd�S rs  )	r2   rÌ  rF   rú  rÕ   r"  rƒ   rË  rT  )r>   ÚscalerI  r8   r8   r9   Úscale_fnr  s    z$upsample_nearestnd.<locals>.scale_fnc                    s>   | ˆ d … }| d ˆ … }ˆ|‡fdd„t |ˆˆ ƒD ƒ•ƒS )Nc                    s   g | ]\}}}ˆ |||ƒ‘qS r8   r8   )r=   r~   r  rI  )r¤  r8   r9   r?   |  s     z2upsample_nearestnd.<locals>.fn.<locals>.<listcomp>)rŒ   )r0  r>   r´   ©Zi_sizesr¡  r¤  Úscalesr9  r8   r9   rK   x  s
    ÿzupsample_nearestnd.<locals>.fnrÓ   )Úrealize_hintrÅ   rn   rm   r_   rŒ   r‹   r(   r�   r†   rb   )	r>   rm  r   r¡  ÚbatchZo_sizesr~   r£  rK   r8   r¥  r9   Úupsample_nearestnda  s&    
ür©  )r¦  c                 C   s   t | ||fdd�S )Nr   ©r¡  ©r©  )r>   rm  r¦  r8   r8   r9   Úupsample_nearest1d‡  s    r¬  )Úscales_hÚscales_wc                 C   s   t | |||fdd�S )Nr   rª  r«  )r>   rm  r­  r®  r8   r8   r9   Úupsample_nearest2dŒ  s    r¯  )Úscales_dr­  r®  c                 C   s   t | ||||fdd�S )NrQ   rª  r«  )r>   rm  r°  r­  r®  r8   r8   r9   Úupsample_nearest3d“  s    r±  c                    s   t ‡ fdd„|D ƒƒS )Nc                 3   s   | ]}t  |ˆ ¡V  qd S rM   r-  r€   r[   r8   r9   rŸ   Ÿ  s     z$_create_constants.<locals>.<genexpr>©rB   )r\   ru   r8   r[   r9   Ú_create_constantsž  s    r³  )Úalign_cornersr­  r®  c              
      sø   |   ¡  |  ¡ ‰|  ¡ \}}‰	‰
|\}}tjj ˆ	¡‰	tjj ˆ
¡‰
dd„ ‰ddd„}	dd„ ‰dd„ ‰d	d
„ ‰‡‡fdd„‰‡fdd„‰|	ˆ	|ˆ |ƒ‰|	ˆ
|ˆ |ƒ‰dd„ ‰‡ ‡‡‡‡‡‡	‡
‡‡f
dd„}
tj|  	¡ |  
¡ |
||t |¡t |¡gd�S )Nc                 S   s   | t  t j¡jkrt jS t jS rM   )rF   rü   rË  re  rÉ  )Úmaxvalr8   r8   r9   Úget_int_dtype³  s    z1upsample_bicubic2d_default.<locals>.get_int_dtypec                 S   sD   |r |dkr| d |d  S dS |d k	r8|dkr8d| S | | S d S r6  r8   )Zin_sizerx  r´  r£  r8   r8   r9   Úcompute_scale¸  s    z1upsample_bicubic2d_default.<locals>.compute_scalec                 S   sN   t  |tj¡}t  | tj¡} |r,t  | |¡S t  dtj¡}| ||  | S d S )Nç      à?)r2   rÌ  rF   rú  r"  rÕ   )r£  Z	dst_indexr´  Zdst_index_ieZhalfr8   r8   r9   Úcompute_source_index¾  s    z8upsample_bicubic2d_default.<locals>.compute_source_indexc                 S   s8   t |d |d dtjd�\}}}||  | |  |  | S )Nr   rQ   r   r[   ©r³  rF   rú  )r>   ÚAZ_Ap2Z_Ap3Ú_1r8   r8   r9   Úcubic_convolution1Ç  s     z6upsample_bicubic2d_default.<locals>.cubic_convolution1c                 S   sD   t |d| d| d| tjd�\}}}}||  | |  | |  | S )NrR   rS   rV   r[   rº  )r>   r»  Z_AZ_4AZ_5AZ_8Ar8   r8   r9   Úcubic_convolution2Ë  s        ÿz6upsample_bicubic2d_default.<locals>.cubic_convolution2c                    sb   d}t  dtj¡}ˆt  | |¡|ƒ}ˆ | |ƒ}t  || ¡}ˆ ||ƒ}ˆt  ||¡|ƒ}||||fS )Ng      è¿ç      ð?)r2   r"  rF   rú  rE   Úsub)rà   r»  r¼  Zc0Úc1Zx2Úc2Úc3)r½  r¾  r8   r9   Úget_cubic_upsample_coefficientsÑ  s    

zCupsample_bicubic2d_default.<locals>.get_cubic_upsample_coefficientsc                    sH   ˆ |ƒ}| d |d  | d |d   | d |d   | d |d   S )Nr   r   r   rQ   r8   )Zxsrà   Úcs)rÄ  r8   r9   Úcubic_interp1dÜ  s    z2upsample_bicubic2d_default.<locals>.cubic_interp1dc                 S   s   t  |t  || ¡¡S rM   )r2   ÚmaximumÚminimum)r/  rf  re  r8   r8   r9   Úclampä  s    z)upsample_bicubic2d_default.<locals>.clampc           
         sì   | \‰‰ }}ˆ
ˆ|ˆƒ}t  |¡}t  ||¡‰ˆ
ˆ|ˆƒ}t  |¡}t  ||¡}‡ ‡	‡‡‡‡fdd„‰t  |ˆˆd ƒ¡‰t  |ˆˆd ƒ¡‰t‡fdd„dD ƒƒ}t‡fdd„dD ƒƒ‰‡‡‡‡fdd	„‰t‡fd
d„|D ƒƒ}	ˆ|	|ƒS )Nc                    sr   t  dtj¡}t  ˆd tj¡}t  ˆd tj¡}t jˆ| ||ƒˆdd�}t jˆ|||ƒˆdd�}ˆˆˆ ||gƒS )Nr   r   Fre  )r2   r"  rF   rË  rT  )Úfyr·  Z_0ZiHm1ZiWm1ÚiyÚix)ÚcrÉ  ÚiHÚiWr¡  r9  r8   r9   Úload_boundedò  s    z<upsample_bicubic2d_default.<locals>.fn.<locals>.load_boundedr   c                 3   s   | ]}t  ˆ |¡V  qd S rM   ©r2   rE   ©r=   Zofs)rË  r8   r9   rŸ   ý  s     z9upsample_bicubic2d_default.<locals>.fn.<locals>.<genexpr>)rÃ   r   r   r   c                 3   s   | ]}t  ˆ |¡V  qd S rM   rÑ  rÒ  )rÌ  r8   r9   rŸ   þ  s     c                    s"   t ‡‡ fdd„ˆD ƒƒ}ˆ|ˆƒS )Nc                 3   s   | ]}ˆ ˆ|ƒV  qd S rM   r8   r<   )rÐ  r3  r8   r9   rŸ     s     zOupsample_bicubic2d_default.<locals>.fn.<locals>.get_x_interp.<locals>.<genexpr>r²  )r3  Zcoeffs_x)rÆ  Úixs_ofsrÐ  Út_x)r3  r9   Úget_x_interp   s    z<upsample_bicubic2d_default.<locals>.fn.<locals>.get_x_interpc                 3   s   | ]}ˆ |ƒV  qd S rM   r8   )r=   r3  )rÕ  r8   r9   rŸ     s     )r2   r(  rÀ  rƒ   rB   )
r0  ZoyÚoxZreal_xZin_xZreal_yZin_yZt_yZiys_ofsZcoeffs_y)
r´  rÉ  r¹  rÆ  r¶  Úheight_scalerÎ  rÏ  Úwidth_scaler9  )rÍ  rÕ  rÌ  rÓ  rË  rÐ  r¡  rÔ  r9   rK   ç  s    

	z&upsample_bicubic2d_default.<locals>.fnrÓ   )N)r§  rÅ   rn   r3   r¯   r°   rL  r(   r�   r†   rb   rc   r®   )r>   rm  r´  r­  r®  ÚNÚCZoHZoWr·  rK   r8   )r´  rÉ  r¹  r½  r¾  rÆ  rÄ  r¶  r×  rÎ  rÏ  rØ  r9  r9   Úupsample_bicubic2d_default¢  s.    
	 ürÛ  c              
      s¬   t |ƒdkst‚|\‰}‰}|  ¡ ‰|  ¡ �^ }‰ ‰tjj ˆ ¡‰ tjj ˆ¡‰dd„ ‰‡ ‡‡‡‡‡fdd„}tj	|  
¡ |  ¡ ||t ˆ ˆ | ¡t ˆˆ | ¡f•d�S )NrR   c                 S   sj   |}t  |d tj¡}t  | tj¡} t  | t  |tj¡¡} t  |t  t  |t  | ¡¡¡¡} t j| |dd�S )Nr   Fre  )r2   r"  rF   rË  rÌ  rÀ  ÚabsrT  )r>   rI  r]  Zsize_numr8   r8   r9   Úreflect  s     z!reflection_pad2d.<locals>.reflectc                    s4   | �^ }}}ˆ|ˆ ˆƒ}ˆ|ˆˆƒ}ˆ|||f•ƒS rM   r8   )r0  r´   r>   r3  ©ÚhÚleftrÝ  ÚtoprŒ  r9  r8   r9   rK   !  s    zreflection_pad2d.<locals>.fnrÓ   )rm   r_   rÅ   rn   r3   r¯   r°   rL  r(   r�   r†   rb   rc   r®   )r>   r€  r  Úbotr¨  rK   r8   rÞ  r9   Úreflection_pad2d  s    &ürã  c                    s¢   t |ƒdkst‚|\‰‰‰‰ | ¡ �^ }‰‰tjj ˆ¡d ‰tjj ˆ¡d ‰|  ¡ ‰|  ¡ �^ }}}‡ ‡‡‡‡‡‡fdd„}tj	|  
¡ |  ¡ |t| ¡ ƒd�S )NrR   r   c                    s¸  | �^ ‰ }}‡ ‡fdd„‰dd„ ‰|ˆ |ˆ	  ‰‰ˆ| ˆ	|  }}dˆ ˆ | dˆ ˆ	 |  }}ˆdˆˆ ˆ f}ˆdˆˆ	 ˆ
 f}t  ˆ|ƒˆ|ƒ¡}	t  |	‡‡‡fdd„d	¡‰d‡‡‡fd
d„	}
|
ˆ|||dˆ	fƒ |
ˆ|||ˆˆ
 ˆd fƒ |
|ˆ|dˆf|ƒ |
|ˆ|ˆˆ ˆd f|ƒ |
|||dˆf|dˆ	fƒ |
|||dˆf|ˆˆ
 ˆd fƒ |
|||ˆˆ ˆd f|dˆ	fƒ |
|||ˆˆ ˆd f|ˆˆ
 ˆd fƒ ˆS )Nc                    s   ˆˆ | |f•ƒS rM   r8   r2  )r´   Úgrad_loaderr8   r9   Úload_from_output=  s    z?reflection_pad2d_backward.<locals>.fn.<locals>.load_from_outputc                 S   sP   | \}}}t  |tj¡}t  |tj¡}t  |tj¡}t  t  ||¡t  ||¡¡S rM   )r2   rÌ  rF   rË  rÉ  r#  r   Úle)Zindex_ranger~   ZlbZubr8   r8   r9   Úindex_range_condition@  s
    
zDreflection_pad2d_backward.<locals>.fn.<locals>.index_range_conditionr   r   c                      s
   ˆˆ ˆƒS rM   r8   r8   )Úcenter_xÚcenter_yrå  r8   r9   ra  \  rb  z7reflection_pad2d_backward.<locals>.fn.<locals>.<lambda>r  c                    sŽ   |d |d k }t |tƒr"|r"d S ˆ|ƒ}|d k	rd|d |d k }t |tƒrT|rTd S t |ˆ|ƒ¡}t |‡‡ ‡fdd„d¡}t ˆ|¡‰d S )Nr   r   c                      s
   ˆ ˆˆƒS rM   r8   r8   )rå  Úout_xÚout_yr8   r9   ra  l  rb  zKreflection_pad2d_backward.<locals>.fn.<locals>.accumulate.<locals>.<lambda>r  )r@   rh   r2   r#  r$  rE   )rê  rë  Zindex_range1Zindex_range2Zupper_less_than_lower1r6   Zupper_less_than_lower2Úg)Úgradrç  rå  )rê  rë  r9   rw  ^  s    z9reflection_pad2d_backward.<locals>.fn.<locals>.accumulater   )N)r2   r#  r$  )r0  r>   r3  Ztop_reflect_xZleft_reflect_yZbot_reflect_xZright_reflect_yZrange_cxZrange_cyr6   rw  ©râ  rä  rß  rà  r  rá  rŒ  )r´   rè  ré  rí  rç  rå  r9   rK   :  s8    " ÿ""   ÿz%reflection_pad2d_backward.<locals>.fnrÓ   )rm   r_   rn   r3   r¯   r°   rL  rÅ   r(   r�   r†   rb   rA   )Úgrad_outputr>   r€  rv   Zh_gradZw_gradrK   r8   rî  r9   Úreflection_pad2d_backward/  s    B
ürð  c                    s:   |   ¡ ‰|  ¡ ‰‡ ‡‡fdd„}tj|  ¡ |  ¡ |ˆd�S )Nc                    sF   t | ƒ} t| ƒtˆƒkst‚ˆ D ]}ˆ| d | |  | |< q ˆ| ƒS r  )rA   rm   r_   )r0  rq   ©r  r  r9  r8   r9   rh  Š  s
    zrev.<locals>.loaderrÓ   )rÅ   rn   r(   r�   r†   rb   )r>   r  rh  r8   rñ  r9   Úrev„  s    ürò  c              	      sv  t |ƒd dkst‚tdd„ |D ƒƒr.t| ƒS |  ¡ }tttt|d d d… |dd d… ƒƒƒƒ‰ t |ƒt ˆ ƒ ‰g ‰ˆ D ]:\}}t|t	j
ƒr |jr tjj |¡n|}ˆ ||f¡ qxt|d ˆ… ƒ}g ‰tˆ |ˆd … ƒD ].\\}}	}
ˆ |
¡ | t	 |
| |	 ¡¡ qÚt |ƒt |ƒk�s t‚t|  ¡ ƒˆƒ‰‡ ‡‡‡‡fdd„‰‡‡‡fdd	„}|  ¡ ‰tj|  ¡ |  ¡ ||d
�S )Nr   r   c                 s   s   | ]}|d kV  qdS ©r   Nr8   )r=   rØ  r8   r8   r9   rŸ   �  s     z"constant_pad_nd.<locals>.<genexpr>r   c                    s~   g }t ˆ ˆd … ˆˆƒD ]>\}\}}}|dkr>| t|dƒ¡ |dkr| t||ƒ¡ qt tj|¡}t |‡ ‡fdd„ˆ¡S )Nr   c                      s   ˆˆ ƒS rM   r8   r8   )rË   r9  r8   r9   ra  ¿  rb  z/constant_pad_nd.<locals>.mask.<locals>.<lambda>)	rŒ   ry   Úrange_mask_lowÚrange_mask_highrš   r  r2   r#  r$  )rË   r%  r0  rü  rý  r  )Úboundsr8  Ú
mask_sizesr¡  r9  rÊ   r9   r%  ·  s    "zconstant_pad_nd.<locals>.maskc                    sZ   t | d ˆ… ƒ}t| ˆd … ˆ ƒD ]\}\}}| || ¡ q"t|ƒt| ƒksRt‚ˆ|ƒS rM   )rA   rŒ   ry   rm   r_   )rË   rj  r0  rü  rý  )Úbounds_precompr%  r¡  r8   r9   Ú	offset_fnÁ  s
    z"constant_pad_nd.<locals>.offset_fnrÓ   )rm   r_   r¤   rõ   rn   rA   r­   rŒ   r@   rc   r·   r³   r3   r¯   r°   Zlookup_precomputed_sizery   r²   r   rb   rÅ   r(   r�   r†   )r>   r€  r8  r  Úlrß  Z	l_precomprm  rü  rý  rI  rù  r8   )rö  rø  r8  r%  r÷  r¡  r9  r9   Úconstant_pad_ndš  s>    *
ÿÿý

ürû  ©r~   rü  c                 C   s&   t  t  | tj¡t  t |¡tj¡¡S rM   )r2   r   rÌ  rF   rÉ  rc   r®   rü  r8   r8   r9   rô  Ñ  s    þrô  ©r~   rý  c                 C   s    t  t  | tj¡t  |tj¡¡S rM   )r2   r!  rÌ  rF   rÉ  rý  r8   r8   r9   rõ  Ø  s    þrõ  ©r~   rý  rü  c                 C   s   t  t| |ƒt| |ƒ¡S rM   )r2   r#  rô  rõ  rþ  r8   r8   r9   Ú
range_maskß  s    þrÿ  r¿  c              	      sX   ˆ  ¡ �^ }‰‰ˆ ¡ ‰ˆr$ˆd nd‰ˆr4ˆd nd‰‡ ‡‡‡‡‡‡‡‡f	dd„}|S )Nr   r   c                    sr   | �^ ‰‰ ‰t  tˆ ˆˆ ˆ ƒtˆˆ	ˆ ˆ ƒ¡}ˆrVt  |‡ ‡‡‡‡
fdd„ˆ¡S t  |‡ ‡‡‡fdd„ˆ¡S )Nc                      s   t ˆˆƒˆˆ ˆf•ƒS rM   )Úconstant_boundary_condition_2dr8   )ÚihÚiwÚpad_fill_valueÚprefixr>   r8   r9   ra  ö  s   
ÿz>constant_boundary_condition_2d.<locals>.load.<locals>.<lambda>c                      s   ˆˆˆ ˆf•ƒS rM   r8   r8   )r  r  r  r9  r8   r9   ra  ü  rb  )r2   r#  rÿ  r$  )rË   r%  ©	r8  rß  r  r€  Z	padding_hZ	padding_wrŒ  r>   r9  )r  r  r  r9   rÉ   ì  s    þùû÷z,constant_boundary_condition_2d.<locals>.load©rn   rÅ   )r>   r8  r€  r  rv   rÉ   r8   r  r9   r   æ  s    r   c                 C   sú   t | d||   || d  || d  || ƒ}|ròt | d||   || d  d|| d   || ƒ}tjj |d ||  |  ||  ¡dkrÂ|d8 }tjj d|||  |  ||  ¡ tjj || ¡dkrîtjj ||¡ d}n|}||fS )Nr   r   r   F)r   r3   r¯   r°   r+  rt  r±   )r>   r~   Úkernel_sizerP  r€  Ú	ceil_modeZx_outZx_altr8   r8   r9   Úpooling_size  s"    & ÿ* ÿ*$r	  c                    sà  ˆdkrddg‰|dkr ddg}ˆs(ˆ ‰t ˆ dƒ‰ t ˆdƒ‰t ˆdƒ‰t |dƒ}t| tƒs^t‚tˆ ƒdksnt‚tˆƒdks~t‚tˆƒdksŽt‚t|ƒdksžt‚t|  ¡ ƒdks²t‚|  ¡  |  ¡ �^ }}‰t|dˆ ˆˆ|ƒ\}}	tˆdˆ ˆˆ|ƒ\}
}ˆd �sˆd �s|	�s|�r&t| t	dƒƒ‰n|  
¡ ‰t|ƒ||
g }ˆ d ˆ d  }|dk�sltdd„ |D ƒƒ�r~t| ˆ ˆˆ||ƒS ‡ ‡‡‡‡fd	d
„}tj|  ¡ |  ¡ tj|dd�|d�}tj|  ¡ tjtj|dd�|d�}||fS )Nr   r   r   ©rQ   rR   z-infé   c                 s   s   | ]}|d kV  qdS r  r8   rF  r8   r8   r9   rŸ   ?  s     z*max_pool2d_with_indices.<locals>.<genexpr>c                    sâ   | �^ }}}d }d }t  tˆ d ƒtˆ d ƒ¡D ] \}}|ˆd  | ˆd  }|ˆd  | ˆd  }ˆ|||f•ƒ}	|r¶t |ˆ | tj¡}
|d kr |
}nt t |	|¡|
|¡}|d krÄ|	}q0t 	|	|¡}q0|rÚ|S |S d S rn  )
r«   ÚproductrŽ   r2   rÌ  rF   rÉ  r  ÚgtrÇ  )r0  Úreturn_indexr  ÚbhÚbwrµ  Zmaxindexr  r  r  rË   ©r  r€  rP  rŒ  r9  r8   r9   rK   E  s$    $z#max_pool2d_with_indices.<locals>.fnF)r  rÓ   T)r0   r@   r+   r_   rm   rn   r§  r	  r   r¸   rÅ   rA   r¡   Ú fallback_max_pool2d_with_indicesr(   r�   r†   rb   rš   r¨   rF   rÉ  )r>   r  rP  r€  r�  r  r¨  rß  Úh_outÚ
ceil_mode1Úw_outÚ
ceil_mode2r;  Úwindow_sizerK   Úr1Úr2r8   r  r9   Úmax_pool2d_with_indices  s`    



      ÿüür  c                    s®  ˆdkrddg‰|dkr ddg}ˆs(ˆ‰t |tƒs6t‚tˆƒdksFt‚tˆƒdksVt‚tˆƒdksft‚t|ƒdksvt‚t| ¡ ƒdksŠt‚|  ¡  z|  ¡ }W n tk
r¶   d }Y nX t |tƒ�rt |jjt	ƒ�r|jj}	t
jd t
j|	 ¡ |	 ¡ |	 ¡ d�|	d�}
|
 ¡  |
 ¡ }n(z| ¡ }W n tk
�r<   d }Y nX |d k	�rV|d dk�pj|d k	�oj|d dk}tj�p€tj�p€tj}tdd„ |D ƒƒ�s¢|�r¸|�s¸t| |ˆˆˆ|||ƒS | ¡  | ¡ �^ }}‰
|  ¡ �^ }‰‰| ¡ ‰|  ¡ ‰ t| ¡ ƒ}t‡‡fd	d
„tˆd d ƒD ƒƒ‰t‡‡fdd
„tˆd d ƒD ƒƒ‰	ˆˆ	 }|dk�rlt| |ˆˆˆ|||ƒS | ¡ ‰‡ ‡‡‡‡‡‡‡‡‡	‡
fdd„}t	j|  ¡ |  ¡ ||d�S )Nr   r   r   r
  )rÔ   r\   rI  )r  rX  rß   c                 s   s   | ]}|d kV  qdS r  r8   rF  r8   r8   r9   rŸ   ¦  s     z3max_pool2d_with_indices_backward.<locals>.<genexpr>c              	      s8   g | ]0}t |ˆd   t d |ˆ d   ˆd   ƒ dƒ‘qS ©r   r   ©re  ©r=   rß  ©r  rP  r8   r9   r?   ¶  s   ÿz4max_pool2d_with_indices_backward.<locals>.<listcomp>c              	      s8   g | ]0}t |ˆd   t d|ˆ d   ˆd   ƒ d ƒ‘qS ©r   r   r  ©r=   rŒ  r  r8   r9   r?   ¼  s   ÿr  c                    sZ  | �^ }}}t  |ˆ
 | tj¡}|ˆd  }|ˆd  }t  t|ˆd  ˆd  ˆd ƒtj¡}t  t|ˆd  ˆd  ˆd ƒtj¡}t  t|ˆd ƒd tj¡}t  t|ˆd ƒd tj¡}t  |t  dtj¡¡}t  |t  dtj¡¡}t  |t  ˆtj¡¡}t  |t  ˆtj¡¡}d }	tˆƒD �]}
tˆ	ƒD �]}t  	|t  |
tj¡¡}t  	|t  |tj¡¡}|t j
t  |t  |t  dtj¡¡¡ˆd dd�t j
t  |t  |t  dtj¡¡¡ˆd dd�f•}ˆ|ƒ}ˆ |ƒ}t  ||¡}|	d k�rt  ||t  dtj¡¡}	n:t  t  t  ||¡t  ||¡¡|¡}t  |t  	|	|¡|	¡}	�q4�q&|	d k	�sVt‚|	S )Nr   r   éþÿÿÿFre  rÃ   r  )r2   rÌ  rF   rË  r   rÇ  r"  rÈ  rŽ   rE   rT  rÀ  r  r  rú  r#  r!  r_   )r0  r  rß  rŒ  Z
index_testÚphstartÚpwstartÚphendÚpwendÚgradientÚph_Úpw_ÚphÚpwZ
grad_indexZindex_actualZ	grad_partr   r%  ©rä  Úh_window_sizerY  Zindices_sizer  r€  Úpooled_heightÚpooled_widthrP  Úw_window_sizeÚwidthr8   r9   rK   Ì  sl     ÿ ÿýýù
  ÿ

þûz,max_pool2d_with_indices_backward.<locals>.fnrÓ   )r@   r+   r_   rm   rn   r§  Ú
get_strideÚAttributeErrorrß   r(   r   rL  rÑ  r†   rb   Zdecide_layoutr   Zcoordinate_descent_tuningZmax_autotuneZmax_autotune_pointwiser¡   Ú)fallback_max_pool2d_with_indices_backwardrÅ   rA   re  rŽ   r�   )rï  r>   r  rP  r€  r�  r  r‡   Z	gO_striderß   Zx_bufferZx_strideZis_channels_lastZautotuner¨  Úheightrv   r;  r  rK   r8   r+  r9   Ú max_pool2d_with_indices_backwardq  s²    
ýù	

ÿÿý        ÿþÿþÿ
       ÿ ;ür5  c                    s(   |   ¡ �^ }}}|  ¡ ‰ ‡ fdd„}|S )Nc              
      s„   |\‰‰|\‰ ‰|\}}t  t  t  ˆ ˆ tj¡t  |tj¡¡t  t  ˆˆ tj¡t  |tj¡¡¡}t  |‡ ‡‡‡‡‡fdd„d¡S )Nc                      s   ˆˆˆ ˆ ˆˆ f•ƒS rM   r8   r8   )Úh_start_indexr  r  r  Úw_start_indexr9  r8   r9   ra  %  rb  z3pad_adaptive_loader.<locals>.load.<locals>.<lambda>r  )r2   r#  r!  rÌ  rF   rÉ  r$  )r  Z
incrementsZstart_indicesZend_indicesÚh_end_indexÚw_end_indexr%  ©r9  )r6  r  r  r  r7  r9   rÉ     s$    þþûýz!pad_adaptive_loader.<locals>.loadr  )r>   rv   rß  rŒ  rÉ   r8   r:  r9   Úpad_adaptive_loader  s    r;  c                    s(   |\‰‰|\‰ ‰‡ ‡‡‡‡fdd„}|S )Nc                    sŽ   | �^ }}}ˆ|ƒ}ˆ |ƒ}ˆ|ƒ}ˆ|ƒ}d }	t  tˆd ƒtˆd ƒ¡D ]<\}
}|||
|g||g||gƒ}|	d kr||}	qLt ||	¡}	qL|	S rn  ©r«   r  rŽ   r2   rE   )r0  rh  r  r  r  r6  r8  r7  r9  Útotalr  r  r  ©Zh_end_index_fnZh_start_index_fnÚkernel_maxesZw_end_index_fnZw_start_index_fnr8   r9   Úfn_sum0  s"    $üz)_adaptive_pooling_idx_sum.<locals>.fn_sumr8   )r?  Zstart_index_fnsZend_index_fnsr@  r8   r>  r9   Ú_adaptive_pooling_idx_sum,  s    rA  c                    sÌ  t ˆtƒst‚t|ƒdkst‚ˆ ¡  ˆ ¡ �^ }}}tjj 	|¡}tjj 	|¡}|\}}||krr||krrt
ˆƒS |dks‚|dkr¤|||f•}t|ˆ ¡ ˆ ¡ d�S || dkrÖ|| dkrÖ|| || g}tˆ|ƒS t|| d |ƒ}	t|| d |ƒ}
t|ƒ||g }ˆ ¡ }dd„ }dd„ }tj|||d	�}tj|||d	�}tj|||d	�}tj|||d	�}|	|
 }|d
k�r~tˆ|ƒS t|	|
g||g||gƒ‰ ttˆƒƒ‰‡ ‡‡fdd„}tjˆ ¡ |||d�}|S )Nr   r   r5  r   c                 S   s   t | | |ƒS rM   ©r   ©rË   Úout_dimÚinp_dimr8   r8   r9   Ústart_indexk  s    z)_adaptive_avg_pool2d.<locals>.start_indexc                 S   s   t | d | | d |ƒS r  rB  rC  r8   r8   r9   Ú	end_indexn  s    z'_adaptive_avg_pool2d.<locals>.end_index©rD  rE  r  c                    s   t  ˆ | tˆƒƒˆ | ˆƒ¡S rM   )r2   Údivr;  r  ©r@  Úones_loaderr>   r8   r9   rK   „  s    z _adaptive_avg_pool2d.<locals>.fnrÓ   )r@   r+   r_   rm   r§  rn   r3   r¯   r°   rL  rõ   r:  rb   r†   Ú
avg_pool2dr.   rA   rš   r¨   Úfallback_adaptive_avg_pool2drA  r;  Ú	ones_liker(   r�   )r>   rm  r¨  Zh_inZw_inr  r  Zo_sizer  Úh_kernel_maxÚw_kernel_maxr;  r\   rF  rG  r6  r8  r7  r9  r  rK   Úrvr8   rJ  r9   Ú_adaptive_avg_pool2dM  sT    


ýürR  c                    s"  ˆ  ¡  ˆ ¡ �^ }}}tjj |¡}tjj |¡}|�^ }}}	|| dkrr||	 dkrrtˆ|| ||	 gdd�S t||ƒ}
t||	ƒ}dd„ ‰‡fdd„}tj	ˆ||d�}tj	|||d�}tj	ˆ|	|d�}tj	||	|d�}t
|
|g||g||gƒ‰ ‡ ‡fd	d
„}tjˆ ¡ ˆ ¡ |t|ƒd�}|S )Nr   r   )Údivisor_overridec                 S   s   t | | |ƒS rM   )r   rC  r8   r8   r9   rF  £  s    z0upsample_nearest2d_backward.<locals>.start_indexc                    s   ˆ | d ||ƒS r  r8   rC  )rF  r8   r9   rG  ¦  s    z.upsample_nearest2d_backward.<locals>.end_indexrH  c                    s   ˆ | t ˆƒƒS rM   )r;  r  )r@  r>   r8   r9   rK   µ  s    z'upsample_nearest2d_backward.<locals>.fnrÓ   )r§  rn   r3   r¯   r°   rL  rL  r.   rš   r¨   rA  r(   r�   r†   rb   rA   )r>   rm  Z
input_sizer­  r®  r¨  Zinp_hZinp_wZout_hZout_wrO  rP  rG  r6  r8  r7  r9  rK   rQ  r8   )r@  rF  r>   r9   Úupsample_nearest2d_backward‘  s8    

ýürT  r8   c                    sÚ  ˆsˆ‰ˆsddg‰t ˆdƒ‰t ˆdƒ‰t ˆdƒ‰t| tƒs@t‚tˆƒdksPt‚tˆƒdks`t‚tˆƒdkspt‚t|  ¡ ƒdks„t‚|  ¡  |  ¡ �^ }}}	t|dˆˆˆ|ƒ\}
}t|	dˆˆˆ|ƒ\}}ˆd sàˆd sà|sà|rðt| dƒ‰d}n|  	¡ ‰d}t
|ƒ|
|g }|  ¡ ‰ ˆd ˆd  }|dk�rBt| ˆˆˆ|||ƒS ‡‡‡fd	d
„‰|�r^|�r–|�rnd| ‰ndˆd ˆd   ‰‡ ‡‡‡fdd„}n*tt| ƒd|�rªˆnd ƒ‰‡‡‡fdd„}tj|  ¡ ˆ ||d�}|S )Nr   r   r
  r   r  TFr  c           	         s”   | �^ }}}d }t  tˆ d ƒtˆ d ƒ¡D ]b\}}|ˆd  | ˆd  }|ˆd  | ˆd  }||||f•ƒ}|d kr‚|}q,t ||¡}q,|S rn  r<  )	r0  rh  r  r  r  r=  r  r  r  )r  r€  rP  r8   r9   r@  ú  s    $zavg_pool2d.<locals>.fn_sumr¿  c                    s   t  ˆ| ˆƒt  ˆˆ ¡¡S rM   )r2   rÕ   r"  r  )r\   r@  r£  r9  r8   r9   rK     s    zavg_pool2d.<locals>.fnc                    s   t  ˆ | ˆƒˆ | ˆƒ¡S rM   ©r2   rI  r  )r@  rK  r9  r8   r9   rK     s    rÓ   )r0   r@   r+   r_   rm   rn   r§  r	  r   rÅ   rA   rb   Úfallback_avg_pool2drN  r(   r�   r†   )r>   r  rP  r€  r  Úcount_include_padrS  r¨  rß  rŒ  r  r  r  r  Úhad_paddingr;  r  rK   rQ  r8   )r\   r@  r  rK  r€  r£  rP  r9  r9   rL  Å  sj    





ù

  ÿürL  c                    sÔ  ˆd ksˆdkst dƒ‚ˆs ˆ‰ˆs,ddg‰t| tƒs:t ‚t|tƒsHt ‚tˆƒdksXt ‚tˆƒdksht ‚tˆƒdksxt ‚t| ¡ ƒdksŒt ‚|  ¡  | ¡ �^ }‰‰tˆdˆˆˆ|ƒ\}	}
tˆdˆˆˆ|ƒ\}}|  ¡ ‰ˆd pîˆd pî|
pî|‰|  ¡ �^ }‰	‰
t| ¡ ƒ}| 	¡ }t
‡‡fdd„tˆd d ƒD ƒƒ‰t
‡‡fdd„tˆd d ƒD ƒƒ‰ˆˆ }|d	k�r„t| |ˆˆˆ|ˆˆƒS ‡‡‡‡‡fd
d„‰ ‡ ‡‡‡‡‡‡‡‡	‡
‡‡fdd„}tj|  ¡ |||d�}|S )Nr   zdivisor must be not zeror   r
  r   c              	      s8   g | ]0}t |ˆd   t d |ˆ d   ˆd   ƒ dƒ‘qS r  r  r  r  r8   r9   r?   N  s   ÿz'avg_pool2d_backward.<locals>.<listcomp>c              	      s8   g | ]0}t |ˆd   t d|ˆ d   ˆd   ƒ d ƒ‘qS r  r  r   r  r8   r9   r?   T  s   ÿr  c              	      sX  t  ˆd tj¡}t  ˆd tj¡}t  ˆd tj¡}t  ˆd tj¡}t  ˆd tj¡}t  ˆd tj¡}t  t  | |¡|¡}t  t  ||¡|¡}	t  t  ||¡t  t  ˆ tj¡|¡¡}
t  t  |	|¡t  t  ˆtj¡|¡¡}t  	|t  dtj¡¡}t  	|	t  dtj¡¡}	t  |
t  ˆ tj¡¡}
t  |t  ˆtj¡¡}t  t  |
|¡t  ||	¡¡}|S )z{
        This computes the scaling factor that we will divide an element
        by when `count_include_pad=False`
        r   r   )
r2   r"  rF   rË  rÀ  rÕ   rÈ  rE   rÌ  rÇ  )r)  r*  Zstride_hZstride_wZpad_hZpad_wZkernel_hZkernel_wZhstartZwstartZhendZwendZdivide_factor)r4  r  r€  rP  r0  r8   r9   Ú!compute_pool_size_without_paddingh  s,    
þ
þz>avg_pool2d_backward.<locals>.compute_pool_size_without_paddingc                    s\  | �^ }}}|ˆd  }|ˆd  }t  t|ˆd  ˆ
d  ˆ
d ƒtj¡}t  t|ˆd  ˆ
d  ˆ
d ƒtj¡}t  t|ˆ
d ƒd tj¡}t  t|ˆ
d ƒd tj¡}t  |t  dtj¡¡}t  |t  dtj¡¡}t  |t  ˆtj¡¡}t  |t  ˆ	tj¡¡}d }tˆƒD �]6}	tˆƒD �]$}
t  	|t  |	tj¡¡}t  	|t  |
tj¡¡}ˆd k	�r`ˆ}n(ˆ�slˆ�s~ˆd ˆd  }n
ˆ ||ƒ}t  
ˆ|t jt  |t  |t  dtj¡¡¡ˆdd�t jt  |t  |t  dtj¡¡¡ˆ	dd�f•ƒ|¡}t  t  ||¡t  ||¡¡}|d k�r,t  ||t  dtj¡¡}nt  |t  	||¡|¡}�q�q|d k	�sXt‚|S )Nr   r   Fre  r  )r2   rÌ  r   rF   rË  rÇ  r"  rÈ  rŽ   rE   ÚtruedivrT  rÀ  r#  r!  r  rú  r_   )r0  r  rß  rŒ  r"  r#  r$  r%  r&  r'  r(  r)  r*  r£  Úpartr%  )rY  rW  rS  rä  r,  rX  r  r€  r-  r.  rP  r/  r8   r9   rK   „  sv     ÿ ÿ

 ÿû ÿû÷ÿì

þ
zavg_pool2d_backward.<locals>.fnrÓ   )r_   r@   r+   rm   rn   r§  r	  rÅ   rA   rb   re  rŽ   Úfallback_avg_pool2d_backwardr(   r�   r†   )rï  r>   r  rP  r€  r  rW  rS  r¨  r  r  r  r  rv   r;  r\   r  rK   rQ  r8   )rY  rW  rS  rä  r,  rX  r4  r  r€  r-  r.  rP  r/  r0  r9   Úavg_pool2d_backward&  sf    þÿþÿ
ø"Aür]  c                 C   sô   |   ¡ }t|tƒr|g}n|s*tt|ƒƒ}t|ƒdkrTt|ƒdksPtd|› �ƒ‚g S t|ƒ}tt|ƒƒD ]j}|| dk r˜||  t|ƒr�t|ƒnd7  < d||   kr´t|ƒk shn t|ƒdkrÎ|| dksht‚qhtt|ƒƒt|ƒksðtdƒ‚|S )Nr   )r8   )r   )rÃ   zinvalid axis: r   zreduction axis not unique)	rn   r@   r]   rŽ   rm   rB   r_   rA   rC   )r>   ÚaxisrI  r~   r8   r8   r9   Ú_validate_reduction_axisÎ  s    
 <r_  c          
         sî   |d k	rt | |ƒ} |  ¡ ‰tt| |ƒƒ}g }g ‰g }g ‰ttˆƒƒD ]>}||krjˆ |¡ | ˆ| ¡ qDˆ |¡ | ˆ| ¡ qD‡ ‡‡‡‡fdd„}ˆr¾tˆƒ}	ˆD ]}t 	d¡|	|< q¨n|}	|  
¡ ‰ t|  ¡ |pÜ|  ¡ |  ¡ ||	|d�S )Nc                    s´   t |ƒt ˆƒkst‚ˆrXt ˆ ƒt ˆƒks,t‚t‡ fdd„ˆD ƒƒsFt‚‡ fdd„ˆD ƒ‰ t ˆ ƒt ˆƒkslt‚d gt ˆ ƒt |ƒ  }t tˆˆ ƒtˆ|ƒ¡D ]\}}|||< qšˆ|ƒS )Nc                 3   s   | ]}ˆ | d kV  qdS ró  r8   r‰   rÊ   r8   r9   rŸ   ö  s     z8_make_reduction_inner.<locals>.loader.<locals>.<genexpr>c                    s   g | ]}ˆ | ‘qS r8   r8   r‰   rÊ   r8   r9   r?   ÷  s     z9_make_reduction_inner.<locals>.loader.<locals>.<listcomp>)rm   r_   r¤   r«   ÚchainrŒ   )rË   Zreduction_indexrj  r0  Úvar©Zinner_loaderÚkeepdimsZkept_idxZreduced_idxrI  rÊ   r9   rh  ò  s     ÿ
z%_make_reduction_inner.<locals>.loaderr   )rÔ   Ú	dst_dtypeÚ	src_dtyperÒ   rÑ   Úreduction_ranges)rƒ   rn   rC   r_  rŽ   rm   ry   rA   rc   r®   rÅ   Údictr†   rb   )
r>   r^  rc  r\   r½   Z
kept_sizesZreduced_sizesr~   rh  r;  r8   rb  r9   Ú_make_reduction_innerà  s:    



úrh  )r™  c                    s   dd dœ‡ ‡fdd„}|S )NFr[   c                   s@   t | |||ˆ d�}tjf dˆi|—Ž}t|jjtƒr<| ¡  |S )N©r^  rc  r\   r½   r™  )rh  r)   r�   r@   rß   rè   )r>   r^  rc  r\   r“   rT  ©r½   r™  r8   r9   rÜ     s    û ÿzmake_reduction.<locals>.inner)NFr8   )r™  r½   rÜ   r8   rj  r9   Úmake_reduction  s    rk  c                   s¤   |d k	rt | |ƒ} |  ¡ ‰ t| |ƒ}|  ¡ }|tjtjfkrHt | tjƒ} t| ||ƒ}t	‡ fdd„|D ƒƒ}t
 ||  ¡ |  ¡ ¡}t |t| ¡ ƒ¡}t t||ƒ|ƒS )Nc                 3   s   | ]}ˆ | V  qd S rM   r8   r‰   ©rI  r8   r9   rŸ   0  s     zmean.<locals>.<genexpr>)rƒ   rn   r_  rb   rF   Úfloat16Úbfloat16r¸   Úsum_r1   r   r$   r†   r#   r�   rA   rI  )r>   r^  Úkeepdimr\   Zoutput_dtypeÚ
sum_resultÚdenomr8   rl  r9   r�  %  s    

r�  c           
         sÊ   |d krd}|   ¡ ‰ t| |ƒ}t| |dd�}|r8| ¡  tt| |ƒƒ}t|||ƒ}t‡ fdd„|D ƒƒ}|rt|| }t 	||  
¡ |  ¡ ¡}t |t|  ¡ ƒ¡}t||ƒ}	|s°|	S |r¸|nt||ƒ}|	|fS )Nr   T)rp  c                 3   s   | ]}ˆ | V  qd S rM   r8   r‰   rl  r8   r9   rŸ   C  s     z var_mean_sum_.<locals>.<genexpr>)rn   r_  r�  rè   ÚsquarerÀ  ro  r1   r   r$   rb   r†   r#   r�   rA   rI  r  )
r>   r^  Ú
correctionrp  Úreturn_meanZx_meanZdiffsrq  rr  Zx_varr8   rl  r9   Úvar_mean_sum_6  s&    

rv  c                 C   sV   t | |ƒ}t| ||d d d�}|d }t|d ƒ}t|tjƒoTt|ƒtjk oTt|ƒdkS )Nri  rÑ   rf  r   )	r_  rh  r1   r@   rc   r®   r]   r   Zunroll_reductions_threshold)r>   r^  rp  r“   rÑ   Zreduction_numelr8   r8   r9   Úuse_two_step_varianceP  s    
    ÿÿ
ýrw  c                   sØ   ˆ d krd‰ t | ||d d d�}| d¡}| d¡ | d¡ tjjf |fd|  ¡ dœ|—Ž\}}}	| ¡  |  ¡ ‰|  ¡ ‰t| |ƒ}t	‡fdd	„|D ƒƒ‰d
d„ ‰‡ ‡‡‡fdd„}
t
|
ƒ|ƒ}|rÔ| ¡  ||fS |S )Nr   ri  rÒ   rd  re  Zwelford_reduce)Z	inner_fnsr™  r\   c                 3   s   | ]}ˆ | V  qd S rM   r8   r‰   rl  r8   r9   rŸ   v  s     z$var_mean_welford_.<locals>.<genexpr>c                 S   s6   t | tjƒr*|  ¡ s*t t | tj¡|¡S t 	| |¡S rM   )
r@   rc   r·   Zis_constantr2   rƒ   rÌ  rF   rÉ  r"  rò   r8   r8   r9   Úget_constant_or_index_exprx  s    z5var_mean_welford_.<locals>.get_constant_or_index_exprc                    s    ˆˆ ˆƒ}ˆˆˆƒ}| ||  S rM   r8   )rß   rÍ  rÙ  )rt  r\   rx  Úrnumelr8   r9   r¤  }  s    

z#var_mean_welford_.<locals>.scale_fn)rh  r^  r   ZWelfordReductionr�   rb   rè   rn   r_  r1   rÞ   )r>   r^  rt  rp  ru  r“   rh  r�  Úm2rv   r¤  ra  r8   )rt  r\   rx  ry  rI  r9   Úvar_mean_welford_`  s>        ÿ


ýü
r{  )rt  rp  c                C   s2   t | ||d�r t| |||dd�S t| |||dd�S )N©r^  rp  F©r^  rt  rp  ru  ©rw  rv  r{  ©r>   r^  rt  rp  r8   r8   r9   Úvar_Š  s        ÿ    ÿr€  c                C   s2   t | ||d�r t| |||dd�S t| |||dd�S )Nr|  Tr}  r~  r  r8   r8   r9   Úvar_mean–  s        ÿ    ÿr�  c                 C   st   |dk rt t | ¡| |ƒS |dkr0t d|¡S |dkr<| S t | |d |ƒ}t ||¡}|d dkrpt || ¡}|S )Nr   r   r   )Úpow_recursiver2   Ú
reciprocalr"  rÕ   )r>   r3  r\   rT  r8   r8   r9   r‚  ¢  s    r‚  c                 C   s   t  | |¡S rM   )r2   Úpow©r�   r´   r8   r8   r9   Ú
pow_native±  s    r†  )r�   c                    s8  t ˆtƒr$ˆtˆƒkr$tˆ tˆƒƒS t ˆtƒr>ˆdkr>tˆ ƒS t ˆtƒrXˆdkrXtˆ ƒS tdd„ ˆ ˆfD ƒƒ}t|ƒ}t ˆtƒo¢dˆ  k o’dk n  p¢|o¢ˆdk}|rÞˆ  ¡ ‰‡ ‡‡fdd	„}t	j
ˆ  ¡ ˆ  ¡ |ˆ  ¡ d
�S t ˆ tƒ�rˆ dk� rþtˆdƒS ˆ dk�rtˆ ¡ ƒ�rtˆƒS |�r.tˆ ˆƒS tˆ ˆƒS )Nr¸  r   c                 s   s"   | ]}t |tjƒr| ¡ V  qd S rM   )r@   r   r+   rb   r<   r8   r8   r9   rŸ   Ã  s      zpow.<locals>.<genexpr>iàÿÿÿé    r   c                    s   t ˆ| ƒˆˆ  ¡ ƒS rM   )r‚  rb   r  ©r�   r´   rh  r8   r9   rK   Í  s    zpow.<locals>.fnrÓ   r   )r@   r¸   r]   r„  Úsqrtrõ   r»   r   rÅ   r(   r�   r†   rb   rn   r   r#  r   Úexp2Úfallback_powr†  )r�   r´   r\   Zis_integer_powZembed_exponentrK   r8   rˆ  r9   r„  ¹  s8    
"ÿü


r„  c                 C   s®   t | tƒr| j}n| }t |tƒr&|j}t |tjƒsftj|  ¡ |  ¡ | 	¡ |  
¡ d�j}t |tjƒsft‚t |tjƒrœ| ¡ sœt |jtjƒsœ| ¡  |j|_| S tj ||¡ | S r  )r@   r+   rß   r   Z
StorageBoxr(   r�   r†   rb   rÅ   rn   r_   Zis_input_bufferZ	NopKernelrè   r…  Zrealize_into)Úchangedr  Zchanged_datar8   r8   r9   rj  ä  s.    

üÿÿrj  c                 C   s   t | t| |ƒƒS rM   )rj  r#  )r>   r8  r8   r8   r9   Úfill_  s    r�  c                 C   s4   t ||  ¡ ƒ}t||  ¡ ƒ}t||  ¡ ƒ}t| |ƒS rM   )r  r†   rƒ   rb   r²   rn   rj  )Údstrk  r  r8   r8   r9   rˆ    s    rˆ  c                 C   s   t  | |¡S rM   )r2   Úfloordivr…  r8   r8   r9   r�    s    r�  c                 C   s   t  | |¡S rM   )r2   Útruncdivr…  r8   r8   r9   r�    s    r�  c                 C   sŠ   t | ƒot |ƒ}t| ƒot|ƒ}|dkrP|r4tdƒ‚|rBt| |ƒS tt| |ƒƒS |dkr€|rdtdƒ‚|rrt| |ƒS tt| |ƒƒS t| |ƒS )Nr(  z5floordiv operands can not be boolean at the same timer*  z5truncdiv operands can not be boolean at the same time)rg   ri   r_   r�  r(  rI  r�  r*  )r�   r´   Zrounding_modeZboth_integerZboth_booleanr8   r8   r9   Údiv_mode  s    r‘  c                 C   s<   t | ƒot |ƒ}|rt| |ƒS ttjjƒ}t|ƒ| |ƒS d S rM   )ri   Úlogical_andr&   rZ  rÕ   r  rÞ   )r�   r´   Z	both_boolrK   r8   r8   r9   rÕ   )  s
    
rÕ   c                 C   s4   t | ƒpt| ƒ}|rt| |ƒS dd„ }t|ƒ| |ƒS )Nc                  W   s
   t j| Ž S rM   rU  rŠ   r8   r8   r9   rK   <  s    zdiv_prim.<locals>.fn)ri   rg   r�  rÞ   ©r�   r´   Zis_integralrK   r8   r8   r9   Údiv_prim5  s
    
r”  c                 C   s4   t | ƒpt| ƒ}|rdd„ }ndd„ }t|ƒ| |ƒS )Nc                 S   s   t  | |¡S rM   )r2   Úmodr…  r8   r8   r9   rK   O  s    zfmod.<locals>.fnc                 S   s   t  | |¡S rM   )r2   Úfmodr…  r8   r8   r9   rK   T  s    )ri   rg   rÞ   r“  r8   r8   r9   r–  I  s
    
r–  c                 C   s:   |   ¡ }t|ƒst|ƒr&t| t ¡ ƒ} dd„ }t|ƒ| ƒS )Nc                 S   s
   t  | ¡S rM   )r2   Úrsqrtrf   r8   r8   r9   Ú_rsqrt`  s    zrsqrt.<locals>._rsqrt)rb   r   r   rƒ   rF   r1  rÞ   )r>   r\   r˜  r8   r8   r9   r—  Z  s
    r—  c                C   sB   t |  ¡ ƒst|  ¡ ƒr&|d kr&tj}td|d�}|| |||d�S )NrŽ  rô   r[   ©r   rb   r   rF   rÉ  rk  ©r>   r^  rc  r\   rK   r8   r8   r9   ro  f  s    
ÿ
ÿþro  c                C   sB   t |  ¡ ƒst|  ¡ ƒr&|d kr&tj}td|d�}|| |||d�S )Nr’  rô   r[   r™  rš  r8   r8   r9   r’  q  s    
ÿ
ÿþr’  c                 C   s   t | tjƒ} tdƒ| ||d�S )Nr¡   ©r^  rc  )rƒ   rF   rh   rk  ©r>   rq   rp  r8   r8   r9   Ú
reduce_any|  s    r�  c                 C   s2   |d k	r$t | ||d�t| ||d�fS t | d |d�S ©Nr›  )Úreduce_amaxÚreduce_argmaxrœ  r8   r8   r9   Ú
reduce_max‚  s
    þr¡  c                 C   s2   |d k	r$t | ||d�t| ||d�fS t | d |d�S rž  )Úreduce_aminÚreduce_argminrœ  r8   r8   r9   Ú
reduce_min�  s
    þr¤  Úxor_sumre  rf  Úargmaxrô   ÚargminÚ
logical_or)rÚ   rÐ   c                 C   s   t | tjd�S )Nrj   ©r  r   ÚINT_TO_FLOAT©rå   r8   r8   r9   Úregister_pointwise_numeric§  s     ÿr¬  c                 C   s   t | tjdd�S )NT)rk   r  r©  r«  r8   r8   r9   Ú register_pointwise_numeric_ldf64­  s
    ýr­  r	  Úlogical_not)rÐ   )rk   r‘   r½   Úidentityc                    s   t | d d�‡ fdd„ƒ}|S )Nrj   c                     s*   ˆ | |Ž}t || d  ¡ ƒ}t| d |ƒS r‚   )rƒ   rb   rj  )ru   r“   rT  ©Úoutplace_opr8   r9   rK      s    
zregister_inplace.<locals>.fn)r©   )Zaten_opr±  rK   r8   r°  r9   Úregister_inplace  s    
r²  c                 C   s.   t jj ¡ }|d k	st‚| |jjjks*t‚| S rM   )rF   Z_guardsZTracingContextrç  r_   Z	fake_modeZ	shape_envZvar_to_range)r�   rf  re  Ztracing_contextr8   r8   r9   Úsym_constrain_rangeI  s    r³  c                 C   s   |   ¡ | S rM   r  ©r�   rq   r8   r8   r9   Úsym_sizeQ  s    rµ  c                 C   s   |   ¡ | S rM   )r1  r´  r8   r8   r9   Ú
sym_strideV  s    r¶  c                 C   s   |   ¡ S rM   )rƒ  rG  r8   r8   r9   Ú	sym_numel[  s    r·  c                 O   s   t dƒ‚d S )NzHelpful for debuggingr4   )r  ru   r“   r8   r8   r9   Úfoobard  s    r¸  c                 C   s   |   ¡  t| ƒS rM   )rè   rõ   rf   r8   r8   r9   Ú_realizei  s    r¹  c                 C   s   t  tj | ¡¡S rM   )r+   r�   r   ZWait)rë   r8   r8   r9   Úwaitt  s    rº  c                 C   s   t j | ||||¡S rM   )r   Z	AllReducer�   ©rë   Z	reduce_opÚtagÚranksÚ
group_sizer8   r8   r9   Ú	allreducex  s    r¿  c                 C   s   t  tj | |||¡¡S rM   )r+   r�   r   ZAllGatherIntoTensor)Zshardr¼  r½  r¾  r8   r8   r9   Úall_gather_into_tensor|  s    ÿrÀ  c              	   C   s   t  tj | ||||¡¡S rM   )r+   r�   r   ZReduceScatterTensorr»  r8   r8   r9   Úreduce_scatter_tensor‚  s    ÿrÁ  c                 C   s   t j | ||||¡S rM   )r   ZAllReduceCoalescedr�   r»  r8   r8   r9   Úall_reduce_coalescedˆ  s    rÂ  c                 C   s"   t j | |||¡}tttj|ƒƒS rM   )r   ZAllGatherIntoTensorCoalescedr�   rA   Úmapr+   )r  r¼  r½  r¾  rT  r8   r8   r9   Ú all_gather_into_tensor_coalescedŒ  s    rÄ  c                 C   s$   t j | ||||¡}tttj|ƒƒS rM   )r   ZReduceScatterTensorCoalescedr�   rA   rÃ  r+   )r  ZreduceOpr¼  r½  r¾  rT  r8   r8   r9   Úreduce_scatter_tensor_coalesced‘  s        ÿrÅ  zRInductor support for distributed collectives depends on building torch.distributedr­  )Úquantized_lowerings)N)NNNNF)F)F)F)N)N)N)r   r   r>  r   )N)N)N)r   )r   r   r   )r   r   r   )r   r   r   )r   )r   )r   )r   )rÃ   )T)T)NT)F)r   NNr   )NN)F)rÃ   FF)F)F)F)N)r   )N)NN)NNN)NN)r   )Nr¿  )Nr   r   F)NNNN)r8   r   FTN)N)N)NF)N)N)F)N)NF)NF)NF)NF)NF(z  rš   r«   ÚloggingrÂ  r±  Úcollectionsr   Úcollections.abcr   Útypingr   r   r   r   r   rc   rF   Ztorch.fxZtorch.utils._pytreeÚutilsZ_pytreer–  Ztorch._prims_commonr	   r
   r   r   r   r   r   r   r   r   r   Z%torch.fx.experimental.symbolic_shapesr   r   r   Ztorch.utils._sympy.functionsr   r   r   Z_dynamo.utilsr   Ú r   r   r   r    Údecompositionr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   Zvirtualizedr2   r3   Ú	getLoggerr  rÄ  rx   rN   rC   r    rZ  Ztr_c10dr  rD   rœ   r:   r;   rP   rR  rL  r]  ZbmmZconvolutionZconvolution_backwardr  r5  Úmmr¯  Zupsample_bicubic2dZ_int_mmrV  Zint8Zint16rË  rÉ  rm  rú  rÌ   Z	complex32Z	complex64rh   rn  r^   r]   r`   rg   ri   rw   r{   r’   rž   r¦   rº   r©   r¶   r¿   rÞ   rñ   r\   rƒ   Zconvert_element_typerú   rþ   r  r   rÔ   r  Z
device_putr  r  r
  r  r�   ÚaliasÚdetachZdetach_ZliftZview_ofr  rl   r  r  r  r   r!  r%  r&  r(  r)  r*  r²   r1  r4  r<  Z_unsafe_viewZreshaper=  ÚslicerE  rK  rB   rS  rU  r[  rh  ri  rl  rm  rp  rq  rr  ry  r-  r{  r?  r}  rª  r\  Ú	lru_cacher³  rº  r»  rµ  r¶  r·  r¸  rÀ  rÆ  rÊ  ZrngprimsrÕ  r×  rÜ  Z	bernoullirØ  rÝ  rà  rã  rä  rÍ  rè  rê  ré  ÚrandintZforce_stride_orderrï  rÔ  rñ  rö  ró  Zlookup_seedr÷  ÚrandomrZ  rû  rÿ  r  r	  r
  rY  r  ZFALLBACK_ALLOW_LISTZ_adaptive_avg_pool2d_backwardZ
_cudnn_rnnZ_cudnn_rnn_backwardZcumsumZcumprodZ_embedding_bagZ_embedding_bag_forward_onlyZ_flash_attention_forwardZ_flash_attention_backwardZ_fused_moving_avg_obs_fq_helperZ*_fused_moving_avg_obs_fq_helper_functionalZgrid_sampler_2d_backwardZrandpermZ'_scaled_dot_product_efficient_attentionZ0_scaled_dot_product_efficient_attention_backwardZ#_scaled_dot_product_flash_attentionZ,_scaled_dot_product_flash_attention_backwardÚsortZstableZ(_sparse_coo_tensor_with_dims_and_tensorsZ_thnn_fused_lstm_cellZtopkZupsample_bicubic2d_backwardr¾  Zupsample_linear1dZupsample_trilinear3dZupsample_linear1d_backwardZupsample_trilinear3d_backwardZ_adaptive_avg_pool3dZadaptive_max_pool2dZadaptive_max_pool3dZaddbmmZaddmvZ_addmm_activationZ
avg_pool3dZ
block_diagZ_cdist_forwardZcummaxZcumminZdigammaZ_efficientzerotensorZ*_embedding_bag_per_sample_weights_backwardZfractional_max_pool2dZfractional_max_pool3dÚfrexpZgeqrfZhistcZi0ZigammaZigammacÚisinZkthvalueZlinalg_cholesky_exZlinalg_crossZ_linalg_detZlinalg_householder_productZlinalg_inv_exZlinalg_ldl_factor_exZlinalg_ldl_solveZ	linalg_luZlinalg_lu_factor_exZlinalg_lu_solveZlinalg_matrix_expZ	linalg_qrZ_linalg_slogdetZ_linalg_solve_exZlinalg_solve_triangularZ_linalg_svdZlogcumsumexpZ	lu_unpackZmax_pool3d_with_indicesZmax_unpool2dZmax_unpool3dZmedianr“  Z	nanmedianZormqrZ_pdist_forwardZpixel_shuffleZpixel_unshuffleZ	polygammaÚputZreflection_pad1dZreplication_pad1dÚresizeZresize_Z	resize_asZ
resize_as_ZsearchsortedZspecial_airy_aiZspecial_bessel_j0Zspecial_bessel_j1Zspecial_bessel_y0Zspecial_bessel_y1Zspecial_chebyshev_polynomial_tZspecial_chebyshev_polynomial_uZspecial_erfcxZspecial_hermite_polynomial_hZspecial_hermite_polynomial_heZspecial_i0eZ
special_i1Zspecial_i1eZspecial_laguerre_polynomial_lZspecial_modified_bessel_i0Zspecial_modified_bessel_i1Zspecial_modified_bessel_k0Zspecial_modified_bessel_k1Zspecial_ndtriZ!special_scaled_modified_bessel_k0Z!special_scaled_modified_bessel_k1Zspecial_spherical_bessel_j0Zspecial_zetaZtakeZ
_trilinearÚuniformZunsafe_splitZvdotZ_adaptive_avg_pool3d_backwardZadaptive_max_pool2d_backwardZadaptive_max_pool3d_backwardZavg_pool3d_backwardZ_cdist_backwardZ_embedding_bag_dense_backwardZfractional_max_pool2d_backwardZfractional_max_pool3d_backwardZ_linalg_check_errorsZ max_pool3d_with_indices_backwardZ_pdist_backwardZreflection_pad1d_backwardZreplication_pad1d_backwardZsoft_margin_loss_backwardZlinalg_pinvZatol_rtol_tensorZsegment_reducer¨  Z_segment_reduce_backwardZangleZcholesky_inverseZcholesky_solveZ_fft_r2cZ	histogramZbin_ctZ_histogramdd_bin_edgesZ_histogramdd_from_bin_ctsZindex_reduceZmasked_scatterZ	to_sparseZ
_to_sparseZtriangular_solveÚgcdZ_linalg_eighro   r=  Z_primsZ	rng_primsZrun_and_save_rng_stateZrun_with_rng_stateZexponentialrö   rõ   r¿  r  r  r'  r(  rÈ  Zscalar_tensorr2  Z
LongTensorr4  r5  r9  r#  r<  r:  r;  r  Z
empty_likerN  Z
zeros_likerH  rK  rB  rN  rR  rS  rW  r\  rb  rp  rË   rt  rx  rz  r{  r~  ru  ry  r‰  r‡  r�  rŠ  r—  r•  rš  r“  r¸   r©  r¬  r±  r³  rÛ  rã  rð  rò  rû  r·   rô  rõ  rÿ  r   r	  r  r3  r;  rA  rR  rM  rT  rV  r\  r_  rh  rk  r�  rv  rw  r{  ra  r€  r�  r‚  r†  r„  r‹  rj  r�  rˆ  r�  r�  rI  r‘  rÕ   r”  Ztrue_divideZTensorrª  r–  r—  rŽ  ro  r’  r¡   r�  re  r¡  rf  r¤  r¥  r›  rŸ  rœ  r¢  r¦  r   r§  r£  rE   r¬  r­  ÚexprŠ  Úexpm1Zrelur|  r‰  rs  rÀ  ÚcosÚsinrÜ  Zbitwise_andZbitwise_left_shiftZbitwise_notZ
bitwise_orZbitwise_right_shiftZbitwise_xorÚlgammaÚerfZspecial_erfÚlog1pÚtanÚtanhr’  r®  r¨  Úlogical_xorrÇ  rÈ  Z	clamp_minZ	clamp_maxÚnegrƒ  Ú	remainderÚsignZsignbitræ  r!  r   r  r  ÚneÚcoshÚsinhÚacosÚacoshÚasinÚasinhÚatan2ÚatanÚatanhÚcopysignÚerfcZerfinvÚhypotÚlog10Z	nextafterZ_foreach_addZScalarZ_foreach_mulZ_foreach_subZ_foreach_negZ_foreach_powZScalarAndTensorZ_foreach_divZ_foreach_sqrtZ_foreach_maximumZ_foreach_reciprocalZ_foreach_signZ_foreach_copyr²  Zadd_Zbitwise_and_Zbitwise_left_shift_Zbitwise_not_Zbitwise_or_Zbitwise_right_shift_Zbitwise_xor_Zmul_Zdiv_ZTensor_modeZlogical_and_Zlogical_not_Zlogical_or_Zlogical_xor_Zsub_Zrelu_Zsigmoid_Ú__and__Ú
__lshift__Ú__or__Ú
__rshift__Ú__xor__Ú__iand__Ú__ilshift__Ú__ior__Ú__irshift__Ú__ixor__r³  rµ  r¶  r·  rç   ÚmethodÚfuncr¸  Z_inductor_testrè   r¹  Z)torch.distributed._functional_collectivesZc10d_functionalZwait_tensorrº  Z
all_reducer¿  rÀ  rÁ  rÂ  rÄ  rÅ  ÚImportErrorrá  r®  rÆ  Zregister_quantized_opsr8   r8   r8   r9   Ú<module>   sh  44
	ôÿó	"4ü
"    ú
8M
÷
-ý















/
:,
	


		  Y
%
&
	
	










 ÿ    ÿûû.ÿ

















I
8





ù





   ÿ
   ÿ%-	

	]øø&"eÿ ÿ&"  ÿ ÿ  ûû
 ûûl

T6( &      ÿPÿ 
C      ÿ0    ù]	ø (2
*
*
ýü









ÿ
ÿ  ÿ
 ÿ
 ÿþü
ü
ü
ü







ÿ

