U
    <cbB                 ?   @   s  U d dl Z d dlZd dlmZ d dl mZ d dlmZmZ 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mZ d dl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! d d
l"m#Z#m$Z$m%Z%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2 dd Z3dddZ4dd Z5dd Z6dd Z7dd Z8dd Z9dd Z:dddZ;d d! Z<d"d# Z=dd$d%d&Z>d'd( Z?dd)d*Z@dd+d,ZAdd-d.ZBdd/d0ZCdd1d2ZDdd3d4ZEdd5d6ZFdd7d8ZGdd9d:ZHdd;d<ZId=d> ZJd?d@ ZKddAdBZLddCdDZMddEdFZNddGdHZOd dIdJZPd!dLdMZQd"dNdOZRd#dPdQZSd$dRdSZTd%dTdUZUd&dVdWZVdXdY ZWdZd[ ZXe,d\d'd^d_ejYjZeej[eej\d`e5e6dKdKdKdae,dbdcejYj]dde  dKdKe:eegdde
e,dbdcejYj]dfdde  dKdKde8eege)e^dgdhdie)ej_djdkej`fdle)ej_djdmej`fdle)e^dndjdkdodpe)e^dndjdmdodpfdqe,drdse  dKdKdeLe+eegdt	e,dudve  dKdKdeLe+eegdt	e,dwdxd]dydzd_e!ej[e!ej\fese&rej[gng  e?ddKdKe)e^d{d|d}ejaej`fdlfd~
e,dde  eCdddKdKe#eeegd
e,ddejYjbe  eMddddKdKe)ej_dhdddpe)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfeeegde,ddejYjde  e@ddddKdKeege)e^d{dde)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfde,dde  eNe+ddddKdKeeege)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfde,dde  eNe+ddddKdKeege)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfde,ddejYjede  dKdddKdKde7eee)eejaedddigde,dde  deGeeegde,dde  deGeeegde,dde  deHee dk deeegde,dde  dKeIeJeege)e^d{dje)e^d{dhde)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfde,ddddd_ de  eIeKdKdKdKdKeege)ej_dde)ej_ddfde,ddde  dKddKdKdeeege9de,ddeej[e!ej\fese&rej[gng  ddddKdKde<e#e)e^ddhdie)e^d{ddejffde)e^d{dddejffdfde,ddejYjge!ejhej[eeege>dKddKe)ej_djdkfd
e,dejYjgde!ejhej[eeegee>dd$ddKddKe)ej_djdke)ej_djdme)ej_djde)ej_djdfde,dde!ejhej[dKdddKeeege=dÍ	e,ddejYjie  dKdKdeVeegdƍ	e,ddejYjje  dKdKe:eegdɍe,ddeEejYjke dKdKdeDd̍	e-dejYjld ddKdKdKddKe!ejhej[e3de)ej_ddуe)ej_dd҃fdӍe,ddejYjme  dKdKdKeTeegd֍	e,ddejYjne  dKdKdKeTeegd֍	e,ddejYjoe  dKdKdKeTeegd֍	e,dejYjpde  dKdKddKe;e)e^dݡdhdރfeegdߍe,ddejYjqde  e@ddKdKeege)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfde,ddejYjre  e@ddKdKeege)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfd
e,ddejYjse  eQdKdKdKeege)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfd
e,ddejYjte  eQdKdKeege)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfd	e,ddejYjue  eRdKefdKde,dde  deAeege)e^d{dhddejcgde)e^d{dhddejcgde)e^d{ddejaejcgdlfde,ddde  dePeege)e^d{dhddejcgde)e^d{dddejcgdfde,ddejYjve  dKdddKdKeOeege)e^d{dddodpfde,dddfdd_ e  ddddKdKeBe%eege)ej_dde)e^d{djdmdoejwgde)e^d{djdkdoejwgdfde,ddde  dddKdKdePe+eege)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfde,dejYjxdde  dKdKdKddde4eeege)e^d{dhddejcgde)e^d{dhddejcgde)e^d{dddejcgdfde,dejYjyd de  ddKdKdeUeeegde,de	jYjze  eXdKdKdeegde,dd(dd_e  eWdKdKeee)eejcedddidhdidodpgdg,Z{ee, e|d< e2dddKde{d	e1d
ddKdde{de1dddKdde{de1dddKde{d	e1dddKde{d	gZ}ee, e|d< dS ()      N)partial)product)IterableList)inf)make_tensor)_get_magma_version_get_torch_cuda_versionCUDA11OrLaterwith_tf32_off)	has_cusolverskipCPUIfNoLapack
skipCUDAIfskipCUDAIfNoCusolverskipCUDAIfNoMagmaskipCUDAIfNoMagmaAndNoCusolverskipCUDAIfRocmtoltoleranceOverride)all_types_and_complexall_types_and_complex_andfloating_and_complex_typesfloating_and_complex_types_and)GRADCHECK_NONDET_TOL4make_fullrank_matrices_with_distinct_singular_valuesslowTestTEST_WITH_ROCM)clone_sampleDecorateInfo
ErrorInput!gradcheck_wrapper_hermitian_inputOpInfoReductionOpInfoSSampleInput)PythonRefInfoReductionPythonRefInfoc                    s    fdd}dd | D S )Nc                     sj   d} t dt  f} dkrb d}|d kr2| S t|tsB|f}|D ]}|dkrF|   S qF| | S )N)            r   g?g r   dim)r   numelget
isinstancer   size)Zhas_idZno_idr+   dkwargst U/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/opinfo/definitions/linalg.pyords9   s    


z'sample_kwargs_vector_norm.<locals>.ordsc                 s   s   | ]}d t |dfV  qdS )r4   )ordN)dict).0or4   r4   r5   	<genexpr>G   s     z,sample_kwargs_vector_norm.<locals>.<genexpr>r4   )r3   r2   r6   r4   r1   r5   sample_kwargs_vector_norm7   s    r<   Fc                 +   s   t }t||||d}d| jk dddg}dddg} fd	d
fdd}	fdd}
fdd}fdd}|	|
||f} rdnd}t|||d|D ]2\}}}}}|||f }t|| ||i|dV  qd S )Ndtypedevicerequires_grad
linalg.svdr4   r      r   rD      c                    s\   | d }|j d }| d dd |f } r2| d n| d j}|dd |d d f }|||fS )Nr*   r   .r)   )shapemH)usvr#   kUVh)is_linalg_svdr4   r5   
uniformizeT   s    
z%sample_inputs_svd.<locals>.uniformizec                    s    | \}}}|  S Nabs)rI   rK   _rN   r4   r5   fn_U\   s    zsample_inputs_svd.<locals>.fn_Uc                    s    | d S )Nr*   r4   )rI   rS   r4   r5   fn_S`   s    zsample_inputs_svd.<locals>.fn_Sc                    s    | \}}}||  fS rO   rP   )rI   rR   r#   rL   rS   r4   r5   fn_Vhc   s    z sample_inputs_svd.<locals>.fn_Vhc                    s    | \}}}|| |fS rO   r4   )rI   rK   r#   rL   rS   r4   r5   fn_UVhh   s    z!sample_inputs_svd.<locals>.fn_UVhZfull_matricesZsomeTFr2   output_process_fn_grad)r   r   namer   r$   )op_infor?   r>   r@   r2   make_fullrankmake_argbatchesnsrT   rU   rV   rW   fnsZfullmatbatchnrJ   Zfullmat_valfnrG   r4   )rM   rN   r5   sample_inputs_svdJ   s0       


  re   c                 k   s   t t|||d}t|tdf|tdffdV  t|tdtf|tdtfftdddV  t|d|tdfftdddV  d S )	Nr=   rD   argsr*   r+   rg   r2   )r*   rD   rF   )r   r   r$   r#   r8   )r\   r?   r>   r@   r2   r^   r4   r4   r5   sample_inputs_crossw   s          rj   c                 k   s   t t|tjd}t|tdf|tdffd}d}t||tdV  t|dtdf|tdffd}d}t||tdV  t|td	f|td	ffd}d
}t||tdV  t|td	f|td	fftd	dd}d}t||t	dV  d S )Nr?   r>   rD   r*   )inputrg   z&inputs dimension -1 must have length 3)error_regex
error_typerE   z.inputs must have the same number of dimensionsr)   zmust have length 3rh   )rl   rg   r2   zDimension out of range)
r   r   torchfloat32r$   r#   r   RuntimeErrorr8   
IndexError)r\   r?   r2   r^   sampleerrr4   r4   r5   error_inputs_cross   s"     
  ru   c                 K   s  t tttf||dd|dttf||dd|dfdt ttd tf||dd|dttf||dd|dfdt tddttf||dd|dtddtf||dd|dfdt tddtd tf||dd|dtddtf||dd|dfdt td||dd|dtd||dd|dfdt tttf||dd|dtd||dd|dfdt tttf||dd|dttd f||dd|dfdt tttd f||dd|dttd f||dd|dfdf}|S )	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.
    r)   r>   r?   lowhighr@   rf   r*   r   r   NrB   )r$   r   r#   )r\   r?   r>   r@   r2   samplesr4   r4   r5   !sample_inputs_householder_product   sD   
	
	
					
	  .r|   c                    s:   t t| d fddfdd}dd | D S )Nrk   c                    s  | d | d kst |dkr(|| d k s,t | d }| d d ||f d }| d d ||f d }|| }tj|\}}}t||\}	}
}|ddd }|jdddj}tj	||| ddj
}|ddd| t j|dddd	|f< |	|
 | }| |S )
