
    Ph^                    +   U d dl Z d dlZd dlZd dlmZ d dl mZmZ d dlmZm	Z	 d dl
Zd dl
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mZmZmZmZmZmZ d d	lm Z m!Z!m"Z"m#Z#m$Z$ d d
l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9 d Z:ddZ;d Z<d Z=d Z>d Z?d Z@d ZAddZBd ZCd ZDdddZEd ZF	 ddZGddZH	 ddZIddZJdd ZKdd!ZL	 dd"ZM	 dd#ZN	 dd$ZOdd%ZPd& ZQd' ZRd( ZSd) ZT	 dd*ZUdd+ZVdd,ZWdd-ZX	 dd.ZY	 d d0ZZ	 dd1Z[dd2Z\dd3Z]dd4Z^	 dd5Z_d6 Z`d7 Zag  e3d8dd:ej                  j                   e!ej                  ej                        d;e<e=d/d/d/ e. ej                  d<      d=d>      f?       e3d@dAej                  j                  dB e"       d/d/eAeegdC
       e3d@dAej                  j                  dDdB e"       d/d/de?eeg e. ej                  dE      d=dF       e. ej                  dG      dHdIdJej                  fe'K       e. ej                  dG      dLdMdJej                  fe'K       e.ej                  dHdNej                  fO       e.ej                  dLdPej                  fO       e. ej                  dQ      dHdNdRS       e. ej                  dQ      dLdPdRS       e. ej                  dT      dHdIdR e$       e+K       e. ej                  dU      dLdMdR e$       e+K      f	V       e3dWdXdY e!ej                  ej                  ej                  ej                        dd/d/eSeTZ	       e3d[d\ e"       d/d/deUe0eeg]	       e3d^d_ e"       d/d/deUe0eeg]	       e3d`dad9dbdc e#ej                  ej                        eFdd/d/ e. ej                  dd      dedfej                  ej                  fO       e. ej                  d<      d=d>      fg	       e3dhdi e"       eJddd/d/e&eeeg e. ej                  dd      djdkdRej                  ge+K       e. ej                  dd      djdldRej                  ge+K      fm       e3dndoej                  j                   e"       eVdddd/d/ e.ej                  d=dpdJS       e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr      feeegv       e3dwdxej                  j                   e"       eGdddd/d/eeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr      fy       e3dzd{ e"       eWe0dddd/d/eeeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr      f|       e3d}d~ e"       eWe0dddd/d/eeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr      f|       e3ddej                  j                  d e"       d/ddd/d/de>ee e. eej                   edd      i             e. ej                  d      dLdPdJej                  fr      g       e3dd e"       deNeeg       e3dd e"       deNeeg       e3dd e"       deO e e       dk  d      eeeg       e3dd e"       d/ePeQeeg e. ej                  dd      dL       e. ej                  dd      dH       e. ej                  dd      d=dp       e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr      f       e3dddd d e"       ePeRd/d/d/d/eeg e.ej                  dtdu       e.ej                  dd      f       e3ddd e"       d/dd/d/deeege@       e3dd e!ej                  ej                         e#ej                  ej                        dddd/d/deCe& e. ej                  d      d=dF       e. ej                  dd      ddej                  fr       e. ej                  dd      dddJej                  fr      f       e3ddej                  j                   e#ej                  ej                        eeegeEd/dd/ e.ej                  dHdN       e. ej                  dd      djdkdRej                  ge+K       e. ej                  dd      djdldRej                  ge+K      f
       e3dej                  j                  d e#ej                  ej                        eeeg eeEd      dd/dd/ e.ej                  dHdN       e.ej                  dLdP       e.ej                  dLdM       e.ej                  dHdI       e. ej                  dd      djdkdRej                  ge+K       e. ej                  dd      djdldRej                  ge+K      f       e3dd e#ej                  ej                        d/ddd/eeegeD e. ej                  dd      djdkdRej                  ge+K       e. ej                  dd      djdldRej                  ge+K      f
       e3ddej                  j                   e"       d/d/de_eeg	       e3ddej                  j                   e"       d/d/eAeeg       e3ddeLej                  j                   e        d/d/deK e. ej                  d<      d=d>      f
       e4dej                  j                  d dd/d/d/dd/ e#ej                  ej                        e:d e.ej                  dd       e.ej                  dd      f       e3ddej                  j                   e"       d/d/d/e]eeg e.ej                  d=d      f
       e3ddej                  j                   e"       d/d/d/e]eeg e.ej                  d=d      f
       e3ddej                  j                   e"       d/d/d/e]eeg e.ej                  d=d      f
       e3dej                  j                  d e"       d/d/dd/eB e. ej                  dƫ      d=dǫ      feegȫ       e3ddej                  j                  d e"       eGdd/d/eeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr      f̫       e3ddej                  j                   e"       eGdd/d/eeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr      fϫ
       e3ddej                  j                   e"       eZd/d/d/eeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr      fҫ
       e3ddej                  j                    e"       eZd/d/eeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr      fի	       e3ddej                  j                   e"       e[d/efd/ث       e3dd e"       deHeeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtduej                  ej                  gO      f۫       e3ddd e"       deYeeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      dtdudqej                  gr      fݫ       e3ddej                  j                   e"       d/ddd/d/eXeeg e. ej                  dd      dtdudRS      f       e3dddDd  e"       dddd/d/eIe*eeg e.ej                  dtdu       e. ej                  dd      dLdPdRej                  gr       e. ej                  dd      dHdNdRej                  gr      f       e3ddd e"       ddd/d/deYe0eeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr       e. eej                   edd㬃      i      d=dFdRS       e.e)dLdPdRS      f       e3dej                  j                  dd e"       d/d/d/ddde;eeeg e. ej                  dd      d=dpdqej                  gr       e. ej                  dd      d=dsdqej                  gr       e. ej                  dd      dtdudqej                  gr       e. ej                  dd      djdkdRej                  ge+K       e. ej                  dd      djdldRej                  ge+K      f       e3dej                  j
                  dd e"       dd/d/de^eeeg e. ej                  dd      djdkdRej                  ge+K       e. ej                  dd      djdldRej                  ge+K      f       e3dej                  j                   e"       ead/d/deeg e. ej                  d<      d=d>      f	       e3ddd e"       e`d/d/ee e. eej                   edd      i      d=dFdRS      g e. ej                  d<      d=d>      f      Ze	e3   ed<    e8ddWde       e8dd`e       e9ddd/e e.ej                  dd       e.ej                  dd      f       e8ddd/de       e8ddd/de       e8ddd/e       e8ddd/e      gZe	e3   ed<   y(      N)partial)chainproduct)IterableList)inf)make_tensor)_get_magma_version_get_torch_cuda_versionwith_tf32_off)
has_cusolverskipCPUIfNoLapack
skipCUDAIfskipCUDAIfNoCusolverskipCUDAIfNoMagmaskipCUDAIfNoMagmaAndNoCusolver"skipCUDAIfNoMagmaAndNoLinalgsolverskipCUDAIfRocmtoltoleranceOverride)all_types_and_complexall_types_and_complex_andfloating_and_complex_typesfloating_and_complex_types_andget_all_complex_dtypes)GRADCHECK_NONDET_TOLIS_MACOS4make_fullrank_matrices_with_distinct_singular_valuesskipIfSlowGradcheckEnvslowTestTEST_WITH_ROCM)
clone_sampleDecorateInfo
ErrorInput!gradcheck_wrapper_hermitian_inputLMOpInfoReductionOpInfoSSampleInput)PythonRefInfoReductionPythonRefInfoc                 .      fd}d  |       D        S )Nc                      d} t         dt          f}j                         dk(  rGj                  d      }|| S t        |t              s|f}|D ]  }j                  |      dk(  s| c S  | |z   S )N)            r   g?g r   dim)r   numelget
isinstancer   size)has_idno_idr4   dkwargsts       |C:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/testing/_internal/opinfo/definitions/linalg.pyordsz'sample_kwargs_vector_norm.<locals>.ords?   sv    %dSD!779>**U#C{c8,f66!9>!M  ~    c              3   8   K   | ]  }d t        |      f  yw) )ordN)dict).0os     r>   	<genexpr>z,sample_kwargs_vector_norm.<locals>.<genexpr>M   s     .v!R!vs   rB   )r=   r<   r?   s   `` r>   sample_kwargs_vector_normrH   =   s     /tv..r@   Fc              +     K   t         }t        ||||      }d| j                  v g d}g d}fdfd}	fd}
fd}fd	}|	|
||f}rd
nd}t        |||d|      D ]$  \  }}}}}|||fz   }t	         || ||i|       & y w)Ndtypedevicerequires_grad
linalg.svdrB   r      r   rR      c                     | d   }|j                   d   }| d   dd |f   }r| d   n| d   j                  }|dd |d d f   }|||fS )Nr3   r   .r2   )shapemH)usvr*   kUVhis_linalg_svds        r>   
uniformizez%sample_inputs_svd.<locals>.uniformizeZ   sa    FGGBKF37O$SV#a&))RaR
^!Rxr@   c                 <     |       \  }}}|j                         S Nabs)rY   r[   _r^   s      r>   fn_Uzsample_inputs_svd.<locals>.fn_Ub   s    S/1auuwr@   c                      |       d   S )Nr3   rB   )rY   r^   s    r>   fn_Szsample_inputs_svd.<locals>.fn_Sf   s    #q!!r@   c                 @     |       \  }}}||j                         fS r`   ra   )rY   rc   r*   r\   r^   s       r>   fn_Vhz sample_inputs_svd.<locals>.fn_Vhi   s"    c?1b"&&({r@   c                 *     |       \  }}}||z  |fS r`   rB   )rY   r[   r*   r\   r^   s       r>   fn_UVhz!sample_inputs_svd.<locals>.fn_UVhn   s     c?1b2vqyr@   full_matricessomeTFr<   output_process_fn_grad)r   r   namer   r+   )op_inforL   rK   rM   r<   make_fullrankmake_argbatchesnsrd   rf   rh   rj   fnsfullmatbatchnrZ   fullmat_valfnrW   r]   r^   s                        @@r>   sample_inputs_svdr|   P   s     HMU6H !GLL0MG	B"
 uf
