U
    ªÊ¹j£© ã                   @   s|#  d dl 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
mZ d dl	mZmZmZ d dlmZmZmZmZ d dlmZ d dlmZmZ d dl
mZmZmZmZmZmZm Z  d d	l!m"Z"m#Z#m$Z$m%Z% d d
l&m'Z'm(Z( d dl)m*Z*m+Z+ d dl,m-Z- e	j.j/Z/e	j0 1ddd¡Z2dd„ Z3dd„ Z4dd„ Z5e3e/j6j7e/j6j8gƒe%ƒ dd„ ƒƒZ9e3e/j:j7e/j:j8gƒe%ƒ ddœdd„ƒƒZ:e3e/j;ƒe%ƒ dd„ ƒƒZ;e3e/j<j7e/j<j8e/j=j7e/j=j8gƒe%ddƒd d!„ ƒƒZ>e3e/j?j7e/j?j8gƒe%ƒ d"d#„ ƒƒZ?d$d%„ Z@e3e/jAj7e/jAj8gƒe%ƒ d&d'„ ƒƒZBe3e/jCj7e/jCj8gƒe%ƒ d(d)„ ƒƒZDe3e/jEjFƒdd*œd+d,„ƒZGe3e/jEj7ƒe	jHdddd-œd.d/„ƒZIe3e/jJj7ƒe	jHdddd-œd0d1„ƒZKe3e/jJjLƒe	jHdddd-œd2d3„ƒZMe3e/jNj7ƒddddd-œd4d5„ƒZOe3e/jPj7e/jPj8gƒe%ƒ d6d7„ ƒƒZQe3e/jRj7ƒ�dpd9d:„ƒZSd;d<„ ZTe3e/jUj7ƒd=d>„ ƒZVe3e/jWj7ƒd?d@œeeXee	jeYeZedAœdBdC„ƒZ[e3e/j\j7ƒd?d@œeeXee	jeYeZedAœdDdE„ƒZ]e3e/j^j7ƒdFdG„ ƒZ_e3e/j^j8ƒdHdI„ ƒZ`e3e/jaj7e/jajbgƒe%ƒ dJdK„ ƒƒZce3e/jajdƒ�dqdLdM„ƒZee3e/jfj7e/jfjbgƒe%ƒ dNdO„ ƒƒZge3e/jfjdƒ�drdPdQ„ƒZhe3e/jij7ƒdRdS„ ƒZje3e/jij8ƒdTdU„ ƒZke3e/jlj7ƒdVdW„ ƒZme3e/jljnƒdXdY„ ƒZoe3e/jpj7ƒddddddZœd[d\„ƒZqe3e/jrj7ƒ�dsd]d^„ƒZre3e/jsj7ƒ�dtd_d`„ƒZte3e/juj7ƒ�dudadb„ƒZue3e/jvj7ƒdcdd„ ƒZwe3e/jxjnƒdedf„ ƒZyeeYdgœdhdi„ZzeeeYdjœdkdl„Z{�dveeYeZdmœdndo„Z|�dweeYeYdqœdrds„Z}eeeZeYdtœdudv„Z~�dxeYeeeYdxœdydz„ZeYd{œd|d}„Z€e3e/j�j7e/j�j‚gƒe%d~dƒ�dyeeYeZd�œd‚dƒ„ƒƒZƒeed„œd…d†„Z„e3e/j…ƒe%ƒ eeeZed‡œdˆd‰„ƒƒZ…e3e/j†ƒe%ƒ �dzeeeZed‡œdŠd‹„ƒƒZ†e3e/j‡ƒe%ƒ �d{eeZedŒœd�dŽ„ƒƒZ‡e3e/jˆƒe%ƒ �d|eeZedŒœd�d�„ƒƒZˆe3e/j‰j7ƒ�d}eeZeZd‘œd’d“„ƒZ‰e3e/jŠj7e/jŠj8gƒe%ƒ eeed”œd•d–„ƒƒZŠe3e/j‹j7ƒ�d~eeZd—œd˜d™„ƒZŒe3e/j�j7e/j�j8gƒe%dšd›dœƒd8d8d�œeeZeZeeeef džœdŸd „ƒƒZŽe3e/j�j7e/j�j8gƒe%ƒ d8d¡œeeeeZed¢œd£d¤„ƒƒZ�e3e/j‘j7e/j‘j8gƒe%d¥d€d¦ƒd?d§œeeZeeeef d¨œd©dª„ƒƒZ’e3e/j“j7e/j“j8gƒe%d«d›dœƒd?d8d¬œeeZeZeeeef d­œd®d¯„ƒƒZ”e3e/j•j7e/j•j8gƒe%ƒ d?d8d°œeeeeZeZed±œd²d³„ƒƒZ–e3e/j—ƒe%d¥d€d¦ƒ�deeeZeZeeeef d´œdµd¶„ƒƒZ˜eYeeZeZf d·œd¸d¹„Z™e3e/jšj7e/jšj8gƒe%dºd»ƒ�d€eeYeeef d½œd¾d¿„ƒƒZ›e3e/jœj7e/jœj�gƒe%dÀdÁd«d›ƒeeeeeef dÂœdÃdÄ„ƒƒZœe3e/jžj7ƒ�d�eeZeZeeY dÅœdÆdÇ„ƒZŸeeeeeX eeX f dÈœdÉdÊ„Z eeeeY eeef dËœdÌdÍ„Z¡eeeZdÎœdÏdÐ„Z¢e3e/j£ƒd?d8dddddÑœeeeZeZee ee ee ee eeeeef dÒœ	dÓdÔ„ƒZ£e3e/j¤j7e/j¤j8gƒd?d8ddÕœeeeZeZeZee edÖœd×dØ„ƒZ¥e3e/j¦ƒe%dÙdÚƒ�d‚eeeZeZeZeeef dÛœdÜdÝ„ƒƒZ§e3e/j¨j7ƒdÞdß„ ƒZ©e3e/jªƒe%ƒ �dƒeeeeZeZedàœdádâ„ƒƒZªdãdä„ Z«dådæ„ Z¬e3e/j­ƒe%ƒ dçdè„ ƒƒZ®e3e/j¯ƒe%ƒ dédê„ ƒƒZ°dëdì„ Z±e3e/j²ƒe%ƒ dídî„ ƒƒZ³e3e/j´ƒe%ƒ dïdð„ ƒƒZµdñdò„ Z¶e3e/j·ƒe%ƒ dódô„ ƒƒZ¸e3e/j¹ƒe%ƒ dõdö„ ƒƒZºe3e/j»j7e/j»j¼e/j½j7e/j½j¼gƒe%ƒ d÷dø„ ƒƒZ¾dùdú„ Z¿e3e/jÀƒe%ƒ dûdü„ ƒƒZÁe3e/jÂƒe%ƒ dýdþ„ ƒƒZÃe3e/jÄj7e/jÄj¼e/jÅj7e/jÅj¼gƒe%ƒ dÿ�d „ ƒƒZÆe3e/jÇƒe%ƒ �d„eeÈe�dœ�d�d„ƒƒZÉe3e/jÊƒe%ƒ eeeÈee�dœ�d�d„ƒƒZËe3e/jÌj7e/jÌj8gƒe%ƒ �d�d�d	œ�d
�d„ƒƒZÍe3e/jÎj7e/jÎj8gƒe%ƒ dd*œ�d�d„ƒƒZÏe3e/jÐjÈƒ�d…�d�d„ƒZÑe3e/jÎjÒƒ�d†�d�d„ƒZÓe3e/jÔj7ƒ�d‡�d�d„ƒZÕ�d�d„ ZÖe3e/j×j7ƒ�d�d„ ƒZØe3e/jÙj7gƒ�d�d„ ƒZÚ�d�d„ ZÛ�d�dœ�d�d „ZÜ�dˆe	je	jeeeX eXf eeeX eXf eeeX eXf eZeXeeeeX eXf  �d!œ�d"�d#„ZÝ�d$�d%„ ZÞe3e/jßj7ƒe	je	je	jeeX eeX eeX eZeeX eX�d&œ	�d'�d(„ƒZàe	jájâ�rŒe	j0 1�d)dd¡Zãe3e	j.jäjåj7ƒ�d*�d+„ ƒZæe3e	j.jäjçj7ƒ�d,�d-„ ƒZèe	jájé�rBe	j0 1�d.dd¡Zêe3e	j.jëjìƒ�d/�d0„ ƒZíe	j0 1�d1dd¡Zîe3e	j.jïjðj7ƒ�d2�d3„ ƒZñe3e	j.jïjòj7ƒ�d4�d5„ ƒZó�d6�d7„ Zôe3e/jõj7ƒ�d‰�d:�d;„ƒZö�d<�d=„ Z÷e3e/jøj7ƒ�d>�d?„ ƒZùe3e/júƒe%ƒ �dŠ�d@�dA„ƒƒZûe3e/jüƒe%ƒ �dB�dC„ ƒƒZýe3e/jþj7ƒ�dD�dE„ ƒZÿe3e/�j j7ƒ�dF�dG„ ƒ�Ze3e/�jj7ƒ�dH�dI„ ƒ�Ze3e/�jƒe%ƒ �dJ�dK„ ƒƒ�ZeeY�dLœ�dM�dN„�Ze3e/�jƒe%�dOdƒ�dP�dQ„ ƒƒ�Ze3e/�j	ƒe%ƒ �dR�dS„ ƒƒ�Z
e3e/�jƒe%�dOdƒ�dT�dU„ ƒƒ�Ze3e/�jƒe%ƒ �dV�dW„ ƒƒ�Ze3e/�jjƒ�d‹�dX�dY„ƒ�Ze3e/�jj7e/�jj8gƒe%ƒ �dZ�d[„ ƒƒ�Ze3e/�j�jƒ�d\�d]„ ƒ�Ze3e/�jj7ƒ�d^�d_„ ƒ�Ze3e/�jj7e/�jj8gƒd�d`œeXeX�daœ�db�dc„ƒ�Ze3e/�jje/�jjgƒ�dd�de„ ƒ�Ze3e/�jj7gƒ�df�dg„ ƒ�Ze3e/�jj7e/�jj8gƒe%ƒ �d�d�d	œ�dh�di„ƒƒ�Ze3e/�jj7e/�j j7e/�j!j7e/�j"j7gƒ�dj�dk„ ƒ�Z#e3e/�j$j7e/�j%j7e/�j&j7e/�j'j7gƒ�dl�dm„ ƒ�Z(�dn�do„ �Z)e3e/�j*je/�j+je/�j,je/�j-je/�j.je/�j/jgƒ�dŒ�dp�dq„ƒ�Z0e3e/�j1je/�j2je/�j3je/�j4je/�j5je/�j6jgƒ�d��dr�ds„ƒ�Z7e3e/�j1�j8e/�j3�j8e/�j2�j8e/�j4�j8gƒ�dŽ�dt�du„ƒ�Z9e3e/�j*�j8e/�j-�j8e/�j,�j8e/�j+�j8gƒ�d��dv�dw„ƒ�Z:e3e/�j;�j8e/�j<�j8gƒ�d��dx�dy„ƒ�Z=e3e/�j>�j8gƒ�d‘�dz�d{„ƒ�Z?e3e/�j@�j8e/�jA�j8gƒ�d’�d|�d}„ƒ�ZBe3e/�jC�jDgƒ�d~�d„ ƒ�ZEe3e/�j;je/�j<jgƒ�d€�d�„ ƒ�ZFe3e/�jGgƒ�d“�d‚�dƒ„ƒ�ZHe3e/�jIj7gƒdd�d„œ�d…�d†„ƒ�ZJe3e/�jKj7gƒdd�d„œ�d‡�dˆ„ƒ�ZLe3e/�jMgƒe%ƒ �d‰�dŠ„ ƒƒ�ZNe3e/�jOj7ƒ�d‹�dŒ„ ƒ�ZPe3e/�jQƒe%ƒ �d��dŽ„ ƒƒ�ZRe3e/�jSj7ƒ�d”�d��d�„ƒ�ZTe3e/�jUj7ƒ�d‘�d’„ ƒ�ZV�d•�d“�d”„�ZWe3e/�jXj7e/�jXj8gƒe%ƒ �d–d�d•œ�d–�d—„ƒƒ�ZYe3e/�jZj7e/�j[j7gƒ�d˜�d™„ ƒ�Z\e3e/�jZjde/�jZ�j]e/�j[jde/�j[�j]e/�j^j7e/�j^�j_gƒe%ddƒ�d—�dš�d›„ƒƒ�Z`e3e/�jaj7ƒ�dœ�d�„ ƒ�Zbe3e/�jcj7ƒ�dž�dŸ„ ƒ�Zde3e/�jej7ƒ�d �d¡„ ƒ�Zfe3e/�jg�j8e/�jh�j8e/�jgje/�jhje/�jij7e/�jjj7e/�jkj7gƒ�d¢�d£„ ƒ�Zle3e/�jm�j8e/�jn�j8e/�jmje/�jnjgƒ�d˜�d¤�d¥„ƒ�Zoe3e/�jpj7e/�jp�jqgƒ�d¦�d§„ ƒ�Zr�d¨�d©„ �Zse3e/�jtje/�jt�j8gƒ�dª�d«„ ƒ�Zue3e/�jvje/�jv�j8gƒ�d¬�d­„ ƒ�Zwe3e/�jxj7ƒ�d®�d¯„ ƒ�Zye3e/�jzje/�jz�j8gƒ�d°�d±„ ƒ�Z{e3e/�j|je/�j|�j8gƒ�d²�d³„ ƒ�Z}e3e/�j~j7ƒ�d´�dµ„ ƒ�Ze3e/�j€j7e/�j�j7gƒ�d™�d¶�d·„ƒ�Z‚e3e/�jƒ�j8ƒ�d¸�d¹„ ƒ�Z„e3e/�j…j7ƒ�dš�dº�d»„ƒ�Z†e3e/�j‡j7ƒ�d¼�d½„ ƒ�Zˆ�d›�d¾�d¿„�Z‰e3e/�jŠj7ƒ�dÀ�dÁ„ ƒ�Z‹�dÂ�dÃ„ �ZŒ�dÄ�dÅ„ �Z��dÆ�dÇ„ �ZŽ�dÈ�dÉ„ �Z��dœeeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeYeZ�dÊœ�dË�dÌ„�Z��dÍ�dÎ„ �Z‘eeeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeY�dÏœ�dÐ�dÑ„�Z’�dÒ�dÓ„ �Z“e3e/�j”j7ƒ�dÔ�dÕ„ ƒ�Z•e3e/�j–j7ƒ�d��d×�dØ„ƒ�Z—e3e/�j˜ƒe%ƒ �dÙ�dÚ„ ƒƒ�Z™�dÛ�dÜ„ �Zše3e/�j›ƒe%ƒ �dÝ�dÞ„ ƒƒ�Zœe3e/�j�ƒe%�dOdƒ�dž�dß�dà„ƒƒ�Zže3e/�jŸƒe%ƒ �dá�dâ„ ƒƒ�Z ee�dãœ�dä�då„�Z¡G �dæ�dç„ �dçeƒ�Z¢eeeX�dèœ�dé�dê„�Z£e3e/�j¤j7ƒ�dë�dì„ ƒ�Z¥e3e/�j¦ƒe%ƒ �dí�dî„ ƒƒ�Z¦e3e/�j§ƒe%�dï�dðƒ�dñ�dò„ ƒƒ�Z§e3e/�j¨j7gƒ�dó�dô„ ƒ�Z¨e3e/�j©j7ƒ�dŸ�dõ�dö„ƒ�Z©e3e/�jªjXƒ�d÷�dø„ ƒ�Z«e3e/�j¬j7ƒ�dù�dú„ ƒ�Z­e3e/�j®j7ƒ�d �dû�dü„ƒ�Z¯�d¡eXeXeZ�dýœ�dþ�dÿ„�Z°�d �d„ �Z±�d�d„ �Z²e3e/�j³j7ƒ�d¢�d�d„ƒ�Z´�d£�d�d„�Zµ�d¤�d�d	„�Z¶�d
�d„ �Z·�d¥�d�d„�Z¸�d¦�d�d„�Z¹e3e/�jºj7ƒ�d�d„ ƒ�Z»e3e/�j¼ƒ�d�d„ ƒ�Z½e3e/�j¾�j¿e/�j¾�jÀe/�j¾�jÁe/�j¾�jÂgƒe%ƒ �d§�d�d„ƒƒ�ZÃe3e/�jÄ�j¿e/�jÄ�jÀe/�jÄ�jÁe/�jÄ�jÂgƒ�d¨�d�d„ƒ�ZÅe3e/�jÆgƒ�d©eeeeÈeZeZeeÈ �dœ�d�d„ƒ�ZÇe3e/�jÈgƒ�dªeeeeeeeeeXeXeÈeZeeeeÈ �dœ�d�d„ƒ�ZÉe3e/�jÊgƒ�d«eeeee eZeZeeÈ �dœ�d �d!„ƒ�ZËe3e/�jÌgƒ�d¬eeeeee eeeeeÈeeZ eZeeÈ �d"œ�d#�d$„ƒ�ZÍe3e/�jÎ�jÏe/�jÎ�jÐgƒe%ƒ �d­�d%�d&„ƒƒ�ZÑe3e/�jÒ�jÏƒ�d®�d'�d(„ƒ�ZÓe3e/�jÔj7e/�jÔj8gƒe%ƒ �d¯dd*œ�d)�d*„ƒƒ�ZÕ�d+�d,„ �ZÖ�d-�d.„ �Z×e3e/�jØj7ƒ�d°�d/�d0„ƒ�ZØe3e/�jÙj7ƒ�d±�d1�d2„ƒ�ZÙe3e/�jÚj7ƒ�d²eeeeXe	�jÛ�jÜf  eeeXe	�jÛ�jÜf  eeÈ eeÈ �d3œ�d4�d5„ƒ�ZÚe3e/�jÝj7ƒ�d³�d6�d7„ƒ�ZÝe3e/�jÞj7e/�jÞ�jße/�jÞ�j_e/�jÞ�jàgƒ�d´�d8�d9„ƒ�Záe3e/�jâ�jßƒdd8�d:œ�d;�d<„ƒ�Zã�d=�d>„ �Zäe3e/�jåj7ƒ�dµ�d?�d@„ƒ�Zæe3e/�jçj7ƒ�dA�dB„ ƒ�Zçe3e/�jèj7ƒ�dC�dD„ ƒ�Zè�dE�dF„ �Zé�dG�dH„ �Zêe3e/�jëj7e/�jìj7gƒ�d¶�dI�dJ„ƒ�Zíe3e/�jîj7ƒ�d·�dK�dL„ƒ�Zîe3e/�jïj7ƒ�d¸�dM�dN„ƒ�Zðe	�jñ�Zò�dO�dP„ �Zóe3e/�jôj7ƒ�dQ�dR„ ƒ�Zôe3e/�jõj7ƒ�dS�dT„ ƒ�Zöe3e/�j÷j7ƒ�dU�dV„ ƒ�Z÷e3e/�jøje/�jø�jùgƒe%ƒ d8d8�dWœ�dX�dY„ƒƒ�Zúe3e/�jûj7ƒ�d¹�dZ�d[„ƒ�Züe3e/�jýj7ƒ�d\�d]„ ƒ�Zýe3e/�jþj7e/�jþj8gƒe%ƒ �dº�d^�d_„ƒƒ�Zþe3e	j.j/�jÿƒ�d`�da„ ƒ�Zÿe3e	j.j/�j ƒ�db�dc„ ƒ�Z e3e/�jƒe%ƒ d8d8dd�ddœ�de�df„ƒƒ�Ze3e/�jƒe%ƒ eXee�dgœ�dh�di„ƒƒ�Z�dj�dk„ �Z�dl�dm„ �Z�ee/�jƒ �ee/�jƒ �ee/�j	ƒ �ee/�j
ƒ �ee/�jƒ �ee/�jƒ �ee/�jƒ �ee/�jƒ �ee/�jƒ �ee/�jj7e/�jj8e/�j�jgƒ �ee/�jj7e/�jj8e/�j�jgƒ �ee/�jj7e/�jj8e/�j�jgƒ �ee/�jj7e/�jj8e/�j�jgƒ �ee/�jj7e/�jj8e/�j�jgƒ d dl&Z	d d�lZ	d d�lZ	�dn�do„ �Z�eƒ  dS (»  é    N)ÚEnum)ÚListÚOptionalÚSequenceÚTupleÚUnion)ÚSymBoolÚSymFloatÚTensor)Ú_add_op_to_registryÚ_convert_out_paramsÚglobal_decomposition_tableÚ
meta_table)Ú
OpOverload)Ú_elementwise_metaÚ$ELEMENTWISE_PRIM_TYPE_PROMOTION_KIND)Úcorresponding_complex_dtypeÚcorresponding_real_dtypeÚelementwise_dtypesÚELEMENTWISE_TYPE_PROMOTION_KINDÚIntLikeÚmake_contiguous_strides_forÚ
TensorLike)Ú_maybe_resize_outÚ_resize_output_checkÚ_safe_copy_outÚout_wrapper)Ú_broadcast_shapesÚ_maybe_broadcast)Ú_constrain_range_for_sizeÚconstrain_range)Útree_mapÚatenZIMPLÚMetac                    s   ‡ fdd„}|S )Nc                    s"   t ˆ ƒ‰ ‡ fdd„}t|ˆƒ ˆ S )Nc                    s   t t| ˆ ƒ d S ©N)r   r   ©Úop©Úfn© úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_meta_registrations.pyÚregister1   s    z0register_meta.<locals>.wrapper.<locals>.register)r   r!   )r(   r+   r%   r'   r*   Úwrapper.   s    
zregister_meta.<locals>.wrapperr)   )r&   r,   r)   r%   r*   Úregister_meta-   s    	r-   c                 C   s(   t jt jt jt jt jt ji}| | | ¡S r$   )ÚtorchZ	complex32ÚhalfÚcfloatÚfloatÚcdoubleÚdoubleÚget)ÚdtypeZfrom_complexr)   r)   r*   ÚtoRealValueType:   s       ýr6   c                    s0   t tˆf|žŽ ƒ‰ t ˆ ˆk‡ ‡fdd„¡ d S )Nc                      s   dˆ› dˆ › �S )Nzoutput with shape z# doesn't match the broadcast shape r)   r)   ©Zbroadcasted_shapeÚ
self_shaper)   r*   Ú<lambda>G   ó    z)check_inplace_broadcast.<locals>.<lambda>)Útupler   r.   Ú_check)r8   Z
args_shaper)   r7   r*   Úcheck_inplace_broadcastC   s
    þr=   c                    sN   t  ˆ jt jk‡ fdd„¡ t  |  ¡ dko6ˆ  ¡ dk dd„ ¡ |  ˆ j¡S )Nc                      s   dˆ j › �S )Nz2take(): Expected a long tensor for index, but got ©r5   r)   ©Úindexr)   r*   r9   Q   r:   zmeta_take.<locals>.<lambda>r   c                   S   s   dS )Nz*take(): tried to take from an empty tensorr)   r)   r)   r)   r*   r9   V   r:   )r.   r<   r5   ÚlongÚ_check_indexÚnumelÚ	new_emptyÚshape)Úselfr@   r)   r?   r*   Ú	meta_takeK   s    

þþrG   éÿÿÿÿ©Údimc                   sh   ˆj }ˆj }t ||kdd„ ¡ t ˆ ˆ ¡dko>ˆ ˆ ¡dk‡ ‡‡fdd„¡ tˆjˆjƒ}ˆ |¡S )Nc                   S   s   dS )Nz=linalg.cross: inputs must have the same number of dimensions.r)   r)   r)   r)   r*   r9   b   r:   zlinalg_cross.<locals>.<lambda>é   c                      s"   dˆ › dˆ  ˆ ¡› dˆ  ˆ ¡› �S )Nzlinalg.cross: inputs dimension z must have length 3. Got ú and ©Úsizer)   ©rJ   ÚotherrF   r)   r*   r9   f   s    )Úndimr.   r<   rN   r   rE   rD   )rF   rP   rJ   Zx_dZy_dÚ	out_shaper)   rO   r*   Úlinalg_cross[   s    þþrS   c                 C   s   t | dƒ t| dƒ t | ¡S )Nzlinalg.matrix_expZ
matrix_exp)ÚsquareCheckInputsÚcheckFloatingOrComplexr.   Ú
empty_like©rF   r)   r)   r*   Úlinalg_matrix_expo   s    

