
    Vh(                     R   d dl mZ d dlmZmZ d dlZd dlmZ d dl	m
Z d dlmZ d dlmc mZ d dlmZ d dl	mZmZmZmZmZmZmZ d dlmZmZmZ g dZdeej<                     d	ej<                  d
efdZ d dl!Z!d dl"m#Z# d dl$m%Z%  e#ejL                  jN                  jP                  jR                         e       e%d1dedede*fd                     Z+d ddddede*de*de*def
dZ, e#ejL                  jN                  jP                  jZ                         ed      	 	 	 d2dddedee.e*f   dee   d e/deej<                     defd!              Z0d" Z1d# Z2 ed      	 	 	 d3ddd$edee.ef   ded e/deej<                     defd%       Z3 ed      	 	 	 d4ddd$edeee.ef      dee   d e/deej<                     defd&       Z4 ed'd(d)d      d5d$ed*e/de5eeef   fd+       Z6 ed      d$edefd,       Z7 e        ed-ejp                  .      d1ded/ede*defd0              Z9y)6    )partial)OptionalUnionN)Tensor)check_fp_or_complexcheck_is_matrixDimDimsTypeELEMENTWISE_TYPE_PROMOTION_KINDIntLikeTensorLikeType)_maybe_convert_to_dtype"elementwise_type_promotion_wrapperout_wrapper)diagonalmatrix_normnormsvdsvdvalsvector_normvecdotcrossdtypex_dtypefn_namec                      t        j                  t        j                         xs t        j                          fd       t        j                  t        j                         t        j                        k(   fd       t        j                  t        j
                          k(  fd       yy)zG
    Checks related to the dtype kwarg in `linalg.*norm` functions
    Nc                       d  S )Nz1: dtype should be floating point or complex. Got  )r   r   s   K/home/dcms/DCMS/lib/python3.12/site-packages/torch/_refs/linalg/__init__.py<lambda>z#_check_norm_dtype.<locals>.<lambda>.   s    wiPQVPWX     c                  f    dj                  t        j                        rd       S d       S )Nz:{fn_name}: dtype should be {d} for {d} inputs. Got {dtype}complexreal)r   dr   )formatutilsis_complex_dtype)r   r   r   s   r   r    z#_check_norm_dtype.<locals>.<lambda>2   sB    PWW$55g>) X  DJ X  r!   c                        d dS )Nz: the dtype of the input (zJ) should be convertible without narrowing to the specified dtype ({dtype})r   )r   r   s   r   r    z#_check_norm_dtype.<locals>.<lambda>:   s    wi9' CA A r!   )torch_checkr'   is_float_dtyper(   get_higher_dtype)r   r   r   s   ```r   _check_norm_dtyper.   '   s       'H5+A+A%+HX	
 	""5)U-C-CG-LL	
 	""5'2e;A	
 r!   )register_decomposition)pw_cast_for_opmathabdimc                 d    t        j                   j                  j                  k(  d        t        j                   j                        dk(  xr j                        dk(   fd       t        j                         \   t        j                   j                        t        j                  d j                        } j                  |dz   dz        j                  |dz   dz        z   j                  |dz   dz        j                  |dz   dz        z  z
  S )Nc                       y)Nz=linalg.cross: inputs must have the same number of dimensions.r   r   r!   r   r    zcross.<locals>.<lambda>L       r!      c                  V    d d j                         dj                         S )Nzlinalg.cross: inputs dim z must have length 3, got z and )size)r2   r3   r4   s   r   r    zcross.<locals>.<lambda>P   s4    +C50I!&&QT+V[\]\b\bcf\g[hi r!   )device      )