%C!.oFG(/RPS(T$q!["Aeg{%;TV
 	
 )Us   BBc              +   V  K   t        t        |||      }t         |t        df       |t        df      f       t         |t        dt        f       |t        dt        f      ft	        d             t         |d       |t        df      ft	        d             y w)	NrJ   rR   argsr3   r4   r   r<   )r3   rR   rV   )r   r	   r+   r*   rD   rq   rL   rK   rM   r<   rs   s         r>   sample_inputs_crossr   }   s     5}H h1v&h1v.>-@
AA
!Q8Q1I#6"8!  hv&h1v.>-@RT
VVs   B'B)c              +   D  K   t        t        |t        j                        }t	         |t
        df       |t
        df      f      }d}t        ||t               t	         |dt
        df       |t
        df      f      }d}t        ||t               t	         |t
        d	f       |t
        d	f      f      }d
}t        ||t               t	         |t
        d	f       |t
        d	f      ft        d	            }d}t        ||t               y w)NrL   rK   rR   r3   )inputr   z&inputs dimension -1 must have length 3error_regex
error_typerT   z.inputs must have the same number of dimensionsr2   zmust have length 3r   )r   r   r<   zDimension out of range)
r   r	   torchfloat32r+   r*   r$   RuntimeErrorrD   
IndexError)rq   rL   r<   rs   sampleerrs         r>   error_inputs_crossr      s     {6GHxA/xA7G6IJF
2C
V
FFxAq	2(Aq6:J9LMF
:C
V
FFxA/xA7G6IJF
C
V
FF1vh1v&6%8!F #C
V
DDs   DD c              +     K   t        t        |||dd      }t         |t        t        f       |t        f             t         |t        dz   t        f       |t        f             t         |ddt        t        f       |ddt        f             t         |ddt        dz   t        f       |ddt        f             t         |ddd       |ddd             t         |t        t        f       |ddd             t         |t        t        f       |t        dz
  fdd             t         |t        t        dz
  f       |t        dz
  fdd             yw)	a9  
    This function generates input for torch.linalg.householder_product (torch.orgqr).
    The first argument should be a square matrix or batch of square matrices, the second argument is a vector or batch of vectors.
    Empty, square, rectangular, batched square and batched rectangular input is generated.
    r2   )rL   rK   rM   lowhighr3   r   r   N)r   r   rP   )r   r	   r+   r*   r   s         r>   !sample_inputs_householder_productr      sE     #H h1v&!
77
hAqz*HaTN
;;
h1a|,h1ay.A
BB
h1a!eQ/0(Aq!92E
FF
T-4d+  h1v&4d(K
LL
h1v&!a%t$(O
PP
h1q5z*Ha!eX4d,S
TTs   E1E3c              +      
K   t        t        |      

fd}t        dt        d            D ]1  \  }}|||fz   }t        d|      D ]  }	t	         |||	              3 y w)Nr   c                    | d   | d   k(  sJ |dkD  r|| d   k  sJ | d   } | d d ||fz         dz  } | d d ||fz         dz  }||z  }t         j                  j                  |      \  }}}t        j                  ||      \  }	}
}|j	                  ddd      j                         }|j                  dd      j                  }t        j                  |||z
  d      j                  }|j	                  ddd      j                  |       t        j                        j                  |j	                  ddd      d	|f<   |	|
z  |z  }|j                         |S )
NrV   r   r   
   T)r4   keepdimF)rZ   largest.)r   linalglu_factor_ex	lu_unpackdiagonalrb   maxvaluestopkindicesdiv_finfoepsrequires_grad_)r8   rankry   abxlupivsrc   plu