rX   ÚvaluesÚindicesc                 C   sV   t j| j| j| jd�}t j| j| jt jd�}|  ¡ dkrN| jdkrNt|| jƒ ||fS )N©Údevicer5   r   )	r.   ÚemptyrE   r\   r5   Úint64rC   rQ   Úmaybe_wrap_dim)rF   rJ   rY   rZ   r)   r)   r*   Ú	cummaxminw   s
    r`   c                 C   s   t || jƒ t | ¡ ¡ S r$   )r_   rQ   r.   rV   Ú
contiguous)rF   rJ   r)   r)   r*   Úlogcumsumexp„   s    rb   c                    sÎ  |j }t|ƒ}|| }tt|ƒƒ}dd„ t|ƒD ƒ}	|D ]}
d|	|
< q8g g  }}|D ]"}
|	|
 sl| |
¡ qT| |
¡ qT|| }t|ƒ}| ¡ ‰ |d |… }|j‡ fdd„dd� |||d …  }| |¡}dgt|j|d … ƒ }| 	|¡}| 
d¡}||d< |}tt|ƒƒD ]}|||  ||d	 < �q|  	|¡} d
d„ t|ƒD ƒ}d	}|d	 }|dk�r�||  d¡ ||| < ||||  9 }|d	8 }�qTt||ƒD ] }|  d	||  ¡||| < �qš|  |||  ¡ ¡S )Nc                 S   s   g | ]}d ‘qS )Fr)   ©Ú.0Ú_r)   r)   r*   Ú
<listcomp>•   s     z_exec_fft.<locals>.<listcomp>Tc                    s   ˆ |  S r$   r)   ©Úx©Zself_stridesr)   r*   r9   ¥   r:   z_exec_fft.<locals>.<lambda>©ÚkeyÚreverserH   r   é   c                 S   s   g | ]}d ‘qS ©r   r)   rc   r)   r)   r*   rf   µ   s     )rQ   ÚlenÚlistÚrangeÚappendÚstrideÚsortÚpermuterE   ÚreshaperN   Ú
as_stridedÚstorage_offset)ÚoutrF   Ú	out_sizesrJ   ÚforwardrQ   Zsignal_ndimÚ
batch_dimsZdim_permuteZis_transformed_dimÚdÚleftÚrightZ	batch_endÚtmpÚinputZbatched_sizesÚ
batch_sizeZbatched_out_sizesÚiZout_stridesZbatch_numelr)   ri   r*   Ú	_exec_fft�   sJ    






r„   c                    sb   | j jst‚| j}|  |¡}|s$|S |d d … }|  ¡ ‰ |j‡ fdd„dd� t|| |||ƒ}|S )Nc                    s   ˆ |  S r$   r)   rg   ri   r)   r*   r9   Ð   r:   zmeta_fft_c2c.<locals>.<lambda>Trj   )r5   Ú
is_complexÚAssertionErrorrE   rD   rs   rt   r„   )rF   rJ   Únormalizationr{   rz   ÚoutputZsorted_dimsr)   ri   r*   Úmeta_fft_c2cÃ   s    
r‰   c                 C   sR   | j jst‚t|  ¡ ƒ}|r<|d }|| d d }|||< | j|t | j ¡d�S )NrH   é   rm   r>   )r5   Úis_floating_pointr†   rp   rN   rD   Úutilsr   )rF   rJ   r‡   ZonesidedÚoutput_sizesZlast_dimZlast_dim_halfsizer)   r)   r*   Úmeta_fft_r2cÖ   s     
ÿrŽ   )Ú	generatorc                C   s    |j dkr| d¡| kst‚|S ©Nrm   r   )rQ   rN   r†   )Únr�   ry   r)   r)   r*   Úmeta_randpermæ   s    r’   ©r5   Úlayoutr\   Ú
pin_memoryc                C   s   t j| ||||d�S ©Nr“   ©r.   r]   )r‘   r5   r”   r\   r•   r)   r)   r*   Úmeta_randperm_defaultì   s        ÿr˜   c                C   s   t j|||||d�S r–   r—   )ÚhighrN   r5   r”   r\   r•   r)   r)   r*   Úmeta_randintõ   s        ÿrš   c                C   s   t j|||||d�S r–   r—   )Úlowr™   rN   r5   r”   r\   r•   r)   r)   r*   Úmeta_randint_lowþ   s        ÿrœ   c                C   s   t j| ||||d�S r–   r—   )rN   r5   r”   r\   r•   r)   r)   r*   Úmeta_rand_default  s        ÿr�   c                 C   s8   | j jst‚t|  ¡ ƒ}|||d < | j|t| j ƒd�S )NrH   r>   )r5   r…   r†   rp   rN   rD   r6   )rF   rJ   r‡   Zlastdimr�   r)   r)   r*   Úmeta_fft_c2r  s    rž   Fc                 C   s2   |  | |¡}|  ¡ | ¡ kr.tj ||  ¡ ¡ | S r$   )ÚtorN   r"   Zexpand_copyÚdefault)rF   ÚsrcÚnon_blockingZintermediater)   r)   r*   Ú
meta_copy_  s    r£   c                 C   sX   t |  ¡ ƒ}t |  ¡ ƒ}||  ¡ kr(dn|| ||  }| |d¡ | ||¡ ||fS ©Nrm   )rp   rN   rs   rJ   Úinsert)ÚtensorrJ   Zresult_sizesZresult_stridesÚ
new_strider)   r)   r*   ÚinferUnsqueezeGeometry*  s     r¨   c                 C   s0   t ||  ¡ d ƒ}t| |ƒ\}}|  ||¡ | S r¤   )r_   rJ   r¨   Úas_strided_)rF   rJ   Zg_sizesZ	g_stridesr)   r)   r*   Úmeta_unsqueeze_3  s    rª   T)Úinclude_self)rF   rJ   r@   ÚsourceÚreducer«   Úreturnc                C   s   t j| t jd�S )N©Úmemory_format)r.   rV   Úcontiguous_format©rF   rJ   r@   r¬   r­   r«   r)   r)   r*   Úmeta_index_reduce;  s    
r³   c                C   s   | S r$   r)   r²   r)   r)   r*   Úmeta_index_reduce_H  s    
r´   c                 C   s.   t |  ¡ ƒ}|  ¡ dkr$| ¡ ||< |  |¡S )Nr   )rp   rN   rJ   rC   rD   )rF   rJ   r@   Úresult_sizer)   r)   r*   Úmeta_index_selectV  s    r¶   c                 C   s(   t  ||  ¡ | j¡ | t  | ||¡¡S r$   )r.   Ú_resize_output_rN   r\   Úcopy_Úindex_select)rF   rJ   r@   ry   r)   r)   r*   Úmeta_index_select_out^  s    rº   c                 C   s
   |   d¡S ©Nr)   ©rD   rW   r)   r)   r*   Úmeta_maxd  s    r½   c                 C   s6   t  | j|f¡}t| ||ƒ}|  |¡| j|tjd�fS ©Nr>   ©rŒ   Úreduction_dimsrE   Ú_compute_reduction_shaperD   r.   rA   ©rF   rJ   ÚkeepdimÚoutput_shaper)   r)   r*   Úmeta_max_dimj  s
    þrÅ   c                 C   s
   |   d¡S r»   r¼   rW   r)   r)   r*   Úmeta_mint  s    rÆ   c                 C   s6   t  | j|f¡}t| ||ƒ}|  |¡| j|tjd�fS r¾   r¿   rÂ   r)   r)   r*   Úmeta_min_dimz  s
    þrÇ   c                 C   s4   |   ¡ rt| jƒ}nt| tjd�\}}tj| |d�S )N©Ztype_promotion_kindr>   )r…   r   r5   r   r   ÚINT_TO_FLOATr.   rV   )rF   Úresult_dtypere   r)   r)   r*   Ú
meta_angle„  s    þ
rË   c                 C   s$   t  ||  ¡ | j¡ | t  | ¡¡S r$   )r.   r·   rN   r\   r¸   Úangle)rF   ry   r)   r)   r*   Úmeta_angle_out�  s    rÍ   c                 C   s   d S r$   r)   )Úvalr)   r)   r*   Úassert_async–  s    rÏ   c                 C   s   d S r$   r)   )rÎ   Ú
assert_msgr)   r)   r*   Úassert_async_meta›  s    rÑ   ©r5   r”   r\   r•   r°   c                 C   s   t jg dd�S )NÚmeta©r\   r—   rÒ   r)   r)   r*   Úmake_dep_token   s    	rÕ   c                 C   s(   t | ttfƒrtdƒ‚t| ||d� d S ©Nz'Constraining SymFloat or Symbool is nyi©ÚminÚmax)Ú
isinstancer	   r   Ú
ValueErrorr    ©rN   rØ   rÙ   r)   r)   r*   Úsym_constrain_range¬  s    rÝ   c                 C   s   t j| ||d� |S ©Nr×   )r"   rÝ   ©rN   rØ   rÙ   Ú	dep_tokenr)   r)   r*   Úfunctional_sym_constrain_range³  s    rá   c                 C   s(   t | ttfƒrtdƒ‚t| ||d� d S rÖ   )rÚ   r	   r   rÛ   r   rÜ   r)   r)   r*   Úsym_constrain_range_for_size¹  s    râ   c                 C   s   t j| ||d� |S rÞ   )r"   râ   rß   r)   r)   r*   Ú'functional_sym_constrain_range_for_sizeÀ  s    rã   c                 C   s   |S r$   r)   )rÎ   rÐ   rà   r)   r)   r*   Úfunctional_assert_async_metaÆ  s    rä   ©rF   Úf_namec                 C   sX   |   ¡ dkst|› d�ƒ‚|  d¡|  d¡ksTt|› d|  d¡› d|  d¡› d�ƒ‚d S )NrŠ   z3: The input tensor must have at least 2 dimensions.rH   éþÿÿÿz5: A must be batches of square matrices, but they are ú by ú	 matrices)rJ   r†   rN   rå   r)   r)   r*   rT   Ì  s    
ÿþÿ þrT   ©rF   ÚAÚnamec                    sŒ   t  ˆjˆ jk‡ ‡fdd„¡ t  ˆjˆ jk‡ ‡fdd„¡ t  ˆ  d¡ˆ  d¡k‡ fdd„¡ t  ˆ  d¡ˆ d¡k‡ ‡‡fdd„¡ d S )Nc                      s   dˆj › dˆ j › d�S )Nz:Expected b and A to be on the same device, but found b on z
 and A on ú	 instead.rÔ   r)   ©rë   rF   r)   r*   r9   ß  s    z(linearSolveCheckInputs.<locals>.<lambda>c                      s   dˆj › dˆ j › d�S )Nz=Expected b and A to have the same dtype, but found b of type z and A of type rí   r>   r)   rî   r)   r*   r9   ç  s    rH   rç   c                      s   dˆ   d¡› dˆ   d¡› d�S )Nz3A must be batches of square matrices, but they are rç   rè   rH   ré   rM   r)   ©rë   r)   r*   r9   ï  s    c                      s:   dˆ› dˆ   d¡› dˆ   d¡› dˆ  d¡› dˆ  d¡› �
S )NzIncompatible matrix sizes for z: each A matrix is rH   rè   z but each b matrix is rç   rM   r)   ©rë   rì   rF   r)   r*   r9   ÷  s    )r.   r<   r\   r5   rN   rê   r)   rð   r*   ÚlinearSolveCheckInputsØ  s     
þ
þ
þþrñ   ©Útræ   Úallow_low_precision_dtypesc                    sZ   | j ‰ t |  ¡ p|  ¡ ‡ ‡fdd„¡ |sVt ˆ tjtjtjtjfk‡ ‡fdd„¡ d S )Nc                      s   ˆ› dˆ › �S )Nz<: Expected a floating point or complex tensor as input. Got r)   r)   ©r5   ræ   r)   r*   r9     r:   z(checkFloatingOrComplex.<locals>.<lambda>c                      s   ˆ› dˆ › �S )Nz*: Low precision dtypes not supported. Got r)   r)   rõ   r)   r*   r9     r:   )	r5   r.   r<   r‹   r…   r1   r3   r0   r2   rò   r)   rõ   r*   rU      s    þþrU   rë   ©rë   ræ   Úarg_namec                    s"   t  |  ¡ dk‡ ‡fdd„¡ d S )NrŠ   c                      s   ˆ› dˆ › d�S )Nz: The input tensor z! must have at least 2 dimensions.r)   r)   ©r÷   ræ   r)   r*   r9     r:   zcheckIsMatrix.<locals>.<lambda>)r.   r<   rJ   rö   r)   rø   r*   ÚcheckIsMatrix  s    
þrù   ©rë   ÚBr~   ræ   c                    sZ   t ˆ ˆƒ tˆˆƒ t ˆr0ˆ  d¡ˆ d¡knˆ  d¡ˆ d¡k‡ ‡‡‡fdd„¡ d S )Nrç   rH   c                      sH   ˆ› dˆrdnd› dˆ   d¡› dˆ   d¡› dˆ  d¡› dˆ  d¡› d	�S )
Nz2: Incompatible shapes of A and B for the equation zAX = BzXA = Bz (rç   rh   rH   rL   ú)rM   r)   ©rë   rû   ræ   r~   r)   r*   r9   !  s    z#checkInputsSolver.<locals>.<lambda>)rT   rù   r.   r<   rN   rú   r)   rý   r*   ÚcheckInputsSolver  s    

*þrþ   Úresult©Úfn_namerÿ   r�   Úresult_namec                    s&   t  ˆjˆjk‡ ‡‡‡fdd„¡ d S )Nc                	      s$   ˆ › dˆ› dˆ› dˆj › dˆj › �	S )Nz: Expected z5 and input tensors to be on the same device, but got z on z and input on rÔ   r)   ©r  r�   rÿ   r  r)   r*   r9   .  s    z!checkSameDevice.<locals>.<lambda>)r.   r<   r\   r   r)   r  r*   ÚcheckSameDevice)  s    
þr  ©ÚUPLOc                    s8   ˆ   ¡ }t tˆ ƒdko&|dkp&|dk‡ fdd„¡ d S )Nrm   ÚUÚLc                      s
   dˆ › �S )Nz1Expected UPLO argument to be 'L' or 'U', but got r)   r)   r  r)   r*   r9   9  r:   zcheckUplo.<locals>.<lambda>)Úupperr.   r<   ro   )r  ZUPLO_uppercaser)   r  r*   Ú	checkUplo5  s
    
þr
  ÚeigenvaluesZeigenvectorsr  )rë   r  Ú	compute_vc                 C   sp   t | dƒ t|ƒ t| jƒ}|r@|  |¡}| |t|dd�¡ n|  dg¡}| ¡  | j|t| j	ƒd�}||fS )Nzlinalg.eighF©Z	row_majorr   r>   )
rT   r
  rp   rE   rD   r©   r   Úpopr6   r5   )rë   r  r  rE   ZvecsÚvalsr)   r)   r*   Úmeta__linalg_eigh=  s    


r  )r¡   r®   c                 C   s   | j jtjd� dd¡S )Nr¯   rç   rH   )ZmTÚcloner.   r±   Ú	transpose)r¡   r)   r)   r*   ÚcloneBatchedColumnMajorT  s    r  )rF   rë   r	  r®   c                 C   s   t | ƒS r$   )r  )rF   rë   r	  r)   r)   r*   Ú_cholesky_solve_helperX  s    r  c                    sP   t  ˆjdk‡fdd„¡ t  ˆ jdk‡ fdd„¡ tˆˆ dƒ\}}t|||ƒS )NrŠ   c                      s   dˆ j › d�S )Nz-b should have at least 2 dimensions, but has ú dimensions instead©rQ   r)   rW   r)   r*   r9   c  r:   z cholesky_solve.<locals>.<lambda>c                      s   dˆ j › d�S )Nz-u should have at least 2 dimensions, but has r  r  r)   rï   r)   r*   r9   g  r:   Úcholesky_solve)r.   r<   rQ   Ú!_linalg_broadcast_batch_dims_namer  )rF   rë   r	  Zself_broadcastedZA_broadcastedr)   rî   r*   r  ^  s    
þ
þ  ÿr  )rF   r	  r®   c                 C   s.   |   ¡ dkrtj| tjd�S t| dƒ t| ƒS )Nr   r¯   Úcholesky)rC   r.   rV   Úlegacy_contiguous_formatrT   r  ©rF   r	  r)   r)   r*   r  o  s    
r  c                 C   s   t | dƒ t| ƒS )NÚcholesky_inverse)rT   r  r  r)   r)   r*   r  x  s    
r  )rë   r	  Úcheck_errorsc                 C   sf   t | dƒ t| dƒ | j}t|ƒ}t|dƒ}|  |¡}| ||¡ | j|d|d … tjd�}||fS )Nzlinalg.choleskyFr   rŠ   r>   )	rT   rU   rE   ro   r   rD   r©   r.   Úint32)rë   r	  r  ZA_shaperQ   Z	L_stridesr  Úinfosr)   r)   r*   Úlinalg_cholesky_ex€  s    



r   )r�   Útaur®   c                    s  t  ˆjdkdd„ ¡ t  ˆ d¡ˆ d¡kdd„ ¡ t  ˆ d¡ˆ d¡kdd„ ¡ t  ˆjˆj dk‡‡fd	d„¡ ˆjdkr¶ˆjd d… }ˆjd d… ‰ t  ˆ |k‡ fd
d„¡ t  ˆjˆjk‡‡fdd„¡ tdˆˆdƒ t jˆjtˆjdd�ˆjˆj	d�S )NrŠ   c                   S   s   dS )NzHtorch.linalg.householder_product: input must have at least 2 dimensions.r)   r)   r)   r)   r*   r9   ™  r:   z,linalg_householder_product.<locals>.<lambda>rç   rH   c                   S   s   dS )Nzbtorch.linalg.householder_product: input.shape[-2] must be greater than or equal to input.shape[-1]r)   r)   r)   r)   r*   r9   �  r:   c                   S   s   dS )Nz`torch.linalg.householder_product: input.shape[-1] must be greater than or equal to tau.shape[-1]r)   r)   r)   r)   r*   r9   ¡  r:   rm   c                      s   dˆj › dˆ j › �S )Nzptorch.linalg.householder_product: Expected tau to have one dimension less than input, but got tau.ndim equal to ú and input.ndim is equal to r  r)   ©r�   r!  r)   r*   r9   ¦  s    c                      s
   dˆ › �S )Nzltorch.linalg.householder_product: Expected batch dimensions of tau to be equal to input.shape[:-2], but got r)   r)   ©Úactual_batch_tau_shaper)   r*   r9   °  s    c                      s   dˆj › dˆ j › �S )Nz,torch.linalg.householder_product: tau dtype z does not match input dtype r>   r)   r#  r)   r*   r9   ¸  s    z torch.linalg.householder_productr!  Fr  ©rN   rs   r5   r\   )
r.   r<   rQ   rN   rE   r5   r  Úempty_stridedr   r\   )r�   r!  Zexpected_batch_tau_shaper)   )r%  r�   r!  r*   Úlinalg_householder_product’  sD    þþþþ

þ
þür(  )rë   r  c                 C   s^   t | dƒ t| ddd� |  | j¡}| | jt| jdd�¡ | j| jd d… tjd�}||fS )Nzlinalg.inv_exF)rô   r  rç   r>   ©rT   rU   rD   rE   r©   r   r.   r  )rë   r  r  r  r)   r)   r*   Úlinalg_inv_ex_metaÈ  s    
r*  ÚLDÚpivotsÚinfo)Ú	hermitianr  )rF   r.  r  r®   c                C   st   t | dƒ t| dƒ tj| jt| jdd�| j| jd�}| j| jd d… tj	d�}| j| jd d… tj	d�}|||fS )Nztorch.linalg.ldl_factor_exFr  r&  rH   r>   rç   )
rT   rU   r.   r'  rE   r   r5   r\   rD   Úint)rF   r.  r  r+  r,  r-  r)   r)   r*   Úlinalg_ldl_factor_ex_metaÔ  s    

ür0  )r.  )r+  r,  rû   r.  r®   c                   sÈ   t ˆdƒ tˆdƒ tˆ ˆdƒ t ˆ jdk‡ fdd„¡ ˆjd d… }t |ˆjk‡fdd„¡ t t ˆj	¡‡fdd„¡ t ˆj	ˆ j	k‡ ‡fdd„¡ t
ˆ ˆƒ\}}tj|t|d	d
�ˆ j	ˆ jd�S )Nztorch.linalg.ldl_solverŠ   c                      s   dˆ j › d�S )NzMtorch.linalg.ldl_solve: Expected B to have at least 2 dimensions, but it has r  r  r)   )rû   r)   r*   r9   ó  s    z'linalg_ldl_solve_meta.<locals>.<lambda>rH   c                      s   dˆ j › d�S )Nzjtorch.linalg.ldl_solve: Expected LD.shape[:-1] and pivots.shape to be the same, but got pivots with shape ú instead©rE   r)   ©r,  r)   r*   r9   û  s    c                      s   dˆ j › �S )Nz<torch.linalg.ldl_solve: Expected pivots to be integers. Got r>   r)   r3  r)   r*   r9     r:   c                      s   dˆj › dˆ j › �S )Nz!torch.linalg.ldl_solve: LD dtype z does not match b dtype r>   r)   )rû   r+  r)   r*   r9     r:   Fr  r&  )rT   rU   rñ   r.   r<   rQ   rE   rŒ   Úis_integer_dtyper5   Ú_linalg_broadcast_batch_dimsr'  r   r\   )r+  r,  rû   r.  Zexpected_pivots_shapeÚB_broadcast_sizere   r)   )rû   r+  r,  r*   Úlinalg_ldl_solve_metaé  s6    


þ
þ

þ
þ
ür7  ÚPr  )Úpivot)rë   r9  r®   c          	         s˜   t  ˆ jdk‡ fdd„¡ tˆ jƒ}|d }|d }t||ƒ}||d< |rVˆ  |¡}nˆ  dg¡}||d< ˆ  |¡}||d< ||d< ˆ  |¡}|||fS )NrŠ   c                      s   dˆ j › d�S )Nz@linalg.lu: Expected tensor with 2 or more dimensions. Got size: r1  r2  r)   rï   r)   r*   r9     r:   z linalg_lu_meta.<locals>.<lambda>rç   rH   r   )r.   r<   rQ   rp   rE   rØ   rD   )	rë   r9  ÚsizesÚmr‘   Úkr8  r  r  r)   rï   r*   Úlinalg_lu_meta  s$    
þ



r=  ÚLU)r9  r  )rë   r9  r  r®   c          	         sš   t  ˆ jdk‡ fdd„¡ tˆ jƒ}|d }|d }t j|t|dd�ˆ jˆ jd�}| 	¡  t
||ƒ|d< ˆ j|t jd	�}| 	¡  ˆ j|t jd	�}|||fS )
NrŠ   c                      s   dˆ j › d�S )NzFtorch.lu_factor: Expected tensor with 2 or more dimensions. Got size: r1  r2  r)   rï   r)   r*   r9   4  r:   z*linalg_lu_factor_ex_meta.<locals>.<lambda>rç   rH   Fr  r&  r>   )r.   r<   rQ   rp   rE   r'  r   r5   r\   r  rØ   rD   r/  )	rë   r9  r  r:  r;  r‘   r>  r,  r-  r)   rï   r*   Úlinalg_lu_factor_ex_meta-  s&    
þ

ür?  )r~   Úadjoint)r>  r,  rû   r~   r@  r®   c                   sî   t ˆdƒ t ˆjˆ jk‡ ‡fdd„¡ t ˆjtjkdd„ ¡ tˆdƒ tˆˆ |dƒ t ˆ d¡ˆ d¡kdd„ ¡ t ˆjd d… ˆjk‡fdd„¡ t	ˆ ˆƒ\}}tj
|t|| d	�ˆ jˆ jd
�}| ¡ dkrê|sê| ¡ rê| ¡ }|S )Nztorch.linalg.lu_solvec                      s   dˆj › dˆ j › d�S )NzPlinalg.lu_solve: Expected LU and B to have the same dtype, but found LU of type ú and B of type r1  r>   r)   )rû   r>  r)   r*   r9   \  s    z&linalg_lu_solve_meta.<locals>.<lambda>c                   S   s   dS )NzElinalg.lu_solve: pivots should be a Tensor of scalar type torch.int32r)   r)   r)   r)   r*   r9   c  r:   zlinalg.lu_solverH   c                   S   s   dS )NzYlinalg.lu_solve: Number of pivots per batch should be same as the dimension of the matrixr)   r)   r)   r)   r*   r9   k  r:   c                      s   dˆ j › d�S )Nzclinalg.lu_solve: Expected LU.shape[:-1] and pivots.shape to be the same, but got pivots with shape r1  r2  r)   r3  r)   r*   r9   q  s    r  r&  r   )rU   r.   r<   r5   r/  rT   rþ   rN   rE   r5  r'  r   r\   rC   r…   Úconj)r>  r,  rû   r~   r@  r6  re   rÿ   r)   )rû   r>  r,  r*   Úlinalg_lu_solve_metaN  s<    

þ
þ
þ
þürC  )r>  r,  Úunpack_dataÚunpack_pivotsr®   c                    sÒ   t  ˆ jdk‡ fdd„¡ |r6t  |jt jkdd„ ¡ tˆ jƒ}|d }|d }t||ƒ}||d< |rrˆ  |¡}nˆ  dg¡}|r°||d< ˆ  |¡}	||d< ||d< ˆ  |¡}
nˆ  dg¡}	ˆ  dg¡}
||	|
fS )NrŠ   c                      s   dˆ j › d�S )NzFtorch.lu_unpack: Expected tensor with 2 or more dimensions. Got size: r1  r2  r)   ©r>  r)   r*   r9   ‘  r:   z lu_unpack_meta.<locals>.<lambda>c                   S   s   dS )Nz´torch.lu_unpack: LU_pivots is expected to be a contiguous tensor of torch.int32 dtype.
Note: this function is intended to be used with the output produced by torch.linalg.lu_factorr)   r)   r)   r)   r*   r9   –  s    rç   rH   r   )	r.   r<   rQ   r5   r  rp   rE   rØ   rD   )r>  r,  rD  rE  r:  r;  r‘   r<  r8  r  r  r)   rF  r*   Úlu_unpack_meta‡  s4    
þ
þ