r*   r+   ndimr:   broadcast_tensorsr'   canonicalize_dimaranger;   index_select)r2   r3   r4   idxs   ``` r   r   r   F   s    
LL	!&&O 
LL	sq-QVVC[A-i ""1a(DAq

 
 
-C
,,q
*C>>#a1}-cAg]1 	sS1WM*Q^^C#'Q-OOP Pr!   offsetdim1dim2inputrF   rG   rH   returnc                4    t        j                  | |||      S )NrE   )r*   r   )rI   rF   rG   rH   s       r   r   r   Z   s     >>%TEEr!   T)exact_dtyper   xordkeepdimc          
         ddl m} t        | j                  d       t	        |t
              r|g} || j                         dk(        rudk  st        d      k(  rbt        j                  |d uxr t        |      dk7  fd       | j                  }|J |D ]"  t        j                  |   dk7  fd       $ t        || j                  d       t        j                  | t        j                  j                   |      \  }}t#        t$        |      }	dk(  r-t        j&                  t        j(                  | d      |||	      S t        d      k(  r1 |	t        j*                  t        j,                  |       ||
            S t        d      k(  r1 |	t        j.                  t        j,                  |       ||
            S t%        | |      } t#        t        j&                  ||
      }
t	        t0              rdz  dk(  ndz  dk(  }|rt        j2                  | j                        st        j,                  |       }  |	t        j4                   |
t        j4                  |             dz              S )Nr   )guard_size_obliviouszlinalg.vector_norm        infc                      d  dS )N&linalg.vector_norm cannot compute the zH norm on an empty tensor because the operation does not have an identityr   )rO   s   r   r    zvector_norm.<locals>.<lambda>y   s    <SE B> > r!   c                      d d  dS )NrV   z norm on the dimension zL because this dimension is empty and the operation does not have an identityr   )r%   rO   s   r   r    zvector_norm.<locals>.<lambda>   s!    @ FC  66 r!   rM   r4   rP   r   )r4   rP   z-infr=          @      ?)%torch.fx.experimental.symbolic_shapesrR   r   r   
isinstancer	   numelfloatr*   r+   lenshaper.   r'   reduction_dtypesREDUCTION_OUTPUT_TYPE_KINDCOMPLEX_TO_FLOATr   r   sumneamaxabsaminr   r,   pow)rN   rO   r4   rP   r   rR   r`   computation_dtyperesult_dtypeto_result_dtype
reduce_sumis_ord_evenr%   s    `          @r   r   r   d   s    K !56#seAGGIN+scU5\>QtO-CA>	

  	ALLaA6	 eQWW&:;&+&<&<	5++<<e'#| 5\JO czyy!S)sG<XX	e	uzz%))A,CQRR	f	uzz%))A,CQRR $A'89UYYCA
&0g&>cAglC#IQTDT 4 4QWW =		!AuyyEIIa4E)Fc	RSSr!   c                 ~    t        |      D cg c]  }|| k7  s	||k7  s| }}|j                  | |f       |S c c}w )N)rangeextend)dim0rG   r>   irets        r   _backshift_permutationru      sA     Dk
=Q$Y191
=C
=JJd|J >s   
:::c                     t        t        |       t        j                  d            D cg c]  \  }}|	 c}}S c c}}w )Nr<   )key)sorted	enumerateoperator
itemgetter)permrs   js      r   _inverse_permutationr~      s0     4h6I6I!6LMN$!QANNNs   =Ac          	         t        | d       t        j                  | j                  |      }t	        |t
              r|f}t        j                  t        |      dk(  d        t        j                  |d   |d   k7  d        t        || j                  d       t	        |t              rt        j                  |dv d        t        | j                  d|d	k7  
       |dk(  rt        | d|||      S |t        | |      } t        |d   |d   | j                        }t        j                   t#        t%        j&                  | |            d|      }|r5t)        |      }t%        j&                  t        j*                  |d      |      }|S t-        |      }t        j                  |ddt/        d      fv d        t        | j                  d|dk7  
       t1        |dkD  rt        j2                  nt        j4                  |      }	|dk(  r|t        | |      } t        |d   |d   | j                        } |	t#        t%        j&                  | |            d      }|r5t)        |      }t%        j&                  t        j*                  |d      |      }|S |\  }
}|t/        d      k(  r||
}}
|s
|
|k  r|dz  } |	t        | d|
||      |      S )Nzlinalg.matrix_normr=   c                       y)Nz4linalg.matrix_norm: dim must be a 2-tuple. Got {dim}r   r   r!   r   r    zmatrix_norm.<locals>.<lambda>   r7   r!   r   r<   c                       y)NzDlinalg.matrix_norm: dims must be different. Got ({dim[0]}, {dim[1]})r   r   r!   r   r    zmatrix_norm.<locals>.<lambda>   r7   r!   )fronucc                       yNz.linalg.matrix_norm: Order {ord} not supported.r   r   r!   r   r    zmatrix_norm.<locals>.<lambda>   r7   r!   r   )allow_low_precision_dtypesr   rM   r1   rT   c                       yr   r   r   r!   r   r    zmatrix_norm.<locals>.<lambda>   r7   r!   rS   )rP   rY   r4   rZ   rX   )r   r'   canonicalize_dimsr>   r\   r	   r*   r+   r_   r.   r   strr   r   r   ru   rd   r   prims	transposer~   	unsqueezerg   r^   r   rf   rh   )r   rO   r4   rP   r   r|   resultinv_permabs_ordmax_minrr   rG   s               r   r   r      s    A+,

!
!!&&#
.C#sf	LLCAU 
LLA#a&V
 eQWW&:;#s>!D	

 	GG)cUl	
 %<q!S'?? +Au5)#a&#a&!&&ADYYwuq$'?@"gNF/5)DhOM c(1eEl++D	

 	GG)cQh	
 c	%**uzz7Sc> +Au5)#a&#a&!&&ADWU__Q%=>BGF/5)DhOMJD$%,&!4dt	AsgUKT r!   c                R   |6t        |t              r|f}t        j                  t	        |      dv d        n%|#t        j                  | j
                  dv d        |5|t	        |      dk(  s|#| j
                  dk(  r|d}t        | ||||      S |d}t        | ||||      S )N)r<   r=   c                       y)NzHlinalg.norm: If dim is specified, it must be of length 1 or 2. Got {dim}r   r   r!   r   r    znorm.<locals>.<lambda>  r7   r!   c                       y)NzZlinalg.norm: If dim is not specified but ord is, the input must be 1D or 2D. Got {A.ndim}Dr   r   r!   r   r    znorm.<locals>.<lambda>  r7   r!   r=   )r   r<   rM   rY   )r\   r	   r*   r+   r_   r>   r   r   )r   rO   r4   rP   r   s        r   r   r      s     c3&CH^	
 
FFfp	

 	SX]!;C1c3u==;C1c3u==r!   USVhfull_matricesc                 0    t        j                  | |      S )Nr   )r   r   )r   r   s     r   r   r   "  s    99Qm44r!   c                 "    t        | d      d   S )NFr   r<   )r   )r   s    r   r   r   (  s    q&q))r!   )rN   y)type_promoting_argstype_promotion_kindr   c                 t    t        | j                  d       | j                         |z  j                  |      S )Nzlinalg.vecdotr   )r   r   conjrd   )rN   r   r4   s      r   r   r   .  s0     1FFHqL#&&r!   )r1   )r=   NF)r   )rD   r1   F)NNF)T):	functoolsr   typingr   r   r*   torch._prims_primsr   torch._prims_common_prims_commonr'   torch._refs_refsrefstorch._refs.linalglinalgr   r   r   r	   r
   r   r   r   torch._prims_common.wrappersr   r   r   __all__r   r   r.   rz   torch._decompr/   torch._decomp.decompositionsr0   _opsopsatenlinalg_crossintr   r   linalg_vector_normr^   boolr   ru   r~   r   r   tupler   r   DEFAULTr   r   r!   r   <module>r      s    "   #  # #    	
Xekk2 
U[[ 
SV 
0  1 ; 

++889PV P PS P   :P( FF F 	F
 F F 

++>>? "	6T $(6T6T	ucz	6T 
(	6T 	6T EKK 6T 6T  @6TrO  #	M $(MM	ucz	M 
M 	M EKK M M Mb  (,"	> $(>>	%s
#	$> 
(	> 	> EKK > > >D S#t.5> 5$ 5%PV@V:W 5 /5
 *~ *& * *
 #"7??'f ' 'c '6 '	 
'r!   