u_diag_absu_diag_abs_largestu_diag_abs_smallest_idxsmatrixrK   rs   rM   s                   r>   make_singular_matrix_batch_basezJsample_inputs_linalg_det_singular.<locals>.make_singular_matrix_batch_base   sm   Bx48###axD48O++HT#2Y!T*+b0T#2Y$*+b0Ell//2D!//"d+1aZZ2r*..0
'^^D^AHH#(::1t8e$

' 	! 	


1b"""#56?D{{5?Q?U?U

1b"c#;;<Qm,r@   )rB   r2   r2   r2   r0   r3   )r   r	   r   ranger+   )rq   rL   rK   rM   r<   r   rx   r8   rW   r   rs   s     ``      @r>   !sample_inputs_linalg_det_singularr      sg     {6?H, 158<tt$!TND=eTJKK # =s   A$A)c              +      K   t         }t        t        |||      }t        ||||      }g d}|D ]C  \  }	}
|
|	|	fz   }dD ]  }t         ||      |f        dD ]  }t         || |f        E y w)NrJ   ))r3   rB   )r2   rP   )r2   r   rS   r~   )r   rV   )r   r   r	   r+   )rq   rL   rK   rM   r<   rr   rs   make_arg_fullrank
test_sizesmatrix_sizebatch_sizesr8   ry   s                r>   !sample_inputs_linalg_matrix_powerr      s     HM5}H  U6J %/ [k;77AhtnA488 A/6aTBB 	 %/s   A6A8c              +     K   t         }t        ||||      }g d}g d}| j                  dk(  }	t        ||      D ]  \  }
}|
||fz   } || }|	r|j	                         sp|j                         dkD  r]t        j                  j                  |      j                  }||j                  d      j                  d      z  }|j                  |       t        |        y w)NrJ   rO   )r   r3   rT   logdetr   rV   )r   r   rp   r   
is_complexr5   r   r   slogdetsign	unsqueezer   r+   )rq   rL   rK   rM   r<   rr   rs   rt   ru   	is_logdetrx   ry   rW   Ass                  r>   'sample_inputs_linalg_det_logdet_slogdetr      s      IMU6H G	B(I
 
"			Ae Q\\^	A$$Q',,AAKKO--b11A]+!n 
s   CCc              +   H  K   t         }t        |||      }t        t        ||      }d }| j                  dk(  }	d}
d}d}t	        ||
|      D ]  \  }}} ||||fz    }t
        j                  j                  |      \  }} ||||fz         }|sdnd}t	        ||      D ]|  \  }}|r|s|s|	rOt	        dd	
      D ]>  \  }}t         |||      | ||r|n|j                  |      ft        ||             @ ^t         |||       |||      |f       ~  yw)z8Samples the inputs for both linalg.lu_solve and lu_solverK   rL   c                 H    | j                         }|j                  |       |S r`   )cloner   )XrM   Ys      r>   r   z%sample_inputs_lu_solve.<locals>.clone  s     GGI	'r@   linalg.lu_solverB   rP   r   )rR   r3   r   )r1   r3   r   Frm   r2   repeat)adjointleftr   r~   N)r   r   r	   rp   r   r   r   	lu_factorr+   mTrD   )rq   rL   rK   rM   r<   make_fnmake_amake_br   is_linalg_lu_solvert   ru   nrhsry   rx   rhsr   LUpivotsBgradsLU_gradB_gradr   r   s                            r>   sample_inputs_lu_solver     s>    BGWE&9F[f=F
 !)::G	BD Wd35#UaV^%\\++A.
F5As8#$ -=&ue4OGVWV!%,]1%EMGT%b'*$eA144&HI#G$?  &F "%6"2%G:Lf9UVV  5 4s   D D"c              +      K   g dg dg dg dg dg dg dg}|D ]H  }g }t        |d d |d	d        D ]"  }t        ||||
      }	|j                  |	       $ t        |       J y w)N)r3   r2   r3   )r2   r   r2   )r   r2   r2   )r2   r2   r2   r2   )r2   rR   r1   rT   )rT   r1   r   r2   )r2   r1   rR   rT   rR   r2   rV   r3   rJ   )zipr	   appendr+   )
rq   rL   rK   rM   r<   
test_casessizestensorsr8   r=   s
             r>   sample_inputs_linalg_multi_dotr   8  s      	J cr
E!"I.DE&A NN1	 /
 '"" s   A&A(c              +   L  K   t         j                  t         j                  t         j                  f}t	        t
        |||      }d}||v rdt        t         ddf}nddt        t         ddddf}d	}	t        |||	d
dg      D ]  \  }
}}}t         ||
      |||f       ! y w)NrL   rK   rM   )r   )r2   rR   r2   fror3   rV   nucr2   r   ))r   rV   )rV   r   TFr~   )	r   float16bfloat16	complex32r   r	   r   r   r+   )rq   rL   rK   rM   r<   low_precision_dtypesrs   r   r?   dimsr8   rC   r4   r   s                 r>    sample_inputs_linalg_matrix_normr   O  s     !MM5>>5??KF%}H  E$$sSD!R(ucC4B26D#*5$tUm#Lc3(4.S'/BCC $Ms   B"B$)variantc             +   f  K   ||dvrt        d|       t        fdt        t        fdt        dfdt        ft        t        t        fdt        t        ft        dt        fdg
}d dddd	d
t        ddddt         f}|t        j                  t        j
                  t        j                  hv rdt        t         ddf}nd ddt        t         ddd	df	}t        t        |||d d       }	|D ]D  t              dk(  }
t              d	k(  }|
xs d   dk7  xr d   dk7  }dD ]	  }|dk7  r|rt         |	      |       |
s|s%|
r|n|}|D ]  }|
r#d   dk(  r|t        j                  k(  s|Z|dk  rU(|rRd dt        j                  dd	dddddddt        j                   dij                  |d      }t        fd|D              r||dk(  r(t        t        j                  |||      ||       t         |	      ||       |dv st         |	      ||d         G y w)N)subgradient_at_zerozKUnsupported variant, expected variant to be 'subgradient_at_zero' but got: rP   r   r   )r   r   r   g      ?r3   r2   g      @g      rV   r   g      r   r   )rK   rL   rM   r   r   FTr   )r   )r   r3   r3   rB   c              3   .   K   | ]  }|   d k(    yw)r   NrB   )rE   r;   	test_sizes     r>   rG   z,sample_inputs_linalg_norm.<locals>.<genexpr>  s     Dm9Q<1,ms   rJ   )r   r   )rC   r   r4   )
ValueErrorr*   r   r   r   r   r   r   r	   lenr+   npr6   anyzeros)rq   rL   rK   rM   r   r<   r   vector_ordsmatrix_ordsrs   is_vector_normis_matrix_normis_valid_for_p2r   r?   rC   dims_to_checkr   s                    @r>   sample_inputs_linalg_normr
  a  s~     w.FFYZaYbc
 	

 
	
A	
A	
A	
Aq		
Aq		
Aq	J CAsCr2tcTJK@@cC4B/UE3aQC#H  	Y1,Y1, )WYr]a-?-VIbMUVDV$G//O!(9"5wGG"n"0;kD!imq&8bff}S1W !#d64DF% c#rl " DmDD !33%%"'#)*7	  '	 	 &hy&93PPn,)$Y/S'v M  %  s   HH1 H1c           	   +   &  K   t        t        |||      }d}d}t        ||      D ]g  \  }}	||	fz   }
t         ||
       ||
      f       t	        t        |
            D ])  }t         ||
       ||
      ft        |             + i y w)Nr   )rB   rP   r   )rT   )r   r3   rR   rT   r~   r   r   )r   r	   r   r+   r   r   rD   )rq   rL   rK   rM   r<   rs   rt   ru   r   ry   rW   is               r>   sample_inputs_linalg_vecdotr    s     F%}H %G	B$1QD(5/%0BCCs5z"Ax&8!  # %s   BBc              +      K   t         }t        ||||      }g d}ddg}t        ||      D ]  \  }	}
t         |g |	|
|
         yw)a  
    This function generates invertible inputs for linear algebra ops
    The input is generated as the itertools.product of 'batches' and 'ns'.
    In total this function generates 8 SampleInputs
    'batches' cases include:
        () - single input,
        (0,) - zero batched dimension,
        (2,) - batch of two matrices,
        (1, 1) - 1x1 batch of matrices
    'ns' gives 0x0 and 5x5 matrices.
    Zeros in dimensions are edge cases in the implementation and important to test for in order to avoid unexpected crashes.
    rJ   rB   rP   r   )r3   r3   rT   r   Nr   r   r   r+   )rq   rL   rK   rM   r<   r   rs   rt   ru   rx   ry   s              r>   sample_inputs_linalg_invertibler    s^      CGweF-XH&G
QBGR(q(0E010a011 )s   A
Ac              +   6  K   fd}dD ]r  }t        d|gd      D ]^  \  }}|s|st        | ||      D ]C  }	|	j                  i k(  sJ  |||	j                         |||	j                        d|	_        |	 E ` t t        | ||      E d{    y7 w)zq
    This function produces inputs for matrix rank that test
    all possible combinations for atol and rtol
    c                 r    | dk(  ry | dk(  ry| dk(  sJ t        j                  |j                  d d       S )Nnonefloat      ?tensorr   rL   )r   onesrW   )
kwarg_typeinprL   s     r>   make_tol_argz/sample_inputs_matrix_rank.<locals>.make_tol_arg  sB     X%%%zz#))CR.88r@   )r  r  r  r2   r   atolrtolN)r   r  r<   r   )
rq   rL   rK   rM   r<   r  tol_type	atol_type	rtol_typer   s
    `        r>   sample_inputs_matrix_rankr#    s     9 ($+VX,>q$I Iyi9 }}***(FLLA(FLLA!  %J (" /w}UUUs   BBBBc              +     K   g d}g d}t        |||      D ]  \  }}}	t        t        d||	            D ]  }
t        j                  g |||
||dj                         j                  j                  |      }t        j                  g ||	|
||dj                         j                  j                  |      }t        ||f         yw)aU  
    This function produces factors `a` and `b` to generate inputs of the form `a @ b.t()` to
    test the backward method of `linalg_pinv`. That way we always preserve the rank of the
    input no matter the perturbations applied to it by the gradcheck.
    Note that `pinv` is Frechet-differentiable in a rank-preserving neighborhood.
    r  )r   rR   2   rR   r   r~   N)	r   r   minr   randqrQr   r+   )rq   rL   rK   rM   r<   rt   r8   rx   mry   rZ   r   r   s                r>   "sample_inputs_linalg_pinv_singularr+    s      'G Dwd3q!s1a|$A 

DED1DaDeD>>-0  

DED1DaDeD>>-0 
 aqd++ % 4s   CCc              +      K   t        t        |||      }t        t        fdt        t        fddt        t        ff}|D ]  }t         ||              y w)NrJ   r2   r3   )r   r	   r*   r+   )rq   rL   rK   rM   r<   rs   shapesrW   s           r>   sample_inputs_linalg_condr.  *  sX     5}H 
A	
Aq		
Aq!F (5/** s   AAc              +   X  K   t        t        |||      }ddt        fdt        ff}|D ]}  }t        |      dkD  r|d   dkD  rt	         ||             t        |      dkD  r|d   nd}t        d      D ]/  }	||	z   dz
  }
|
dk  rt	         ||      t        |
	      
       1  y w)NrJ   rB   r   r2   r   rV   r3   rR   )Nr<   )r   r	   r*   r   r+   r   rD   )rq   rL   rK   rM   r<   rs   r-  rW   ry   r  r0  s              r>   sample_inputs_linalg_vanderr2  :  s     5}H
 		
	
A	F u:>eBi!mhuo..UaE"IQqAA	A1uhuodQi@@ 	 s   B(B*c                 F   | j                   dk(  r| t        j                     } | j                   dk(  rt        j                  | |d      }|S || j                  d   }t        j                  | j                         |d      j                  g | j                  |      }|S )Nr   r3   T)r0  
increasingrV   )ndimr  newaxisvanderrW   ravelreshape)r   r0  ys      r>   np_vander_batchedr;  R  s    vv{bjjMvv{IIa1.9AIIaggi16>>}}!}Mr@   c              +     K   ddl m}  |t        t        ||      } |dt        t        ||      }||j                  z  }||j                  z  }	t	        j
                  dd||      t	        j
                  ddd||      ||	f}
d |
D        }|D ]  }||_        t        |       t        |j                         j                         j                  |      t        d             |j                         j                         j                  j                         j                  |      }t        |t        d	              y w)
Nr   random_well_conditioned_matrixr   r2   c              3   ^   K   | ]%  }t         j                  j                  |d        ' yw)FupperN)r   r   choleskyrE   r   s     r>   rG   z8sample_inputs_linalg_cholesky_inverse.<locals>.<genexpr>u  s%     HA%,,'''7   +-Fr@  r1  T)$torch.testing._internal.common_utilsr>  r*   rX   r   r  rM   r+   detachr   r   rD   r   
contiguous)rq   rL   rK   rM   r<   r>  single_well_conditioned_matrixbatch_well_conditioned_matrices	single_pdbatch_pdinputsr   r   r   s                 r>   %sample_inputs_linalg_cholesky_inverserM  `  s1     T &D	1E&&" 'E	1auV'# /1O1R1RRI.1P1S1SSH 	Aqf5Aq!58	F IHJ'!nHHJ--m<TPUEV
 	

 HHJ!!,,.==mL!Dt$455 s   E
Ec           	   +     K   ddl m}m} t        j                  |      }t         |t        ||      t        d             t         |t        d||      t        d             t        t        j                  dd||      t        d             t        t        j                  ddd||      t        d             |j                  dk(  xr t               d	k\  }|j                  r`|j                  d
k(  s|rNt         |t        ||      t        d             t         |t        d||      t        d             y y y w)Nr   random_hermitian_pd_matrixrandom_symmetric_pd_matrixr   F	hermitianr1  r2   cuda)r2   rT   r1   cpuT)rE  rP  rQ  r   rL   r+   r*   rD   r  typer
   r   )rq   rL   rK   rM   r<   rP  rQ  magma_254_availables           r>   sample_inputs_linalg_ldl_factorrX    s;    
 \\&!F "1E&Ae$  "1auVDe$  Aqf5dU>S  Aq!58PUAV  !++/U4F4HI4UV[[E15H&qfE$'
 	
 &q!5H$'
 	
 6Is   EEc           
   +   d  K   ddl m}m} t        j                  |      } |t
        ||       |t
        d||      t        j                  dd||      t        j                  ddd||      f}|j                  dk(  r+|j                  r |t
        ||       |t
        d||      fnd}d |D        }	d |D        }
t        t        |||	      }|	D ]  }|\  }}}||_        d|j                  d d
 fD ]  } |g ||j                  d   t
              }t        |||ft        d             |j                         j!                         j#                  |      }t        |||ft        d               |
D ]  }|\  }}}||_        d|j                  d d
 fD ]  } |g ||j                  d   t
              }t        |||ft        d             |j                         j!                         j#                  |      }t        |||ft        d               y w)Nr   rO  r   r2   rU  rB   c              3   ^   K   | ]%  }t         j                  j                  |d        ' yw)FrR  Nr   r   ldl_factor_exrC  s     r>   rG   z1sample_inputs_linalg_ldl_solve.<locals>.<genexpr>  s)      @P1""1"6@PrD  c              3   ^   K   | ]%  }t         j                  j                  |d        ' yw)TrR  Nr[  rC  s     r>   rG   z1sample_inputs_linalg_ldl_solve.<locals>.<genexpr>  s)      ?O!""1"5?OrD  r   r   rV   FrR  r   T)rE  rP  rQ  r   rL   r*   r  rV  r   r   r	   rM   rW   r+   rD   rF  r   r   )rq   rL   rK   rM   r<   rP  rQ  symmetric_inputshermitian_inputstest_cases1test_cases2rs   	test_casefactorsr   rc   B_batch_shaper   clone_factorss                      r>   sample_inputs_linalg_ldl_solverf    s@    
 \\&!F"1E&A"qf	
 	Aqf5Aq!58 ;;%E$4$4 'qfE&q!5H	

  @PK?OK
 F%}H !	& - '--"45M?=?'--*;?Q?@AgVQKu@UVV#NN,224CCMRMVQKu8M 	 6 ! !	& - '--"45M?=?'--*;?Q?@AgVQKt@TUU#NN,224CCMRMVQKt8L 	 6 !s   H.H0c           	   +   \  K   ddl m} t        j                  |      }|j                  dk(  rd}nd}|j                  dk(  s
t               rd}nd}t        d	||      D ]K  \  }}	}
|d
|
z   d
fz   } ||||d}|j                  |       t        |||d d |      }t        |||	       M y w)Nr   r=  rT  )gels)rh  gelsygelssgelsdrU  )rV   r   r3   rP   rB   rQ   )rR   rR   rR   r   )rK   rL   r   r   rM   driver)
rE  r>  r   rL   rV  r   r   r   r	   r+   )rq   rL   rK   rM   r<   r>  driversdeltasrx   rn  deltarW   r   r   s                 r>   sample_inputs_linalg_lstsqrr    s     S\\&!F {{f5 {{e|~  '(:GV LvuUA&*EvN	''
 !Qv.. !Ms   B*B,c              +   z   K   t        j                  d|      }t        t        ||f      t        d       y wNrB   r  r~   zat least 2 dimensions)r   r   r   randnr$   r+   r   rq   rL   r<   zero_ds       r>   error_inputs_lstsqry    s5     [[F+F
F&++ s   9;c              +   |   K   t        j                  d|      }t        t        ||d f      t        d       y wrt  ru  rw  s       r>    error_inputs_lstsq_grad_orientedr{    s7     [[F+F
F&$0+ s   :<c              +     K   t        t        |||      }t        t        fddf}t        t        t        ff}t               t        d      t        d      t        d      f}t        ddd      t        ddd      t        d	dd      f}	t	        t        ||      t        ||	            D ]  \  }
}t         ||
      |
        y w)NrJ   )rR   rT   )rT   rR   r2   )offsetr3   )r}  dim1dim2r   r   r1  )r   r	   r*   rD   r   r   r+   )rq   rL   rK   rM   r<   rs   	shapes_2d	shapes_3d	kwargs_2d	kwargs_3drW   kwargs               r>   !sample_inputs_diagonal_diag_embedr    s     5}H
 Q(I QIQQQHIAAA&AAA&BQQ'I 	9%wy)'Du (5/%88s   CC
c              +   `  K   t        t        |t        j                        }d}t        t
        ff}t        t        t
        ff}i }t        dd      t        d      t        d      f}|}	t        ||      }
t        ||      }t        ||	      }t        |
||      D ]  \  }} ||      }t        ||      }|j                  d	      }|j                  d
      }d| j                  v r|j                         }n2| j                  dv r|dv rp|j                         dz   }nt        d      | }|dz
  }t        ||dz         }|xr ||v}|xr ||v}||k(  rd| d| }t!        ||t               |s|r(|r|n|}d| d| d| d}t!        ||t"               t        d       y w)Nr   )r   r3   rP   r   r3   )r~  r  i'  )r~  )r  )r   r<   r~  r  r   )
diag_embedz_refs.diag_embed)rP   r   zshould be unreachablez(diagonal dimensions cannot be identical z, r   z6Dimension out of range \(expected to be in range of \[z\], but got z\))r   r	   r   r   r'   r&   r*   rD   r   r   r+   r6   rp   r4   r   r   r$   r   )rq   rL   r<   rs   shapes1dshapes2dshapes3dkwargs1dkwargs2dkwargs3d	samples1d	samples2d	samples3drW   argr   r~  r  num_dimbound1bound2	dim_range	dim1_cond	dim2_condr   err_dims                             r>    error_inputs_diagonal_diag_embedr  5  s    {6GH!HAyHAq	|HH 	!!%%H H(+I(+I(+Iy)Y?vuo3v6zz&!zz&!%ggiG\\??$ggi!mG6771&&1*-	2T2	2T2	4<<TF"TFKCVNN)'dTGXRx|G9B@  VLL677E @s   F,F.c              +      K   ddl m} g d}ddg}t        ||ddg      D ])  \  }}	}
 ||	g|||d}||_        t	        ||
       + y	w)
aM  
    This function generates always positive-definite input for torch.linalg.cholesky using
    random_hermitian_pd_matrix.
    The input is generated as the itertools.product of 'batches' and 'ns'.
    In total this function generates 8 SampleInputs
    'batches' cases include:
        () - single input,
        (0,) - zero batched dimension,
        (2,) - batch of two matrices,
        (1, 1) - 1x1 batch of matrices
    'ns' gives 0x0 and 5x5 matrices.
    Zeros in dimensions are edge cases in the implementation and important to test for in order to avoid unexpected crashes.
    r   )rP  r  rT   TFr   r@  N)rE  rP  r   rM   r+   )rq   rL   rK   rM   r<   rP  rt   ru   rx   ry   rA  r   s               r>   sample_inputs_linalg_choleskyr  q  sa       P&G
QB"7Bu>q%&qM5MfM'!5)) ?   AAc              +   R   K   d }t        | |||      }|D ]  }||_        |  yw)z<
    This function generates input for torch.linalg.eig
    c                 (    | d   t        | d         fS Nr   r3   ra   outputs    r>   out_fnz(sample_inputs_linalg_eig.<locals>.out_fn  s    ay#fQi.((r@   N)r  ro   rq   rL   rK   rM   r<   r  samplesr   s           r>   sample_inputs_linalg_eigr    s4     
) .gvumTG(.% s   %'c              +      K   d }t        | |||      }|D ]+  }dt        j                  ddg      i|_        ||_        | - yw)zm
    This function generates input for torch.linalg.eigh/eigvalsh with UPLO="U" or "L" keyword argument.
    c                 L    t        | t              r| d   t        | d         fS | S r  )r7   tuplerb   r  s    r>   r  z)sample_inputs_linalg_eigh.<locals>.out_fn  s*    fe$!9c&)n,, Mr@   UPLOr&   r[   N)r  randomchoicer<   ro   r  s           r>   sample_inputs_linalg_eighr    sO     
 .gvumTG  Sz!:;(.% s   AAc              +      K   t        | |||fi |D ]h  }|j                  r |j                  j                  j                  n|}ddt        j                  d||      fD ]  }t        |      }d|i|_        |  j yw)zd
    This function generates input for torch.linalg.pinv with hermitian=False keyword argument.
    Nr  r   r  )	r  r   r   realrK   r   r  r"   r<   )rq   rL   rK   rM   r<   rF   
real_dtyper  s           r>   sample_inputs_linalg_pinvr    s      -17 ,1+;+;QWW\\''
3S
6 RSDQA~AHG Ts   A<A>c              +   N   K   t        | |||fi |D ]  }ddi|_        |  yw)zc
    This function generates input for torch.linalg.pinv with hermitian=True keyword argument.
    rS  TN)r  r<   )rq   rL   rK   rM   r<   rF   s         r>   #sample_inputs_linalg_pinv_hermitianr    s;      -17  &	s   #%Tc              +      K   t         }t        ||||      }t        t        |||      }g d}	ddg}
|rg d}nddg}t        |
|	|      D ]-  \  }}}t	         |g |||  |||fz   |z         f       / y	w)
a  
    This function generates always solvable input for torch.linalg.solve
    We sample a fullrank square matrix (i.e. invertible) A
    The first input to torch.linalg.solve is generated as the itertools.product of 'batches' and 'ns'.
    The second input is generated as the product of 'batches', 'ns' and 'nrhs'.
    In total this function generates 18 SampleInputs
    'batches' cases include:
        () - single input,
        (0,) - zero batched dimension,
        (2,) - batch of two matrices.
    'ns' gives 0x0 and 5x5 matrices.
    and 'nrhs' controls the number of vectors to solve for:
        () - using 1 as the number of vectors implicitly
        (1,) - same as () but explicit
        (3,) - solve for 3 vectors.
    Zeros in dimensions are edge cases in the implementation and important to test for in order to avoid unexpected crashes.
    'vector_rhs_allowed' controls whether to include nrhs = () to the list of SampleInputs.
    torch.solve / triangular_solve / cholesky_solve (opposed to torch.linalg.solve) do not allow
    1D tensors (vectors) as the right-hand-side.
    Once torch.solve / triangular_solve / cholesky_solve and its testing are removed,
    'vector_rhs_allowed' may be removed here as well.
    rJ   r   rT   r   )rB   r   rQ   r   rQ   r~   N)r   r   r	   r   r+   )rq   rL   rK   rM   vector_rhs_allowedr<   rr   r   r   rt   ru   r   ry   rx   r   s                  r>   sample_inputs_linalg_solver    s     2 IMU6F 5}F G
QBd| Wd35#&.%..A.fUaT\C=O6P5RSS 4s   A:A<c           	   +     K   t        t        ||      }d}d}d}t        |||t        dd            D ]F  \  }	}
}\  }}}|	dk(  r!|r
 ||
|
f      n	 |||f      } ||
|f      }n#|r ||	|
|
f      n
 ||	||f      } ||	|
|f      }|r#|j                  d	d
d      j	                  d       n)|j                  d	d
d      }d||j                         dk  <   |r|j                          n|j                          |||d}|rgt        dd      D ]U  \  }}|s|st        |j                         j                  |      |j                         j                  |      f|       W 6t        ||f|       I y w)Nr   )r3   r2   r   )rR   r   )r3   rR   r   rm   rR   r   r3   r   r   rV   r  gư>)rA  r   unitriangularr2   r   )r   r	   r   r   fill_rb   triu_tril_r+   r   r   )rq   rL   rK   rM   r<   rs   bsru   ksr   ry   rZ   r   rA  unir   r   r;   grad_Agrad_Bs                       r>   %sample_inputs_linalg_solve_triangularr    s     {%?H	B	B	B'.
BGM!4(#1a#$s 6$(!Q h1v.>A!Q A'+!Q#1a)1DA!Q#AJJq"b!'',

1b"%A #AaeegnGGIGGI $E")-"Bf!GGI,,V4'')226:<! 	 #C aqd6::?(s   E=E?c              +      K   t        | |||d      }d }|D ]C  }|j                  d   |j                  fc|_        |_        | j                  dk(  r||_        | E yw)aM  
    This function generates always solvable input for legacy solve functions
    (the ones that are not in torch.linalg module).
    The difference from sample_inputs_linalg_solve is that here the right-hand-side of A x = b equation
    should have b.ndim >= 2, vectors are not allowed.
    Also the arguments order is swapped.
    F)rM   r  c                     | d   S )Nr   rB   r  s    r>   r  z*sample_inputs_legacy_solve.<locals>.out_fn.  s    ayr@   r   solveN)r  r   r   rp   ro   )rq   rL   rK   rM   r<   outr  r   s           r>   sample_inputs_legacy_solver  "  sf      %mPUC $*KKNV\\O!fk<<7",2F)	 s   AAc              +   V   K    j                   dk(  }|st        nt        }t        ||||      } fd}d}	t	        j
                  |      j                  dk(  rdnd}
d}t        |	|
|      D ]9  \  }}}|t        |z   t        fz   }|s ||      n || }t        |d	|i|
       ; y w)Nlinalg.lu_factorrJ   c                 :    j                   dk(  r
| d   | d   fS | S )N	linalg.lur3   r2   )rp   )r  rq   s    r>   r  z'sample_inputs_linalg_lu.<locals>.out_fnB  s'    <<;&!9fQi''Mr@   rl  rT  rm   )T)r   rV   r   r3   r2   pivotrn   )
rp   r	   r   r   r   rL   rV  r   r*   r+   )rq   rL   rK   rM   r<   	full_rankr   rs   r  batch_shapesr   rp  batch_shaper  rq  rW   r   s   `                r>   sample_inputs_linalg_lur  9  s      22I  	A 
 weF-XH &L#ll62776A]wF F%,\66%J!UEq5y!n,#,HUO(E2B!We$4VTT	 &Ks   B&B)c              +      K   t        t        |||      }g d}g d}t        |||      D ]  \  }}	}
t         |||	|
fz                  y wNrJ   r  )rT   r2   r   )r   r	   r   r+   )rq   rL   rK   rM   r<   rs   rt   ru   rx   r*  ry   s              r>   sample_inputs_linalg_svdvalsr  S  sV     5}H 'G	BwB/q!(5Aq6>233 0r  c              +      K   t         }t        ||||      }g d}g d}t        |t        ||            D ]  \  }	\  }
}|	|
|fz   }t         ||        ! y wr  r  )rq   rL   rK   rM   r<   rr   rs   rt   ru   rx   r*  ry   rW   s                r>   sample_inputs_linalg_qr_geqrfr  _  si      IMU6H 'G	B '"b/:v1A(E*++ ;s   AAc              +      K   ddg}d dg}t        t        |||      }t        j                  ||      D ](  \  }}	 ||      }
 ||d d       }t	        |
||	       * y w)N)r2   rR   r0   )rR   r1   r1   rR   )r   r2   rJ   r2   )r   )r   r	   	itertoolsr   r+   )rq   rL   rK   rM   r<   a_shapesdimssrs   a_shaper   r   r   s               r>   sample_inputs_tensorsolver  p  st     <(H
 6NE5}H #**8U;WWRa[!!QT** <s   AA c              +      
K   t         

fd}ddg}|D ]U  \  }}  |       j                  g || j                         }	|	j                         t	        |	t        |             W y w)Nc                       dd       S )N   r   rB   )rL   rK   rs   rM   s   r>   
make_inputz+sample_inputs_tensorinv.<locals>.make_input  s    BvU-XXr@   ))r2   r2   rR   )r  r3   ))r1   rR   )r0   r3   r2   )ind)r   r9  rF  r   r+   r   )rq   rL   rK   rM   r<   r  r-  	shape_lhs	shape_rhsr  rs   s    ```      @r>   sample_inputs_tensorinvr    sv     CHY
 	F
 !'	9"jl"":I:	:AAC=)#3y>22 !'s   A.A4zlinalg.crossrV   c                 2    t        j                  | ||      S )N)axis)r  crossr   r:  r4   s      r>   <lambda>r    s    !QS!9r@   linalg_crosszUnsupported on MPS for now
TestCommontest_numpy_ref_mps)
refopdtypes	aten_namesample_inputs_funcerror_inputs_funcsupports_outsupports_fwgrad_bwgradsupports_forward_adskipsz
linalg.det
linalg_det)det)	r  r  aliasesr  r  r  r  
decoratorscheck_batched_gradgradsingularz'The backward may give different resultstest_noncontiguous_samplesz Gradients are incorrect on macosTestBwdGradientstest_fn_gradrU  )device_typer  	active_ifTestFwdGradientstest_forward_mode_ADtest_fn_gradgrad)r  test_fn_fwgrad_bwgradz-Skipped, see https://github.com//issues/84192rT  )r  z=Flaky on ROCm https://github.com/pytorch/pytorch/issues/93044z=Flaky on ROCm https://github.com/pytorch/pytorch/issues/93045)r  r  variant_test_namer  r  r  r  r  r  r  r  zlinalg.diagonallinalg_diagonaldiagonal_backward)r  aten_backward_namer  r  r  r  r  r  zlinalg.choleskylinalg_cholesky)r  r  r  r  check_batched_forward_gradr  gradcheck_wrapperr  zlinalg.cholesky_exlinalg_cholesky_exzlinalg.vecdotlinalg_vecdotr   c                F    | j                         |z  j                  |      S r`   )conjsumr  s      r>   r  r  ,  s    QVVX\$6$6s$;r@   zSkipped!TestSchemaCheckModeOpInfotest_schema_correctness)r  r  r  r  r  r  r  r  zlinalg.condlinalg_condTestFakeTensortest_fake_crossref_backward_amp"test_fake_crossref_backward_no_amp)
r  r  r  r  r  r  r  gradcheck_nondet_tolr  r  z
linalg.eig
linalg_eigtest_outmps)r  r  test_variant_consistency_eagerTestJittest_variant_consistency_jit)r  r  r  r  r  check_batched_gradr  r  r  r  r  zlinalg.eigvalslinalg_eigvals)r  r  r  r  r  r  r  r  r  r  r  zlinalg.eighlinalg_eigh)r  r  r  r	  r  r  r  r  r  r  r  zlinalg.eigvalshlinalg_eigvalshzlinalg.householder_productlinalg_householder_product)orgqrgMbP?r  zSkipped! Flaky)r  r  r  r  gradcheck_fast_moder  r  r  r  r  r  r  zlinalg.ldl_factorlinalg_ldl_factor)r  r  supports_autogradr  r  zlinalg.ldl_factor_exlinalg_ldl_factor_exzlinalg.ldl_solvelinalg_ldl_solve)   r1   z not available before CUDA 11.3.1zlinalg.lstsqlinalg_lstsq)r  r  r  r  r  r  r  grad_orientedc                 L    t         j                  j                  | ||      d   S )Nrm  r   )r   r   lstsq)r   r   rn  s      r>   r  r  \  s     2 21a 2 G Jr@   TestOperatorSignatures(test_get_torch_func_signature_exhaustive)r  r  r  r  r  r  r  r"  r$  r  r  r  r  zlinalg.matrix_power)matrix_powerlinalg_matrix_power)
r  r  r  r"  supports_inplace_autogradr  r  r  r  r  zlinalg.multi_dotlinalg_multi_dotz67470!
TestOpInfoxlaTestNNCOpInfotest_nnc_correctness)r  r  dtypesIfCUDAr0  r  r  r  r  r  r  r  r  zlinalg.normlinalg_norm)	r  r  r  r  r  r  r  r  r  subgradients_at_zeror   )
r  r  r  r  r  r  r  r  r  r  zlinalg.matrix_normlinalg_matrix_norm)	r  r  r  r  r  r  r  r  r  z	linalg.qr	linalg_qr)r  r  r  r  r  r  r  r  zlinalg.slogdetlinalg_slogdet)r  r  r  r  r  r  r  zlinalg.vanderlinalg_vander)	r  r  r  r  r  r  r  r  r  zlinalg.vector_norm	propagatelinalg_vector_normTestReductionstest_dim_emptytest_dim_empty_keepdim)r  identity
nan_policysupports_multiple_dimscomplex_to_realr  r  r  r  generate_args_kwargsr  r  r  linalg_lu_factortest_compare_cpu)	r  r  r  r"  r  r  r  r  r  zlinalg.lu_factor_exlinalg_lu_factor_exr  	linalg_lur   linalg_lu_solvezTests different backward paths'test_floating_inputs_are_differentiable)
r  r  r  r"  r  r  r  r  r  r  z
linalg.inv
linalg_inv)inverse)
r  r  r  r  r  r  r  r  r  r  zlinalg.inv_exlinalg_inv_ex)	r  r  r  r  r  r  r  r  r  zlinalg.solvelinalg_solve)	r  r  r  r  r"  r  r  r  r  zlinalg.solve_exlinalg_solve_ex)r  r  r  r  r  r  r  r  zlinalg.solve_triangularlinalg_solve_triangular)r  r  r  r  r  r  r  zlinalg.matrix_ranklinalg_matrix_rank)r  r  r$  r  r  r  rS  )r  r  r  r$  r  r  r  zlinalg.pinvlinalg_pinv)r  r  r  r"  r  r  r  r  r  r  r  c                 Z    t         j                  j                  | |j                  z        S r`   )r   r   pinvr   )r   r   s     r>   r  r    s    ))!add(3r@   )r  r  r  r  r  r  r  r  r  r  r  r  gh㈵>)r  r  r  r  r  r  r  r  r  r	  r  r  rN   
linalg_svd_linalg_svd)r  r  decomp_aten_namer  r"  r  r  r  r  r  r  r  r  zlinalg.svdvalslinalg_svdvals)r  r  rY  r  r  r  r  r  r  r  r  zlinalg.tensorinv)r  r  r  r  r  r  r  r  zlinalg.tensorsolvec                 F    t         j                  j                  | ||      S )N)axes)r  r   tensorsolve)r   r   r   s      r>   r  r  C	  s    BII$9$9!QT$9$Jr@   )r  r  r  r  r  r  r  op_dbz_refs.linalg.diagonal)torch_opinfo_namer  r^  z_refs.linalg.vecdot)r_  r^  z_refs.linalg.vector_norm)r_  r  r^  r  z_refs.linalg.matrix_norm)r_  r  validate_view_consistencyr^  z_refs.linalg.normz_refs.linalg.svdz_refs.linalg.svdvalspython_ref_dbr   r`   r   )rV   )r  r  unittest	functoolsr   r   r   typingr   r   numpyr  r   r   torch.testingr	   #torch.testing._internal.common_cudar
   r   r   *torch.testing._internal.common_device_typer   r   r   r   r   r   r   r   r   r   $torch.testing._internal.common_dtyper   r   r   r   r   rE  r   r   r   r   r    r!   #torch.testing._internal.opinfo.corer"   r#   r$   r%   r&   r'   r(   r)   r*   r+   #torch.testing._internal.opinfo.refsr,   r-   rH   r|   r   r   r   r   r   r   r   r   r   r
  r  r  r#  r+  r.  r2  r;  rM  rX  rf  rr  ry  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  halfr   skipr  float64expectedFailure
complex128boolr   chalf	complex64r   eigeigvalshouseholder_productlongnormr(  r   r7  vector_normr   r   r   lu_solveinvinv_exr  solve_exsolve_triangularrV  cdoublesvdsvdvals	tensorinvr^  __annotations__ra  rB   r@   r>   <module>r     s/       $ !    % 
       V/&*
ZWE,U@L>C.6&WR#.D& 7;]@  +022VF +0,>+ A0 +0 6H +0%
R +0:z /F9098z +0*4.  +0
 EI)TZ +0';T.U4	4 +0,"+"3$G
9<<(U^^D .,# :;$
G( <<)+ #B%'EF$)G@ <<$)+ #$<%'EFGH,
 @A"!'" @A"&!'" ((""((*	 (("'((*	 MN"""	 MN"'"	 S #"-/(	 S #&"-/(	sC