rG  )Úmoder®   c                    sR   ˆ dkrd}d}n8ˆ dkr$d}d}n&ˆ dkr6d}d}nt  d‡ fdd„¡ ||fS )NÚreducedTZcompleteFÚrc                      s   dˆ › d�S )Nzqr received unrecognized mode 'z=' but expected one of 'reduced' (default), 'r', or 'complete'r)   r)   ©rH  r)   r*   r9   ¾  s    z _parse_qr_mode.<locals>.<lambda>©r.   r<   )rH  Ú	compute_qrI  r)   rK  r*   Ú_parse_qr_mode±  s    
þrN  ÚQÚRrI  )rë   rH  r®   c                 C   sÌ   t | dƒ t| dƒ t|ƒ\}}| jd }| jd }t||ƒ}|r|t| jƒ}|rT|n||d< |  |¡}| |t|dd�¡ n|  dg¡}t| jƒ}	|sš|sž|n||	d< |  |	¡}
|
 |	t|	dd�¡ ||
fS )Nz	linalg.qrrç   rH   Fr  r   )	rù   rU   rN  rE   rØ   rp   rD   r©   r   )rë   rH  rM  Zreduced_moder;  r‘   r<  ZQ_shaperO  ZR_shaperP  r)   r)   r*   Úlinalg_qr_metaÆ  s"    








rQ  ÚsignÚ	logabsdet)rë   r®   c                 C   sŠ   t | dƒ t| ddƒ | j}|  |d d… ¡}| j|d d… t| jƒd�}tj|t|dƒ| j| j	d�}| j|d d… tj
d�}||||fS )Nzlinalg.slogdetFrç   r>   r&  rH   )rT   rU   rE   rD   r6   r5   r.   r'  r   r\   r  )rë   rE   rR  rS  r>  r,  r)   r)   r*   Ú_linalg_slogdetå  s    
ürT  )rë   Úfull_matricesÚ
compute_uvÚdriverc                 C   sö   t | dƒ t| dƒ t| jd d… ƒ}| jd }| jd }t||ƒ}|rº|||rT|n|g }|  |¡}	|	 |t|dd�¡ ||r„|n||g }
|  |
¡}t| ƒdk}| |
t|
|d�¡ n|  dg¡}	|  dg¡}| j||g t	| j
ƒd�}|	||fS )	Nz
linalg.svdrç   rH   Fr  Úcudar   r>   )rù   rU   rp   rE   rØ   rD   r©   r   Údevice_hintr6   r5   )rë   rU  rV  rW  r|   r;  r‘   r<  ZU_shaper  ZV_shapeÚVZis_cudaÚSr)   r)   r*   Ú_linalg_svd_metaù  s$    






r\  )Úarg1Úarg2r®   c                 C   sn   | j d d… }|j d d… }t||ƒ}t|ƒ}||  d¡|  d¡g7 }t|ƒ}|| d¡| d¡g7 }||fS )Nrç   rH   )rE   r   rp   rN   )r]  r^  Zarg1_batch_sizesZarg2_batch_sizesÚexpand_batch_portionÚarg1_expand_sizeÚarg2_expand_sizer)   r)   r*   r5    s    
r5  )r]  r^  rì   r®   c                 C   sV   |rt | ||ƒ t| |ƒ\}}|| jkr,| n|  |¡}||jkrD|n| |¡}||fS r$   )rñ   r5  rE   Úexpand)r]  r^  rì   r`  ra  Zarg1_broadcastedZarg2_broadcastedr)   r)   r*   r  /  s    ÿÿr  )r�   rP   r®   c                 C   s6   | j d d… }|jdkp0| jd |jko0|j |k}|S )NrH   rm   )rE   rQ   )r�   rP   Zexpected_batched_rhs_shapeÚvector_caser)   r)   r*   Úlinalg_solve_is_vector_rhsA  s
    
ÿrd  )r~   r  rÿ   r>  r,  r-  )	rë   rû   r~   r  rÿ   r>  r,  r-  r®   c                   sr  t ˆ dƒ t ˆ jˆjk‡ ‡fdd„¡ tˆ ˆƒ}|r@ˆ d¡nˆ}	tˆ |	|dƒ t|	ˆ ƒ\}
}t |pl| dd„ ¡ |r†|
d d… n|
}tj|t	|| ƒˆjˆj
d�}ˆ j}ˆ j}tj|t	|dƒˆ jˆ j
d�}ˆ j|d d… tjd�}ˆ j|d d	… tjd�}||||f}||||f}td
d„ |D ƒƒ�rnt||ƒD ]6\}}t||jƒ | |j| ¡ ¡ t||dd� �q6|S )Nzlinalg.solvec                      s   dˆ j › dˆj › d�S )NzKlinalg.solve: Expected A and B to have the same dtype, but found A of type rA  r1  r>   r)   ©rë   rû   r)   r*   r9   X  s    z"_linalg_solve_ex.<locals>.<lambda>rH   c                   S   s   dS )Nz•linalg.solve: Vector broadcasting of the left hand side is not supported for left=False. In this case linalg.solve is equivalent to B / A.squeeze(-1)r)   r)   r)   r)   r*   r9   c  s    r&  Fr>   rç   c                 s   s   | ]}|d k	V  qd S r$   r)   ©rd   rh   r)   r)   r*   Ú	<genexpr>{  s     z#_linalg_solve_ex.<locals>.<genexpr>)Ú	copy_fromÚcopy_toZexact_dtype)rU   r.   r<   r5   rd  Ú	unsqueezerþ   r5  r'  r   r\   rE   rQ   rD   r  ÚallÚzipr   r©   rs   r   )rë   rû   r~   r  rÿ   r>  r,  r-  rc  ÚB_ZB_broad_shapere   Zresult_shapeZresult_rE   rQ   ZLU_Zpivots_Zinfo_ry   ÚresrJ  Úor)   re  r*   Ú_linalg_solve_exI  sL    

þ
þ
üürp  )r~   Úunitriangularry   )rë   rû   r	  r~   rq  ry   r®   c          	      C   sš   |d kr|   dg¡}t|tƒs"t‚t| ||dƒ t|| d ƒ\}}| dd¡ ¡ oV| ¡ }|rjt	||j
ƒ}n,t||j
ƒr–| | dd¡j
¡ | dd¡ |S )Nr   zlinalg.solve_triangularrç   rH   )rD   rÚ   r   r†   rþ   r  r  Úis_contiguousÚis_conjr   rE   r   Zresize_Ú
transpose_)	rë   rû   r	  r~   rq  ry   rm  ZA_Zavoid_copy_Ar)   r)   r*   Úlinalg_solve_triangular_meta…  s    
ru  ÚsolutionÚcloned_coefficient)rF   rë   r	  r  rq  r®   c           	         sà   t  ˆjdk‡fdd„¡ t  ˆ jdk‡ fdd„¡ tˆˆ dƒ ˆ jt jkr˜tˆˆ ƒ\}}t j|t|dd�ˆj	ˆj
d�}t j|t|dd�ˆ j	ˆ j
d�}n@ˆ jt jks°ˆ jt jkrÈt  ˆ¡}ˆ d	g¡}nt  dd
d„ ¡ ||fS )NrŠ   c                      s   dˆ j › d�S )NzMtorch.triangular_solve: Expected b to have at least 2 dimensions, but it has r  r  r)   rW   r)   r*   r9   ª  s    z'triangular_solve_meta.<locals>.<lambda>c                      s   dˆ j › d�S )NzMtorch.triangular_solve: Expected A to have at least 2 dimensions, but it has r  r  r)   rï   r)   r*   r9   ±  s    Útriangular_solveFr  r&  r   c                   S   s   dS )Nz+triangular_solve: Got an unexpected layout.r)   r)   r)   r)   r*   r9   Ë  r:   )r.   r<   rQ   rñ   r”   Ústridedr5  r'  r   r5   r\   Ú
sparse_csrÚ
sparse_bsrrV   rD   )	rF   rë   r	  r  rq  Zself_broadcast_sizeZA_broadcast_sizerv  rw  r)   rî   r*   Útriangular_solve_metaŸ  s8    	
þ
þ
ü
ü
r|  c                 C   sp   t | dƒ t| dƒ |  | jd d… ¡}|  | j¡}| | jt| jdd�¡ | j| jd d… tjd�}|||fS )Nz
linalg.detrç   Fr  rH   r>   r)  )rë   Zdetr>  r,  r)   r)   r*   Ú_linalg_det_metaÐ  s    

r}  )r�   r!  rP   r~   r  r®   c                    sÀ  t  ˆjdkdd„ ¡ t  ˆjdkdd„ ¡ |r4dnd‰t  ˆjˆ ˆjd k‡fdd„¡ t  ˆjˆ ˆjd k‡fdd„¡ t  ˆjd ˆjd kd	d„ ¡ t  ˆjˆj d
k‡‡fdd„¡ t  ˆjˆjk‡‡fdd„¡ ˆjdk�rFˆjd d… }ˆjd d… ‰t  ˆ|k‡fdd„¡ ˆjd d… ‰ t  ˆ |k‡ fdd„¡ t  ˆjˆjk‡‡fdd„¡ t  ˆjˆjk‡‡fdd„¡ tdˆˆdƒ tdˆˆdƒ t jˆjtˆjdd�ˆjˆjd�S )NrŠ   c                   S   s   dS )Nz3torch.ormqr: input must have at least 2 dimensions.r)   r)   r)   r)   r*   r9   è  r:   zormqr.<locals>.<lambda>c                   S   s   dS )Nz3torch.ormqr: other must have at least 2 dimensions.r)   r)   r)   r)   r*   r9   ë  r:   rç   rH   c                      s   dˆ › d�S )Nútorch.ormqr: other.shape[z0] must be greater than or equal to tau.shape[-1]r)   r)   ©Úleft_size_conditionr)   r*   r9   ñ  r:   c                      s   dˆ › d�S )Nr~  z"] must be equal to input.shape[-2]r)   r)   r  r)   r*   r9   õ  r:   c                   S   s   dS )NzHtorch.ormqr: tau.shape[-1] must be less than or equal to input.shape[-1]r)   r)   r)   r)   r*   r9   ú  r:   rm   c                      s   dˆj › dˆ j › �S )Nz[torch.ormqr: Expected tau to have one dimension less than input, but got tau.ndim equal to r"  r  r)   r#  r)   r*   r9   ÿ  s    c                      s   dˆj › dˆ j › �S )Nzhtorch.ormqr: Expected other to have the same number of dimensions as input, but got other.ndim equal to r"  r  r)   ©r�   rP   r)   r*   r9     s    c                      s
   dˆ › �S )NzWtorch.ormqr: Expected batch dimensions of tau to be equal to input.shape[:-2], but got r)   r)   r$  r)   r*   r9     s    c                      s
   dˆ › �S )NzYtorch.ormqr: Expected batch dimensions of other to be equal to input.shape[:-2], but got r)   r)   )Úactual_batch_other_shaper)   r*   r9     s    c                      s   dˆ j › dˆj › �S )NzPtorch.ormqr: Expected input and tau to have the same dtype, but input has dtype z and tau has dtype r>   r)   r#  r)   r*   r9   "  s    c                      s   dˆ j › dˆj › �S )NzRtorch.ormqr: Expected input and other to have the same dtype, but input has dtype z and other has dtype r>   r)   r�  r)   r*   r9   )  s    ztorch.ormqrr!  rP   Fr  r&  )	r.   r<   rQ   rE   r5   r  r'  r   r\   )r�   r!  rP   r~   r  Zexpected_batch_shaper)   )r‚  r%  r�   r€  rP   r!  r*   ÚormqrÞ  sr    	 ÿ ÿ
þ
þþþ
þ
þ
þ
þ
þürƒ  c                   s¦   t  tˆƒdˆ  k‡ ‡fdd„¡ ˆj}|ˆ d k}|}| }|rftd|ƒD ]}|o`ˆ |¡dk}qLn"td|ƒD ]}|o„ˆ |¡dk}qpt  |p’|‡ ‡fdd„¡ d S )NrŠ   c                      s   ddˆ  › dt ˆƒ› �S )Nzpadding size is expected to be rŠ   z, but got: ©ro   r)   )rJ   Úpaddingr)   r*   r9   =  r:   z,_padding_check_valid_input.<locals>.<lambda>rm   r   c                      s    dˆ d › dˆ d › dˆj › �S )Nz	Expected rm   zD or rŠ   zcD (batch mode) tensor with possibly 0 batch size and other non-zero dimensions for input, but got: r2  r)   )rJ   r�   r)   r*   r9   R  s    )r.   r<   ro   rQ   rq   rN   )r�   r…  rJ   Z	input_dimZis_batch_modeZvalid_batch_modeZvalid_non_batch_moder}   r)   )rJ   r�   r…  r*   Ú_padding_check_valid_input:  s"    þþr†  c                   sÖ   d}d‰ d}ˆj dkr0ˆ d¡}ˆ d7 ‰ |d7 }tˆ|dd� |\‰‰ˆ |¡}ˆ ˆ ¡‰ˆˆ ˆ ‰|r�t ˆˆk o|ˆˆk ‡ ‡‡‡fdd„¡ t ˆdk‡‡fdd„¡ ˆj dkrÂˆ |ˆf¡S ˆ ||ˆf¡S d S )	Nr   rm   rK   rI   c                      s   dˆ› dˆ› dˆ › dˆj › �S ©NzcArgument #4: Padding size should be less than the corresponding input dimension, but got: padding (ú, ú) at dimension ú
 of input r2  r)   ©Údim_wr�   Úpad_lÚpad_rr)   r*   r9   n  s    z_pad1d_common.<locals>.<lambda>c                      s   dˆ › dˆ› �S )Nz
input (W: z%) is too small. Calculated output W: r)   r)   )Úinput_wÚoutput_wr)   r*   r9   v  r:   rŠ   )rQ   rN   r†  r.   r<   rD   )r�   r…  Úis_reflectionÚ	dim_planeÚnbatchÚnplaner)   )rŒ  r�   r�  r�  r�  rŽ  r*   Ú_pad1d_commonY  s0    



þþ
r•  c                 C   s   t | |dd�S ©NT©r‘  ©r•  ©r�   r…  r)   r)   r*   Úmeta_reflection_pad1d  s    rš  c                 C   s   t | |dd�S ©NFr—  r˜  r™  r)   r)   r*   Úmeta_replication_pad1d…  s    rœ  c                   s¨   d‰ |s t  t|ƒdkdd„ ¡ ˆjdkr2ˆ d7 ‰ |\‰‰ˆ ˆ ¡}|ˆ ˆ ‰|rzt  ˆ|k ofˆ|k ‡ ‡‡‡fdd„¡ t  ˆˆ ˆ ¡k‡ ‡‡fdd„¡ ˆ ˆj¡S )Nrm   rŠ   c                   S   s   dS )Nz padding size is expected to be 2r)   r)   r)   r)   r*   r9   Ž  r:   z(_pad1d_backward_common.<locals>.<lambda>rK   c                      s   dˆ› dˆ› dˆ › dˆj › �S r‡  r2  r)   r‹  r)   r*   r9   ›  s    c                      s   dˆ› dˆ  ˆ ¡› �S ©Nz(grad_output width unexpected. Expected: ú, Got: rM   r)   ©rŒ  Úgrad_outputr�  r)   r*   r9   £  r:   )r.   r<   ro   rQ   rN   rD   rE   )r   r�   r…  r‘  r�  r)   )rŒ  r   r�   r�  r�  rŽ  r*   Ú_pad1d_backward_common‹  s$    

þþr¡  c                 C   s   t | ||dd�S r–  ©r¡  ©r   r�   r…  r)   r)   r*   Úmeta_reflection_pad1d_backward©  s    r¤  c                 C   s   t | ||dd�S r›  r¢  r£  r)   r)   r*   Úmeta_replication_pad1d_backward¯  s    r¥  c                   s8  d‰d‰ d}d}t ˆ|dd� ˆj}|dkrNˆ d¡}ˆd7 ‰ˆ d7 ‰ |d7 }|\‰‰	‰
‰ˆ |¡}ˆ ˆ ¡‰ˆ ˆ¡‰ˆˆ
 ˆ ‰ˆˆ ˆ	 ‰|ràt ˆˆk o¦ˆ	ˆk ‡‡‡‡	fdd„¡ t ˆ
ˆk oÌˆˆk ‡ ‡‡‡
fdd„¡ t ˆdkpòˆdk‡‡‡‡fd	d„¡ ˆjd
k�r"ˆ |ˆˆf¡S ˆ ||ˆˆf¡S d S )NrŠ   rm   r   rI   é   c                      s   dˆ› dˆ› dˆ › dˆj › �S r‡  r2  r)   r‹  r)   r*   r9   Ï  s    z_pad2d_common.<locals>.<lambda>c                      s   dˆ› dˆ› dˆ › dˆj › �S ©NzcArgument #6: Padding size should be less than the corresponding input dimension, but got: padding (rˆ  r‰  rŠ  r2  r)   ©Údim_hr�   Úpad_bÚpad_tr)   r*   r9   Ö  s    c                      s   dˆ › dˆ› dˆ› dˆ› �S )Nz
input (H: ú W: z%) is too small. Calculated output H: r)   r)   )Úinput_hr�  Úoutput_hr�  r)   r*   r9   Þ  s    rK   ©r†  rQ   rN   r.   r<   rD   )r�   r…  r‘  Z
dim_slicesr“  rQ   r”  r)   )r©  rŒ  r�   r­  r�  r®  r�  rª  r�  rŽ  r«  r*   Ú_pad2d_commonµ  sB    



þþþr°  c                 C   s   t | |dd�S r–  ©r°  r™  r)   r)   r*   Úmeta_reflection_pad2dê  s    r²  c                 C   s   t | |dd�S r›  r±  r™  r)   r)   r*   Úmeta_replication_pad2dð  s    r³  c                    sÎ   d‰d‰ d}d}|j }| ¡ dkrB|d }ˆd7 ‰ˆ d7 ‰ |d7 }|\}}}}	|| }
|ˆ  }|ˆ }|| |	 ‰|| | ‰t ˆˆ ˆ¡k‡‡‡fdd„¡ t ˆˆ ˆ ¡k‡ ‡‡fdd„¡ | |j ¡S )NrŠ   rm   r   r¦  c                      s   dˆ› dˆ  ˆ ¡› �S r�  rM   r)   rŸ  r)   r*   r9     r:   z%meta_pad2d_backward.<locals>.<lambda>c                      s   dˆ› dˆ  ˆ ¡› �S ©Nz)grad_output height unexpected. Expected: rž  rM   r)   ©r©  r   r®  r)   r*   r9     r:   )rE   rJ   r.   r<   rN   rD   )r   rF   r…  r’  r“  r8   r�  rŽ  r«  rª  r”  r­  r�  r)   )r©  rŒ  r   r®  r�  r*   Úmeta_pad2d_backwardö  s2    
þþr¶  c             	      s’  d‰d‰d‰ d}t ˆ|dd� ˆjdk}|rVˆ d¡}ˆd7 ‰ˆd7 ‰ˆ d7 ‰ |d7 }|\‰‰‰‰
‰‰ˆ |¡}ˆ ˆ ¡‰ˆ ˆ¡‰ˆ ˆ¡‰ˆˆ ˆ ‰ˆˆ ˆ
 ‰ˆˆ ˆ ‰	|�r,t ˆˆk oÊˆˆk ‡‡‡‡fdd„¡ t ˆˆk oðˆ
ˆk ‡‡‡
‡fd	d„¡ t ˆˆk �oˆˆk ‡ ‡‡‡fd
d„¡ t ˆ	dk�pJˆdk�pJˆdk‡‡‡‡‡‡	fdd„¡ |�r|ˆ ||ˆˆˆ	f¡S ˆ |ˆˆˆ	f¡S d S )NrK   rŠ   rm   r   rI   é   c                      s   dˆ› dˆ› dˆ › dˆj › �S r‡  r2  r)   r‹  r)   r*   r9   <  s    z_pad3d_common.<locals>.<lambda>c                      s   dˆ› dˆ› dˆ › dˆj › �S r§  r2  r)   r¨  r)   r*   r9   C  s    c                      s   dˆ› dˆ› dˆ › dˆj › �S )NzcArgument #8: Padding size should be less than the corresponding input dimension, but got: padding (rˆ  r‰  rŠ  r2  r)   )Údim_dr�   Úpad_bkÚpad_fr)   r*   r9   J  s    c                      s(   dˆ › dˆ› dˆ› dˆ› dˆ› dˆ› �S )Nz
input (D: ú H: r¬  z%) is too small. Calculated output D: r)   r)   )Úinput_dr­  r�  Úoutput_dr®  r�  r)   r*   r9   R  s    r¯  )r�   r…  r‘  r’  Z
batch_moder“  r”  r)   )r¸  r©  rŒ  r�   r¼  r­  r�  r½  r®  r�  rª  r¹  rº  r�  rŽ  r«  r*   Ú_pad3d_common  sP    





þþþþr¾  c                 C   s   t | |dd�S r–  ©r¾  r™  r)   r)   r*   Úmeta_reflection_pad3d^  s    rÀ  c                 C   s   t | |dd�S r›  r¿  r™  r)   r)   r*   Úmeta_replication_pad3dd  s    rÁ  c                    s(  t  t|ƒdkdd„ ¡ |jdks&t‚ˆj|jks6t‚d‰d‰d‰ |jdkrdˆd7 ‰ˆd7 ‰ˆ d7 ‰ |\}}}}}}| ˆ ¡}	| ˆ¡}
| ˆ¡}|	| | ‰|
| | ‰|| | ‰t  ˆˆ ˆ¡k‡‡‡fdd„¡ t  ˆˆ ˆ¡k‡‡‡fd	d„¡ t  ˆˆ ˆ ¡k‡ ‡‡fd
d„¡ | |j¡S )Né   c                   S   s   dS )Nz padding size is expected to be 6r)   r)   r)   r)   r*   r9   t  r:   z%meta_pad3d_backward.<locals>.<lambda>rK   rŠ   rm   r·  c                      s   dˆ› dˆ  ˆ ¡› �S r�  rM   r)   rŸ  r)   r*   r9   Œ  r:   c                      s   dˆ› dˆ  ˆ ¡› �S r´  rM   r)   rµ  r)   r*   r9   �  r:   c                      s   dˆ› dˆ  ˆ ¡› �S )Nz(grad_output depth unexpected. Expected: rž  rM   r)   )r¸  r   r½  r)   r*   r9   ”  r:   )r.   r<   ro   rQ   r†   rN   rD   rE   )r   r�   r…  r�  rŽ  r«  rª  rº  r¹  r¼  r­  r�  r)   )r¸  r©  rŒ  r   r½  r®  r�  r*   Úmeta_pad3d_backwardj  s<    




þþþrÃ  rŠ   )rF   Úpr®   c                 C   sb   t  |  ¡ dd„ ¡ |  d¡}|dkr<|  dg¡jt jd�S |  ||d  d f¡jt jd�S d S )Nc                   S   s   dS )Nz(_pdist_forward requires contiguous inputr)   r)   r)   r)   r*   r9   ž  r:   z%meta__pdist_forward.<locals>.<lambda>r   rm   r¯   rŠ   )r.   r<   rr  rN   rD   rŸ   r  )rF   rÄ  r‘   r)   r)   r*   Úmeta__pdist_forwardš  s     ÿ
ÿrÅ  )ÚgradrF   rÄ  Úpdistr®   c                 C   s8   t  | ¡ dd„ ¡ t  | ¡ dd„ ¡ t j|t jd�S )Nc                   S   s   dS )Nz._pdist_backward requires self to be contiguousr)   r)   r)   r)   r*   r9   ­  r:   z&meta__pdist_backward.<locals>.<lambda>c                   S   s   dS )Nz/_pdist_backward requires pdist to be contiguousr)   r)   r)   r)   r*   r9   °  r:   r¯   )r.   r<   rr  rV   r  )rÆ  rF   rÄ  rÇ  r)   r)   r*   Úmeta__pdist_backward©  s     ÿ ÿrÈ  rm   )ÚbetaÚalphac          	         sæ   ˆ   d¡}ˆ   d¡}ˆ  d¡}ˆ |||f¡‰t ˆ  ¡ dkdd„ ¡ t ˆ ¡ dkdd„ ¡ t ˆjˆ j  kozˆjkn  ‡ ‡‡fdd„¡ ˆ j}ˆj‰|d ‰|d ‰t ˆd ˆkoÆˆd ˆk‡‡‡fd	d„¡ ˆ ˆ  ¡ ¡S )
Nr   rm   rŠ   rK   c                   S   s   dS ©Nzbatch1 must be a 3D tensorr)   r)   r)   r)   r*   r9   ¼  r:   zmeta_baddbmm.<locals>.<lambda>c                   S   s   dS ©Nzbatch2 must be a 3D tensorr)   r)   r)   r)   r*   r9   ½  r:   c                      s   dˆj › dˆ j › dˆj › �S )Nz+Input dtypes must be the same, got: input: z
, batch1: z
, batch2: r>   r)   )Úbatch1Úbatch2rF   r)   r*   r9   À  r:   c                	      s&   dˆ› dˆ› dˆ d › dˆ d › d�	S ©Nz@Expected size for first two dimensions of batch2 tensor to be: [rˆ  z] but got: [r   rm   ú].r)   r)   ©Úbatch2_sizesÚbsÚcontraction_sizer)   r*   r9   È  s    )rN   rb  r.   r<   rJ   r5   rE   rD   )	rF   rÍ  rÎ  rÉ  rÊ  Údim1Údim2Zdim3Úbatch1_sizesr)   )rÍ  rÎ  rÒ  rÓ  rÔ  rF   r*   Úmeta_baddbmmµ  s&    