NrF   rv   r   
   T)r+   keepdimF)rJ   largest.)AssertionErrorro   linalglu_factor_exZ	lu_unpackdiagonalrQ   maxvaluesZtopkindicesZdiv_ZfinfoZepsrequires_grad_)r/   rankrc   abxluZpivsrR   pluZ
u_diag_absZu_diag_abs_largestZu_diag_abs_smallest_idxsZmatrix)r>   r^   r@   r4   r5   make_singular_matrix_batch_baseT  s(      
zJsample_inputs_linalg_det_singular.<locals>.make_singular_matrix_batch_basec                  3   sD   t dtdD ]0\} }| ||f }td|D ]} ||V  q,qd S )N)r4   r)   r)   r)   r'   r*   )r   range)rb   r/   rG   r   )r   r4   r5   sample_generatorj  s    z;sample_inputs_linalg_det_singular.<locals>.sample_generatorc                 S   s   g | ]}t |qS r4   )r$   )r9   r3   r4   r4   r5   
<listcomp>p  s     z5sample_inputs_linalg_det_singular.<locals>.<listcomp>)r   r   )r\   r?   r>   r@   r2   r   r4   )r>   r^   r   r@   r5   !sample_inputs_linalg_det_singularQ  s    r   c                 k   s   t }tt|||d}t||||d}dddg}|D ]P\}	}
|
|	|	f }dD ]}t|||fdV  qJdD ]}t|| |fdV  qhq2d S )Nr=   )r*   r4   )r)   rB   )r)   r   )r   rD   rE   rf   )rv   rF   )r   r   r   r$   )r\   r?   r>   r@   r2   r]   r^   Zmake_arg_fullrank
test_sizesZmatrix_sizeZbatch_sizesr/   rc   r4   r4   r5   !sample_inputs_linalg_matrix_powers  s.          r   c                 k   s   t }t||||d}dddg}dddg}| jdk}	t||D ]j\}
}|
||f }|| }|	r| s| dkrtj|j	}||
d	
d	 }|| t|V  q<d S )
Nr=   r4   rB   rC   r   r*   rE   ZlogdetrF   )r   r   r[   r   
is_complexr,   ro   r   slogdetsignZ	unsqueezer   r$   )r\   r?   r>   r@   r2   r]   r^   r_   r`   Z	is_logdetrb   rc   rG   Asr4   r4   r5   'sample_inputs_linalg_det_logdet_slogdet  s*       



r   c              
   k   s$  t }t|||d}tt||d}dd }| jdk}	d}
d}d}t||
|D ]\}}}||||f  }tj|\}}||||f }|sdnd	}t||D ]\}}|r|s|sq|	rtd	d
dD ]:\}}t||||||r|n|j	|ft
||ddV  qqt|||||||fdV  qqJdS )z8Samples the inputs for both linalg.lu_solve and lu_solver>   r?   c                 S   s   |   }|| |S rO   )cloner   )Xr@   Yr4   r4   r5   r     s    
z%sample_inputs_lu_solve.<locals>.clonelinalg.lu_solve)r4   rB   r   )rD   r*   r   )r(   r*   r   )FrX   r)   repeat)adjointleftri   rf   N)r   r   r   r[   r   ro   r   	lu_factorr$   mTr8   )r\   r?   r>   r@   r2   make_fnmake_amake_br   Zis_linalg_lu_solver_   r`   nrhsrc   rb   rhsr   ZLUpivotsBZgradsZLU_gradZB_gradr   r   r4   r4   r5   sample_inputs_lu_solve  s0    