PAGb #.(JJu{{
  #<:cG| #)+ ##(8;24EF}GT &)+ ##(8;24EFUGl ! ";-ejj%..I6#( # j)+))9)9:	 :;$
mG\ )+4$#( #124E}Uj) 1"( j) 4"(
]GX <<)+3#( $ # ((,
PU j)! j)0! j).!'
6 &'8-HM'YGh "<<)+:#( $ #%'89j)! j)0! j).!
#iGp )+4;#( $ #%'8-Hj)! j)0! j).!
#qGx	 #)+4;#( $ #%'89 j)! j)0! j).!!
$y	GB $.<<++)+  $ ##(< !5??CT4M"NO ./"'!((*
CG~ %)+:68IJGN ()+:68IJOG^ $)+9')G35W !
_G|  )+5,%'89 z24FGz24FGz2L*Mj)! j)0! j).!+
%}GH  )J)+5:  #%'89 (()5S (((:

!IG@ !')+ "' # 24E}U<AG\ $(U^^D3EJJO"' $ ##(91 h'7S
 j)!

}	 j)&!

}
!&]Gl <<-emmU^^L24E}U4 #(#((*<>P j) 1"( j) 4"(
mGl <<0-emmU^^L24E}U"%/D
    $)# ((*<>P ((*<>U ((*<>T 113E~Vj) 1"( j) 4"(+