þþrØ  c                C   s   t  | ¡ ¡ S r$   ©r.   rV   ra   )rF   r�   r)   r)   r*   Úmeta_bernoulliÐ  s    rÚ  ç      à?c                 C   s   | S r$   r)   ©rF   rÄ  r�   r)   r)   r*   Úmeta_bernoulli_×  s    rÝ  c                 C   s   t  | ¡ ¡ S r$   rÙ  rÜ  r)   r)   r*   Úmeta_bernoulli_pÜ  s    rÞ  c                 C   s6   t  |
|  ¡ k dd„ ¡ t j| t jd�}t  | ¡|fS )Nc                   S   s   dS )NzJError in fused_moving_avg_obs_fake_quant_cpu: ch_axis must be < self.dim()r)   r)   r)   r)   r*   r9   ô  r:   z6meta__fused_moving_avg_obs_fq_helper.<locals>.<lambda>r>   )r.   r<   rJ   rV   Úbool)rF   Zobserver_onZfake_quant_onZrunning_minZrunning_maxÚscaleZ
zero_pointZaveraging_constZ	quant_minZ	quant_maxZch_axisZper_row_fake_quantZsymmetric_quantÚmaskr)   r)   r*   Ú$meta__fused_moving_avg_obs_fq_helperâ  s    
þrâ  c                    sT   t  ˆ ¡ dkoˆ  ¡ dk‡ ‡fdd„¡ ‡ ‡fdd„}t  ˆ ¡ ˆ  ¡ k|¡ d S )Nrm   c                      s   dˆ  ¡ › dˆ   ¡ › d�S )Nz1D tensors expected, but got zD and z	D tensorsrI   r)   ©rP   rF   r)   r*   r9   ý  r:   zdot_check.<locals>.<lambda>c                	      s.   dˆ  ¡ › dˆ   ¡ › dˆ  ¡ › dˆ   ¡ › d�	S )Nz+inconsistent tensor size, expected tensor [z] and src [z.] to have thesame number of elements, but got rL   z elements respectively©rC   r)   rã  r)   r*   Únumel_error   s    ,ÿzdot_check.<locals>.numel_error)r.   r<   rJ   rC   )rF   rP   rå  r)   rã  r*   Ú	dot_checkú  s    þræ  c                 C   s   t | |ƒ |  d¡S r»   )ræ  rD   )rF   r¦   r)   r)   r*   Úmeta_dot	  s    
rç  c                    sn   t  |  ¡ dkdd„ ¡ t  | ¡ dkdd„ ¡ | j\‰‰ |j\‰‰t  ˆ ˆk‡ ‡‡‡fdd„¡ |  ˆˆ¡S )NrŠ   c                   S   s   dS )Nza must be 2Dr)   r)   r)   r)   r*   r9     r:   zmeta_mm.<locals>.<lambda>c                   S   s   dS )Nzb must be 2Dr)   r)   r)   r)   r*   r9     r:   c                	      s   dˆ› dˆ › dˆ› dˆ› d�	S )Nz/a and b must have same reduction dim, but got [rˆ  z] X [rÐ  r)   r)   ©ZM1ZM2ÚNr8  r)   r*   r9     r:   )r.   r<   rJ   rE   rD   ©ÚaÚbr)   rè  r*   Úmeta_mm  s    

þrí  c                    s0   |r"t ‡ ‡fdd„tˆjƒD ƒƒS t ˆjˆ ¡S )Nc                 3   s$   | ]}|ˆ krˆj | nd V  qdS )rm   Nr2  ©rd   rƒ   ©ÚdimsrF   r)   r*   rg    s     z+_compute_reduction_shape.<locals>.<genexpr>)r;   rq   rQ   rŒ   Úcompute_reduction_output_shaperE   )rF   rð  rÃ   r)   rï  r*   rÁ     s    rÁ   Ústr)r®   c                 C   s   t | tjjƒr| jjS dS d S )NrX  )rÚ   r.   Z_subclassesZ
FakeTensorZfake_deviceÚtype)r¦   r)   r)   r*   rY  '  s    rY  )Úinput_tensorÚweightrs   r…  ÚdilationÚis_transposedÚgroupsÚoutput_paddingc                 C   s  t t t t t t dœdd„}t t t t t t t dœdd„}	|jdd … }
| jdd … }|rb||jd  }n*|jd	 }|jd | | jd krŒtd
ƒ‚| jd	 |g}t|tƒr´|gt|ƒ }nt|ƒdkrÒ|d	 gt|ƒ }t|tƒrì|gt|ƒ }n t|ƒdk�r|d	 gt|ƒ }t|tƒ�r(|gt|ƒ }n t|ƒdk�rH|d	 gt|ƒ }d }|�r”t|tƒ�rn|gt|ƒ }n&t|ƒdk�r�|d	 gt|ƒ }n|}tt|ƒƒD ]h}|�rÜ| |	|| || || |
| || || ƒ¡ n*| ||| || || |
| || ƒ¡ �q |S )N)ÚlnrÄ  r}   r<  Úsr®   c                 S   s$   | d|  ||d   d | d S )a�  
        Formula to apply to calculate the length of some dimension of the output

        See: https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html

        Args:
            ln: length of the dimension
            p: padding in that dim
            d: dilation in that dim
            k: kernel size in that dim
            s: stride in that dim
        Returns:
            The output length
        rŠ   rm   r)   )rú  rÄ  r}   r<  rû  r)   r)   r*   Ú_formula8  s    z+calc_conv_nd_return_shape.<locals>._formula)rú  rÄ  r}   r<  rû  r&   r®   c                 S   s(   | d | d|  ||d   | d S )aü  
        Formula to apply to calculate the length of some dimension of the output
        if transposed convolution is used.
        See: https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d.html

        Args:
            ln: length of the dimension
            p: padding in that dim
            d: dilation in that dim
            k: kernel size in that dim
            s: stride in that dim
            op: output padding in that dim

        Returns:
            The output length
        rm   rŠ   r)   )rú  rÄ  r}   r<  rû  r&   r)   r)   r*   Ú_formula_transposedI  s    z6calc_conv_nd_return_shape.<locals>._formula_transposedrŠ   rm   r   zInvalid channel dimensions)r/  rE   ÚRuntimeErrorrÚ   r   ro   rq   rr   )rô  rõ  rs   r…  rö  r÷  rø  rù  rü  rý  Úkernel_sizerð  Zout_channelsZ	ret_shapeZoutput_padding_listrƒ   r)   r)   r*   Úcalc_conv_nd_return_shape.  sZ    



úÿ"ÿr   c                 C   s   t j | ¡t jkS r$   ©r.   Ú_prims_commonÚsuggest_memory_formatÚchannels_last©Útenr)   r)   r*   Úis_channels_last“  s    r  )	rô  rõ  Úbiasrs   r…  rö  r÷  rù  rø  c	              	      sH   ‡ ‡fdd„}	t ˆ ˆ||||||r&|nd ƒ}
ˆ  |
¡}|j|	ƒ d�}|S )Nc                      s^   t ˆ ƒdkr$tˆ ƒstˆƒr2tjS ntˆ ƒr2tjS ˆ jtjd�rFtjS ˆ jtjd�rZtjS d S ©NrX  r¯   )rY  r  r.   r  rr  r±   Úpreserve_formatr)   ©rô  rõ  r)   r*   Úpick_memory_format£  s    z%meta_conv.<locals>.pick_memory_formatr¯   )r   rD   rŸ   )rô  rõ  r  rs   r…  rö  r÷  rù  rø  r  Ú	shape_outry   r)   r  r*   Ú	meta_conv—  s    
ø
r  Úmkldnnc
              	   C   s6   t | ||||d|g ƒ}
|  |
¡}tj}|j|d�}|S )NFr¯   )r   rD   r.   r  rŸ   )rô  rõ  r  r…  rs   rö  rø  ÚattrÚscalarsÚ	algorithmr  ry   Zout_memory_formatr)   r)   r*   Úmeta_mkldnn_convolution_defaultÄ  s           ÿ
r  c                 C   s    |   | jd d… |jd f˜¡S ©NrH   r   ©rD   rE   )rô  rõ  r  r  r  r  r)   r)   r*   Úmeta_linear_pointwise_defaultÙ  s    r  Úmklc                 C   s    |   | jd d… |jd f˜¡S r  r  )rô  Zpacked_weightZorig_weightr  r‚   r)   r)   r*   Úmeta_mkl_linearä  s    ÿr  Úonednnc              	   C   s@   t | ||||	d|
d ƒ}| j||r&tjnd d�}|jtjd�}|S )NFr>   r¯   )r   rD   r.   Úfloat32rŸ   r  )rh   Úx_scaleÚx_zpÚwÚw_scaleÚw_zpr  rs   r…  rö  rø  Úoutput_scaleÚoutput_zero_pointÚfp32_outputr  r  r  r  ry   r)   r)   r*   Úmeta_qconv2d_pointwiseô  s    ø
r#  c                 C   s4   t | jƒ}|jd |d< | j||	r(tjnd d�}|S )Nr   rH   r>   )rp   rE   rD   r.   r  )rh   r  r  r  r  r  r  r   r!  r"  Zpost_op_nameZpost_op_argsZpost_op_algorithmrÄ   ry   r)   r)   r*   Úmeta_qlinear_pointwise  s    
r$  c                    s4   t  ˆ ¡ ˆ koˆjˆ ˆk‡ ‡‡‡fdd„¡ d S )Nc                      s8   dˆ › dˆ› dˆ› d�dˆ  ¡ › dˆ› dˆjˆ › � S )NzExpected a tensor of dimension z and tensor.size[z] == rˆ  zbut got : dimension z] = ©rJ   rE   r)   ©rJ   Údim_sizerN   r¦   r)   r*   r9   0  s   ÿz check_dim_size.<locals>.<lambda>)r.   r<   rJ   rE   )r¦   rJ   r'  rN   r)   r&  r*   Úcheck_dim_size-  s    þr(  r)   rn   c                 C   sd  dd„ }|d|ƒ\}}	t  t|ƒdkdd„ ¡ t|ƒdkrF||	 }
}n.t|ƒdkrf|d |d  }
}n|d	|ƒ\}
}|d
|ƒ\}}t  |d kp”|dkdd„ ¡ |  ¡ dkr´|  d¡nd}|  d¡}|  d¡}|  d¡}t||||
d|ƒ}t||	||d|ƒ}t | ¡}t| ||	|
|||dd||||||ƒ |  ¡ dk�rB|||g}n||||g}t j	|| j
| j|d�S )Nc                    sD   t  t|ƒdk‡ fdd„¡ |d }t|ƒdkr4|n|d }||fS )N©rm   rŠ   c                      s   dˆ › d�S )Nzavg_pool2d: ú4 must either be a single int, or a tuple of two intsr)   r)   ©rì   r)   r*   r9   B  r:   z1meta_avg_pool2d.<locals>.unpack.<locals>.<lambda>r   rm   ©r.   r<   ro   ©rì   rÎ   ÚHÚWr)   r+  r*   Úunpack?  s    

þzmeta_avg_pool2d.<locals>.unpackrÿ  ©r   rm   rŠ   c                   S   s   dS ©NzOavg_pool2d: stride must either be omitted, a single int, or a tuple of two intsr)   r)   r)   r)   r*   r9   K  r:   z!meta_avg_pool2d.<locals>.<lambda>r   rm   rs   r…  c                   S   s   dS ©Nzdivisor must be not zeror)   r)   r)   r)   r*   r9   X  r:   r¦  éüÿÿÿéýÿÿÿrç   rH   rK   ©r5   r\   r°   )r.   r<   ro   rJ   rN   Úpooling_output_shaperŒ   r  Úpool2d_shape_checkr]   r5   r\   )r�   rÿ  rs   r…  Ú	ceil_modeÚcount_include_padÚdivisor_overrider0  ÚkHÚkWÚdHÚdWÚpadHÚpadWr“  ÚnInputPlaneÚinputHeightÚ
inputWidthÚoutputHeightÚoutputWidthr°   rN   r)   r)   r*   Úmeta_avg_pool2d5  sb    
	
þþ



ñürG  c                 C   sj   t | ||||||dd|	|
||||ƒ |  ¡ }|	}t|||d |ƒ t|||d |ƒ t|||d |ƒ d S )Nrm   rK   rŠ   )r8  rJ   r(  )r�   Z
gradOutputr“  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  Ú
mem_formatrQ   ÚnOutputPlaner)   r)   r*   Úavg_pool2d_backward_shape_checkƒ  s,    ñrJ  c                 C   s¶  t  t|ƒdkpt|ƒdkdd„ ¡ |d }t|ƒdkr<|n|d }	t  t|ƒdkpjt|ƒdkpjt|ƒdkdd„ ¡ t|ƒdkr„|n|d }
t|ƒdkrœ|	nt|ƒdkr¬|
n|d }t  t|ƒdkpÎt|ƒdkdd„ ¡ |d }t|ƒdkrð|n|d }t  |d k�p|dkdd„ ¡ |j}| ¡ d	k�r2|d
 nd}|d }|d }|d }t||||
d|ƒ}t||	||d|ƒ}t |¡}t|| |||	|
|||||||||ƒ t j	||j
|j|d�S )Nrm   rŠ   c                   S   s   dS )NzKavg_pool2d: kernel_size must either be a single int, or a tuple of two intsr)   r)   r)   r)   r*   r9   ½  r:   z*meta_avg_pool2d_backward.<locals>.<lambda>r   c                   S   s   dS r2  r)   r)   r)   r)   r*   r9   Ã  r:   c                   S   s   dS )NzGavg_pool2d: padding must either be a single int, or a tuple of two intsr)   r)   r)   r)   r*   r9   É  r:   c                   S   s   dS r3  r)   r)   r)   r)   r*   r9   Ð  r:   r¦  r4  r5  rç   rH   r6  )r.   r<   ro   rE   rJ   r7  rŒ   r  rJ  r]   r5   r\   )ZgradOutput_r�   rÿ  rs   r…  r9  r:  r;  r<  r=  r>  r?  r@  rA  Ú
input_sizer“  rB  rC  rD  rE  rF  rH  r)   r)   r*   Úmeta_avg_pool2d_backward¯  sj    þ"þ(þþ
ñürL  c                 C   s  t  t|ƒdkdd„ ¡ |d }t|ƒdkr0|n|d }t|ƒdkrH|n|d }	t  | pdt|ƒdkdd„ ¡ |sv|n|d }
|s†|nt|ƒdkr–|
n|d }|s¦|	nt|ƒdkr¶|
n|d }t  t|ƒdkdd„ ¡ |d }t|ƒdkrî|n|d }t|ƒdk�r|n|d }t  | jd	kd
d„ ¡ t  | �p8|dkdd„ ¡ |  d¡}|  d¡}|  d¡}|  d¡}|  d¡}t||||
d|ƒ}t||||d|ƒ}t||	||d|ƒ}t| ||||	|
|||||ddd||||||ddd� | jdk�rü|  ||||f¡S |  |||||f¡S d S )N©rm   rK   c                   S   s   dS ©NzFavg_pool3d: kernel_size must be a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   	  r:   z!meta_avg_pool3d.<locals>.<lambda>r   rm   rŠ   c                   S   s   dS ©NzJavg_pool3d: stride must be omitted, a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   	  r:   c                   S   s   dS ©NzBavg_pool3d: padding must be a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   	  r:   ©r¦  r·  c                   S   s   dS ©Nz9non-empty 4D or 5D (batch mode) tensor expected for inputr)   r)   r)   r)   r*   r9   	  r:   c                   S   s   dS r3  r)   r)   r)   r)   r*   r9   "	  r:   r4  r5  rç   rH   zavg_pool3d()T)Úcheck_input_sizer¦  )r.   r<   ro   rQ   rN   r7  Úpool3d_shape_checkrD   )r�   rÿ  rs   r…  r9  r:  r;  ÚkTr<  r=  ÚdTr>  r?  ÚpadTr@  rA  r“  ÚnslicesÚitimeÚiheightÚiwidthÚotimeÚoheightÚowidthr)   r)   r*   Úmeta_avg_pool3dø  s€    
þþ  
þþþ




êr_  c                 C   sØ  t  t|ƒdkdd„ ¡ |d }t|ƒdkr0|n|d }	t|ƒdkrH|n|d }
t  | pdt|ƒdkdd„ ¡ |sv|n|d }|s†|	nt|ƒdkr–|n|d }|s¦|
nt|ƒdkr¶|n|d }t  t|ƒdkdd„ ¡ |d }t|ƒdkrî|n|d }t|ƒdk�r|n|d }t  |jd	kd
d„ ¡ t  | �p8|dkdd„ ¡ | d¡}| d¡}| d¡}| d¡}t||||d|ƒ}t||	||d|ƒ}t||
||d|ƒ}t|| |||	|
||||||||||||dƒ | |j¡S )NrM  c                   S   s   dS rN  r)   r)   r)   r)   r*   r9   \	  r:   z*meta_avg_pool3d_backward.<locals>.<lambda>r   rm   rŠ   c                   S   s   dS rO  r)   r)   r)   r)   r*   r9   d	  r:   c                   S   s   dS rP  r)   r)   r)   r)   r*   r9   l	  r:   rQ  c                   S   s   dS rR  r)   r)   r)   r)   r*   r9   t	  r:   c                   S   s   dS r3  r)   r)   r)   r)   r*   r9   y	  r:   r4  r5  rç   rH   zavg_pool3d_backward())	r.   r<   ro   rQ   rN   r7  Úavg_pool3d_backward_shape_checkrD   rE   )r   r�   rÿ  rs   r…  r9  r:  r;  rU  r<  r=  rV  r>  r?  rW  r@  rA  rX  rY  rZ  r[  Zotime_for_shape_checkZoheight_for_shape_checkZowidth_for_shape_checkr)   r)   r*   Úmeta_avg_pool3d_backwardN	  st    
þþ  
þþþ



íra  c                    sZ   t  ˆ jdkpˆ jdk‡ fdd„¡ ˆ jd d… t|ƒ }t ˆ ¡}t j|ˆ jˆ j	|d�S )NrK   r¦  c                      s   dˆ j › �S )Nz"Expected 3D or 4D tensor, but got r2  r)   rW   r)   r*   r9   ¢	  r:   z*meta_adaptive_avg_pool2d.<locals>.<lambda>rç   r6  )
r.   r<   rQ   rE   r;   rŒ   r  r]   r5   r\   )rF   Úoutput_sizerÄ   r°   r)   rW   r*   Úmeta_adaptive_avg_pool2dž	  s    
þ
ürc  c                    s@   t  ˆ jdkpˆ jdk‡ fdd„¡ ˆ  ˆ jd d… t|ƒ ¡S )Nr¦  r·  c                      s   dˆ j › �S )Nz"Expected 4D or 5D tensor, but got r2  r)   rW   r)   r*   r9   ´	  r:   z*meta_adaptive_avg_pool3d.<locals>.<lambda>r5  )r.   r<   rQ   rD   rE   r;   )rF   rb  r)   rW   r*   Úmeta_adaptive_avg_pool3d°	  s
    
þrd  c                    sœ   ˆ j }td|ƒD ]$‰t ˆ  ˆ¡dk‡ ‡fdd„¡ qt |dkpH|dk‡fdd„¡ t ˆjˆ jk‡ ‡fdd„¡ tj}tˆƒrˆtj}ˆ 	ˆj
¡j|d	�S )
Nrm   r   c                      s   dˆ j › dˆ› d�S )Nz{adaptive_avg_pool2d_backward(): Expected grad_output to have non-zero                       size for non-batch dimensions, ú with dimension ú being emptyr2  r)   )Úgrad_outrƒ   r)   r*   r9   ¿	  s   ÿÿz4meta__adaptive_avg_pool2d_backward.<locals>.<lambda>rK   r¦  c                      s   dˆ j › �S )NzBadaptive_avg_pool2d_backward(): Expected 3D or 4D tensor, but got r2  r)   rW   r)   r*   r9   Ä	  r:   c                      s   dˆj › dˆ j › �S ©Nzexpected dtype z! for `grad_output` but got dtype r>   r)   )rg  rF   r)   r*   r9   È	  r:   r¯   )rQ   rq   r.   r<   rN   r5   r±   r  r  rD   rE   rŸ   )rg  rF   rQ   r°   r)   )rg  rƒ   rF   r*   Ú"meta__adaptive_avg_pool2d_backward¹	  s$    þ
þ
þri  c                 C   s   t | dƒ tj|tjd�S )NZadaptive_avg_pool3d_backwardr¯   )Ú!_adaptive_pool_empty_output_checkr.   rV   r  ©r   rF   r)   r)   r*   Ú"meta__adaptive_avg_pool3d_backwardÐ	  s    
rl  )r   r÷   c                    s<   ˆj }td|ƒD ]&‰t ˆ ˆ¡dk‡ ‡‡fdd„¡ qd S )Nrm   r   c                      s   ˆ › dˆj › dˆ› d�S )Nzc(): Expected grad_output to have non-zero size for non-batch dimensions, but grad_output has sizes re  rf  r2  r)   ©r÷   r   rƒ   r)   r*   r9   Ü	  s    z3_adaptive_pool_empty_output_check.<locals>.<lambda>)rQ   rq   r.   r<   rN   )r   r÷   rQ   r)   rm  r*   rj  ×	  s    þrj  ry   c                    s&  ˆj }t |dk‡fdd„¡ td|ƒD ]$‰ t ˆ ˆ ¡dk‡ ‡fdd„¡ q(t t|ƒdkdd„ ¡ d}d}d}ˆj d	krŽˆ d¡}|d7 }ˆ |d ¡}|\}}ˆj d
krÚ|||f}ˆ |¡}	ˆj|tjd�}
|	|
fS ||||f}t 	ˆ¡}ˆ |¡j
|d�}	ˆj|tjd�j
|d�}
|	|
fS d S )N©rK   r¦  c                      s   dˆ j › �S )Nz:adaptive_max_pool2d(): Expected 3D or 4D tensor, but got: r2  r)   ©r�   r)   r*   r9   é	  r:   z*meta_adaptive_max_pool2d.<locals>.<lambda>rm   r   c                      s   dˆj › dˆ › d�S )Nzjadaptive_max_pool2d(): Expected input to have non-zero size for non-batch dimensions, but input has sizes re  rf  r2  r)   ©rƒ   r�   r)   r*   r9   î	  s    rŠ   c                   S   s   dS )NzCadaptive_max_pool2d(): internal error: output_size.size() must be 2r)   r)   r)   r)   r*   r9   ö	  r:   r¦  rK   r>   r¯   )rQ   r.   r<   rq   rN   ro   rD   r^   rŒ   r  rŸ   )r�   rb  rQ   ZdimHÚsizeBÚsizeDÚosizeHÚosizeWrR   ry   rZ   r°   r)   rp  r*   Úmeta_adaptive_max_pool2dã	  sD    
þþ
þ





ÿru  c                    sd   ˆ j }t |dk‡ fdd„¡ tˆ dƒ t ˆjˆ jk‡ ‡fdd„¡ t ˆ¡}ˆ ˆj¡j	|d�S )Nrn  c                      s   dˆ j › �S )NzKadaptive_max_pooling2d_backward(): Expected 3D or 4D grad_output, but got: r2  r)   ©r   r)   r*   r9   
  r:   z3meta_adaptive_max_pool2d_backward.<locals>.<lambda>Úadaptive_max_pool2d_backwardc                      s   dˆj › dˆ j › �S rh  r>   r)   ©r   r�   r)   r*   r9    
  r:   r¯   )
rQ   r.   r<   rj  r5   rŒ   r  rD   rE   rŸ   )r   r�   rZ   rQ   r°   r)   rx  r*   Ú!meta_adaptive_max_pool2d_backward
  s    
þ

þ
ry  c                    sæ   ˆj }t |dk‡fdd„¡ td|ƒD ]$‰ t ˆ ˆ ¡dk‡ ‡fdd„¡ q(t t|ƒdkdd„ ¡ d}d}d}|d	krŒˆ d¡}|d7 }ˆ |¡}|\}}}|d
kr¶||||f}	n|||||f}	ˆ |	¡}
ˆj|	tjd�}|
|fS )NrQ  c                      s   dˆ j › �S )Nz:adaptive_max_pool3d(): Expected 4D or 5D tensor, but got: r2  r)   ro  r)   r*   r9   -
  r:   z*meta_adaptive_max_pool3d.<locals>.<lambda>rm   r   c                      s   dˆj › dˆ › d�S )Nzjadaptive_max_pool3d(): Expected input to have non-zero size for non-batch dimensions, but input has sizes re  rf  r2  r)   rp  r)   r*   r9   2
  s    rK   c                   S   s   dS )NzCadaptive_max_pool3d(): internal error: output_size.size() must be 3r)   r)   r)   r)   r*   r9   :
  r:   r·  r¦  r>   )rQ   r.   r<   rq   rN   ro   rD   r^   )r�   rb  rQ   ZdimDrq  rr  ZosizeTrs  rt  rR   ry   rZ   r)   rp  r*   Úmeta_adaptive_max_pool3d'
  s8    
þþ
þ



rz  c                 C   s   t | dƒ | |j¡S )NÚadaptive_max_pool3d_backward)rj  rD   rE   )r   r�   rZ   r)   r)   r*   Ú!meta_adaptive_max_pool3d_backwardS
  s    