r   c                 K   s   dddgdddgdddgddddgddddgddddgddddddgg}g }|D ]P}g }t |d d |dd  D ]}	t|	|||d}
||
 qr|t| qP|S )	Nr*   r)   r   rD   r(   rE   rF   r=   )zipr   appendr$   )r\   r?   r>   r@   r2   
test_casesresultsizesZtensorsr/   r3   r4   r4   r5   sample_inputs_linalg_multi_dot  s*    



   r   c                 k   s   t jt jt jf}tt|||d}d}||k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dV  qjd S )Nr?   r>   r@   )r   )r)   rD   r)   fror*   rF   nucr)   rv   ))rv   rF   )rF   r   TFrf   )	ro   float16bfloat16	complex32r   r   r   r   r$   )r\   r?   r>   r@   r2   Zlow_precision_dtypesr^   r   r6   dimsr/   r7   r+   r~   r4   r4   r5    sample_inputs_linalg_matrix_norm  s       r   )variantc                   s  |d k	r|dk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krdtt ddf}nd ddtt ddd	df	}g }	|D ]ȉ t dk}
t d	k}|
p d dko d dk}dD ]}|dkr6|r6|	t	t
 ||d d |dt|dd |
sD|sDq|
rN|n|}|D ](}|
r d dkr|tjksV|d k	r|dk rqVnP|rd dtjdd	dddddddtj di|d}t fdd|D rqV|dkr|	t	tj |||d|ft|dd nb|	t	t
 ||d d |d|ft|dd |dkrV|	t	t
 ||d d |dt||ddd qVqq|	S )N)subgradient_at_zerozKUnsupported variant, expected variant to be 'subgradient_at_zero' but got: rB   rz   r   )r   r   r   g      ?r*   r)   g      @g      rF   rv   g      r   r   )FTr   rw   )r~   r2   )r   r*   r*   r4   c                 3   s   | ]} | d kV  qdS )r   Nr4   )r9   r0   Z	test_sizer4   r5   r;   F  s     z,sample_inputs_linalg_norm.<locals>.<genexpr>r=   ri   )r   r   )r7   r~   r+   )