-mGH &-emmU^^L #($#24E}U;j) 1"( j) 4"(
IGB <<??)+ #$8(*;<CGZ "<<)+ #B24EF	[Gn !<<$& #6:;$
oGR <<###  $)#-emmU^^L6& 113CEUV((*:<T
SG@ $<<!!)+ ! #224EF 11<AST
AGb '<<$$)+  #224EF 11<AST
cGB <<??)+ ! #224EF 11<AST
CGd <<  #)+  #(#1>?9
 &'EF%eGL <<)+:$ #24EFj)! j)0! j).!
"MGR !<<)+:$ #24EFj)! j)0! j).!
!SGV  <<)+5  #24EFj)! j)0! j).!
"WG\ #<<  )+5 #24EFj)! j)0! j).!
 ]G^ !+<<(()+@# " 
_Gt &)+424EFj)! j)0! j).7	!
uGr &%)+>24EFj)! j).!
sGd <<)+  $ #424EF j)."	
eGR $ 4)+ $ #= 24EF(()5S j)"'" j)"""
%'SGb  %)+ $ ##(>;%'89j)! j)0! j).! !5==#4d2K"LM,"	 &"'"	;#
2c GH" <<&)+ # #( $,24E}Uj)! j)0! j).! j) 1"( j) 4"(=&
!7I"Gx# <<"&)+#(# $724E}Uj) 1"( j) 4"(
y#Gx$ II)+2 ##(%'EF:;$
y$G\% J)+4 #*!5==#5u2M"NO,"		
 :;$
#]%GtF| GZ& +	 )
 ". 113CEUV((*:<T
 ". #( ' #( &	 *	i:tF| :r@   