r|  c                 C   s   |d krt dƒ‚|  |¡S )Nz:cannot repeat_interleave a meta tensor without output_size)rþ  rD   )Úrepeatsrb  r)   r)   r*   Úmeta_repeat_interleave_TensorZ
  s    r~  c                 C   s:   | j jst‚|j jst‚t| j|jƒ}| j|t| j ƒd�S r¾   )r5   r‹   r†   r   rE   rD   r   )ÚrealÚimagrR   r)   r)   r*   Úmeta_complexa
  s    r�  c                 C   s   t  | ¡ |¡S r$   )rŒ   Úclone_preserve_stridesrŸ   )rF   r5   r)   r)   r*   Ú
view_dtypej
  s    rƒ  c                 C   sx   | j st | |¡S |  ¡ rH| ¡ r6t | ¡ |  ¡ ¡S t |  ¡ |¡S n| ¡ rdt | | ¡ ¡ ¡ S t| |ƒ |  d¡S r»   )r…   r.   Údotrs  ÚvdotrB  ræ  rD   ©rF   rP   r)   r)   r*   r…  o
  s    
r…  )Ú
fill_value)rN   r‡  c                C   s   | j ||  ¡ ftjd�S r¾   )rD   rJ   r.   rA   )rF   rN   r‡  r)   r)   r*   Únonzero_static€
  s    rˆ  c              
      s¬  t  tˆƒdd„ ¡ g }tˆƒD ]â\‰ ‰ˆd k	røt  ˆjt jt jt jt jfkdd„ ¡ ˆjt jt jfkrìˆ ¡ }t	|ƒ‰t  
ˆˆj ˆjk‡fdd„¡ tˆjƒD ]F‰t  
ˆjˆ ˆjˆˆ  k‡ ‡‡‡‡fdd„¡ | | dˆ¡¡ q¢n
| ˆ¡ q | ˆ¡ q |‰t  t	ˆƒˆjk‡‡fdd„¡ dd lm} t|jˆŽ ƒ‰t	ˆƒˆjk �r`ˆ d ¡ �qBd}d	}ˆD ]J‰|dk�rŠˆd k	�r´d}n*|dk�r¤ˆd k�r´d
}nˆd k	�rl �q¼�qld}|�s<g }g }tˆƒD ](\‰ ‰ˆd k	�rÒ| ˆ ¡ | ˆ¡ �qÒtˆƒD ](\‰ ‰ˆd k�r| ˆ ¡ | ˆ¡ �qˆ |¡‰|‰g }	g }
g }tˆƒD ]H\}‰ˆd k�rŒ|�rz|
 ˆj| ¡ n|	 ˆj| ¡ n
tˆjƒ}�qPˆ |	| |
 ¡S )Nc                   S   s   dS )Nz#at least one index must be providedr)   r)   r)   r)   r*   r9   ‡
  r:   z#meta_index_Tensor.<locals>.<lambda>c                   S   s   dS )Nz?tensors used as indices must be long, int, byte or bool tensorsr)   r)   r)   r)   r*   r9   �
  r:   c                      s   dˆ j › �S )Nú)too many indices for tensor of dimension r  r)   rW   r)   r*   r9   –
  r:   c                	      s$   dˆj › dˆ › dˆj › dˆˆ › �S )NzThe shape of the mask z
 at index z0 does not match the shape of the indexed tensor r2  r)   )rƒ   r@   Újr<  rF   r)   r*   r9   ›
  r:   rm   c                      s   dˆj › dtˆ ƒ› d�S )Nr‰  z (got rü   )rQ   ro   r)   )rZ   rF   r)   r*   r9   ¦
  r:   r   FrŠ   T)r.   r<   rß  Ú	enumerater5   rA   r/  Úint8Únonzeroro   rB   rQ   rq   rE   rr   ÚselectÚtorch._refsZ_refsrp   r   ru   rD   )rF   rZ   rÿ   r�  ÚrefsÚstateZhas_contiguous_subspacerð  Ztransposed_indicesZbefore_shapeZafter_shapeZreplacement_shaperJ   r)   )rƒ   r@   rZ   rŠ  r<  rF   r*   Úmeta_index_Tensor…
  s†    þ
þþþ











r’  c                 C   sT   d }d }d }|
d r"|   | ¡ ¡}|
d r8|   | ¡ ¡}|
d rJ|   |¡}|||fS )Nr   rm   rŠ   )rD   rN   )Zgrad_output_Zinput_Zweight_Zbias_sizes_optrs   r…  rö  Z
transposedrù  rø  Úoutput_maskZbackend_grad_inputZbackend_grad_weightZbackend_grad_biasr)   r)   r*   Úmeta_convolution_backwardé
  s    
r”  c                   sÔ   ˆ   d¡}ˆ  d¡}|  ||f¡} t ˆ  ¡ dkdd„ ¡ t ˆ ¡ dkdd„ ¡ t ˆ   d¡ˆ  d¡k‡ ‡fdd„¡ t ˆ   d¡ˆ  d¡k‡ ‡fd	d„¡ t |   d¡|ko¼|   d¡|kd
d„ ¡ |  |   ¡ ¡S )Nrm   rŠ   rK   c                   S   s   dS rË  r)   r)   r)   r)   r*   r9     r:   zmeta_addbmm.<locals>.<lambda>c                   S   s   dS rÌ  r)   r)   r)   r)   r*   r9     r:   r   c                      s   dˆ   d¡› dˆ  d¡› �S )Nz8batch1 and batch2 must have same number of batches, got r   rL   rM   r)   ©rÍ  rÎ  r)   r*   r9     r:   c                
      s6   dˆ   d¡› dˆ   d¡› dˆ  d¡› dˆ  d¡› d�	S )Nz#Incompatible matrix sizes for bmm (rm   rh   rŠ   rL   rü   rM   r)   r•  r)   r*   r9     s    c                   S   s   dS )Nz.self tensor does not match matmul output shaper)   r)   r)   r)   r*   r9     r:   )rN   rb  r.   r<   rJ   rD   )rF   rÍ  rÎ  rÉ  rÊ  rÕ  rÖ  r)   r•  r*   Úmeta_addbmm  s$    

þþþr–  c                    s   t  tˆ tƒ‡ fdd„¡ d S )Nc                      s   dt ˆ ƒ› �S ©NzExpect List[Tensor] but got ©ró  r)   rW   r)   r*   r9   ,  r:   z&meta__foreach_unaop_.<locals>.<lambda>©r.   r<   rÚ   r   rW   r)   rW   r*   Úmeta__foreach_unaop_!  s    	
þrš  c                    s(   t  tˆ tƒ‡ fdd„¡ dd„ ˆ D ƒS )Nc                      s   dt ˆ ƒ› �S r—  r˜  r)   rW   r)   r*   r9   ;  r:   z%meta__foreach_unaop.<locals>.<lambda>c                 S   s   g | ]}t  |¡‘qS r)   ©r.   rV   ©rd   rû  r)   r)   r*   rf   =  s     z'meta__foreach_unaop.<locals>.<listcomp>r™  rW   r)   rW   r*   Úmeta__foreach_unaop0  s
    	
þr�  c                    sX   t  tˆtƒotˆ tƒ‡ ‡fdd„¡ t  tˆƒdkoDtˆƒtˆ ƒk‡ ‡fdd„¡ d S )Nc                      s   dt ˆƒ› dt ˆ ƒ› d�S )Nz9The first two arguments of must be List[Tensor], but got rL   Ú.r˜  r)   rã  r)   r*   r9   C  s    z3_check_foreach_binop_tensor_lists.<locals>.<lambda>r   c                      s   dt ˆƒ› dt ˆ ƒ› d�S )Nz>self and other must be non-empty and match in length, but got rL   rž  r„  r)   rã  r)   r*   r9   J  s    )r.   r<   rÚ   r   ro   r†  r)   rã  r*   Ú!_check_foreach_binop_tensor_lists@  s    þþrŸ  c                 C   s   t | |ƒ dd„ | D ƒS )Nc                 S   s   g | ]}t  |¡‘qS r)   r›  rœ  r)   r)   r*   rf   ]  s     z,meta__foreach_binop_list.<locals>.<listcomp>©rŸ  ©rF   rP   rÊ  r)   r)   r*   Úmeta__foreach_binop_listQ  s    
r¢  c                 C   s   t | |ƒ d S r$   r   r¡  r)   r)   r*   Úmeta__foreach_binop__list`  s    r£  c                    s   t  tˆ tƒ‡ fdd„¡ d S )Nc                      s   dt ˆ ƒ› d�S ©Nz4The first argument of must be List[Tensor], but got rž  r˜  r)   rW   r)   r*   r9   y  r:   z-meta__foreach_binop__scalar.<locals>.<lambda>r™  ©rF   Úscalarr)   rW   r*   Úmeta__foreach_binop__scalarn  s    	
þr§  c                    s(   t  tˆ tƒ‡ fdd„¡ dd„ ˆ D ƒS )Nc                      s   dt ˆ ƒ› d�S r¤  r˜  r)   rW   r)   r*   r9   ˆ  r:   z,meta__foreach_binop_scalar.<locals>.<lambda>c                 S   s   g | ]}t  |¡‘qS r)   r›  rœ  r)   r)   r*   rf   Š  s     z.meta__foreach_binop_scalar.<locals>.<listcomp>r™  r¥  r)   rW   r*   Úmeta__foreach_binop_scalar}  s
    	
þr¨  c                    st   t  tdd„ ˆ ˆˆfD ƒƒ‡ ‡‡fdd„¡ t  tˆ ƒdkdd„ ¡ t  tˆ ƒtˆƒkoftˆ ƒtˆƒkdd„ ¡ d S )Nc                 s   s   | ]}t |tƒV  qd S r$   ©rÚ   r   ©rd   Úlr)   r)   r*   rg  •  s     z/meta__foreach_addcop__scalar.<locals>.<genexpr>c                      s"   dt ˆ ƒ› dt ˆƒ› dt ˆƒ› �S )Nz?All arguments of _foreach_addc*_ must be List[Tensor], but got rˆ  ú, and r˜  r)   ©rF   Útensor1Útensor2r)   r*   r9   –  s    z.meta__foreach_addcop__scalar.<locals>.<lambda>r   c                   S   s   dS ©Nz$input tensor list must not be empty.r)   r)   r)   r)   r*   r9   ›  r:   c                   S   s   dS ©Nz0All input tensor lists must have the same lengthr)   r)   r)   r)   r*   r9   ž  r:   ©r.   r<   rk  ro   ©rF   r®  r¯  r¦  r)   r­  r*   Úmeta__foreach_addcop__scalar�  s    þþr´  c                 C   s   t | |ƒ d S r$   r   )rF   rP   r¦  r)   r)   r*   Úmeta__foreach_lerp__scalar¢  s    rµ  c                    s~   t  tdd„ ˆ ˆˆfD ƒƒ‡ ‡‡fdd„¡ t  tˆ ƒdkdd„ ¡ t  tˆ ƒtˆƒkoftˆ ƒtˆƒkdd„ ¡ dd	„ ˆ D ƒS )
Nc                 s   s   | ]}t |tƒV  qd S r$   r©  rª  r)   r)   r*   rg  ³  s     z.meta__foreach_addcop_scalar.<locals>.<genexpr>c                      s"   dt ˆ ƒ› dt ˆƒ› dt ˆƒ› �S )Nz,All arguments must be List[Tensor], but got rˆ  r¬  r˜  r)   r­  r)   r*   r9   ´  s    z-meta__foreach_addcop_scalar.<locals>.<lambda>r   c                   S   s   dS r°  r)   r)   r)   r)   r*   r9   ¹  r:   c                   S   s   dS r±  r)   r)   r)   r)   r*   r9   ¼  r:   c                 S   s   g | ]}t  |¡‘qS r)   r›  rœ  r)   r)   r*   rf   ¿  s     z/meta__foreach_addcop_scalar.<locals>.<listcomp>r²  r³  r)   r­  r*   Úmeta__foreach_addcop_scalar«  s    þþr¶  c                    s(   t  tˆ tƒ‡ fdd„¡ dd„ ˆ D ƒS )Nc                      s   dt ˆ ƒ› �S ©Nz'exponent must be a tensor list but got r˜  r)   ©Úexponentr)   r*   r9   Æ  r:   z5meta__foreach_pow_scalar_and_tensor.<locals>.<lambda>c                 S   s   g | ]}t  |¡‘qS r)   r›  )rd   Úer)   r)   r*   rf   È  s     z7meta__foreach_pow_scalar_and_tensor.<locals>.<listcomp>r™  )rF   r¹  r)   r¸  r*   Ú#meta__foreach_pow_scalar_and_tensorÂ  s
    
þr»  c                    s‚   t  tdd„ ˆˆˆfD ƒƒo&tˆ t jƒ‡ ‡‡‡fdd„¡ t  tˆƒdkdd„ ¡ t  tˆƒtˆƒkottˆƒtˆƒkdd„ ¡ d S )Nc                 s   s   | ]}t |tƒV  qd S r$   r©  rª  r)   r)   r*   rg  Î  s     z.meta__foreach_addcop_tensor.<locals>.<genexpr>c                	      s,   dt ˆƒ› dt ˆƒ› dt ˆƒ› dt ˆ ƒ› �S )Nzi_foreach_addc*_ op expects arguments of type: List[Tensor], List[Tensor], List[Tensor], tensor, but got: rˆ  r¬  r˜  r)   ©r  rF   r®  r¯  r)   r*   r9   Ð  s    z-meta__foreach_addcop_tensor.<locals>.<lambda>r   c                   S   s   dS r°  r)   r)   r)   r)   r*   r9   Õ  r:   c                   S   s   dS r±  r)   r)   r)   r)   r*   r9   Ø  r:   )r.   r<   rk  rÚ   r
   ro   )rF   r®  r¯  r  r)   r¼  r*   Úmeta__foreach_addcop_tensorË  s    
ýþr½  c                 C   s   t | |ƒ d S r$   r   )rF   r¡   r¢   r)   r)   r*   Úmeta__foreach_copy_inplaceÜ  s    r¾  )Ú
grad_scaleÚ	found_infc       	            s4   | |||||fD ]‰ t  tˆ tƒ‡ fdd„¡ qd S )Nc                      s   dt ˆ ƒ› �S r·  r˜  r)   ©r«  r)   r*   r9   ÷  r:   z#meta__fused_adam_.<locals>.<lambda>r™  )rF   ÚgradsÚexp_avgsÚexp_avg_sqsÚmax_exp_avg_sqsÚstate_stepsÚlrÚbeta1Úbeta2Úweight_decayÚepsÚamsgradÚmaximizer¿  rÀ  r)   rÁ  r*   Úmeta__fused_adam_á  s
    
þrÎ  c       	            sZ   | |||||fD ]‰ t  tˆ tƒ‡ fdd„¡ qdd„ }|| ƒ||ƒ||ƒ||ƒ||ƒfS )Nc                      s   dt ˆ ƒ› �S r·  r˜  r)   rÁ  r)   r*   r9     r:   z"meta__fused_adam.<locals>.<lambda>c                 S   s   dd„ | D ƒS )Nc                 S   s   g | ]}t  |¡‘qS r)   r›  )rd   ró   r)   r)   r*   rf     s     z=meta__fused_adam.<locals>.empty_like_list.<locals>.<listcomp>r)   )Ztensor_listr)   r)   r*   Úempty_like_list  s    z)meta__fused_adam.<locals>.empty_like_listr™  )rF   rÂ  rÃ  rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  rÊ  rË  rÌ  rÍ  r¿  rÀ  rÏ  r)   rÁ  r*   Úmeta__fused_adamû  s    
þûrÐ  c                    s®   t  ˆ  ¡ dkdd„ ¡ t  ˆ ¡ dkdd„ ¡ t  ˆ jt jk‡ fdd„¡ t  ˆjt jk‡fdd„¡ t  ˆ  d¡ˆ d¡k‡ ‡fd	d„¡ ˆ jˆ  d¡ˆ d¡ft jd
�S )NrŠ   c                   S   s   dS )Nza must be a 2D tensorr)   r)   r)   r)   r*   r9   #  r:   zmeta__int_mm.<locals>.<lambda>c                   S   s   dS )Nzb must be a 2D tensorr)   r)   r)   r)   r*   r9   $  r:   c                      s   dˆ j › �S )Nzexpected self to be int8, got r>   r)   )rë  r)   r*   r9   '  r:   c                      s   dˆ j › �S )Nzexpected mat2 to be int8, got r>   r)   )rì  r)   r*   r9   +  r:   rm   r   c                
      s6   dˆ   d¡› dˆ   d¡› dˆ  d¡› dˆ  d¡› d�	S )Nz'Incompatible matrix sizes for _int_mm (r   rh   rm   rL   rü   rM   r)   rê  r)   r*   r9   /  s    r>   )r.   r<   rJ   r5   rŒ  rN   rD   r  rê  r)   rê  r*   Úmeta__int_mm   s    

þ

þþrÑ  c           	         s  t  ˆ ¡ dk‡fdd„¡ t  ˆ ¡ dk‡fdd„¡ t  ˆ d¡ˆ d¡k‡‡fdd„¡ t  t ˆj¡dd„ ¡ t  t ˆj¡dd„ ¡ t  |d	kd
d„ ¡ t  ˆ dk‡ fdd„¡ ˆ d¡}ˆ d¡}ˆjd d… }ˆjd d… }tt  	||¡ƒ}| 
||g¡ ˆ |¡S )NrŠ   c                      s   dˆ   ¡ › d�S )Nz1cdist only supports at least 2D tensors, X1 got: ÚDrI   r)   )Úx1r)   r*   r9   ;  r:   z$meta_cdist_forward.<locals>.<lambda>c                      s   dˆ   ¡ › d�S )Nz1cdist only supports at least 2D tensors, X2 got: rÒ  rI   r)   )Úx2r)   r*   r9   ?  r:   rH   c                      s   dˆ   d¡› dˆ  d¡› �S )Nz4X1 and X2 must have the same number of columns. X1: rH   z X2: rM   r)   )rÓ  rÔ  r)   r*   r9   C  r:   c                   S   s   dS )Nz=cdist only supports floating-point dtypes, X1 got: {x1.dtype}r)   r)   r)   r)   r*   r9   G  r:   c                   S   s   dS )Nz=cdist only supports floating-point dtypes, X2 got: {x2.dtype}r)   r)   r)   r)   r*   r9   K  r:   r   c                   S   s   dS )Nz)cdist only supports non-negative p valuesr)   r)   r)   r)   r*   r9   M  r:   )Nrm   rŠ   c                      s
   dˆ › �S )Nz%possible modes: None, 1, 2, but was: r)   r)   )Úcompute_moder)   r*   r9   P  r:   rç   )r.   r<   rJ   rN   rŒ   Úis_float_dtyper5   rE   rp   Úbroadcast_shapesÚextendrD   )	rÓ  rÔ  rÄ  rÕ  Úr1Úr2Úbatch_tensor1Úbatch_tensor2rÄ   r)   )rÕ  rÓ  rÔ  r*   Úmeta_cdist_forward7  s@    

þ

þþ
þ
þ
þ

rÝ  c                 C   sÀ   |j d }|j d }|j d }|j d d… }|j d d… }	tt ||	¡ƒ}
|
d d … }| ||g¡ t |
¡}|dksŽ|dksŽ|dksŽ|dkr˜t |¡S |t|j ƒkr°| |¡}tj	|tj
d�S )NrH   rç   r   r¯   )rE   rp   r.   r×  rØ  ÚmathÚprodÚ
zeros_likerb  rV   r±   )rÆ  rÓ  rÔ  rÄ  ZcdistÚc1rÙ  rÚ  rÛ  rÜ  r_  Ztensor1_expand_sizeZbatch_productr)   r)   r*   Úmeta_cdist_backward[  s    



 

râ  c	                    sF  t  ˆ jt jt jfk‡ fdd„¡ t  ˆjt jt jfk‡fdd„¡ t  t ˆj¡‡fdd„¡ ˆ d¡}	|rŠt  |	dkdd„ ¡ |	d8 }	ˆ |	ˆ d¡¡}
t	dƒ\}}}ˆd k	�r"t  ||kd	d„ ¡ t  ˆjˆjk‡‡fd
d„¡ t  ˆj
dk‡fdd„¡ t  ˆ ¡ ˆ  ¡ k‡ ‡fdd„¡ ‡fdd„‰dd„ ‰‡‡fdd„}tˆƒdk�ršˆ  ˆ  d¡¡}ˆ  ˆ ¡ ¡}||k�rŽˆ  |	ˆ d¡¡}n
ˆ  d¡}n |ˆˆ|
|ƒ}|||fk�s¼|�sÎˆ ˆ  d¡¡}n
ˆ d¡}ˆ |	¡}ˆjd }||k�r,|�rt  |dkdd„ ¡ |d8 }ˆ |ˆjd ¡}nˆ | ¡ ¡}|
|||fS )Nc                      s   dˆ j › �S )Nz(expected indices to be long or int, got r>   r)   ©rZ   r)   r*   r9   €  r:   z$meta_embedding_bag.<locals>.<lambda>c                      s   dˆ j › �S )Nz(expected offsets to be long or int, got r>   r)   )Úoffsetsr)   r*   r9   „  r:   c                      s   dˆ j › �S )Nz/expected weight to be floating point type, got r>   r)   )rõ  r)   r*   r9   ˆ  r:   r   rm   c                   S   s   dS ©Nz1include_last_offset: numBags should be at least 1r)   r)   r)   r)   r*   r9   �  r:   rK   c                   S   s   dS )Nz@embedding_bag: per_sample_weights only supported with mode='sum'r)   r)   r)   r)   r*   r9   ™  r:   c                      s   dˆj › dˆ j › d�S )Nzexpected weight (z) and per_sample_weights (z) to have same dtyper>   r)   )Úper_sample_weightsrõ  r)   r*   r9   �  r:   c                      s   dˆ j › d�S )Nz1expected per_sample_weights to be 1D tensor, got rÒ  r  r)   )ræ  r)   r*   r9   ¡  r:   c                      s   dˆ  ¡ › dˆ   ¡ › d�S )Nz%expected per_sample_weights.numel() (z$ to be the same as indices.numel() (rü   rä  r)   )rZ   ræ  r)   r*   r9   ¥  s    c                    s   ˆ | ||ƒo|  d¡dkS ©Nr   rm   ©rs   ©r¡   rà  rˆ   Úpadding_idx)Úis_fast_path_index_selectr)   r*   Úis_fast_path_index_select_scale«  s    ÿz;meta_embedding_bag.<locals>.is_fast_path_index_select_scalec                 S   s<   | j tjks| j tjko:|  d¡dko:| d¡dko:|dk S r�   )r5   r.   r1   r/   rs   )r¡   rˆ   rê  r)   r)   r*   rë  °  s    ÿþüz5meta_embedding_bag.<locals>.is_fast_path_index_selectc                    s&   |d k	rˆ| |||ƒS ˆ | ||ƒS d S r$   r)   ré  )rë  rì  r)   r*   Úis_fast_path¸  s    z(meta_embedding_bag.<locals>.is_fast_pathÚcpuc                   S   s   dS rå  r)   r)   r)   r)   r*   r9   Ò  r:   )r.   r<   r5   rA   r/  rŒ   rÖ  rN   rD   rq   rQ   rC   rY  rE   )rõ  rZ   rä  Zscale_grad_by_freqrH  Úsparseræ  Zinclude_last_offsetrê  Znum_bagsrˆ   ZMODE_SUMZ	MODE_MEANZMODE_MAXrí  Ú
offset2bagÚbag_sizeÚmax_indicesZfast_path_sumZnumBagsr)   )rZ   rë  rì  rä  ræ  rõ  r*   Úmeta_embedding_bagr  s~    
þ
þ

þ
þ
þ
þ
þþ




þró  c                 G   s@   t | ||f|žŽ \}}}}t|ƒdkr4| | ¡ ¡}||||fS )Nrî  )ró  rY  rD   rN   )rõ  rZ   rä  Úargsrˆ   rð  rñ  rò  r)   r)   r*   Úmeta_embedding_bag_forward_onlyÛ  s      ÿÿrõ  c                 C   s.   |r|S | j js| j jr| j S |r(tjS | j S r$   )r5   r‹   r…   r.   rA   )r�   r5   Úpromote_int_to_longr)   r)   r*   Ú_get_reduction_dtypeå  s    r÷  r>   c                C   s6   t | |dd�}t | j|¡}t| ||ƒ}| j||d�S )NT)rö  r>   )r÷  rŒ   rÀ   rE   rÁ   rD   )r�   rð  rÃ   r5   Zoutput_dtyperÄ   r)   r)   r*   Úmeta_nansumò  s    rø  c                 C   s$   t  | jtt|  ¡ ƒƒ¡}|  |¡S r$   )rŒ   rñ  rE   r;   rq   rJ   rD   )r�   rÄ   r)   r)   r*   Úmeta_medianû  s
     ÿrù  c                 C   sL   t | ƒdkrt d¡ t | j|f¡}t| ||ƒ}|  |¡| j|tjd�fS )NrX  zmedian CUDA with indices outputr>   )	rY  rŒ   Úalert_not_deterministicrÀ   rE   rÁ   rD   r.   rA   )r�   rJ   rÃ   rÄ   r)   r)   r*   Úmeta_median_mode_dim  s    