ValueErrorr#   r   ro   r   r   r   lenr   r$   r   r8   npr-   anyzeros)r\   r?   r>   r@   r   r2   r   Zvector_ordsZmatrix_ordsinputsZis_vector_normZis_matrix_normZis_valid_for_p2r~   r6   r7   Zdims_to_checkr4   r   r5   sample_inputs_linalg_norm  s    


         


r   c                 k   s   t t|||d}d}d}t||D ]\\}}	||	f }
t||
||
fdV  tt|
D ]$}t||
||
ft|ddV  qXq"d S )Nr   )r4   rB   r   )rE   )r   r*   rD   rE   rf   rh   ri   )r   r   r   r$   r   r   r8   )r\   r?   r>   r@   r2   r^   r_   r`   r   rc   rG   ir4   r4   r5   sample_inputs_linalg_vecdotz  s"       
  r   c                 k   sV   t }t||||d}ddddg}ddg}t||D ]\}	}
t||	|
|
f V  q2dS )	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.
    r=   r4   rB   r   r*   r*   rE   r   Nr   r   r   r$   )r\   r?   r>   r@   r2   r   r^   r_   r`   rb   rc   r4   r4   r5   sample_inputs_linalg_invertible  s    r   c           
      +   s    fdd}dD ]l}t d|gddD ]V\}}|s6|s6q$t|  ||D ]4}	|	ji ksVt|||	j|||	jd|	_|	V  qDq$qt|  ||D ]
}	|	V  qdS )	zq
    This function produces inputs for matrix rank that test
    all possible combinations for atol and rtol
    c                    s<   | dkrd S | dkrdS | dks$t tj|jd d  dS )Nnonefloat      ?tensorrv   r?   )r   ro   ZonesrG   )Z
kwarg_typeinpr   r4   r5   make_tol_arg  s    z/sample_inputs_matrix_rank.<locals>.make_tol_arg)r   r   r   r)   r   ZatolrtolN)r   r   r2   r   rl   )
r\   r?   r>   r@   r2   r   Ztol_typeZ	atol_typeZ	rtol_typers   r4   r   r5   sample_inputs_matrix_rank  s4       

   r   c                 k   s   ddddg}dddg}t |||D ]\}}}	ttdt||	D ]`}
tj|||
f||d j|}tj||	|
f||d j|}t||fd	V  q@q"d
S )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.
    r4   rB   r   r   r   rD   2   rk   rf   N)	r   r   minro   ZrandqrQr   r$   )r\   r?   r>   r@   r2   r_   r/   rb   mrc   rJ   r   r   r4   r4   r5   "sample_inputs_linalg_pinv_singular  s    	
  r   c                 k   sH   t t|||d}ttfdttfddttff}|D ]}t||V  q0d S )Nr=   r)   r*   )r   r   r#   r$   )r\   r?   r>   r@   r2   r^   shapesrG   r4   r4   r5   sample_inputs_linalg_cond  s       
r   c                 k   s   t t|||d}ddtfdtff}|D ]~}t|dkrP|d dkrPt||V  t|dkrd|d nd}tdD ]2}	||	 d }
|
dk rqpt||t|
d	d
V  qpq&d S )Nr=   r4   r   r)   r   rF   r*   rD   )Nr   )r   r   r#   r   r$   r   r8   )r\   r?   r>   r@   r2   r^   r   rG   rc   r   r   r4   r4   r5   sample_inputs_linalg_vander  s(       r   c                 C   sn   | j dkr| tj } | j dkr2tj| |dd}|S |d krD| jd }tj|  |dd| j|f}|S d S )Nr   r*   T)r   Z
increasingrF   )ndimr   ZnewaxisvanderrG   Zravelreshape)r   r   yr4   r4   r5   np_vander_batched  s    