þrû  c                 C   s   | S r$   r)   rW   r)   r)   r*   Úmeta_logical_not_  s    rü  c                    sd   t  tˆƒ|  ¡ kdd„ ¡ tˆƒ|  ¡  }d| t| jƒ ‰ ‡ ‡fdd„ttˆƒƒD ƒ}|  |¡S )Nc                   S   s   dS )NzZNumber of dimensions of repeat dims can not be smaller than number of dimensions of tensorr)   r)   r)   r)   r*   r9   "  r:   zmeta_repeat.<locals>.<lambda>©rm   c                    s   g | ]}ˆ | ˆ|  ‘qS r)   r)   rî  ©Zpadded_sizer}  r)   r*   rf   )  s     zmeta_repeat.<locals>.<listcomp>)r.   r<   ro   rJ   r;   rE   rq   rD   )rF   r}  Znum_new_dimensionsZtarget_sizer)   rþ  r*   Úmeta_repeat  s    þrÿ  c                 C   s   | S r$   r)   rW   r)   r)   r*   Ú
meta_zero_-  s    r   c                 C   s   t |tjƒrt| j|jƒ | S r$   ©rÚ   r.   r
   r=   rE   r†  r)   r)   r*   Úmeta_binop_inplace2  s    r  c                 C   s   t |tjƒrt| j|jƒ | S r$   r  r¡  r)   r)   r*   Úmeta_binop_inplace_alphaC  s    	r  c                 K   s   t | tjd�S ©N©Ztype_promotion)r   r   ÚDEFAULT)rF   Úkwargsr)   r)   r*   Ú
meta_roundQ  s     ÿr  c                    sj   t  t ˆj¡‡ ‡fdd„¡ tˆt jƒrJt  t ˆj¡‡ ‡fdd„¡ nt  tˆtƒ‡ ‡fdd„¡ d S )Nc                      s   ˆ › dˆj › �S )Nz7: Expected input tensor to have an integral dtype. Got r>   r)   )r  rF   r)   r*   r9   [  r:   z#shift_dtype_check.<locals>.<lambda>c                      s   ˆ › dˆj › �S )Nz6: Expected shift value to have an integral dtype. Got r>   r)   ©r  rÎ   r)   r*   r9   `  r:   c                      s   ˆ › dˆ› �S )Nz): Expected shift value to be an int. Got r)   r)   r	  r)   r*   r9   e  r:   )r.   r<   rŒ   r4  r5   rÚ   r
   r   ©r  rF   rÎ   r)   r
  r*   Úshift_dtype_checkX  s    
þ
þþr  c                 C   sL   t d| |ƒ t| tjd�}|  ¡ dkrHt|tjƒrHtj|j	|j
|jd�S |S )NÚrshiftr  r   r[   ©r  r   r   r  rJ   rÚ   r.   r
   r]   rE   r\   r5   ©rF   rP   Zelement_wiser)   r)   r*   Úmeta_rshiftsi  s     ÿ  ÿr  c                 C   sL   t d| |ƒ t| tjd�}|  ¡ dkrHt|tjƒrHtj|j	|j
|jd�S |S )NÚlshiftr  r   r[   r  r  r)   r)   r*   Úmeta_lshiftsw  s     ÿ  ÿr  c                 C   s   |   | j¡S r$   r  rW   r)   r)   r*   Ú	meta_zero…  s    r  c                 C   s   | S r$   r)   ©rF   rÎ   r)   r)   r*   Ú
meta_fill_Š  s    r  c                 C   s
   t  | ¡S r$   r›  r  r)   r)   r*   Ú	meta_fill�  s    r  c                 C   s   | S r$   r)   rW   r)   r)   r*   Ú
meta_relu_”  s    r  c                 C   s
   t  | ¡S r$   r›  ©rF   rZ   rY   Ú
accumulater)   r)   r*   Úmeta_index_put™  s    r  c                 C   s   t | j|jƒ | S r$   )r=   rE   )rF   rá  Úvaluer)   r)   r*   Úmeta_masked_fill_ž  s    r  c                 C   s   | S r$   r)   r  r)   r)   r*   Úmeta_index_put_¤  s    r  c                 C   s   |   | j¡S r$   )ÚviewrE   rW   r)   r)   r*   Ú
meta_alias©  s    r  c                    sæ   t  |  ¡ dkdd„ ¡ t  | ¡ dkdd„ ¡ |  ¡ }| ¡ ‰ |d ‰|d ‰|d }ˆ d }ˆ||f‰t  ˆ d ˆko„ˆ d ˆk‡ ‡‡fdd„¡ | ˆ¡}|sâˆd k	rât  ˆ ¡ dkd	d„ ¡ t  ˆ ¡ ˆk‡‡fd
d„¡ |S )NrK   c                   S   s   dS rË  r)   r)   r)   r)   r*   r9   ¯  r:   z)common_meta_baddbmm_bmm.<locals>.<lambda>c                   S   s   dS rÌ  r)   r)   r)   r)   r*   r9   °  r:   r   rŠ   rm   c                	      s&   dˆ› dˆ› dˆ d › dˆ d › d�	S rÏ  r)   r)   rÑ  r)   r*   r9   ½  r:   c                   S   s   dS )Nzself must be a 3D tensorr)   r)   r)   r)   r*   r9   Æ  r:   c                      s   dˆ › dˆ  ¡ › �S )Nz*Expected an input tensor shape with shape z but got shape: rM   r)   )rb  Úself_baddbmmr)   r*   r9   É  r:   )r.   r<   rJ   rN   rD   )rÍ  rÎ  Zis_bmmr  r×  Zres_rowsZres_colsrˆ   r)   )rÒ  rÓ  rÔ  rb  r  r*   Úcommon_meta_baddbmm_bmm®  s*    
þ

þr   c                 C   s   t | |dƒS )NT)r   )rF   Zmat2r)   r)   r*   Úmeta_bmmÏ  s    r!  c                 C   s<   | | }| | }|dkr8t |dk ƒt |dk ƒkr8|d8 }|S rç  )rß  )rh   ÚyÚqrJ  r)   r)   r*   Údiv_rtnÔ  s
     r$  c                 C   sZ   t | | | ||d   d |r(|d nd |ƒd }|rV|d | | | krV|d8 }|S r�   )r$  )Ú	inputSizeÚ
kernelSizer�  rŽ  rs   rö  r9  Z
outputSizer)   r)   r*   Úpooling_output_shape_pad_lrÞ  s*    ÿþ
ýüûù	÷ÿr'  c                    s^   t  |dkdd„ ¡ t  ˆdk‡fdd„¡ t  ˆˆ d k‡ ‡fdd„¡ t| ˆ ˆˆ|||ƒS )Nr   c                   S   s   dS )Nzstride should not be zeror)   r)   r)   r)   r*   r9   ô  r:   z&pooling_output_shape.<locals>.<lambda>c                      s
   dˆ › �S )Nz'pad must be non-negative, but got pad: r)   r)   )Úpadr)   r*   r9   õ  r:   rŠ   c                      s   dˆ› dˆ › �S )Nz7pad should be at most half of kernel size, but got pad=z and kernel_size=r)   r)   ©r&  r(  r)   r*   r9   ø  r:   )r.   r<   r'  )r%  r&  r(  rs   rö  r9  r)   r)  r*   r7  ó  s    
þ      ÿr7  c              	      sR  ˆ   ¡ }ˆ‰t ˆdkoˆdkdd„ ¡ t |dko:|dkdd„ ¡ t |dkoV|dkdd„ ¡ ˆ  d¡dkozˆ  d¡dk}|tjkr®t |dko¢|o¢ˆ  d	¡dkd
d„ ¡ nDt |d	krÌˆ  d¡dkrÌ|pä|dkoä|oäˆ  d	¡dk‡ fdd„¡ t ˆd ˆ
k�oˆd ˆ	k‡‡‡	‡
fdd„¡ t ˆdk�o6ˆdk‡‡‡‡‡‡fdd„¡ d S )Nr   c                   S   s   dS )NzCkernel size should be greater than zero, but got kH: {kH}, kW: {kW}r)   r)   r)   r)   r*   r9     r:   z$pool2d_shape_check.<locals>.<lambda>c                   S   s   dS )Nz>stride should be greater than zero, but got dH: {dH}, dW: {dW}r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS )Nz\dilation should be greater than zero, but got dilationH: {dilationH}, dilationW: {dilationW}r)   r)   r)   r)   r*   r9     r:   rm   rŠ   r¦  rK   c                   S   s   dS )NzŽExpected 4D (batch mode) tensor expected for input with channels_last layout with optional 0 dim batch size for input, but got: {input.size()}r)   r)   r)   r)   r*   r9   %  r:   c                      s   dˆ   ¡ › �S )NzYExpected 3D or 4D (batch mode) tensor with optional 0 dim batch size for input, but got: rM   r)   ro  r)   r*   r9   ,  r:   c                      s   dˆ› dˆ› dˆ› dˆ › �S )NzKpad should be smaller than or equal to half of kernel size, but got padW = z	, padH = z, kW = z, kH = r)   r)   )r<  r=  r@  rA  r)   r*   r9   1  r:   c                      s*   dˆ› dˆ › dˆ› dˆ› dˆ› dˆ› d�S ©NzGiven input size: (rh   z). Calculated output size: (z). Output size is too smallr)   r)   )rC  rD  rB  rI  rE  rF  r)   r*   r9   7  r:   )rJ   r.   r<   rN   r  )r�   r<  r=  r>  r?  r@  rA  Ú	dilationHÚ	dilationWrB  rC  rD  rE  rF  r°   rQ   Z
valid_dimsr)   )r�   rC  rD  r<  r=  rB  rI  rE  rF  r@  rA  r*   r8  ÿ  sB    þþþ
þ
ýþþr8  )r�   rX  rU  r<  r=  rV  r>  r?  ÚpTÚpHÚpWÚ	dilationTr+  r,  rY  rZ  r[  r\  r]  r^  r  rS  c              
      s   ˆ	j }t ˆdko ˆdko ˆdk‡‡‡fdd„¡ t ˆdkoLˆdkoLˆ dk‡ ‡‡fdd„¡ t ˆdkoxˆdkoxˆdk‡‡‡fdd„¡ t |dk‡‡	fdd„¡ t|ƒD ]8‰|dkrÂˆdkrÂq¬t ˆ	 ˆ¡dk‡‡‡	fd	d„¡ q¬|�r"t ˆ
ˆk�o
ˆˆk�o
ˆˆk‡‡
‡‡‡‡fd
d„¡ t ˆd ˆk�oLˆd ˆk�oLˆd ˆk‡‡‡‡‡‡fdd„¡ t ˆdk�o‚ˆdk�o‚ˆdk‡‡
‡‡‡‡‡fdd„¡ d S )Nr   c                      s   dˆ› dˆ › dˆ› �S )Nz5kernel size should be greater than zero, but got kT: z, kH: z, kW: r)   r)   )r<  rU  r=  r)   r*   r9   Y  s    z$pool3d_shape_check.<locals>.<lambda>c                      s   dˆ› dˆ › dˆ› �S )Nz0stride should be greater than zero, but got dT: z, dH: z, dW: r)   r)   )r>  rV  r?  r)   r*   r9   `  s    c                      s   dˆ› dˆ › dˆ› �S )Nz9dilation should be greater than zero, but got dilationT: z, dilationH: z, dilationW: r)   r)   )r+  r0  r,  r)   r*   r9   g  s    rQ  c                      s   ˆ › dˆj › �S )Nz/: Expected 4D or 5D tensor for input, but got: r2  r)   )r  r�   r)   r*   r9   o  r:   r·  c                      s   ˆ › dˆj › dˆ ˆ¡› d�S )NzZ: Expected input's non-batch dimensions to have positive length, but input has a shape of z and non-batch dimension z has length zero!)rE   rN   r)   ©r  rƒ   r�   r)   r*   r9   x  s    c                      s*   dˆ› dˆ › dˆ› dˆ› dˆ› dˆ› d�S )Nzinput image (T: r»  r¬  z ) smaller than kernel size (kT: ú kH: ú kW: rü   r)   r)   )rZ  rY  r[  r<  rU  r=  r)   r*   r9   ‚  s    rŠ   c                      s(   dˆ› dˆ› dˆ › dˆ› dˆ› dˆ› �S )NzHpad should be smaller than or equal to half of kernel size, but got kT: r3  r2  z padT: z padW: z padH: r)   r)   )r<  rU  r=  r.  r-  r/  r)   r*   r9   Š  s    rm   c                      s6   dˆ› dˆ› dˆ › dˆ› dˆ› dˆ› dˆ› dˆ› d�S r*  r)   r)   )rZ  rY  r[  rX  r]  r\  r^  r)   r*   r9   ’  s    )rQ   r.   r<   rq   rN   )r�   rX  rU  r<  r=  rV  r>  r?  r-  r.  r/  r0  r+  r,  rY  rZ  r[  r\  r]  r^  r  rS  rQ   r)   )r>  rV  r?  r+  r0  r,  r  rƒ   rZ  r�   rY  r[  r<  rU  r=  rX  r]  r\  r^  r.  r-  r/  r*   rT  =  sJ    þþþþþ	þ&þþrT  c                 C   sÊ   | j }t| |||||||	|
||||||||||||ƒ t|||d |ƒ t|||d |ƒ t|||d |ƒ t|||d |ƒ t|||d |ƒ t|||d |ƒ t|||d |ƒ t|||d |ƒ d S )Nr¦  rK   rŠ   rm   ©rQ   rT  r(  )r�   r   rZ   rX  rU  r<  r=  rV  r>  r?  r-  r.  r/  r0  r+  r,  rY  rZ  r[  r\  r]  r^  r  rQ   r)   r)   r*   Úmax_pool3d_backward_shape_checkš  s@    ër5  )r�   r   rX  rU  r<  r=  rV  r>  r?  r-  r.  r/  rY  rZ  r[  r\  r]  r^  r  c                 C   s„   | j }t| ||||||||	|
|ddd|||||||dƒ t|||d |ƒ t|||d |ƒ t|||d |ƒ t|||d |ƒ d S )Nrm   Tr¦  rK   rŠ   r4  )r�   r   rX  rU  r<  r=  rV  r>  r?  r-  r.  r/  rY  rZ  r[  r\  r]  r^  r  rQ   r)   r)   r*   r`  Ø  s:    êr`  c                 C   sB  dd„ }|d|ƒ\}}t  t|ƒdkdd„ ¡ t|ƒdkrF|| }	}
n|d|ƒ\}	}
|d	|ƒ\}}|d
|ƒ\}}|  d¡}|  d¡}|  d¡}t | ¡}|t jkr¼t  |  ¡ dkdd„ ¡ n4|t jkràt  |  ¡ dkdd„ ¡ nt  ddd„ ¡ t	||||	||ƒ}t	||||
||ƒ}t
| |||	|
||||||||||ƒ |||fS )Nc                    sD   t  t|ƒdk‡ fdd„¡ |d }t|ƒdkr4|n|d }||fS )Nr)  c                      s   dˆ › d�S )Nzmax_pool2d: r*  r)   r)   r+  r)   r*   r9     r:   zEmax_pool2d_checks_and_compute_shape.<locals>.unpack.<locals>.<lambda>r   rm   r,  r-  r)   r+  r*   r0    s    

þz3max_pool2d_checks_and_compute_shape.<locals>.unpackrÿ  r1  c                   S   s   dS )NzOmax_pool2d: stride must either be omitted, a single int, or a tuple of two intsr)   r)   r)   r)   r*   r9     r:   z5max_pool2d_checks_and_compute_shape.<locals>.<lambda>r   rs   r…  rö  r5  rç   rH   r¦  c                   S   s   dS )NzMnon-empty 4D (batch mode) tensor expected for input with channels_last layoutr)   r)   r)   r)   r*   r9   0  r:   rn  c                   S   s   dS )Nz9non-empty 3D or 4D (batch mode) tensor expected for inputr)   r)   r)   r)   r*   r9   5  r:   Fc                   S   s   dS )Nz?Unsupport memory format. Supports only ChannelsLast, Contiguousr)   r)   r)   r)   r*   r9   :  r:   )r.   r<   ro   rN   rŒ   r  r  rJ   r±   r7  r8  )r�   rÿ  rs   r…  rö  r9  r0  r<  r=  r>  r?  r@  rA  r+  r,  rB  rC  rD  r°   rE  rF  r)   r)   r*   Ú#max_pool2d_checks_and_compute_shape  sb    	
þ





þ

þþñr6  c                    s„   t ˆ|||||ƒ\}‰‰t ˆjˆ jk‡ ‡fdd„¡ |‰ˆj‰‡‡‡‡fdd„}	|	ˆ ƒ |	|ƒ t ˆ¡}
tjˆjˆjˆj	|
d�S )Nc                      s   dˆj › dˆ j › �S )NzExpected dtype z  for `gradOutput` but got dtype r>   r)   rk  r)   r*   r9   j  r:   z7meta_max_pool2d_with_indices_backward.<locals>.<lambda>c                    s:   t | ˆˆd ˆ ƒ t | ˆˆd ˆƒ t | ˆˆd ˆƒ d S )NrK   rŠ   rm   )r(  )ró   )rI  rQ   rE  rF  r)   r*   Ú_check_dim_sizep  s    z>meta_max_pool2d_with_indices_backward.<locals>._check_dim_sizer6  )
r6  r.   r<   r5   rQ   rŒ   r  r]   rE   r\   )r   rF   rÿ  rs   r…  rö  r9  rZ   rB  r7  r°   r)   )r   rI  rQ   rE  rF  rF   r*   Ú%meta_max_pool2d_with_indices_backwardU  s8         ÿü
þ
ür8  rý  c                 C   sŒ   t | |||||ƒ\}}}|  ¡ dkr.|  d¡nd}	t | ¡}
|  ¡ dkrT|||g}n|	|||g}tj|| j| j|
d�tj|tj	| j|
d�fS )Nr¦  r4  rm   rK   r6  )
r6  rJ   rN   rŒ   r  r.   r]   r5   r\   r^   )r�   rÿ  rs   r…  rö  r9  rB  rE  rF  r“  r°   rN   r)   r)   r*   Úmeta_max_pool2d_with_indices�  s<         ÿü
üüùr9  c           	         s  t  d¡ t ˆjtjk‡fdd„¡ t tˆƒdk‡fdd„¡ ˆ\}}t ˆjdk‡fdd„¡ t ˆjˆjk‡‡fdd„¡ t	d	ˆjƒD ]$‰ t ˆ 
ˆ ¡d
k‡ ‡fdd„¡ qŽˆ ¡ }ˆjdkrâ| 
d
¡}| |||f¡}n&| 
d
¡}| 
d	¡}| ||||f¡}|S )NZmax_unpooling2d_forward_outc                      s   dˆ j › �S )Nz2elements in indices should be type int64 but got: r>   r)   rã  r)   r*   r9   ª  r:   z#meta_max_unpool2d.<locals>.<lambda>rŠ   c                      s   dt ˆ ƒ› d�S )NzMThere should be exactly two elements (height, width) in output_size, but got ú
 elements.r„  r)   ©rb  r)   r*   r9   ®  s    rn  c                      s   dˆ j › d�S )NzLInput to max_unpooling2d should be a 3d or 4d Tensor, but got a tensor with ú dimensions.r  r)   )Úself_r)   r*   r9   ¸  s    c                      s   dˆj › dˆ j › �S ©NzBExpected shape of indices to be same as that of the input tensor (z%) but got indices tensor with shape: r2  r)   )rZ   r=  r)   r*   r9   ¿  s    rm   r   c                      s   dˆj › dˆ › d�S )NzZmax_unpooling2d(): Expected input to have non-zero size for non-batch dimensions, but got re  ú being empty.r2  r)   )rƒ   r=  r)   r*   r9   È  s    rK   )rŒ   rú  r.   r<   r5   r^   ro   rQ   rE   rq   rN   ra   rD   )	r=  rZ   rb  r]  r^  rF   Ú	nchannelsrÿ   r“  r)   )rƒ   rZ   rb  r=  r*   Úmeta_max_unpool2d£  s>    


þ

þ
þ
þþ	



rA  c                    s  t  ˆjt jkdd„ ¡ t  ˆjdk‡fdd„¡ t  tˆƒdk‡fdd„¡ t  tˆƒdk‡fdd„¡ t  tˆƒdk‡fdd„¡ t  ˆjˆjk‡‡fd	d„¡ td
ˆjƒD ]&‰t  ˆ ˆ¡dk‡ ‡‡fdd„¡ q°t  ˆd dkoþˆd
 dkoþˆd dk‡fdd„¡ d S )Nc                   S   s   dS )Nz(elements in indices should be type int64r)   r)   r)   r)   r*   r9   Þ  r:   z._max_unpooling3d_shape_check.<locals>.<lambda>rQ  c                      s   dˆ j › d�S )NzLInput to max_unpooling3d should be a 4d or 5d Tensor, but got a tensor with r<  r  r)   ro  r)   r*   r9   â  r:   rK   c                      s   dt ˆ ƒ› d�S )NzVThere should be exactly three elements (depth, height, width) in output_size, but got r:  r„  r)   r;  r)   r*   r9   æ  s    c                      s   dt ˆ ƒ› d�S )NzRThere should be exactly three elements (depth, height, width) in stride, but got: r:  r„  r)   rè  r)   r*   r9   í  r:   c                      s   dt ˆ ƒ› d�S )NzSThere should be exactly three elements (depth, height, width) in padding, but got: r:  r„  r)   )r…  r)   r*   r9   ñ  r:   c                      s   dˆj › dˆ j › �S r>  r2  r)   )rZ   r�   r)   r*   r9   õ  s    rm   r   c                      s   ˆ › dˆj › dˆ› d�S )NzI: Expected input to have non-zero size for non-batch dimensions, but got re  r?  r2  r)   r1  r)   r*   r9   þ  s    rŠ   c                      s
   dˆ › �S )Nz5strides should be greater than zero, but got stride: r)   r)   rè  r)   r*   r9     r:   )	r.   r<   r5   r^   rQ   ro   rE   rq   rN   )r�   rZ   rb  rs   r…  r  r)   )r  rƒ   rZ   r�   rb  r…  rs   r*   Ú_max_unpooling3d_shape_checkÜ  sB    
 ÿ
þ

þ

þ

þ
þþ	"
þrB  c                 C   s‚   t  d¡ t| ||||dƒ |  ¡ }|\}}}| jdkrV| d¡}	| |	|||f¡}
n(| d¡}| d¡}	| ||	|||f¡}
|
S )NZmax_unpooling3d_forward_outzmax_unpooling3d()r¦  r   rm   )rŒ   rú  rB  ra   rQ   rN   rD   )r=  rZ   rb  rs   r…  rF   Zodepthr]  r^  r@  rÿ   r“  r)   r)   r*   Úmeta_max_unpool3d  s$    
     ÿ




rC  c                 C   sÎ  t  t|ƒdkdd„ ¡ |d }t|ƒdkr0|n|d }t|ƒdkrH|n|d }t  | pdt|ƒdkdd„ ¡ |sv|n|d }	|s†|nt|ƒdkr–|	n|d }
|s¦|nt|ƒdkr¶|	n|d }t  t|ƒdkdd„ ¡ |d }t|ƒdkrî|n|d }t|ƒdk�r|n|d }t  t|ƒdkd	d„ ¡ |d }t|ƒdk�rB|n|d }t|ƒdk�r\|n|d }t  | jd
kdd„ ¡ | jdk�r�|  d¡nd}|  d¡}|  d¡}|  d¡}|  d¡}t||||	||ƒ}t||||
||ƒ}t||||||ƒ}t| |||||	|
|||||||||||||dƒ | jdk�o<t | ¡t j	k}| jdk�r||  
d¡}| ¡  �ol|jt j	d�}||||f}n|||||f}|  |¡}| j|t jd�}|�rÆ|jt j	d�}|jt j	d�}||fS )NrM  c                   S   s   dS ©NzMmax_pool3d: kernel_size must either be a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   /  r:   z.meta_max_pool3d_with_indices.<locals>.<lambda>r   rm   rŠ   c                   S   s   dS ©NzQmax_pool3d: stride must either be omitted, a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   7  r:   c                   S   s   dS ©NzImax_pool3d: padding must either be a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   ?  r:   c                   S   s   dS ©NzJmax_pool3d: dilation must be either a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   G  r:   rQ  c                   S   s   dS rR  r)   r)   r)   r)   r*   r9   O  r:   r·  éûÿÿÿr4  r5  rç   rH   zmax_pool3d_with_indices()r¦  r¯   r>   )r.   r<   ro   rQ   rN   r7  rT  rŒ   r  Úchannels_last_3drj  rr  rD   r^   rŸ   )r�   rÿ  rs   r…  rö  r9  rU  r<  r=  rV  r>  r?  r-  r.  r/  r0  r+  r,  r“  rX  rY  rZ  r[  r\  r]  r^  r  Úinput_channels_last_checkrR   ry   rZ   r)   r)   r*   Úmeta_max_pool3d_with_indices#  s¢    

þþ  
þ
þþ



ëÿ
ÿÿþ
rK  c                 C   sd  t  t|ƒdkdd„ ¡ |d }t|ƒdkr0|n|d }	t|ƒdkrH|n|d }
t  | pdt|ƒdkdd„ ¡ |sv|n|d }|s†|	nt|ƒdkr–|n|d }|s¦|
nt|ƒdkr¶|n|d }t  t|ƒdkdd„ ¡ |d }t|ƒdkrî|n|d }t|ƒdk�r|n|d }t  t|ƒdkd	d„ ¡ |d }t|ƒdk�rB|n|d }t|ƒdk�r\|n|d }t  |jd
kdd„ ¡ | d¡}| d¡}| d¡}| d¡}|  d¡}|  d¡}|  d¡}t|| ||||	|
|||||||||||||||dƒ |jdk�ot |¡t jk}|jdk�r@| 	d¡}| 
¡  �o>|j
t jd�}| |j¡}|�r`|jt jd�}|S )NrM  c                   S   s   dS rD  r)   r)   r)   r)   r*   r9   š  r:   z7meta_max_pool3d_with_indices_backward.<locals>.<lambda>r   rm   rŠ   c                   S   s   dS rE  r)   r)   r)   r)   r*   r9   ¢  r:   c                   S   s   dS rF  r)   r)   r)   r)   r*   r9   ª  r:   c                   S   s   dS rG  r)   r)   r)   r)   r*   r9   ²  r:   rQ  c                   S   s   dS rR  r)   r)   r)   r)   r*   r9   º  r:   r4  r5  rç   rH   z"max_pool3d_with_indices_backward()r·  r¦  r¯   )r.   r<   ro   rQ   rN   r5  rŒ   r  rI  rj  rr  rD   rE   rŸ   )r   r�   rÿ  rs   r…  rö  r9  rZ   rU  r<  r=  rV  r>  r?  r-  r.  r/  r0  r+  r,  rX  rY  rZ  r[  r\  r]  r^  r  rJ  Ú
grad_inputr)   r)   r*   Ú%meta_max_pool3d_with_indices_backwardŒ  sœ    
þþ  
þ
þþ






éÿ
ÿÿþrM  ©r�   Úgridc                    sÊ   t  ˆjˆ jk‡ ‡fdd„¡ t  ˆjt jko8ˆ jt jk‡ ‡fdd„¡ t  ˆjd ˆ jd k‡ ‡fdd„¡ t  ˆ jd ˆjd k‡ ‡fdd„¡ tdˆjƒD ]$‰t  ˆjˆ dk‡‡fd	d„¡ q d S )
Nc                      s   dˆj › dˆ j › �S )NzNgrid_sampler(): expected input and grid to be on same device, but input is on z and grid is on rÔ   r)   ©rO  r�   r)   r*   r9   ö  s    z+check_grid_sampler_common.<locals>.<lambda>c                      s   dˆj › dˆ j › �S )NzTgrid_sampler(): expected input and grid to have torch.strided layout, but input has z and grid has )r”   r)   rP  r)   r*   r9   ý  s    r   c                      s   dˆj › dˆ j › �S )NzZgrid_sampler(): expected grid and input to have same batch size, but got input with sizes ú and grid with sizes r2  r)   rP  r)   r*   r9     s    rH   rŠ   c                      s   dˆj d › dˆ j› �S )Nz+grid_sampler(): expected grid to have size rŠ   z, in last dimension, but got grid with sizes )rQ   rE   r)   rP  r)   r*   r9     s    c                      s   dˆj › dˆ › d�S )NzYgrid_sampler(): expected input to have non-empty spatial dimensions, but input has sizes re  rf  r2  r)   rp  r)   r*   r9     s    )r.   r<   r\   r”   ry  rE   rQ   rq   rN  r)   )rO  rƒ   r�   r*   Úcheck_grid_sampler_commonó  s*    
þþþþþrR  c                   @   s   e Zd ZdZdZdZdS )ÚGridSamplerInterpolationr   rm   rŠ   N)Ú__name__Ú
__module__Ú__qualname__ZBILINEARZNEARESTÚBICUBICr)   r)   r)   r*   rS    s   rS  ©r�   rO  Úinterpolation_modec                    sP   t  ˆjdkoˆjˆ jk‡ ‡fdd„¡ t  ˆjdko@|tjjk dd„ ¡ d S )Nr·  c                      s   dˆj › dˆ j › �S )Nzdgrid_sampler(): expected 5D input and grid with same number of dimensions, but got input with sizes rQ  r2  r)   rP  r)   r*   r9   $  s    z'check_grid_sampler_3d.<locals>.<lambda>c                   S   s   dS )Nz<grid_sampler(): bicubic interpolation only supports 4D inputr)   r)   r)   r)   r*   r9   /  r:   )r.   r<   rQ   rS  rW  r  rX  r)   rP  r*   Úcheck_grid_sampler_3d!  s    þ

þûrZ  c           
      C   s:   |d }|rt j|t jd�}nd }t j|t jd�}	||	fS ©Nr   r¯   )r.   rà  r±   rV   ©
r   r�   rO  rY  Úpadding_modeÚalign_cornersr“  Zinput_requires_gradrL  Ú	grad_gridr)   r)   r*   Úgrid_sampler_2d_backward_meta3  s    
r`  c           
      C   s\   t | |ƒ t| ||ƒ | jd }| jd }|jd }|jd }|jd }	|  |||||	f¡S )Nr   rm   rŠ   rK   )rR  rZ  rE   rD   )
r�   rO  rY  r]  r^  ré  ÚCZout_DZout_HZout_Wr)   r)   r*   Úgrid_sampler_3dF  s    	





rb  rL  r_  c           
      C   sP   t ||ƒ t|||ƒ |d }|r4tj|tjd�}nd }tj|tjd�}	||	fS r[  )rR  rZ  r.   rà  r  rV   r\  r)   r)   r*   Úgrid_sampler_3d_backwardY  s    
 ÿrc  c                 O   s4   |  dd ¡}|st |¡}||d< tj| f|ž|ŽS )Nr5   )r4   rŒ   Z	get_dtyper.   r]   )rN   r‡  rô  r  r5   r)   r)   r*   Úfullq  s
    
rd  c                 C   sº   |t jkr”t  |d kdd„ ¡ t jd|d kr2| jn|||d krD| jn||d�}| jrp| |  ¡ |  	¡ |  
¡ ¡ n| |  ¡ |  ¡ d¡ | d¡ |S tjj| |||||d�}| d¡ |S )Nc                   S   s   dS )Nz9memory format option is only supported by strided tensorsr)   r)   r)   r)   r*   r9   ‡  r:   zzeros_like.<locals>.<lambda>r   r“   TrÒ   )r.   Z
sparse_coor<   r]   r5   r\   Ú	is_sparseZsparse_resize_and_clear_rN   Ú
sparse_dimÚ	dense_dimrJ   Z_coalesced_r"   rV   r    Úfill_)rF   r5   r”   r\   r•   r°   rn  r)   r)   r*   rà  {  s>    	
þû  ÿ
ú	
rà  c                    s¼   ˆ  ¡ }t |dkdd„ ¡ ˆ dkr(ˆ nˆ | ‰ ˆ ˆ ¡}t ˆ |kpNˆ|k ‡ ‡‡fdd„¡ ˆdkrnˆnˆ| ‰tˆ ¡ ƒ}tˆ ¡ ƒ}ˆ ¡ ˆ|ˆ    }|ˆ = |ˆ = ˆ |||¡S )Nr   c                   S   s   dS )Nz-select() cannot be applied to a 0-dim tensor.r)   r)   r)   r)   r*   r9   ­  r:   zmeta_select.<locals>.<lambda>c                      s   dˆ› dˆ  ¡ › dˆ › �S )Nzselect(): index z! out of range for tensor of size z at dimension rM   r)   ©rJ   r@   rF   r)   r*   r9   µ  r:   )rJ   r.   rB   rN   rp   rs   rx   rw   )rF   rJ   r@   rQ   rN   Únew_sizer§   Znew_storage_offsetr)   ri  r*   Úmeta_select¨  s$    þ
þrk  c                 C   s
   t  | ¡S r$   ©rŒ   r‚  )rF   r¡   rJ   r@   r)   r)   r*   Úmeta_select_scatterÅ  s    rm  c                 C   s
   t  | ¡S r$   rl  )rF   r¡   rJ   ÚstartÚendÚstepr)   r)   r*   Úmeta_slice_scatterÊ  s    rq  )rJ   Údim_post_exprÚwrap_scalarc                 C   sb   |dkr|st ‚d}| }|d }| |k s2| |krNt d| › d|› d|› d�ƒ‚| dk r^| |7 } | S )Nr   rm   zdim z out of bounds (rˆ  rü   )r†   )rJ   rr  rs  rØ   rÙ   r)   r)   r*   r_   Ð  s    ,r_   c                 C   s   |   ¡ dkrdS | j| S rç  r%  )ró   rJ   r)   r)   r*   Úensure_nonempty_sizeÜ  s    rt  c                    st   t ˆ ¡ dƒ}t ˆ ¡ dƒ}t ||kdd„ ¡ t|ƒD ]6‰ˆˆ kr8t tˆˆƒtˆˆƒk‡ ‡‡‡fdd„¡ q8d S )Nrm   c                   S   s   dS )NzDIndex tensor must have the same number of dimensions as input tensorr)   r)   r)   r)   r*   r9   æ  r:   z$gather_shape_check.<locals>.<lambda>c                      s$   dˆ› dˆj › �dˆj › dˆ › � S )Nz!Size does not match at dimension z expected index ú to be smaller than self ú apart from dimension r2  r)   ©rJ   rƒ   r@   rF   r)   r*   r9   ì  s   ÿ)rÙ   rJ   r.   r<   rq   rt  )rF   rJ   r@   Ú	self_dimsZ
index_dimsr)   rw  r*   Úgather_shape_checká  s    þþry  c                    sR   t ||  ¡ ƒ}ˆ  ¡ dk}|sFt ˆ jtjk‡ fdd„¡ t| |ˆ ƒ |  ˆ j	¡S )Nr   c                      s   dˆ j › �S )Nz2gather(): Expected dtype int64 for index, but got r>   r)   r?   r)   r*   r9   ø  r:   zmeta_gather.<locals>.<lambda>)
r_   rJ   rC   r.   r<   r5   rA   ry  rD   rE   )rF   rJ   r@   Zsparse_gradÚwrapped_dimZis_index_emptyr)   r?   r*   Úmeta_gatherñ  s    

þr{  c                 C   s„   |rT| dkrdS | dkrdS | dkr(dS | dkr4dS | d	kr@d
S t  ddd„ ¡ d S | dkr`dS | dkrldS t  ddd„ ¡ d S d S )NÚsumZ
REDUCE_ADDrß  ZREDUCE_MULTIPLYZmeanZREDUCE_MEANZamaxZREDUCE_MAXIMUMZaminZREDUCE_MINIMUMFc                   S   s   dS )Nz=reduce argument must be either sum, prod, mean, amax or amin.r)   r)   r)   r)   r*   r9     r:   z#get_operator_enum.<locals>.<lambda>ÚaddÚmultiplyc                   S   s   dS )Nz/reduce argument must be either add or multiply.r)   r)   r)   r)   r*   r9     r:   rL  )Úreduce_Úuse_new_optionsr)   r)   r*   Úget_operator_enumÿ  s,    þr�  c                    sP   |  ¡ dkr(t |jtjk‡ fdd„¡ |d k	rLt |j|jk‡ fdd„¡ d S )Nr   c                      s
   ˆ › d�S )Nz"(): Expected dtype int64 for indexr)   r)   ©Úmethod_namer)   r*   r9     r:   z,scatter_gather_dtype_check.<locals>.<lambda>c                      s
   ˆ › d�S )Nz0(): Expected self.dtype to be equal to src.dtyper)   r)   r‚  r)   r*   r9   $  r:   )rC   r.   r<   r5   rA   )rƒ  rF   r@   Úsrc_optr)   r‚  r*   Úscatter_gather_dtype_check  s    

þ

þr…  c                 C   s
   t | dƒS r¤   )rÙ   rI   r)   r)   r*   Úensure_nonempty_dim(  s    r†  c                    s   ˆ  ¡ dkrd S t tˆ ¡ ƒtˆ ¡ ƒkdd„ ¡ d}tˆ ¡ ƒ}t|ƒD ].}tˆ|ƒ}|ˆ krdqL|tˆ|ƒkrLd} q|qL|s¶ˆd k	r¶t|ƒD ]$}tˆ|ƒ}|tˆ|ƒkr�d} q¶q�ˆd k	�rt tˆ ¡ ƒtˆ ¡ ƒkdd„ ¡ t | ‡ ‡‡‡fdd„¡ nt | ‡ ‡‡fdd„¡ d S )	Nr   c                   S   s   dS ©NzCIndex tensor must have the same number of dimensions as self tensorr)   r)   r)   r)   r*   r9   2  r:   z%scatter_shape_check.<locals>.<lambda>FTc                   S   s   dS r‡  r)   r)   r)   r)   r*   r9   L  r:   c                      s&   dˆj › dˆj › �dˆ › dˆj › � S )NúExpected index ru  rv  z and to be smaller than src r2  r)   ©rJ   r@   rF   r„  r)   r*   r9   P  s   ÿc                      s   dˆj › dˆj › �dˆ › � S )Nrˆ  ru  rv  r2  r)   ri  r)   r*   r9   V  s   ÿ)rC   r.   r<   r†  rJ   rq   rt  )rF   rJ   r@   r„  Zis_wrong_shaperx  r}   Zindex_d_sizer)   r‰  r*   Úscatter_shape_check-  sD    þ


þþþrŠ  c                 C   s@   t ||  ¡ ƒ}td| ||ƒ t| |||ƒ |d k	r<t||ƒ d S )NÚscatter)r_   rJ   r…  rŠ  r�  )rF   rJ   r@   r¡   r  r€  rz  r)   r)   r*   Úscatter_meta_impl\  s
    rŒ  c                 C   s   t | |||dƒ |  | j¡S ©Nr}  ©rŒ  rD   rE   ©rF   rJ   r@   r¡   r)   r)   r*   Úmeta_scatter_adde  s    r�  c                 C   s   t | |||dƒ | S r�  ©rŒ  r�  r)   r)   r*   Úmeta_scatter_add_k  s    r’  c                 C   s0   t |tjƒr|nd }t| ||||ƒ |  | j¡S r$   )rÚ   r.   r
   rŒ  rD   rE   ©rF   rJ   r@   Zsrc_or_valuer­   r¡   r)   r)   r*   Úmeta_scatterq  s    
r”  c                 C   s(   t |tjƒr|nd }t| ||||ƒ | S r$   )rÚ   r.   r
   rŒ  r“  r)   r)   r*   Úmeta_scatter_€  s    	r•  ç        )Úqueryrk   r  Ú	dropout_pÚ	is_causalÚreturn_debug_maskrà  c                 C   s
  |   d¡}|   d¡}|   d¡}	|   d¡}
|  d¡}||	 }|  dd¡}| |||
¡}tj|| jd�}| ||	||
¡ dd¡}t| ƒdk�r
tj||	|ftj	| jd� dd¡}||tjdtj
d	d�tjdtj
d	d�ddtjdtjd	d�tjdtjd	d�tjd| j| jd�f	S t |	d
 ¡d
 }tj|||ftj	| jd�}tj|d tj
d	d�}tj|d tj
d	d�}|�rÄ|
dk�rvdnd}t |	| ¡}|dk�r˜d}n|dk�r¦d}tj||||f| j| jd�}ntjd| j| jd�}|||||	|tjdtjd	d�tjdtjd	d�|f	S )Nr   rm   rŠ   rK   rÔ   rî  ©r5   r\   r)   rÓ   é   é@   é€   é   )rN   r  rv   r.   rV   r\   r  rY  r]   r1   r  rA   r5   rÞ  Úceil)r—  rk   r  r˜  r™  rš  rà  r‚   Ú	num_headsZmax_seqlen_batch_qÚhead_dimZmax_seqlen_batch_kZNnz_qZquery_tZquery_reshapedZ	attentionÚ	logsumexpZmax_seqlen_qZcumulative_sequence_length_qZcumulative_sequence_length_kZblocksize_cZmax_seqlen_kZ
debug_maskr)   r)   r*   Úmeta__scaled_dot_product_flashŽ  sž    




   ÿ þýù ø
÷ý  ÿ  ÿ


ý÷r¤  )rg  r—  rk   r  ry   r£  Ú	cum_seq_qÚ	cum_seq_kÚmax_qÚmax_kr˜  r™  Úphilox_seedÚphilox_offsetrà  c                 C   s¶   |  d¡}|  d¡}|  d¡}t|ƒdkr4|  d¡n|}t|ƒdkrN|  d¡n|	}tj||||fd|j|jd�}tj||||fd|j|jd�}tj||||fd|j|jd�}|||fS )Nr   rm   rK   rî  rŠ   ©r   rŠ   rm   rK   r›  )rN   rY  r.   Úempty_permutedr5   r\   )rg  r—  rk   r  ry   r£  r¥  r¦  r§  r¨  r˜  r™  r©  rª  rà  r‚   r¡  r¢  Úlen_qZlen_kÚgrad_qÚgrad_kÚgrad_vr)   r)   r*   Ú'meta__scaled_dot_product_flash_backwardî  s0    



ü
ü
ür±  )r—  rk   r  Ú	attn_biasÚcompute_log_sumexpr™  rà  c                 C   sê   |   dd¡} |  dd¡}|  dd¡}|  d¡}|  d¡}	| d¡}
|  d¡}|  d¡}| d¡}tj||	||| j| jd�}|r�t |	d ¡d nd}tj|||ftj| jd�}|  dd¡}tjdtj	d	d�}tjdtj	d	d�}||||fS )
Nrm   rŠ   r   rç   rH   r›  é    r)   rÓ   )
r  rN   r.   r]   r5   r\   rÞ  r   r1   rA   )r—  rk   r  r²  r³  r˜  r™  rà  rû   ÚMré  r¡  ÚKZKvrn  Zlogsumexp_dimZ
logsum_expÚseedÚoffsetr)   r)   r*   Ú"meta__scaled_dot_product_efficient   s(    





ýr¹  )rg  r—  rk   r  r²  ry   r£  r©  rª  r˜  Úgrad_input_maskr™  rà  c                 C   sÔ   |  d¡}|  d¡}|  d¡}|  d¡}|  d¡}|  d¡}tj||||fd|j|jd�}tj||||fd|j|jd�}tj||||fd|j|jd�}d }|d k	rÈ|
d rÈtj|  ¡ | ¡ |j|jd�}||||fS )Nr   rm   rŠ   rK   r«  r›  )rN   r.   r¬  r5   r\   r'  rs   )rg  r—  rk   r  r²  ry   r£  r©  rª  r˜  rº  r™  rà  r‚   r¡  r§  r¢  Z
head_dim_vr¨  r®  r¯  r°  Ú	grad_biasr)   r)   r*   Ú+meta__scaled_dot_product_efficient_backwardL  sB    






ü
ü
üür¼  c                 C   s    t | ||||dd� |  | j¡S ©NT)r€  rŽ  ©rF   rJ   r@   r¡   r­   r«   r)   r)   r*   Úmeta_scatter_reduce_two†  s    r¿  c                 C   s   t | ||||dd� | S r½  r‘  r¾  r)   r)   r*   Úmeta_scatter_reduce__two�  s    rÀ  c                   sh   t  dˆ  ¡   k odkn  ‡ fdd„¡ ˆ  ¡ dkrLt j|t jˆ jd�S t jˆ  d¡|t jˆ jd�S )Nr   rŠ   c                      s   dˆ   ¡ › �S )Nz@The probabilty distributions dimensions must be 1 or 2, but got rI   r)   ro  r)   r*   r9   ˜  r:   z"meta_multinomial.<locals>.<lambda>rm   r›  )r.   r<   rJ   r]   rA   r\   rN   )r�   Znum_samplesÚreplacementr�   r)   ro  r*   Úmeta_multinomial“  s    
þ   ÿrÂ  c                 C   s   d}| D ]}||9 }q|S r¤   r)   )ÚvsrJ  Úvr)   r)   r*   Úmultiply_integers¡  s    
rÅ  c                    sž   t  tˆƒˆk‡‡fdd„¡ ˆd ‰ t  tˆƒˆ k‡ ‡fdd„¡ t  tdd„ ˆdd … D ƒƒortdd„ ˆD ƒƒ‡‡fdd„¡ ˆd d… \}}||fˆ˜S )Nc                      s   dˆ › dt ˆƒ› �S )Nz%It is expected output_size equals to ú, but got size r„  r)   )Únum_spatial_dimsrb  r)   r*   r9   «  r:   z'upsample_common_check.<locals>.<lambda>rŠ   c                      s   dˆ › dt ˆƒ› �S )Nz$It is expected input_size equals to rÆ  r„  r)   )Úexpected_input_dimsrK  r)   r*   r9   °  r:   c                 s   s   | ]}|d kV  qdS ©r   Nr)   rœ  r)   r)   r*   rg  ´  s     z(upsample_common_check.<locals>.<genexpr>c                      s   dˆ › dˆ› �S )NzDInput and output sizes should be greater than 0, but got input size z and output size r)   r)   )rK  rb  r)   r*   r9   µ  r:   )r.   r<   ro   rk  )rK  rb  rÇ  r“  Zchannelsr)   )rÈ  rK  rÇ  rb  r*   Úupsample_common_check¨  s    
þ
þ*þrÊ  c                    sZ   t  ˆ  ¡ dkp"tˆ  ¡ dd … ƒ‡ fdd„¡ tˆ  ¡ |dd�}ˆ  |¡jt 	ˆ ¡d�S )Nr   rm   c                      s   dˆ   ¡ › �S )Nz>Non-empty 3D data tensor expected but got a tensor with sizes rM   r)   ro  r)   r*   r9   Á  r:   z$upsample_nearest1d.<locals>.<lambda>©rÇ  r¯   ©
r.   r<   rC   rÅ  rN   rÊ  rD   rŸ   rŒ   r  )r�   rb  ÚscalesÚfull_output_sizer)   ro  r*   Úupsample_nearest1d½  s    
þ  ÿ
ÿrÏ  c           	         sŽ   t  ˆ  ¡ dkp"tˆ  ¡ dd … ƒ‡ fdd„¡ tˆ  ¡ |dd�}ˆ  |¡}t ˆ ¡}ˆ j	\}}}}ˆ j
jdkr~|dk r~t j}|j|d	�}|S )
Nr   rm   c                      s   dˆ   ¡ › �S ©Nz>Non-empty 4D data tensor expected but got a tensor with sizes rM   r)   ro  r)   r*   r9   Ï  r:   z$upsample_nearest2d.<locals>.<lambda>rŠ   rË  rX  r¦  r¯   )r.   r<   rC   rÅ  rN   rÊ  rD   rŒ   r  rE   r\   ró  r±   ra   )	r�   rb  Úscales_hÚscales_wrÎ  rˆ   r°   re   Z
n_channelsr)   ro  r*   Úupsample_nearest2dË  s     
þ  ÿ

rÓ  ©r   rb  rK  rÑ  rÒ  c                    st   t ||dd�‰ t ˆjdk‡fdd„¡ tdƒD ]*‰t ˆ ˆ¡ˆ ˆ k‡ ‡‡fdd„¡ q0ˆ |¡jt 	ˆ¡d�S )NrŠ   rË  r¦  c                      s   dˆ j › �S )NzFExpected grad_output to be a tensor of dimension 4 but got: dimension r  r)   rv  r)   r*   r9   ð  r:   z-upsample_nearest2d_backward.<locals>.<lambda>c                
      s&   dˆ› dˆ ˆ › dˆ› dˆ  ˆ¡› �S )NzCExpected grad_output to have the same shape as output; output.size(z) = z but got grad_output.size(rM   r)   ©rÎ  r   rƒ   r)   r*   r9   õ  s    r¯   )
rÊ  r.   r<   rQ   rq   rN   rD   rŸ   rŒ   r  rÔ  r)   rÕ  r*   Úupsample_nearest2d_backwardã  s"      ÿ
þþ	
ÿrÖ  c                    sZ   t  ˆ  ¡ dkp"tˆ  ¡ dd … ƒ‡ fdd„¡ tˆ  ¡ |dd�}ˆ  |¡jt 	ˆ ¡d�S )Nr   rm   c                      s   dˆ   ¡ › �S )Nz>Non-empty 5D data tensor expected but got a tensor with sizes rM   r)   ro  r)   r*   r9     r:   z$upsample_nearest3d.<locals>.<lambda>rK   rË  r¯   rÌ  )r�   rb  Zscales_drÑ  rÒ  rÎ  r)   ro  r*   Úupsample_nearest3d  s    
þ  ÿ
ÿr×  c           
      C   sª   t  | ¡t j| t jd� }}|d k	r¢|d k	r¢t|tƒs:t‚t|tƒsHt‚|j}| ¡ }	t||ƒ}t||ƒ}| 	||	¡ | 	||	¡ t
||d� t
||d� ||fS ||fS )Nr>   )rh  ri  )r.   rV   r^   rÚ   r   r†   rE   rs   r   r©   r   )
rF   ÚstablerJ   Ú
descendingrY   rZ   rÄ  rƒ   rR   Z
out_strider)   r)   r*   Ú	meta_sort  s    	