"r   c                 k   s   ddl m} |tt||d}|dtt||d}||j }||j }	tjdd||dtjddd||d||	f}
dd |
D }|D ]b}||_t|V  t| 	 
|tddd	V  | 	 j 
|}t|td
dd	V  q~d S )Nr   random_well_conditioned_matrixr   r)   c                 s   s   | ]}t jj|d dV  qdS )FupperN)ro   r   Zcholeskyr9   r   r4   r4   r5   r;   0  s     z8sample_inputs_linalg_cholesky_inverse.<locals>.<genexpr>Fr   r   T)$torch.testing._internal.common_utilsr   r#   rH   ro   r   r@   r$   detachr   r   r8   r   
contiguous)r\   r?   r>   r@   r2   r   Zsingle_well_conditioned_matrixZbatch_well_conditioned_matricesZ	single_pdZbatch_pdr   r   r   r   r4   r4   r5   %sample_inputs_linalg_cholesky_inverse  s>           


 r   c                 k   s  ddl m}m} t|}t|t||dtdddV  t|td||dtdddV  ttjdd||dtdddV  ttjddd||dtdddV  |j	dkot
 d	k}|jr|j	d
ks|rt|t||dtdddV  t|td||dtdddV  d S )Nr   random_hermitian_pd_matrixrandom_symmetric_pd_matrixr   F	hermitianr   r)   cuda)r)   rE   r(   cpuT)r   r   r   ro   r?   r$   r#   r8   r   typer   r   )r\   r?   r>   r@   r2   r   r   Zmagma_254_availabler4   r4   r5   sample_inputs_linalg_ldl_factor>  s8    
  r   c              
   k   s  ddl m}m} t|}|t||d|td||dtjdd||dtjddd||df}|jdkr|jr|t||d|td||dfnd}dd |D }	d	d |D }
|	D ]}|\}}}||_	d|j
d d
 fD ]h}t||j
d tf|||d}t|||ftdddV  |  |}t|||ftdddV  qq|
D ]}|\}}}||_	d|j
d d
 fD ]j}t||j
d tf|||d}t|||ftdddV  |  |}t|||ftdddV  qhqBd S )Nr   r   r   r)   r   r4   c                 s   s   | ]}t jj|d dV  qdS )Fr   Nro   r   Zldl_factor_exr   r4   r4   r5   r;     s    z1sample_inputs_linalg_ldl_solve.<locals>.<genexpr>c                 s   s   | ]}t jj|d dV  qdS )Tr   Nr   r   r4   r4   r5   r;     s    rv   rF   r   Fr   ri   T)r   r   r   ro   r?   r#   r   r   r   r@   rG   r   r$   r8   r   r   r   )r\   r?   r>   r@   r2   r   r   Zsymmetric_inputsZhermitian_inputsZtest_cases1Ztest_cases2Z	test_caseZfactorsr   rR   ZB_batch_shaper   Zclone_factorsr4   r4   r5   sample_inputs_linalg_ldl_solvef  sz    
   
  
  r   c              	   K   s   ddl m} t|}|jdkr&d}nd}|jdks:t r@d}nd}g }td	||D ]d\}	}
}|	d
| d
f }||||d}|| t|||d d |d}|	t
||ft|
dd qT|S )Nr   r   r   )gels)r   ZgelsyZgelssZgelsdr   )rF   r   r*   rB   r4   rC   )rD   rD   rD   r   rw   driverri   )r   r   ro   r?   r   r   r   r   r   r   r$   r8   )r\   r?   r>   r@   r2   r   Zdriversdeltasoutrb   r  deltarG   r   r   r4   r4   r5   sample_inputs_linalg_lstsq  s.    