rÚ  )rJ   rÙ  c                C   s   t | |||d�d S )N)rØ  rJ   rÙ  rm   )rÚ  )rF   rØ  rJ   rÙ  r)   r)   r*   Úmeta_argsort*  s    rÛ  c                    s  t  ˆjdk‡fdd„¡ t  ˆjˆjk‡‡fdd„¡ ˆ d¡‰ˆd k	r t  ˆjdk‡fdd„¡ t  ˆ ¡ ˆk‡‡fdd„¡ t  ˆjˆjk‡‡fdd„¡ t  ˆjdk‡fd	d„¡ ˆ d
¡ˆ ˆ ‰ t  ˆ ¡ ˆ k‡ ‡‡‡‡fdd„¡ t  t‡fdd„ˆˆˆˆfD ƒƒdd„ ¡ d S )NrŠ   c                      s   ˆ j › d�S ©Nz != 2r  r)   ©Úinput_gatesr)   r*   r9   2  r:   z%rnn_cell_checkSizes.<locals>.<lambda>c                      s   ˆj › dˆ j › �S ©Nú != r2  r)   )Úhidden_gatesrÞ  r)   r*   r9   5  r:   rm   c                      s   ˆ j › d�S )Nz != 1r  r)   )Ú
input_biasr)   r*   r9   9  r:   c                      s   ˆ  ¡ › dˆ › �S rß  rä  r)   )Ú
gates_sizerâ  r)   r*   r9   <  r:   c                      s   ˆj › dˆ j › �S rß  r2  r)   )Úhidden_biasrâ  r)   r*   r9   @  r:   c                      s   ˆ j › d�S rÜ  r  r)   )Úprev_hiddenr)   r*   r9   B  r:   r   c                
      s,   ˆ  ¡ › dˆ d¡› dˆ› dˆ› dˆ › d�
S )Nrà  r   z * z // z (aka rü   )rC   rN   r)   )Úexpected_prev_hidden_numelÚfactorrã  rÞ  rå  r)   r*   r9   F  r:   c                 3   s   | ]}|j ˆ j kV  qd S r$   rÔ   rf  rÝ  r)   r*   rg  I  s   ÿz&rnn_cell_checkSizes.<locals>.<genexpr>c                   S   s   dS )Nz%expected all inputs to be same devicer)   r)   r)   r)   r*   r9   M  r:   )r.   r<   rQ   rE   rN   rC   rk  )rÞ  rá  râ  rä  rç  rå  r)   )ræ  rç  rã  rä  rá  râ  rÞ  rå  r*   Úrnn_cell_checkSizes/  s8    
þ

þ
þ
þ
þûrè  c                 C   sL   t | |||d|ƒ tj| tjd�}tj|tjd�}tj|tjd�}|||fS )Nr¦  r¯   )rè  r.   rV   r±   )rÞ  rá  Úcxrâ  rä  Ú	workspaceÚhyÚcyr)   r)   r*   Ú_thnn_fused_lstm_cell_metaQ  s
    rí  c                 C   s*  t |ƒdk}|r,t |ƒ}|d }| jd }n4|
r:| jd n| jd }|
rR| jd n| jd }d}|rhdnd}|dkrx|n|}|rŽ||| g}n |
r |||| gn|||| g}|  |¡}|	| ||g}|d kràtjd| jd�}n
| |¡}| |	| ||g¡}|�rdnd}| j|tjd�}|||||fS )Nr   rm   rH   rŠ   rÔ   r>   )ro   rE   rD   r.   r]   r\   Úuint8)r�   rõ  Zweight_stride0Z
weight_bufÚhxré  rH  Úhidden_sizeZ	proj_sizeÚ
num_layersÚbatch_firstZdropoutÚtrainÚbidirectionalÚbatch_sizesZdropout_stateZis_input_packedÚ
seq_lengthÚ
mini_batchZbatch_sizes_sumZnum_directionsZout_sizerR   rˆ   Z
cell_shaperì  rë  Zreserve_shapeZreserver)   r)   r*   Ú
_cudnn_rnn\  s2    ÿý

rø  c                 C   sÂ   |r| j d n| j d }|r&| j d n| j d }|
}|rB|||gn|||g}|  |¡}|d krptjd| jd�}n| |j ¡}|d kr–tjd| jd�}n| |j ¡}tjd| jtjd�}||||fS )Nrm   r   rÔ   r[   )rE   rD   r.   r]   r\   rî  )r�   Zw0Zw1Zw2Zw3Úhx_Zcx_rl   rõ  rH  rð  rñ  Ú
has_biasesrô  rò  ró  rö  r÷  Zoutput_chanelsrR   rˆ   rë  rì  rê  r)   r)   r*   Úmkldnn_rnn_layer”  s     ÿý
rû  c                    sR   | j dkr.t ˆ dkpˆ dk‡ ‡fdd„¡ n t |  ˆ ¡dk‡ ‡fdd„¡ d S )Nr   rH   c                      s   ˆ› dˆ › �S )Nz4: Expected reduction dim -1 or 0 for scalar but got r)   r)   ©rJ   r  r)   r*   r9   À  r:   z'zero_numel_check_dims.<locals>.<lambda>c                      s   ˆ› dˆ › d�S )Nz: Expected reduction dim z to have non-zero size.r)   r)   rü  r)   r*   r9   Å  r:   )rQ   r.   rB   rN   )rF   rJ   r  r)   rü  r*   Úzero_numel_check_dims¼  s    
þþrý  c                    sD   |d k	r$t || ¡ ƒ}t||ˆ ƒ nt | ¡ dk‡ fdd„¡ d S )Nr   c                      s
   ˆ › d�S )Nz@: Expected reduction dim to be specified for input.numel() == 0.r)   r)   r+  r)   r*   r9   Ñ  r:   z%check_argmax_argmin.<locals>.<lambda>)r_   rJ   rý  r.   r<   rC   )rì   rF   rJ   r)   r+  r*   Úcheck_argmax_argminÊ  s    

þrþ  c                 C   sD   t d| |ƒ t | j|d k	r"|fnd ¡}t| ||ƒ}| j|tjd�S )NÚargmaxr>   )rþ  rŒ   rÀ   rE   rÁ   rD   r.   r^   )rF   rJ   rÃ   rð  rE   r)   r)   r*   Úargmax_argmin_metaÕ  s    r   c                 C   s   t jd||||d�S )Nr)   r“   r—   )rû  r5   r”   r\   r•   r)   r)   r*   Úscalar_tensorÝ  s        ÿr  c                 C   s²   t ||  ¡ dd�}t |dko:||  ¡ dkr6|  |¡ndkdd„ ¡ |  ¡ dkrTdn|  |¡}t |dkop||kdd„ ¡ t| jƒ}t|ƒdkr˜|||< |  |¡| j|tj	d�fS )	NT)rs  r   rm   c                   S   s   dS )Nzselected index k out of ranger)   r)   r)   r)   r*   r9   ê  r:   ztopk_meta.<locals>.<lambda>c                   S   s   dS )Nzk not in range for dimensionr)   r)   r)   r)   r*   r9   í  r:   r>   )
r_   rJ   r.   r<   rN   rp   rE   ro   rD   r^   )rF   r<  rJ   ÚlargestÚsortedZ	sliceSizeZtopKSizer)   r)   r*   Ú	topk_metaä  s    $þ
r  c                 C   sä   | d k	r| n|}t  | ¡ dkdd„ ¡ | ¡ }| d k	rPt  |  ¡ |kdd„ ¡ |d k	rpt  | ¡ |kdd„ ¡ t  | ¡ |kdd„ ¡ t  | ¡ |kdd„ ¡ t  | ¡ dkdd„ ¡ t  | ¡ |d	 |d
  d kdd„ ¡ d S )NrŠ   c                   S   s   dS ©NÚ r)   r)   r)   r)   r*   r9   û  r:   z(checkLSTMBackwardSizes.<locals>.<lambda>c                   S   s   dS r  r)   r)   r)   r)   r*   r9   þ  r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9      r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   r   rm   r¦  c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   )r.   r<   rJ   rN   rC   )Úgrad_hyÚgrad_cyré  rì  rê  Zdefined_gradZexp_sizer)   r)   r*   ÚcheckLSTMBackwardSizesù  s    r	  c           	      C   s`   | d kr|d krdS t | ||||ƒ tj|td�}tj|td�}|rR|jddd�nd }|||fS )N)NNNr¯   r   F)rÃ   )r	  r.   rV   Úlegacy_contiguous_memory_formatr|  )	r  r  ré  rì  rê  Zhas_biasZ
grad_gatesZgrad_cxr»  r)   r)   r*   Ú#_thnn_fused_lstm_cell_backward_impl  s     ÿr  c                    s²   t ˆjƒdkr$ˆjd ||  dks:tdˆj› d|› �ƒ‚dd„ ‰ ‡ ‡fdd	„}ˆjd ||  }ˆjd
 | }ˆjd | }ˆjd d… |||f˜}ˆ |¡}|j|ƒ d�}|S )NrŠ   r5  r   z'Invalid input shape for pixel_shuffle: z with upscale_factor = c                 S   s   t j | ¡t jkS r$   r  r  r)   r)   r*   r    s    z,meta_pixel_shuffle.<locals>.is_channels_lastc                      sN   ˆ ˆƒr"t ˆƒdkrtjS tjS n(ˆjtjd�r6tjS ˆjtjd�rJtjS d S r	  )rY  r.   r±   r  rr  r
  r)   ©r  rF   r)   r*   r    s    z.meta_pixel_shuffle.<locals>.pick_memory_formatrç   rH   r¯   )ro   rE   r†   rD   rŸ   )rF   Zupscale_factorr  ra  ZHrZWrrR   ry   r)   r  r*   Úmeta_pixel_shuffle  s    ÿÿþ
r  c                 C   sZ   |   | j¡}|  |j¡}|  |j¡}|  |j¡}|  |j¡}|  |j¡}|||||||fS r$   r  )r�   Zweight0Zweight1Zweight2Zweight3rù  Zcx_tmprˆ   Zhy_Zcy_Zgrad_output_r_optZgrad_hy_r_optZgrad_cy_r_optrl   rH  rð  rñ  rú  ró  rô  rõ  rò  rê  Zdiff_xZdiff_hxZdiff_cxZdiff_w1Zdiff_w2Zdiff_br)   r)   r*   Úmkldnn_rnn_layer_backward3  s    r  )Ú	out_int32r   c                C   s   t j| |rt jnt jd� ¡ S r¾   )r.   rV   r  r^   ra   )rF   Z
boundariesr  r   r)   r)   r*   Úmeta_bucketizeV  s     ÿr  c                    sd   t ˆ  ¡ |dd�}t ˆ  ¡ dkp>tdd„ ˆ  ¡ dd … D ƒƒ‡ fdd„¡ ˆ  |¡jt 	ˆ ¡d	�S )
NrŠ   rË  r   c                 s   s   | ]}|d kV  qdS rÉ  r)   )rd   rN   r)   r)   r*   rg  f  s     z.meta_upsample_bilinear2d_aa.<locals>.<genexpr>rm   c                      s   dˆ   ¡ › �S rÐ  rM   r)   ro  r)   r*   r9   g  r:   z-meta_upsample_bilinear2d_aa.<locals>.<lambda>r¯   )
rÊ  rN   r.   r<   rC   rk  rD   rŸ   rŒ   r  )r�   rb  r^  rÑ  rÒ  rÎ  r)   ro  r*   Úmeta_upsample_bilinear2d_aa^  s      ÿ(
þ
ÿr  c                 C   s\   t  | ¡ dkdd„ ¡ t  | ¡ dkdd„ ¡ t  |jjdd„ ¡ t  |jjdd„ ¡ d S )Nrm   c                   S   s   dS )Nz%found_inf must be a 1-element tensor.r)   r)   r)   r)   r*   r9   r  r:   z<_amp_foreach_non_finite_check_and_unscale_.<locals>.<lambda>c                   S   s   dS )Nz%inv_scale must be a 1-element tensor.r)   r)   r)   r)   r*   r9   u  r:   c                   S   s   dS )Nz!found_inf must be a float tensor.r)   r)   r)   r)   r*   r9   y  r:   c                   S   s   dS )Nz!inv_scale must be a float tensor.r)   r)   r)   r)   r*   r9   }  r:   )r.   r<   rC   r5   r‹   )rF   rÀ  Z	inv_scaler)   r)   r*   Ú*_amp_foreach_non_finite_check_and_unscale_o  s     
 ÿ
 ÿþþr  c                 C   s   t |  ¡ ƒ}|  |¡S r$   )rp   rN   rD   )rF   ÚnanZposinfZneginfrµ   r)   r)   r*   Ú
nan_to_num‚  s    r  c                 C   s®   | j tjtjtjtjhks,td| j › d�ƒ‚| j}t||ƒ}t||ƒ}||krR| S t	|  
¡ ƒ}t	|  ¡ ƒ}|| ||  ||< ||< || ||  ||< ||< |  ||¡ | S )Nz>torch.transpose_: in-place transposition is not supported for z layout)r”   r.   rz  Z
sparse_cscr{  Z
sparse_bscr†   rQ   r_   rp   rN   rs   r©   )rF   Zdim0rÕ  ÚndimsrN   rs   r)   r)   r*   rt  ‰  s&    üû

rt  c                 C   sx   | j }| jrD|  ¡ }|  ¡ }|dkr,|dks`td|› d|› d�ƒ‚n|  ¡ dks`td|› d�ƒ‚t| d|dk rrdndƒS )	NrŠ   r   zEt_ expects a tensor with <= 2 sparse and 0 dense dimensions, but got z sparse and z dense dimensionsz6t_ expects a tensor with <= 2 dimensions, but self is rÒ  rm   )rQ   re  rf  rg  r†   rJ   rt  )rF   r  rf  rg  r)   r)   r*   Út_¤  s    ÿÿþ
ÿ
þr  )r  r   ÚsideÚsorterc                C   sD   |r
t jnt j}t|t jƒr.t j||d� ¡ S t jd|| jd�S d S )Nr>   r)   r›  )	r.   r  r^   rÚ   r
   rV   ra   r]   r\   )Zsorted_sequencerF   r  r   r  r  r5   r)   r)   r*   Úmeta_searchsorted¶  s    r  )r‘   rF   r®   c                 C   s4   t  | dkdd„ ¡ t|tjd�\}}t j||d�S )Nr   c                   S   s   dS )Nz,polygamma(n, x) does not support negative n.r)   r)   r)   r)   r*   r9   Å  r:   z meta_polygamma.<locals>.<lambda>rÈ   r>   )r.   r<   r   r   rÉ   rV   )r‘   rF   re   rÊ   r)   r)   r*   Úmeta_polygammaÂ  s    þ
r  c                 C   s   t | ƒtƒ dd„ ƒƒ}|S )Nc                 S   s   t | tjd�S r  )r   r   rÉ   rg   r)   r)   r*   Ú_fÎ  s     ÿz)_create_unary_float_meta_func.<locals>._f©r-   r   ©Úfuncr  r)   r)   r*   Ú_create_unary_float_meta_funcÍ  s    r  c                 C   s   t | ƒtƒ dd„ ƒƒ}|S )Nc                 S   s   t | |ƒ\} }t| |tjd�S r  )r   r   r   rÉ   )rh   r"  r)   r)   r*   r  Ù  s      ÿz*_create_binary_float_meta_func.<locals>._fr  r  r)   r)   r*   Ú_create_binary_float_meta_funcØ  s    r   c                  C   s
  i } dD ]*}t | }|D ]}|| kr|| | |< qq|  ¡ D ]È\}}t|tƒsRt‚| tjjj	¡|ƒ tj 
| ¡ d¡r”|t d kr’t|› d�ƒ‚q<|jrœq<| ¡ dkrªq<d| ¡ krÄt ||¡ q<d| ¡ krÞt ||¡ q<d| ¡ krøt ||¡ q<t ||¡ q<d S )	N)rÓ   Zpost_autogradZpre_autogradZCompositeImplicitAutogradrÓ   z« is a CompositeImplicitAutograd op, we shouldn't register meta function for it. Instead, we should let the decomposition run and write meta kernels for the base operators.>   úaten::rot90úaten::constant_pad_ndúaten::_to_copyúaten::copy_úaten::empty_stridedúaten::cloneúaten::as_strided_scatterzmkldnn::zmkl::zonednn::)r   ÚitemsrÚ   r   r†   Zpy_implr.   Ú_CZDispatchKeyr#   Z%_dispatch_has_kernel_for_dispatch_keyrì   rþ  Zis_viewÚ2_meta_lib_dont_use_me_use_register_meta_for_mkldnnÚimplÚ/_meta_lib_dont_use_me_use_register_meta_for_mklÚ2_meta_lib_dont_use_me_use_register_meta_for_onednnÚ'_meta_lib_dont_use_me_use_register_meta)Zactivate_meta_tableró  ÚregistryZopoZop_overloadr(   r)   r)   r*   Úactivate_meta  s:     ÿÿ	r0  )F)F)F)NN)NNN)NN)T)rë   )rÿ   )r  T)F)F)F)FF)F)TT)rI  )FTN)TFF)TF)rŠ   )rÛ  N)rÛ  N)FF)N)r)   rn   FTN)r)   rn   FTN)N)rm   )rm   )rm   )rm   )rm   )rm   )rm   )F)Fr   FNFrH   )T)NF)rH   F)rm   )F)F)N)F)r)   rn   rý  F)r)   rn   rý  F)NNNNN)r   NNrm   )T)F)F)N)N)NNF)N)N)r–  FFN)N)r–  FN)FN)T)T)F)N)NN)NN)NNN)NrH   FNN)NN)NF)NNNN)rH   TT)NN)NNN(  rÞ  Úenumr   Útypingr   r   r   r   r   r.   Ztorch._prims_commonr  rŒ   r   r	   r
   Ztorch._decompr   r   r   r   Z
torch._opsr   Ztorch._primsr   r   r   r   r   r   r   r   r   Ztorch._prims_common.wrappersr   r   r   r   r�  r   r   Z%torch.fx.experimental.symbolic_shapesr   r    Ztorch.utils._pytreer!   Zopsr"   ZlibraryÚLibraryr.  r-   r6   r=   Ztaker    ry   rG   rS   rX   ZcummaxZcumminr`   rb   r„   Z_fft_c2cr‰   Z_fft_r2crŽ   ZrandpermZgenerator_outr’   rA   r˜   Úrandintrš   r›   rœ   Zrandr�   Z_fft_c2rrž   r¸   r£   r¨   Z
unsqueeze_rª   Zindex_reducer/  rò  rß  r³   Zindex_reduce_r´   r¹   r¶   rº   rÙ   Z	unary_outr½   rJ   rÅ   rØ   rÆ   rÇ   rÌ   rË   rÍ   Z_assert_asyncrÏ   ÚmsgrÑ   Z_make_dep_tokenrÕ   rÝ   Z_functional_sym_constrain_rangerá   râ   Z(_functional_sym_constrain_range_for_sizerã   Z_functional_assert_asyncrä   rT   rñ   rU   rù   rþ   r  r
  Z_linalg_eighr  r  r  r  r  r  r  r   r(  Zlinalg_inv_exr*  Zlinalg_ldl_factor_exr0  Zlinalg_ldl_solver7  Z	linalg_lur=  Zlinalg_lu_factor_exr?  Zlinalg_lu_solverC  Z	lu_unpackrG  rN  Z	linalg_qrrQ  rT  rR  Z_linalg_svdr\  r5  r  rd  rp  Zlinalg_solve_triangularru  rx  r|  Z_linalg_detr}  rƒ  r†  r•  Zreflection_pad1drš  Zreplication_pad1drœ  r¡  Zreflection_pad1d_backwardr¤  Zreplication_pad1d_backwardr¥  r°  Zreflection_pad2dr²  Zreplication_pad2dr³  Zreflection_pad2d_backwardrL  Zreplication_pad2d_backwardr¶  r¾  Zreflection_pad3drÀ  Zreplication_pad3drÁ  Zreflection_pad3d_backwardZreplication_pad3d_backwardrÃ  Z_pdist_forwardr1   rÅ  Z_pdist_backwardrÈ  ZbaddbmmrØ  Z	bernoullirÚ  Z
bernoulli_rÝ  rÄ  rÞ  Z_fused_moving_avg_obs_fq_helperrâ  ræ  r„  rç  Úmmrí  rÁ   rY  r   r  Zconvolutionr  r)  Z_has_mkldnnr*  r  Z_convolution_pointwiser  Z_linear_pointwiser  Zhas_mklr,  r  Z_mkl_linearr  r-  r  Zqconv2d_pointwiser#  Zqlinear_pointwiser$  r(  Z
avg_pool2drG  rJ  Zavg_pool2d_backwardrL  Z
avg_pool3dr_  Zavg_pool3d_backwardra  Z_adaptive_avg_pool2drc  Z_adaptive_avg_pool3drd  Z_adaptive_avg_pool2d_backwardri  Z_adaptive_avg_pool3d_backwardrl  rj  Zadaptive_max_pool2dru  rw  ry  Zadaptive_max_pool3drz  r{  r|  Zrepeat_interleaver~  Úcomplexr�  r  r5   rƒ  r…  rˆ  r@   Z_unsafe_indexr’  Zconvolution_backwardr”  Zaddbmmr–  Z_foreach_neg_Z_foreach_reciprocal_Z_foreach_sqrt_Z_foreach_sign_rš  Z_foreach_negZ_foreach_reciprocalZ_foreach_sqrtZ_foreach_signr�  rŸ  Z_foreach_addZ_foreach_subZ_foreach_mulZ_foreach_divZ_foreach_maximumZ_foreach_minimumr¢  Z_foreach_add_Z_foreach_sub_Z_foreach_mul_Z_foreach_div_Z_foreach_maximum_Z_foreach_minimum_r£  ZScalarr§  r¨  Z_foreach_addcdiv_Z_foreach_addcmul_r´  Z_foreach_lerp_rµ  Z_foreach_addcdivZ_foreach_addcmulr¶  Z_foreach_powZScalarAndTensorr»  r½  Z_foreach_copy_r¾  Z_fused_adam_rÎ  Z_fused_adamrÐ  Z_int_mmrÑ  Z_cdist_forwardrÝ  Z_cdist_backwardrâ  Z_embedding_bagró  Z_embedding_bag_forward_onlyrõ  r÷  Znansumrø  ZmedianZ	nanmedianrù  Z
dim_valuesrH  rY   rû  Zlogical_not_rü  Úrepeatrÿ  Zzero_r   Zmul_Zdiv_Zlogical_and_Zlogical_or_Zlogical_xor_r  Zadd_Zsub_r  ÚroundZdecimalsr  r  Ú
__rshift__r  Ú
__lshift__r  Úzeror  rh  r  Úfillr  Zrelu_r  Z	index_putZ_unsafe_index_putr  Zmasked_fill_r  Z
index_put_r  Úaliasr  r   Zbmmr!  r$  r'  r7  r8  rT  r5  r`  r6  Z max_pool2d_with_indices_backwardr8  Zmax_pool2d_with_indicesr9  Zmax_unpool2drA  rB  Zmax_unpool3drC  Zmax_pool3d_with_indicesrK  Z max_pool3d_with_indices_backwardrM  rR  rS  rZ  Zgrid_sampler_2d_backwardr`  rb  rc  rd  rà  rŽ  rk  Zselect_scatterrm  Zslice_scatterrq  r_   rt  ry  Zgatherr{  r�  r…  r†  rŠ  rŒ  Zscatter_addr�  Zscatter_add_r’  r‹  r¡   r  r­   Zvalue_reducer”  Zscatter_r•  Z#_scaled_dot_product_flash_attentionr¤  Z,_scaled_dot_product_flash_attention_backwardr±  Z'_scaled_dot_product_efficient_attentionr¹  Z0_scaled_dot_product_efficient_attention_backwardr¼  Zscatter_reduceÚtwoZtwo_outr¿  Zscatter_reduce_rÀ  ZmultinomialrÂ  rÅ  rÊ  rÏ  rÓ  rÖ  ÚtypesZSymIntr×  rt   rØ  Zvalues_stablerÚ  ZargsortrÛ  rè  Z_thnn_fused_lstm_cellrí  rø  rû  rý  rþ  rÿ  Zargminr   r  Ztopkr  r±   r
  r	  r  Zpixel_shuffler  r  Z	bucketizeZ
Tensor_outr  Z_upsample_bilinear2d_aar  r  r  rt  r  Zsearchsortedr  Z	polygammar  r  r   Zspecial_airy_aiZspecial_bessel_y0Zspecial_bessel_y1Zspecial_modified_bessel_i0Zspecial_modified_bessel_i1Zspecial_modified_bessel_k0Zspecial_modified_bessel_k1Z!special_scaled_modified_bessel_k0Z!special_scaled_modified_bessel_k1Zspecial_chebyshev_polynomial_tZn_scalar_outZspecial_chebyshev_polynomial_uZspecial_hermite_polynomial_hZspecial_hermite_polynomial_heZspecial_laguerre_polynomial_lZtorch._refs.nn.functionalZtorch._refs.specialr0  r)   r)   r)   r*   Ú<module>   s  $
	ÿ	6

   ÿ
   ÿ
ø

	


ùø
ùø




	
	








ú






ý)ÿ  ÿüÿ   ÿ ýý
ÿ2

üûÿ   þ&
&
 ÿ  þúù7
 üû(þ
ý 
  üü& þ  
þ÷ö;ùø  û
ú/

 ûúZ&5üÿ ?üÿ'  



 ó
øøe
÷'
  ÿ
  ÿ  ÿ!
    ùM,
H    ùTN



.


*
"c üÿüÿúÿ
úÿ




üÿ



üÿ

þÿ
ÿÿ

þÿðð$#
     ÷h	


úÿ


ùÿ

üÿ!
Têê]?í6G+      ÿ!
7/


   úg
e(

	    ú,/	




üÿ



üÿÿÿ	   ùù[ÿÿññ-ÿÿ  øø'ÿÿ óó5 ûû


üÿ"  ÿ
7'
"  ÿ
   ÿ

	
ýÿ
ýÿ
ýÿ
ýÿ
ýÿ

9