r  c                 k   s,   t jd|d}tt||fdtddV  d S Nr4   r   rf   zat least 2 dimensions)rn   rm   ro   Zrandnr   r$   rq   r\   r?   r2   Zzero_dr4   r4   r5   error_inputs_lstsq  s    r
  c                 k   s.   t jd|d}tt||d fdtddV  d S r  r  r	  r4   r4   r5    error_inputs_lstsq_grad_oriented  s    r  c                 K   sv   ddl m} ddddg}ddg}g }t||dd	gD ]<\}	}
}||
f|	||d
}||_|t|d|id q4|S )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   )r   r4   rB   r   r   rE   TFr   r   r   )r   r   r   r@   r   r$   )r\   r?   r>   r@   r2   r   r_   r`   r  rb   rc   r   r   r4   r4   r5   sample_inputs_linalg_cholesky  s    r  c                 k   s0   dd }t | |||}|D ]}||_|V  qdS )z<
    This function generates input for torch.linalg.eig
    c                 S   s   | d t | d fS Nr   r*   rP   outputr4   r4   r5   out_fn  s    z(sample_inputs_linalg_eig.<locals>.out_fnN)r   rZ   r\   r?   r>   r@   r2   r  r{   rs   r4   r4   r5   sample_inputs_linalg_eig  s
    r  c                 k   sF   dd }t | |||}|D ]&}dtjddgi|_||_|V  qdS )zm
    This function generates input for torch.linalg.eigh/eigvalsh with UPLO="U" or "L" keyword argument.
    c                 S   s&   t | tr| d t| d fS | S d S r  )r.   tuplerQ   r  r4   r4   r5   r    s    
z)sample_inputs_linalg_eigh.<locals>.out_fnZUPLOLrK   N)r   r   randomchoicer2   rZ   r  r4   r4   r5   sample_inputs_linalg_eigh  s    	r  c                 k   sd   t | |||f|D ]L}|jr&|jjjn|}ddtjd||dfD ]}t|}d|i|_|V  q@qdS )zd
    This function generates input for torch.linalg.pinv with hermitian=False keyword argument.
    Nr   r   r   )	r   r   rl   realr>   ro   r   r   r2   )r\   r?   r>   r@   r2   r:   Z
real_dtyper   r4   r4   r5   sample_inputs_linalg_pinv   s       
r  c                 k   s,   t | |||f|D ]}ddi|_|V  qdS )zc
    This function generates input for torch.linalg.pinv with hermitian=True keyword argument.
    r   TN)r   r2   )r\   r?   r>   r@   r2   r:   r4   r4   r5   #sample_inputs_linalg_pinv_hermitian/  s       
r  Tc                 k   s   t }t||||d}tt|||d}dddg}	ddg}
|rFdddg}nddg}t|
|	|D ]4\}}}t||||f |||f | fd	V  qZd
S )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.
    r=   r4   rB   r   rE   r   r   rC   rf   N)r   r   r   r   r$   )r\   r?   r>   r@   vector_rhs_allowedr2   r]   r   r   r_   r`   r   rc   rb   r   r4   r4   r5   sample_inputs_linalg_solve<  s(          
r  c                 k   sl  t t||d}d}d}d}t|||tdddD ]4\}	}
}\}}}|	dkrv|r\||
|
fn
|||f}||
|f}n.|r||	|
|
fn||	||f}||	|
|f}|r|d	d
dd n|d	d
d}d|| dk < |r|  n|  |||d}|rTtdddD ]@\}}|s(|s(qt|	 
||	 
|f|dV  qq0t||f|dV  q0d S )Nr   )r*   r)   r   )rD   r   )r*   rD   r   rX   rD   r   r*   r   rv   rF   r   gư>)r   r   Zunitriangularr)   ri   )r   r   r   r   Zfill_rQ   Ztriu_Ztril_r$   r   r   )r\   r?   r>   r@   r2   r^   bsr`   ksr   rc   rJ   r   r   unir   r   r0   Zgrad_AZgrad_Br4   r4   r5   %sample_inputs_linalg_solve_triangularh  sB       
 
r   c                 k   sV   t | |||dd}dd }|D ]2}|jd |jf |_|_| jdkrJ||_|V  qdS )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)r@   r  c                 S   s   | d S )Nr   r4   r  r4   r4   r5   r    s    z*sample_inputs_legacy_solve.<locals>.out_fnr   solveN)r  rg   rl   r[   rZ   )r\   r?   r>   r@   r2   r  r  rs   r4   r4   r5   sample_inputs_legacy_solve  s        
r"  c                 +   s    j dk}|stnt}t||||d} fdd}d}	t|jdkrJdnd}
d	}t|	|
|D ]B\}}}|t| tf }|s||n|| }t	|d
|i|dV  q^d S )Nlinalg.lu_factorr=   c                    s"    j dkr| d | d fS | S d S )N	linalg.lur*   r)   )r[   r  r\   r4   r5   r    s    
z'sample_inputs_linalg_lu.<locals>.out_fnr   r   rX   )T)rv   rF   r   r*   r)   pivotrY   )
r[   r   r   r   ro   r?   r   r   r#   r$   )r\   r?   r>   r@   r2   Z	full_rankr   r^   r  Zbatch_shapesr   r  Zbatch_shaper&  r  rG   r   r4   r%  r5   sample_inputs_linalg_lu  s    
r'  c                 k   sX   t t|||d}ddddg}dddg}t|||D ] \}}	}
t|||	|
f V  q2d S 	Nr=   r4   rB   r   r   rE   r)   r   )r   r   r   r$   )r\   r?   r>   r@   r2   r^   r_   r`   rb   r   rc   r4   r4   r5   sample_inputs_linalg_svdvals  s       
r)  c                 k   sf   t }t||||d}ddddg}dddg}t|t||D ]&\}	\}
}|	|
|f }t|| V  q:d S r(  r   )r\   r?   r>   r@   r2   r]   r^   r_   r`   rb   r   rc   rG   r4   r4   r5   sample_inputs_linalg_qr_geqrf  s       
r*  c                 k   sj   ddg}d dg}t ||D ]H\}}t||||d}	t|d d |||d}
t|	|
ft|ddV  qd S )N)r)   rD   r'   )rD   r(   r(   rD   )r   r)   r=   r)   )r   ri   )	itertoolsr   r   r$   r8   )r\   r?   r>   r@   r2   Za_shapesZdimssZa_shaper   r   r   r4   r4   r5   sample_inputs_tensorsolve  s        
   r,  c                    sn   t  fdd}ddg}g }|D ]B\}}	| j||	  }
|
 |t|
tt|dd q&|S )Nc                      s   dd dS )N   r   r4   r4   r?   r>   r^   r@   r4   r5   
make_input  s    z+sample_inputs_tensorinv.<locals>.make_input))r)   r)   rD   )r-  r*   ))r(   rD   )r'   r*   r)   )indr   )r   r   r   r   r   r$   r8   r   )r\   r?   r>   r@   r2   r/  r   r{   Z	shape_lhsZ	shape_rhsr   r4   r.  r5   sample_inputs_tensorinv  s    
r1  zlinalg.crossrF   c                 C   s   t j| ||dS )N)Zaxis)r   crossr   r   r+   r4   r4   r5   <lambda>
      r4  Zlinalg_cross)
refopdtypesdtypesIfCUDA	aten_namesample_inputs_funcerror_inputs_funcsupports_outsupports_fwgrad_bwgradsupports_forward_adz
linalg.detZ
linalg_det)det)	r:  r7  aliasesr8  r?  r>  r;  
decoratorscheck_batched_gradgradZsingularz'The backward may give different resultsZ
TestCommonZtest_noncontiguous_samplesZTestGradientsZtest_fn_gradgrad)r8  Ztest_fn_fwgrad_bwgradz-Skipped, see https://github.com//issues/84192r   )device_type)r:  r7  variant_test_namerA  r8  r?  r>  rC  r;  rB  skipszlinalg.choleskyZlinalg_cholesky)r:  r8  r?  r>  check_batched_forward_gradr;  gradcheck_wrapperrB  zlinalg.cholesky_exZlinalg_cholesky_exzlinalg.vecdotZlinalg_vecdotrh   c                C   s   |   | |S rO   )Zconjsumr3  r4   r4   r5   r4  i  r5  zSkipped!ZTestSchemaCheckModeOpInfoZtest_schema_correctness)	r:  r6  r8  r9  r;  rG  r?  r>  rF  zlinalg.condZlinalg_cond)	r:  r8  r;  rC  rG  r?  r>  gradcheck_nondet_tolrB  z
linalg.eigZ
linalg_eigZtest_outr   Zmps)rD  r8  Ztest_variant_consistency_eagerZTestJitZtest_variant_consistency_jit)r:  r7  r8  r;  rG  check_batched_gradrC  r?  r>  rF  rB  zlinalg.eigvalsZlinalg_eigvalsZTestCudaFuserOpInfoZtest_nvfuser_extremal_values)r:  r7  r8  r;  rG  rK  rC  r?  r>  rB  rF  zlinalg.eighZlinalg_eigh)r:  r8  r;  rH  rG  rK  rC  r?  r>  rB  rF  zlinalg.eigvalshZlinalg_eigvalshzlinalg.householder_productZlinalg_householder_product)ZorgqrgMbP?r   )r:  r7  rA  r8  gradcheck_fast_moderK  rC  r?  r>  rG  r;  rB  zlinalg.ldl_factorZlinalg_ldl_factor)r:  r8  supports_autogradr;  rB  zlinalg.ldl_factor_exZlinalg_ldl_factor_exzlinalg.ldl_solveZlinalg_ldl_solve)   r(   z not available before CUDA 11.3.1zlinalg.lstsqZlinalg_lstsq)r:  r8  r=  r;  r<  rB  rF  Zgrad_orientedc                 C   s   t jj| ||dd S )Nr  r   )ro   r   Zlstsq)r   r   r  r4   r4   r5   r4    r5  ZTestOperatorSignaturesZ(test_get_torch_func_signature_exhaustive)r:  rE  r7  r=  r8  r;  r<  rL  rM  r?  r>  rB  rF  zlinalg.matrix_power)Zmatrix_powerZlinalg_matrix_power)
rA  r:  r8  rL  supports_inplace_autogradr?  r>  rK  rB  r;  zlinalg.multi_dotZlinalg_multi_dotz67470!Z
TestOpInfoZxlaZTestNNCOpInfoZtest_nnc_correctness)r:  r8  r9  rO  rK  rC  r?  r>  rG  r;  rJ  rF  zlinalg.normZlinalg_norm)	r:  r7  r8  rB  r;  r?  rG  r>  rF  Zsubgradients_at_zeror   Ztest_forward_mode_ADZtest_fn_grad)
r7  rE  r8  rB  r;  r:  r?  rG  r>  rF  zlinalg.matrix_normZlinalg_matrix_norm)r:  r8  r?  rG  rC  r>  rB  r;  z	linalg.qrZ	linalg_qr)r:  r7  r8  r?  r>  rC  r;  rB  zlinalg.slogdetZlinalg_slogdet)r:  r7  r8  r?  r>  r;  rB  zlinalg.vanderZlinalg_vander)r:  r6  r7  r8  r?  r>  r=  r;  zlinalg.vector_norm	propagateZlinalg_vector_normZTestReductionsZtest_dim_emptyZtest_dim_empty_keepdim)r7  identityZ
nan_policyZsupports_multiple_dimsZcomplex_to_realr?  rG  r>  r8  Zgenerate_args_kwargsr:  rF  r#  Zlinalg_lu_factor)r:  r7  r8  rL  r?  r>  r;  rB  zlinalg.lu_factor_exZlinalg_lu_factor_exr$  Z	linalg_lur   Zlinalg_lu_solvezTests different backward pathsZ'test_floating_inputs_are_differentiable)
r7  r:  r8  rL  r?  rG  r>  r;  rF  rB  z
linalg.invZ
linalg_inv)Zinverse)
r:  r7  rA  r8  r;  rC  r?  r>  rB  rF  zlinalg.inv_exZlinalg_inv_ex)	r:  r7  r8  r;  rC  r?  r>  rB  rF  zlinalg.solveZlinalg_solve)	r:  r7  r8  r;  rL  r?  r>  rB  rF  zlinalg.solve_exZlinalg_solve_ex)r:  r7  r8  r;  r?  r>  rB  rF  zlinalg.solve_triangularZlinalg_solve_triangular)r:  r7  r8  r;  r>  rF  r?  zlinalg.matrix_rankZlinalg_matrix_rank)r:  r8  rM  r;  rB  rF  r   )r:  rE  r8  rM  r;  rB  rF  zlinalg.pinvZlinalg_pinv)r:  r7  r8  rL  rK  rC  r?  r>  r;  rB  rF  c                 C   s   t j| |j S rO   )ro   r   pinvr   )r   r   r4   r4   r5   r4  c  r5  )r:  rE  r7  r8  r=  rK  rC  r?  r>  r;  rB  rF  )r:  rE  r8  rK  rC  r?  r>  rG  r;  rH  rB  rF  rA   Z
linalg_svdZ_linalg_svd)r7  r:  decomp_aten_namer8  rL  r>  r?  rG  rK  rC  r;  rB  rF  zlinalg.svdvalsZlinalg_svdvals)
r7  r:  rS  r8  rG  r>  r?  rC  r;  rB  zlinalg.tensorinv)r6  r8  r;  r?  r>  rG  rB  zlinalg.tensorsolvec                 C   s   t jj| ||dS )N)Zaxes)r   r   Ztensorsolve)r   r   r   r4   r4   r5   r4    r5  )r6  r8  r;  r?  r>  rB  op_dbz_refs.linalg.vector_norm)torch_opinfo_namer=  supports_nvfuserrT  z_refs.linalg.matrix_norm)rU  r=  rV  Zvalidate_view_consistencyrT  z_refs.linalg.normz_refs.linalg.svdz_refs.linalg.svdvalspython_ref_db)F)F)F)F)F)F)F)N)F)F)F)F)F)F)F)F)F)FT)F)F)F)F)F)rF   )N)~r+  Zunittest	functoolsr   r   typingr   r   Znumpyr   r   ro   Ztorch.testingr   Z#torch.testing._internal.common_cudar   r	   r
   r   Z*torch.testing._internal.common_device_typer   r   r   r   r   r   r   r   r   Z$torch.testing._internal.common_dtyper   r   r   r   r   r   r   r   r   Z#torch.testing._internal.opinfo.corer   r   r   r    r!   r"   r#   r$   Z#torch.testing._internal.opinfo.refsr%   r&   r<   re   rj   ru   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r  r  r  r   r"  r'  r)  r*  r,  r1  r   r2  r   Zhalfr@  skipZexpectedFailureZ
complex128Z	complex64Zeigrp   ZeigvalsZhouseholder_productlongZnormr   r   r   r   Zvector_normr   r   r   Zlu_solveinvZinv_exr!  Zsolve_exZsolve_triangularrR  ZcdoubleZsvdZsvdvalsZ	tensorinvrT  __annotations__rW  r4   r4   r4   r5   <module>   sd   ,(
- :") 
%

$
)
D%	


  
-
*

-
   (*$% %    *     
  #"#!
  (&(               