
    Cpj                     j   S r SSKrSSKJr  SSKJr  SSKrSSKJr  SSK	J
r
  SSKrSSKJrJr  SSKJrJr  SSKrSS	KJrJrJrJrJrJrJrJrJrJr  SS
KJ r!  SSK"J#r#  SSK$J#s  J%s  J&r'  SSK(J)r)J*r*  SSK+J,r,  SSK-J.r.  \" \)S4\)S4\)S4\)S4\)S4\)S4\)S4\*5      r/SSSSS.S jr0 " S S5      r1\Rd                  Rg                  SSS9 " S S5      5       r4 " S  S!5      r5S" r6S# r7S$ r8S% r9\Rd                  Rg                  S&S'S9S( 5       r:S) r;S* r<S+ r=\R|                  \R~                  \R                  \R                  4rB\R                  \R                  \R                  4rF\R                  \R                  \R                  4rJ\F\J-   rK\B\K-   rL\Rd                  R                  S,\L5      S- 5       rNS. rOS/ rPS0 rQS1 rR\Rd                  Rg                  SSS9\Rd                  Rg                  S&S2S9S3 5       5       rS\Rd                  Rg                  S4S59S6 5       rT\Rd                  Rg                  S7S8S9S9 5       rU\Rd                  R                  S:S;S4/5      \Rd                  R                  S</ S=Q5      \Rd                  R                  S>/ S?Q5      \Rd                  R                  S@/ SAQ5      \Rd                  R                  SB\R                  \R                  /5      \Rd                  Rg                  SSS9\Rd                  Rg                  S&S2S9SC 5       5       5       5       5       5       5       rVg)Dz7Test functions for the sparse.linalg._interface module
    N)partial)product)
ModuleType)
NamedTuple)raiseswarns)assert_assert_equal)
SCIPY_ARRAY_APISCIPY_DEVICEis_torchxp_assert_closeis_lazy_arrayxp_assert_equalxp_ravelis_numpymake_xp_pytest_marksis_jax_array)array_api_extra)LinearOperatoraslinearoperator)matrix)assert_deallocated__init__matvecmatmatdotrdotrmatvecrmatmat   
   ndimminmaxrngc                "  ^ [         R                  R                  T5      m[         R                  " X!5      n[         R                  " X15      n[	        U4S j[        X#5       5       5      n[         R                  " U/U SS9nUR                   H  nSUTR                  SU 5      S & M     [        TR                  USS95      n[        [        U5      5       Hu  nXh   n	[         R                  " U	S:g  5      (       a  [         R                  " U	S:g  5      S   S   OUn
TR                  5       S:  d  M\  U	TR                  U
S-   5      S  Xh'     O   [         R                  " U6 U:X  d   eU V	s/ s H  n	[	        S U	 5       5      PM     sn	$ s  sn	f )Nc              3   P   >#    U  H  u  pTR                  XS -   5      v   M     g7f)   N)integers).0min_max_r'   s      d/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/scipy/sparse/linalg/tests/test_interface.py	<genexpr>0generate_broadcastable_shapes.<locals>.<genexpr>+   s#     S]ztT622]s   #&r   axisr*   g      ?c              3   8   #    U  H  n[        U5      v   M     g 7fN)int)r,   els     r/   r0   r1   <   s     *Eb#b''Es   )nprandomdefault_rngbroadcast_totupleziprepeatTr+   listpermutedrangelenanywherebroadcast_shapes)nshapesr$   r%   r&   r'   batch_shapeshapescolumnishapejs       `      r/   generate_broadcastable_shapesrN   '   sQ   
))


$C
//#
$C
//#
$CSS]SSKYY}gA6F ((,-s||Aw'()  #,,vA,./F3v;	*,&&!*<*<BHHUaZ #A&$::<$cll1Q3/01FI   ';6668>?uE*E**???s   -Fc                   f    \ rS rSrS rS r\R                  R                  SSS9S 5       r	S r
S	rg
)TestLinearOperator?   c                     [         R                  " / SQ/ SQ/5      U l        [         R                  " SS/SS/SS//5      U l        [         R                  " SS/SS//5      U l        g )	Nr*   r!               r*   r!   rT   rV   rW   rX   )r8   arrayABC)selfs    r/   setup_methodTestLinearOperator.setup_method@   si    7"$ %Aa5a5a5" # Aa5a5" #    c                 <#  ^^^ U4S jn[        TR                  TR                  S9nU" U" U R                  5      5       GHw  n[        R
                  " S0 UDST0D6mTR                  S:X  d   e[        TR                  U" / SQ5      5      U" SS/5      5        [        R                  " [        SS	9   [        TR                  U" S
/S/S//5      5      U" S/S//5      5        S S S 5        [        TU" / SQ5      -  U" SS/5      5        [        TU" S
/S/S//5      -  U" S/S//5      5        [        TR                  U" / SQ5      5      U" SS/5      5        [        TR                  U" S
/S/S//5      5      U" S/S//5      5        [        (       d  [        TR                  [        S
/S/S//5      5      U" S/S//5      5        [        T[        S
/S/S//5      -  U" S/S//5      5        [        TR                  [        S
/S/S//5      5      U" S/S//5      5        [        ST-  U" / SQ5      -  U" SS/5      5        [        ST-  R                  U" S
S
/5      5      U" / SQ5      5        [        ST-  R                   R                  U" S
S
/5      5      U" / SQ5      5        [        ST-  R#                  5       R                  U" S
S
/5      5      U" / SQ5      5        [        ST-  U" S
/S
/S
//5      -  U" S/S//5      5        [        ST-  R%                  U" S
/S
/S
//5      5      U" S/S//5      5        [        TS-  U" / SQ5      -  U" SS/5      5        [        TS-  U" S
/S
/S
//5      -  U" S/S//5      5        [        ST-  U" / SQ5      -  U" SS/5      5        [        TT-   U" / SQ5      -  U" SS/5      5        [        TT-   R                  U" S
S
/5      5      U" / SQ5      5        [        TT-   R                   R                  U" S
S
/5      5      U" / SQ5      5        [        TT-   R#                  5       R                  U" S
S
/5      5      U" / SQ5      5        [        TT-   U" S
/S
/S
//5      -  U" S/S//5      5        [        TT-   R%                  U" S
/S
/S
//5      5      U" S/S//5      5        [        T* U" / SQ5      -  U" SS/5      5        [        T* U" S
/S
/S
//5      -  U" S/S//5      5        [        TT-
  U" / SQ5      -  U" SS/5      5        [        TT-
  U" S
/S
/S
//5      -  U" S/S//5      5        TR                  U R                  TR                  S9nTR                  S
S/SS//TR                  S9n[        ST-  R'                  U5      SU-  R(                  U-  5        [        TS-  R'                  U5      US-  R(                  U-  5        [        ST-  R'                  U5      TR+                  SU-  R(                  5      U-  5        [        TS-  R'                  U5      TR+                  US-  R(                  5      U-  5        [        TT-   R'                  U5      XU-   R(                  U-  5        [        TST-  -   R'                  U5      TR+                  USU-  -   R(                  5      U-  5        [        T* R'                  U5      U* R(                  U-  5        [        TT-
  R'                  U5      XU-
  R(                  U-  5        [        ST-  R'                  SU-  5      TR+                  SU-  R(                  5      SU-  -  5        TT-   n[-        UR                  5      S:X  a$  UR                  S   TL a  UR                  S
   TL d   eST-  n[-        UR                  5      S:X  d   e[/        TR1                  S5      5      (       d'  UR                  S   TL a  UR                  S
   S:X  d   e[3        TR1                  S5      5      n[5        TR                  U" / SQ5      5      U5      (       d   e[7        TR1                  S5      5      (       d  [        R                  " [        SS	9O[8        R:                  " 5       n	U	   [5        TR                  U" S
/S/S//5      5      U5      (       d   e S S S 5        [5        TU" / SQ5      -  U5      (       d   e[5        TU" S
/S/S//5      -  U5      (       d   e[5        TR                  U" / SQ5      5      U5      (       d   e[5        TR                  U" S
/S/S//5      5      U5      (       d   e[        (       d  [5        TR                  [        S
/S/S//5      5      U5      (       d   e[5        T[        S
/S/S//5      -  U5      (       d   e[5        TR                  [        S
/S/S//5      5      U5      (       d   e[5        ST-  [        R<                  5      (       d   e[5        ST-  [        R<                  5      (       d   e[5        TT-   [        R>                  5      (       d   e[5        T* [        R<                  5      (       d   e[5        TT-
  [        R>                  5      (       d   e[5        TS-  [        R<                  5      (       d   e[5        TS-  [        R<                  5      (       d   e[/        TR1                  S5      5      (       d  TS-  S-  R                  S   TL d   eTU" / SQ5      -  n
TS-  mTS-  n[        TU" / SQ5      -  U
5        ST-  R@                  TR                  :X  d   eSn[C        [D        US	9   TTR                  S
S/5      -  nS S S 5        [C        [D        TR                  TR                  S
S/5      5        [C        [D        TR                  TR                  / SQ5      5        [C        [D        TR                  TR                  S
/S//5      5        [C        [D        TR                  TR                  S
/S/S/S//5      5        [C        [D        U4S j5        [C        [D        U4S j5        GMz     [G        U" U" U R                  5      5      U" U" U RH                  5      5      5       GH  u  p[        R
                  " S0 UDST0D6m[        R
                  " S0 UDST0D6mU" U R                  U RH                  -  5      nU" S
S/SS//5      n[        TT-  R'                  U5      UR(                  U-  5        [        ST-  T-  R'                  U5      TR+                  SU-  R(                  5      U-  5        [        TT-  U" S
S
/5      -  U" SS/5      5        [        TT-  U" S
/S
//5      -  U" S/S//5      5        [        TT-  R%                  U" S
/S
//5      5      U" S/S//5      5        [        TT-  R                  U" S
S
/5      5      U" SS /5      5        [        TT-  R                   R                  U" S
S
/5      5      U" SS /5      5        [        TT-  R#                  5       R                  U" S
S
/5      5      U" SS /5      5        [5        TT-  [        RJ                  5      (       d   e[C        [D        UU4S! j5        [C        [D        U4S" j5        TT-  n[-        UR                  5      S:X  d   e[/        TR1                  S5      5      (       a  GM}  UR                  S   TL a  UR                  S
   TL a  GM   e   U" U" U RL                  5      5       GH  n[        R
                  " S0 UDST0D6nU" S
S/SS//5      nU" U RL                  5      n[        UR'                  U5      UR(                  U-  5        [        US-  R'                  U5      UU-  R(                  U-  5        [        US-  U" S
S
/5      -  U" S#S$/5      5        [        US-  R                  U" S
S
/5      5      U" S%S/5      5        [        US-  R                   R                  U" S
S
/5      5      U" S%S/5      5        [        US-  R#                  5       R                  U" S
S
/5      5      U" S%S/5      5        [        US-  R%                  U" S
/S
//5      5      U" S#/S$//5      5        [5        US-  [        RN                  5      (       a  GM   e   g ! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= f)&Nc                 f   >^  T R                   TR                  U 4S jU U4S jU U4S jU 4S jS./$ )Nc                    > TU -  $ r5    xrZ   s    r/   <lambda>ETestLinearOperator.test_matvec.<locals>.get_matvecs.<locals>.<lambda>N   	    AEr`   c                 @   > TR                  TR                  5      U -  $ r5   conjr?   rf   rZ   xps    r/   rg   rh   O       RWWQSS\A%5r`   c                 @   > TR                  TR                  5      U -  $ r5   rk   rm   s    r/   rg   rh   P   ro   r`   c                    > TU -  $ r5   rd   re   s    r/   rg   rh   Q   ri   r`   rL   dtyper   r   r    r   )rL   float64)rZ   rn   s   `r/   get_matvecs3TestLinearOperator.test_matvec.<locals>.get_matvecsJ   s,    )55)  r`   rs   rn   rd   rS          column vectorsmatchr*   r!   rT   )r*   r*   r*         )r"   rx                     @y              (@y              >@iir   rV   rW   z.Can only divide a linear operator by a scalar.r*   r!   rT   rV   c                     > T T -  $ r5   rd   rZ   s   r/   rg   0TestLinearOperator.test_matvec.<locals>.<lambda>   	    acr`   c                     > T S-  $ Nr!   rd   r   s   r/   rg   r      	    adr`   2   q   G   \   c                     > T T-   $ r5   rd   )rZ   r[   s   r/   rg   r      r   r`   c                     > T S-  $ r   rd   r   s   r/   rg   r      r   r`      %      )(r   asarray
complex128rZ   	interfacer   argsr   r   pytestr   FutureWarningr   r   r   r   Hadjointr   r    r?   rl   rC   r   emptytype
isinstancer   
contextlibnullcontext_ScaledLinearOperator_SumLinearOperatorrs   assert_raises
ValueErrorr   r[   _ProductLinearOperatorr\   _PowerLinearOperator)r]   rn   ru   _asarraymatvecsA_Xzarray_objectctxresultr\   msg_matvecsAmatvecsBAtimesBmatvecsCC_rZ   r[   s    `                 @@r/   test_matvecTestLinearOperator.test_matvecI   sz   	 2::R]];"8DFF#34G((:7:r:A66R<<AHHXg%672b'9JKm3CDHHXsA3sm45rdB4[) E
 A 118RG3DEA1#qc1# 77B4+9NOAEE(7"34h2w6GHAEE(QCQC="9:HrdB4[<QR"?HHVaS!aSM23rdB4[)  FQCQC=$9 98bT2$K;PQfqc1#qc]&; <hbT{>STQqSHW$55xB7HIQUOOHaV,<=x?UVQqSGGNN8QqE?;Xl=ST1&&x17& QqSHqc1#qc]$;;XtRDk=RSQx!qcA3892$& QqSHW$55xB7HIQqSHqc1#qc]$;;XtRDk=RSRTXg%66#c8KLQqSHW$55xR7IJQUOOHaV,<=x?UVQqSGGNN8QqE?;Xl=STQ!((1Q%9& QqSHqc1#qc]$;;XtbTl=ST1XsA3sm452$& aR8G#44h3x6HIaR8aS!aSM#::HrdC5\<RSQqSHW$55x1GQUhaS1#&??A3QRPS*AUVDFF"--8B

QFQF+2==
AAQUOOA.R

Q?QUOOA.a

Q?R!V,,Q/"r'1E1IJQV,,Q/"r'1E1IJQUOOA.a@QaZ003RWWb27l=M=M5NQR5RSaRLLOrcWWq[9QUOOA.a@R!V,,R!V4bggrBwkk6JbSTf6UV!Aqvv;!#q	Q166!9>II!Aqvv;!### !--vvayA~!&&)q.88,Lahhx	':;\JJJJ $BHHQK00 ]2BC++- 
 !!((8aS!aSM+B"C\RRRR a(7"33\BBBBa(QCQC="99<HHHHaeeHW$56EEEEaeeHqc1#qc]$;<lKKKK"?!!((6A3sA3-+@"A<PPPP!!fqc1#qc]&;";\JJJJ!!%%QC}(=">MMMMac9#B#BCCCCbdI$C$CDDDDac9#?#?@@@@qb)"A"ABBBBac9#?#?@@@@ac9#B#BCCCCadI$C$CDDDD !--Q!))!,111 ),,FAAAAA 33V<F>>R]]222 CCz5

Aq6** 6 *ahh

Aa50AB*ahh

90EF*ahh

QC90EF*ahh

QCQC;L0MN*k2*l3 5B #*+htvv6F*G*5htvv6F*G#IH((;8;;A((;8;;Atvv/G1a&1a&)*AQUOOA.		A>R!VaZ003RWWb7l=M=M5NQR5RSQUh!uo5xC7IJQUhQCy&998bT3%L;QRQUNN8aS!I+>?B4QTPU,AWXQUOOHaV,<=xR?QRQUII,,Xq!f-=>"b@RSQ!((1a&)9:"b"
 ac9#C#CDDDD*k2*l3!Aqvv;!### !--vvayA~!&&)q.88=#I@ $HTVV$45H((;8;;A1a&1a&)*A$&&!BAIIaL2&&1*5QTNN1-R{{Q?QT8QqE?2HbW4EFQTNN8QF+;<hBx>PQQTHHOOHaV,<=xR?QRA ''!Q(89"b" QTMM(QC9*=>2$PRt@UVadI$B$BCCCC# 6w EDZ F 65s-   42AE(/AE:8AFE(
AE7	E:
AF		F
AF	array_api_strict8https://github.com/data-apis/array-api-strict/issues/188reasonc           	        ^^ [        TR                  TR                  S9nU" U R                  5      mTR                  TR                  UU4S jUU4S jUU4S jU4S jS.n[
        R                  " S0 UDST0D6nU" / SQ/ S	Q/ S
Q/5      nUS   n[        [        R                  " XF5      XF-  5        [        [        R                  " UTR                  US5      5      UTR                  US5      -  5        [        [        R                  " XE5      XE-  5        [        [        R                  " XdR                  5      XdR                  -  5        [        [        R                  " XdR                  5       5      XdR                  5       -  5        [        [        R                  " TR                  US5      UR                  5      TR                  US5      UR                  -  5        [        [        R                  " UR                  SS5      UR                  5       5      UR                  SS5      UR                  5       -  5        [        [        R                  " XTR                  5      XTR                  -  5        [        [        R                  " XTR                  5       5      XTR                  5       -  5        [        [        [        R                  US5        [        [        [        R                  SU5        g )Nrw   c                 J   > TR                  TU -  TR                  S   45      $ )Nr   )reshaperL   rf   r   rn   s    r/   rg   0TestLinearOperator.test_matmul.<locals>.<lambda>  s    BFRXXa[N!Cr`   c                 |   > TR                  TR                  TR                  5      U -  TR                  S   45      $ Nr*   )r   rl   r?   rL   r   s    r/   rg   r     s+    "**RWWRTT]Q->!"Or`   c                 @   > TR                  TR                  5      U -  $ r5   rk   r   s    r/   rg   r     s    "''"$$-!"3r`   c                    > TU -  $ r5   rd   )rf   r   s    r/   rg   r     s	    ar`   rr   rn   )y      ?      ?r!   rT   rU   )      	   )r   .r*   )r*   r   r*   r   r!   rd   )r   r   r   rZ   rL   r   r   r   operatormatmulr   r   r   r   r   )r]   rn   r   DrZ   r[   br   s    `     @r/   test_matmulTestLinearOperator.test_matmul
  s   
 2::R]];dffhhmmCO3') $$0q0R0n! " fI-qu5OOArzz!W56

1g&&	
 	-qu533/SS999;7YY[IOOBJJq'2ACC8JJq'"QSS(	
 	OOAIIa,aiik:IIaqyy{*	
 	33/SS999;7YY[Ij(//1a8j(//1a8r`   c                    Sn[         R                  " UR                  S5      5      nUR                  UR                  S5      5        [        R
                  " [        US9   UR                  UR                  S5      5        S S S 5        UR                  UR                  S5      5        [        R
                  " [        US9   UR                  UR                  S5      5        S S S 5        UR                  UR                  S5      5        [        R
                  " [        US9   UR                  UR                  S5      5        S S S 5        UR                  UR                  S5      5        [        R
                  " [        US9   UR                  UR                  S5      5        S S S 5        UR                  UR                  S5      5        [        R
                  " [        US9   UR                  UR                  S5      5        S S S 5        UR                  UR                  S5      5        [        R
                  " [        US9   UR                  UR                  S5      5        S S S 5        g ! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GNZ= f! , (       d  f       GN
= f! , (       d  f       N= f! , (       d  f       g = f)	Nz(D|d)imension mismatch)rT   rV   rV   r{   rT   rV   rT   rT   rT   rV   rV   )r   r   onesr   r   r   r   r   r   r    r   r   )r]   rn   r   rZ   s       r/   test_dimension_mismatch*TestLinearOperator.test_dimension_mismatch2  s   &&&rwwv7	]]:S1HHRWWQZ  2 	
		"''!*]]:S1IIbggaj! 2 	
!]]:S1HHRWWV_% 2 	
		"''&/"]]:S1IIbggfo& 2 	
bggfo]]:S1EE"''&/" 2 	
rwwv]]:S1FF2776?# 21) 21 21 21 21 21 21sH   !!I5!J%!J!J+)!J=!K5
J
J
J(+
J:=
K
K)rZ   r[   r\   N)__name__
__module____qualname____firstlineno__r^   r   r   markskip_xp_backendsr   r   __static_attributes__rd   r`   r/   rP   rP   ?   sC    #DB [[!!I " "9	"9H$r`   rP   
dask.array)https://github.com/dask/dask/issues/11711r   c                      \ rS rSr% Sr " S S\5      r\" SSSS5      r\\S'   \" S	S
SS5      r	\\S'   \" SSSS5      r
\\S'   \" SSSS5      r\\S'   \" SSSS5      r\\S'   \" SSSS5      r\\S'   \\	\
/r\\   \S'   \\\\/-   r\\   \S'    S1S\S\R&                  S\S\4S jjr  S2S\R&                  S\S\S\S\4
S  jjr\R2                  R5                  S!/ S"Q5      \R2                  R5                  S#\5      S#\S!\\S$4   4S% j5       5       r\R2                  R5                  S!/ S"Q5      \R2                  R5                  S#\5      S#\S!\\S$4   4S& j5       5       r\R2                  R5                  S!/ S"Q5      \R2                  R5                  S#\5      S#\S!\\S$4   4S' j5       5       r\R2                  R5                  S!/ S"Q5      S!\\S$4   4S( j5       r \R2                  R5                  S!/ S"Q5      \R2                  RC                  S)S*S+9S!\\S$4   4S, j5       5       r"\R2                  R5                  S!/ S"Q5      \R2                  RC                  SS-9S!\\S$4   4S. j5       5       r#S/r$g0)3TestDotTestsiO  z
This class aims to help ensure correctness of the LinearOperator
interface, by verifying correctness properties based on equivalent
computations using 'forward' and 'adjoint' modes.
c                   L    \ rS rSr% Sr\\S4   \S'   \\S'   \\S'   \	\S'   Sr
g	)
TestDotTests.OperatorArgsiV  z
shape: (core) shape of the operator
op_dtype: dtype of the operator
data_dtype: real dtype corresponding to op_dtype for data generation
complex: the operator has a complex dtype
.rL   op_dtype
data_dtypecomplexrd   N)r   r   r   r   __doc__r<   r6   __annotations__strboolr   rd   r`   r/   OperatorArgsr   V  s&    	 S#Xr`   r   )r}   r}   rt   Freal_square_args)r   r   int32float32integer_square_args)   r   	complex64Tcomplex_square_args)r      real_overdetermined_argsr   complex_overdetermined_args)rW   r   real_underdetermined_argssquare_args_listall_args_listrn   opr   complex_datac                    [         R                  R                  S5      n[         R                  " U5      nUR                  Gt pxn	[        SSSSSS9u  pU	4U44/ U
QUQU	P7/ UQUQUP744 GH  u  pUR                  XS9nUR                  XS9nU(       a*  US	UR                  XS9-  -   nUS	UR                  XS9-  -   nUR                  U5      nUR                  U5      nUR                  U5      nUR                  U5      nUR                  UUS
S9nUR                  UUS
S9n[         R                  " U5      R                  S:  a  SOSn[         R                  " U5      R                  S:  a  SOSn[        UUUUS9  GM     g)a  
This check verifies the equivalence of the forward and adjoint computation,
using `matvec` and `rmatvec` respectively, on randomised data.

Data is generated with the real dtype `data_dtype` and operated on by the
linear operator `op`.

If `complex_data` is set to `True`, complex data is instead generated
by combining randomised real and imaginary components, each generated
with `data_dtype`.

If `check_operators` is set to `True`, equivalence is checked between
`matvec` and `*` and `@`,
and between `rmatvec` and the composition of `.H` and `*`.

If `check_dot` is set to `True`, equivalence is checked between
`matvec` and `.dot`,
and between `rmatvec` and the composition of `.H` and `.dot`.
*   r!   rT   r   rW   rQ   r#   rw                 ?r   r2   :0yE>-q=h㈵>V瞯<rtolatolN)r8   r9   r:   rs   rL   rN   standard_normalr   r   r   vecdotfinfoepsr   )r]   rn   r   r   r   r'   rs   rH   MNu_broadcastv_broadcastu_shapev_shapeuvop_uopH_vop_u_H_vuH_opH_vr  r  s                         r/   check_matvecTestDotTests.check_matvec|  s   . ii##B'$XX#@A1!$
  TA4L,{,[,!,.M.Mk.M1.MN	!
G ##G#9A##G#9Ac11'1GGHc11'1GGH

1A

1A99Q<DJJqMEyyqry2HyyEy3HHHZ044t;5DHHZ044t;5DHhTE-!
r`   check_operators	check_dotc                    [         R                  R                  S5      nUR                  SS5      n[         R                  " U5      n	UR
                  Gt pnUR                  / U
QUPUP7U	S9nUR                  / U
QUPUP7U	S9nU(       a:  USUR                  / U
QUPUP7U	S9-  -   nUSUR                  / U
QUPUP7U	S9-  -   nUR                  U5      nUR                  U5      nUR                  U5      nUR                  U5      nU(       aN  [        XU-  5        [        XU-  5        [        UUR                  U-  5        [        UUR                  U-  5        U(       a?  [        XR                  U5      5        [        UUR                  R                  U5      5        UR                  U5      R                  nUR                  U5      R                  nUR                  UU5      nUR                  UU5      n[         R                   " U5      R"                  S:  a  SOSn[         R                   " U5      R"                  S:  a  S	OSn[        UUUUS
9  g)a  
This check verifies the equivalence of the forward and adjoint computation,
using `matmat` and `rmatmat` respectively, on randomised data.

Data is generated with the real dtype `data_dtype` and operated on by the
linear operator `op`.

If `complex_data` is set to `True`, complex data is instead generated
by combining randomised real and imaginary components, each generated
with `data_dtype`.

If `check_operators` is set to `True`, equivalence is checked between
`matmat` and `*` and `@`,
and between `rmatvec` and the composition of `.H` and `@`.

If `check_dot` is set to `True`, equivalence is checked between
`matmat` and `.dot`,
and between `rmatmat` and the composition of `.H` and `.dot`.
r   r!   d   )sizers   r   r   r   r   r   r   N)r8   r9   r:   r+   rs   rL   r  r   r   r    r   r   r   rl   mTr   r  r  )r]   rn   r   r   r   r  r  r'   krs   rH   r  r  UVop_UopH_Vop_U_HUHop_U_H_VUH_opH_Vr  r  s                          r/   check_matmatTestDotTests.check_matmat  s   0 ii##B'LLC $XX %9{%9A%9q%9G%9{%9A%9q%9GR#--3G[3G!3GQ3Gu-UUVAR#--3G[3G!3GQ3Gu-UUVAJJqMJJqMyy|

1Dq&)Dq&)E244!8,E244!8,D&&),E24488A;/!!WWQZ]]99VQ'99R',0047uT,0047uT(DAr`   rH   )rd   rT   )rT   rV   rW   r   r   .c                    ^^ UU4S jnTUR                   -   n[        TUR                  5      n[        R                  " XVXDTS9nU R                  TXqR                  UR                  S9  U R                  TXqR                  UR                  S9  g)z[
Simple identity operator on square matrices.
Tests batches of RHS via `args.batch_shape`.
c                    > / [         R                  " TU R                  S S 5      QU R                  S   P7nTR                  X5      $ )Nr   )xpxrF   rL   r;   )rf   rL   rH   rn   s     r/   identity3TestDotTests.test_identity_square.<locals>.identity  s@    Sc**;ESqwwr{SE??1,,r`   rL   rs   r   r   rn   r   r   N	rL   getattrr   r   r   r  r   r   r$  )r]   r   rH   rn   r+  rL   rs   r   s     ``    r/   test_identity_square!TestDotTests.test_identity_square  s|    	- djj(DMM*%%"

 	"b__4<<X"b__4<<Xr`   c                 `  ^^^	^
^ UR                   u  m	m
S mU	UUU4S jnU
UUU4S jnTUR                   -   n[        TUR                  5      n[        R                  " XgXETS9nU R                  TXR                  UR                  S9  U R                  TXR                  UR                  S9  g)zj
Identity operator with zero-padding on non-square matrices.
Tests batches of RHS via `args.batch_shape`.
c                 x    S/U R                   -  nSXR                  S   -
  4US'   [        R                  " XSS9$ )N)r   r   r   r   constant)mode)r$   rL   r*  pad)rf   target_size
pad_widthss      r/   pad_core_dim:TestDotTests.test_identity_nonsquare.<locals>.pad_core_dim  s<     AFF*Jwwr{!:;JrN771z::r`   c                 &  > [         R                  " U R                  S   T-
  5      =S:X  a    O=S:X  a    U SS T24   n OS:X  a  T" U TS9n / [        R                  " TU R                  S S 5      QU R                  S   P7nTR                  X5      $ )Nr   r   r*   .r8  r8   signrL   r*  rF   r;   )rf   rL   r  rH   r:  rn   s     r/   mv0TestDotTests.test_identity_nonsquare.<locals>.mv  s    ''!''"+/*#rr'
A$QA6ASc**;ESqwwr{SE??1,,r`   c                 &  > [         R                  " TU R                  S   -
  5      =S:X  a    O=S:X  a	    T" U TS9n OS:X  a	  U SS T24   n / [        R                  " TU R                  S S 5      QU R                  S   P7nTR                  X5      $ )Nr   r   r*   r=  .r>  )rf   rL   r  rH   r:  rn   s     r/   rmv1TestDotTests.test_identity_nonsquare.<locals>.rmv%  s    ''!aggbk/*$QA6A#rr'
ASc**;ESqwwr{SE??1,,r`   r-  r.  Nr/  )r]   r   rH   rn   r@  rC  rL   rs   r   r  r  r:  s     ``     @@@r/   test_identity_nonsquare$TestDotTests.test_identity_nonsquare	  s     zz1	;

	- 
	-
	- 
	- djj(DMM*%%R
 	"b__4<<X"b__4<<Xr`   c                 .  ^^ UU4S jnUU4S jnTUR                   -   n[        TUR                  5      n[        R                  " XgXETS9nU R                  TXR                  UR                  S9  U R                  TXR                  UR                  S9  g)zd
Simple (complex) scaling operator on square matrices.
Tests batches of RHS via `args.batch_shape`.
c                    > S[        S5      -  n/ [        R                  " TU R                  S S 5      QU R                  S   P7nTR	                  X-  U5      $ )Ny      @       @r   absr*  rF   rL   r;   rf   scalerL   rH   rn   s      r/   rL  /TestDotTests.test_scaling_square.<locals>.scaleA  R    s6{*ESc**;ESqwwr{SE??59e44r`   c                    > S[        S5      -  n/ [        R                  " TU R                  S S 5      QU R                  S   P7nTR	                  X-  U5      $ )Ny      @       r   rI  rK  s      r/   r_scale1TestDotTests.test_scaling_square.<locals>.r_scaleF  rN  r`   r-  r.  Nr/  )	r]   r   rH   rn   rL  rP  rL   rs   r   s	     ``     r/   test_scaling_square TestDotTests.test_scaling_square:  s    	5
	5
 djj(DMM*%%U
 	"b__4<<X"b__4<<Xr`   c                    ^^^  " UUU4S jS[         R                  5      mTR                  S-  nSnT" / TQSPSP7TR                  US9nU R	                  TXTSS9  U R                  TXTSS9  g)	z
Simple rotation operator defined by `matmat` and `adjoint`,
subclassing `LinearOperator`.
Tests batches of RHS via `batch_shape`.
c                   F   >^  \ rS rSrU U4S jrUU4S jrU4S jrSrU =r$ )0TestDotTests.test_subclass_matmat.<locals>.RotOpiZ  c                 .   > X0l         [        TU ]	  XTS9  g Nrn   )_thetasuperr   )r]   rs   rL   theta	__class__rn   s       r/   r   9TestDotTests.test_subclass_matmat.<locals>.RotOp.__init__\  s    # " 5r`   c                 ~  > U R                   nTR                  [        R                  " U5      [        R                  " U5      * /[        R                  " U5      [        R                  " U5      //5      nX1-  n[
        R                  " TUR                  S S 5      UR                  SS  -   nTR                  XE5      $ )N)	rZ  r   r8   cossinr*  rF   rL   r;   )r]   r   r\  Rr[   rL   rH   rn   s         r/   _matmat8TestDotTests.test_subclass_matmat.<locals>.RotOp._matmat`  s    JJVVE]RVVE]N3VVE]RVVE]3   E,,[!''#2,G!''RTRU,Vq00r`   c                 Z   > U R                   * nT" U R                  U R                  U5      $ r5   )rZ  rs   rL   )r]   negative_thetaRotOps     r/   _adjoint9TestDotTests.test_subclass_matmat.<locals>.RotOp._adjointj  s%    "&++TZZ^DDr`   )rZ  )	r   r   r   r   r   rd  ri  r   __classcell__)r]  rh  rH   rn   s   @r/   rh  rV  Z  s    61E Er`   rh  r!   rt   )rL   rs   r\  Fr.  N)r   r   pirt   r  r$  )r]   rH   rn   r\  r   r   rh  s    ``   @r/   test_subclass_matmat!TestDotTests.test_subclass_matmatS  s}    	E 	EI,, 	E( 	
-;--1-RZZuM"beL"beLr`   r   r   r   c                    [         R                  R                  S5      nUR                  UR	                  / UQSPSP75      UR
                  S9n[        R                  " U5      nSnU R                  X%USS9  U R                  X%USS9  g)zI
Test operators coming from `aslinearoperator`,
*including batched LHS*.
r   rV   rw   rt   Tr.  N)
r8   r9   r:   r   r  r   r   r   r  r$  )r]   rH   rn   r'   r   r   r   s          r/   test_aslinearop_dense"TestDotTests.test_aslinearop_denseu  s     ii##B' 4+ 4q 4! 45--  
 ''/
"ZdK"ZdKr`   np_onlyc                     [         R                  " / UQSPSP7UR                  S9n[        R                  " U5      nSnU R                  X$USS9  U R                  X$USS9  g)z[
Test operators coming from `aslinearoperator` with sparse arrays,
*including batched LHS*
rV   rw   rt   Tr.  N)sparserandom_arrayr   r   r   r  r$  )r]   rH   rn   r   r   r   s         r/   test_aslinearop_sparse#TestDotTests.test_aslinearop_sparse  si     $$%9{%9A%9q%9O''/
"ZdK"ZdKr`   rd   N)F)FFF)%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   parametrizer<   r6   r1  rE  rR  rm  r   rp  rw  r   rd   r`   r/   r   r   O  s{   

z 
 &2)Y&l  )5E)  )5+y$)  .:)Y.l  1=,	41  /;	9e/| 
 	-/B,d<(  *: "=?X= *M4%  #6F6F"+":":6FHK6F6Ft =B<B..<B<?<B<B59<B <B| [[],HI[[V%56Y Y/4S#XY 7 JY* [[],HI[[V]3-Y -Y/4S#X-Y 4 J-Y^ [[],HI[[V%56Y Y5c? Y 7 JY. [[],HIMc3h M JMB [[],HI[[!!,7b!cL c?L d JL" [[],HI[[!!$!/	L%S/ 	L 0 J	Lr`   r   c                       \ rS rSrSS jrS r\R                  R                  SS9S 5       r	\R                  R                  SS9S 5       r
\R                  R                  S	/ S
Q5      S 5       rSrg)TestAsLinearOperatori  Nc                   ^^^^	^
^ / nTb  TO[         m	U	U4S jm
U	U4S jm " U
UU4S jS[        R                  5      n " U4S jSU5      n " UU
UU4S jSU5      n " U	U4S	 jS
U5      nT(       Ga3  UR                  TT45        UR                  U" T5      T45        UR                  U" T5      T45        UR                  U" T5      T45        UR                  [        R                  " TR
                  5      R
                  T45        UR                  [        R                  " TR
                  5      R                  TR                  T5      45        UR                  [        R                  " TR
                  5      R                  5       TR                  T5      45        U$ UR                  [        TTS9T45        UR                  [         R                  " TTS9T45        UR                  [        R                  " TTS9T45        UR                  U" T5      T45        UR                  U" T5      T45        UR                  U" T5      T45        U$ )Nc                 h   > TU -  n[        U R                  5      S:X  a  TR                  US5      nU$ )Nr!   r   )rC   rL   r   )rf   y_xporiginals     r/   r@  +TestAsLinearOperator.make_cases.<locals>.mv  s1    1A177|q KK7+Hr`   c                 @   > TR                  TR                  5      U -  $ r5   rk   )rf   r  r  s    r/   rC  ,TestAsLinearOperator.make_cases.<locals>.rmv  s    88HJJ'!++r`   c                   >   >^  \ rS rSrSrU UU4S jrU4S jrSrU =r$ )4TestAsLinearOperator.make_cases.<locals>.BaseMatlikei  rd   c                 8   > [         TU ]  UTR                  TS9  g N)rs   rL   rn   )r[  r   rL   )r]   rs   r]  r  rn   s     r/   r   =TestAsLinearOperator.make_cases.<locals>.BaseMatlike.__init__  s"     ".. ! r`   c                    > T" U5      $ r5   rd   )r]   rf   r@  s     r/   _matvec<TestAsLinearOperator.make_cases.<locals>.BaseMatlike._matvec  s    !ur`   )	r   r   r   r   r   r   r  r   rk  )r]  r@  r  rn   s   @r/   BaseMatliker    s    D r`   r  c                   &   > \ rS rSrSrU 4S jrSrg)3TestAsLinearOperator.make_cases.<locals>.HasRmatveci  rd   c                    > T" U5      $ r5   rd   )r]   rf   rC  s     r/   _rmatvec<TestAsLinearOperator.make_cases.<locals>.HasRmatvec._rmatvec  s    1vr`   N)r   r   r   r   r   r  r   )rC  s   r/   
HasRmatvecr    s    D r`   r  c                   ,   > \ rS rSrSrU UUU4S jrSrg)3TestAsLinearOperator.make_cases.<locals>.HasAdjointi  rd   c                    > U R                   S   U R                   S   4n[        T5      n[        T5      n[        R                  " UUTUTS9$ )Nr*   r   )r   r   rs   rL   rn   )rL   r   r   r   )r]   rL   r   r   rs   r@  rC  rn   s       r/   ri  <TestAsLinearOperator.make_cases.<locals>.HasAdjoint._adjoint  sP    

1tzz!}4 !"+ //v8?6;6;35	8 8r`   N)r   r   r   r   r   ri  r   )rs   r@  rC  rn   s   r/   
HasAdjointr    s    D8 8r`   r  c                   0   > \ rS rSrU4S jrU U4S jrSrg)3TestAsLinearOperator.make_cases.<locals>.HasRmatmati  c                    > TU-  $ r5   rd   )r]   rf   r  s     r/   rd  ;TestAsLinearOperator.make_cases.<locals>.HasRmatmat._matmat  s    !|#r`   c                 @   > TR                  TR                  5      U-  $ r5   rk   )r]   rf   r  r  s     r/   _rmatmat<TestAsLinearOperator.make_cases.<locals>.HasRmatmat._rmatmat  s    xx

+a//r`   rd   Nr   r   r   r   rd  r  r   )r  r  s   r/   
HasRmatmatr    s    $0 0r`   r  rw   )r8   r   r   appendr   r?   r   rl   r   r   rY   ru  	csr_array)r]   r  rs   rn   casesr  r  r  r  r  r@  rC  s    ```     @@@r/   
make_casesTestAsLinearOperator.make_cases  s    Nb		,	 	)22 		 		8 	8 	8	0 	0 	0 LL(H-.LL*U+X67LL*U+X67LL*U+X67LL)44XZZ@BBHMNLL**8::688!  LL**8::6>>@!# 
 LfXU3X>?bhhxu5x@Af&&xu=xHIj'23j'23j'23r`   c           	         / U l         U R                  n[        R                  " / SQ/ SQ/5      nU =R                   U" U[        R                  5      -  sl         U =R                   U" U[        R
                  5      -  sl         U =R                   U" U[        R                  5      -  sl         U =R                   U" UR                  [        R                  5       VVs/ s H1  u  p4[        R                  " U5      R                  UR                  4PM3     snn-  sl         U =R                   U" UR                  [        R                  5       VVs/ s H?  u  p4[        R                  " U5      R                  UR                  R                  5       4PMA     snn-  sl         U =R                   U" UR                  [        R                  5       VVs/ s HC  u  p4[        R                  " U5      R                  5       UR                  R                  5       4PME     snn-  sl         [        R                  " / SQ/ SQ/5      nU =R                   U" U[        R                  5      -  sl         U =R                   U" UR                  [        R                  5       VVs/ s H1  u  p4[        R                  " U5      R                  UR                  4PM3     snn-  sl         U =R                   U" UR                  [        R                  5       VVs/ s H?  u  p4[        R                  " U5      R                  UR                  R                  5       4PMA     snn-  sl         U =R                   U" UR                  [        R                  5       VVs/ s HC  u  p4[        R                  " U5      R                  5       UR                  R                  5       4PME     snn-  sl         g s  snnf s  snnf s  snnf s  snnf s  snnf s  snnf )NrS   rU   r*   r                 @)y              @y              @rX   )r  r  r8   rY   r   r   rt   r?   r   r   r   rl   r   r   )r]   r  r  r  rZ   s        r/   r^   !TestAsLinearOperator.setup_method  s   
__
88Wg./

j28844


j2::66


j2::66


#-hjj"**#EG#E41 "221577=#EG 	G


#-hjj"**#EG#E41 "221577D#EG 	G


#-hjj"**#EG#E41 "2215==?L#EG 	G
 88[+67

j2==99


#-hjj"--#HJ#H41 "221577=#HJ 	J


#-hjj"--#HJ#H41 "221577D#HJ 	J


#-hjj"--#HJ#H41 "2215==?L#HJ 	J
GGG
JJJs(   8O'
AO-
A
O3
8O9
AO?
A
P
Trr  c           	      p
   U R                    GH   u  p#[        R                  " U5      n[        R                  " / SQ5      [        R                  " S/S/S//5      /n[        R                  " SS/5      [        R                  " S/S//5      /nUR
                  [        R                  :X  al  U[        R                  " / SQ5      [        R                  " S/S/S//5      /-  nU[        R                  " SS/5      [        R                  " S/S//5      /-  n[        R                  " SS/SS	/SS
//5      nU H  nUR                  S   S:X  a  [        R                  " [        SS9O[        R                  " 5       n	U	   [        UR                  U5      UR                  U5      5        S S S 5        [        XH-  UR                  U5      5        M     [        UR!                  U5      UR                  U5      5        [        XG-  UR                  U5      5        U GHl  n
U
R                  S   S:X  a  [        R                  " [        SS9O[        R                  " 5       n	U	   [        UR#                  U
5      UR$                  R'                  5       R                  U
5      5        [        UR$                  R                  U
5      UR$                  R                  U
5      5        [        UR(                  R                  U
5      UR$                  R'                  5       R                  U
5      5        [        UR+                  5       R                  U
5      UR$                  R'                  5       R                  U
5      5        S S S 5        GMo     U GH2  n
U
R,                  S:  a  M  [        UR/                  U
5      UR$                  R'                  5       R                  U
5      5        [        UR$                  R!                  U
5      UR$                  R                  U
5      5        [        UR(                  R!                  U
5      UR$                  R'                  5       R                  U
5      5        [        UR+                  5       R!                  U
5      UR$                  R'                  5       R                  U
5      5        GM5     [1        US5      (       a   [        UR
                  UR
                  5        [3        [1        US5      5        GM     g ! , (       d  f       GNo= f! , (       d  f       GM  = f)NrS   r*   r!   rT   r  r   r  rV   rW   rX   r   rz   r{   rs   r   )r  r   r   r8   rY   rs   r   rL   r   r   r   r   r   r
   r   r   r   r   r?   rl   r   r   r$   r    hasattrr	   )r]   rn   r  A_arrayrZ   xsysx2rf   r   r~  s              r/   
test_basicTestAsLinearOperator.test_basic   s    **JA**1-A((9%((QC!qc?+-B((Aq6"BHHqcA3Z$89Bww"--'rxx,xx!rdRD 124 4rxxB("((QC";*?@@Aq6Aq6Aq623B wwr{a' LL6FG#//1 
  !gkk!n=  QUGKKN3  "w{{27R1 wwr{a' LL6FG#//1 
  1wyy~~/?/C/CA/FG A		a0@A A		0@0D0DQ0GH !3!3A!6		8H8L8LQ8OP	 S  66A:QYYq\799>>+;+?+?+BCQSSZZ]GIIMM!,<=QSSZZ]GIINN,<,@,@,CDQYY[//2GIINN4D4H4H4KL  q!!QWWagg.GAv&'g %( S Ss    +T$DT%
T"%
T5c                    U R                    H  u  p#[        R                  " U5      n[        R                  " / SQ5      n[        R                  " S/S/S//5      n[        R                  " SS/SS/SS//5      n[        UR                  U5      UR                  U5      5        [        UR                  U5      UR                  U5      5        [        UR                  U5      UR                  U5      5        M     g )NrS   r*   r!   rT   rV   rW   rX   )r  r   r   r8   rY   r
   r   )r]   rn   r  r  rZ   x0x1r  s           r/   test_dotTestAsLinearOperator.test_dot8  s     **JA**1-A)$BA3aS/*BAq6Aq6Aq623BrGKKO4rGKKO4rGKKO4 %r`   rs   )int64rt   r   c                 X   US:X  a0  [        U5      (       a   [        S:w  a  [        R                  " S5        [	        X!5      nUR                  / SQ/ SQ/US9nU R                  X1US9 GH  u  pE[        R                  " U5      nUR                  / SQ5      UR                  S/S	/S
//5      /nUR                  SS	/5      UR                  S/S	//5      /nUR                  UR                  :X  aV  XrR                  / SQ5      UR                  S/S/S//5      /-  nXR                  SS/5      UR                  S/S//5      /-  nUR                  SS/S	S/S
S//US9n	U H$  n
UR                  X5      n
[        Xj-  XZ-  5        M&     [        UR                  U	5      XY-  5        [        Xi-  XY-  5        U GH%  nUR                  S	:  a  M  UR                  X5      n[        UR                  U5      UR!                  UR"                  5      U-  5        [        UR"                  R                  U5      UR!                  UR"                  5      U-  5        [        UR$                  R                  U5      UR!                  UR"                  5      U-  5        [        UR'                  5       R                  U5      UR!                  UR"                  5      U-  5        GM(     [)        US5      (       a   [+        UR                  UR                  5        [)        US5      (       a  GM   e   g )Nr  cpuz'"addmm_cuda" not implemented for 'Long'rS   rU   rw   rY  r*   r!   rT   r  r   r  rV   rW   rX   rs   r   )r   r   r   skipr0  r   r  r   r   rs   r   astyper   r   r$   r    rl   r?   r   r   r  r
   )r]   rs   rn   r  r  r  rZ   r  r  r  rf   r~  s               r/   test_xpTestAsLinearOperator.test_xpF  s   G1FKKCD"::y)4E:B//(b/AJA**1-A**Y'**qcA3_-/B**aV$bjj1#s&<=Bww"--'zz+.zzA3rd"346 6zz1b'*BJJbT{,CDDaVaVaV4EBBIIa'w{3  AHHRL',7AFGL166A:IIa'		!bgggii.@1.DE

1rwwwyy/AA/EF

1rwwwyy/AA/EF		 2 21 5rwwwyy7IA7MN  q'""QWWagg.1f%%%%C Br`   )r  r5   )r   r   r   r   r  r^   r   r   r   r  r  ry  r  r   rd   r`   r/   r{  r{    s    PdJ. [[!!$!/5( 05(n [[!!$!/5 05 [[W&HI&& J&&r`   r{  c                 j   ^  [         R                  " SU 4S jT S9n[        U5      nSU;  d   U5       eg )N)r*   r*   c                 (   > TR                  S/5      $ r   r   rf   rn   s    r/   rg   test_repr.<locals>.<lambda>q  s    

A3r`   rL   r   rn   zunspecified dtype)r   r   repr)rn   rZ   repr_As   `  r/   	test_reprr  p  s5      v6OTVWA!WFf,4f4,r`   c                    [         R                  " SU S9n[        XR                  / SQ5      -  U R                  / SQ5      5        [        [	        UR                  U R                  U R                  S5      S5      5      5      U R                  S5      5        [        [        UR                  U R                  / SQ5      5        g )Nr   rY  rS   r   r   )r   IdentityOperatorr   r   r   r   r   aranger   r   r   )rn   idents     r/   test_identityr  v  s    &&v"5EEJJy112::i3HIHUYYrzz"))A,'GHI299UV<X*ellBJJ|,DEr`   c           
        ^  [         R                  " T R                  T R                  ST R                  S9S5      5      nU 4S jn[         R
                  " SUT S9nXX-  X-  UR                  UR                  5       X-   X3-   US-  /	nU H<  n[        US5      (       d   e[        US	5      (       d   e[        US
5      (       a  M<   e   g )N   rw   r   c                    > TR                  U 5      n U R                  S:X  d  U R                  S:X  d   eTR                  S5      $ )Nr&  )rT   r*   rV   )r   rL   r   r  s    r/   always_four_ones)test_attributes.<locals>.always_four_ones  s:    JJqMww$!''V"333wwqzr`   r   r  rV   rs   rL   r  )	r   r   r   r  rt   r   r   r   r  )rn   rZ   r  r[   opsr   s   `     r/   test_attributesr  ~  s    ""2::bii"**i.Mv#VWA
 	  v6F2NAqssAIIKq!t
DCr7####r7####r9%%%% r`   c                     U $ )z=Needed for test_pickle as local functions are not pickleable rd   rf   s    r/   matvec_for_pickler    s    Hr`   r   z0pickle-ability is not guaranteed by the standardc                 @   SS K n[        U 5      (       a  SOSn[        X!R                  S-   5       Hj  n[        R
                  " S[        U S9nUR                  XCS9nUR                  U5      nUR                   H  n[        XG5      [        Xg5      :X  a  M   e   Ml     g )Nr   r!   r*   r   rY  )protocol)pickler   rB   HIGHEST_PROTOCOLr   r   r  dumpsloads__dict__r0  )rn   r  protocol_minr  rZ   sr[   r  s           r/   test_pickler    s    
  1!L,(?(?!(CD$$V->2FLLL.LLOA1=GAM111  Er`   c                    ^   " S S[         R                  5      n[        [        SS9   [	        [
        U5        S S S 5         " U 4S jS[         R                  5      nU" S5      n[        UR                  T R                  / SQ5      5      T R                  / SQ5      5        [	        [        UR                  T R                  / S	Q5      5         " U 4S
 jS[         R                  5      nU" T R                  [        R                  R                  SS5      5      5      nUR                  T R                  [        R                  R                  S5      5      5      R                  S:X  d   eg ! , (       d  f       GN;= f)Nc                       \ rS rSrSrg)test_inheritance.<locals>.Emptyi  rd   N)r   r   r   r   r   rd   r`   r/   Emptyr    s    r`   r  zshould implement at leastr{   c                   2   >^  \ rS rSrU U4S jrS rSrU =r$ )"test_inheritance.<locals>.Identityi  c                 &   > [         TU ]  S X4TS9  g r  )r[  r   )r]   nr]  rn   s     r/   r   +test_inheritance.<locals>.Identity.__init__  s    G4v"=r`   c                     U$ r5   rd   r]   rf   s     r/   r  *test_inheritance.<locals>.Identity._matvec  s    Hr`   rd   )r   r   r   r   r   r  r   rk  r]  rn   s   @r/   Identityr    s    	>	 	r`   r  rT   rS   rU   c                   2   >^  \ rS rSrU U4S jrS rSrU =r$ )$test_inheritance.<locals>.MatmatOnlyi  c                 X   > [         TU ]  UR                  UR                  TS9  Xl        g rX  r[  r   rs   rL   rZ   r]   rZ   r]  rn   s     r/   r   -test_inheritance.<locals>.MatmatOnly.__init__  $    GQWWagg"5Fr`   c                      U R                   U-  $ r5   r   r  s     r/   rd  ,test_inheritance.<locals>.MatmatOnly._matmat  s    66A:r`   r   )r   r   r   r   r   rd  r   rk  r  s   @r/   
MatmatOnlyr    s    		 	r`   r  rW   rW   )r   r   r   RuntimeWarningr   	TypeErrorr   r   r   NotImplementedErrorr   r8   r9   randnrL   )rn   r  r  id3r  mms   `     r/   test_inheritancer    s   	((  
~%@	Ai' 
B9++  1+CCJJrzz)45rzz)7LM%s{{BJJy4IJY--  
BJJryyq!45	6B99RZZ		 234::dBBB/ 
B	As   E..
E=c                    U R                  [        R                  R                  SS5      S[        R                  R                  SS5      -  -   5      nU R                  [        R                  R                  SS5      5      n[        R
                  " U5      n[        R
                  " U5      nX3-   nXD-   nUR                  U R                  :X  d   eUR                  U R                  :X  d   eg )Nr!   r   )	r   r8   r9   randr   r   rs   rt   r   )rn   mat_complexmat_realcomplex_operatorreal_operatorsum_complexsum_reals          r/   test_dtypes_of_operator_sumr    s     **RYY^^Aa02		q8K3KKLKzz"))..1-.H 11+>..x8M"5K,H>>RZZ'''---r`   c                 `   ^ S/mU4S jn[         R                  " SXS9  [        TS   S5        g )Nr   c                 "   > TS==   S-  ss'   U $ Nr   r*   rd   )r  
call_counts    r/   r   #test_no_double_init.<locals>.matvec  s    1r`   r!   r!   r   rn   r*   )r   r   r
   )rn   r   r  s     @r/   test_no_double_initr    s/    J VF:A"r`   
test_dtypec                   ^^ SU R                   ;   a&  [        T5      (       d  [        R                  " S5        TR	                  [
        R                  " SU S95      mUU4S jn[        R                  " SUTS9nTR                  nTR                  US5      (       a$   TR	                  S	5      TR	                  S
5      -     UR                  U:X  d   eg ! [         a    [        R                  " TSS9n N4f = f)N
longdoublez$longdoubles are only tested for `np`r*   rw   c                 <   > TR                  TU S   -  U S   /5      $ r  )stack)r  scalarrn   s    r/   r@  /test_determine_lo_dtype_from_matvec.<locals>.mv  s#    xx!A$!-..r`   r  r  )zreal floatingzcomplex floatingr!   g       @integral)kind)r   r   r   r  r   r8   rY   r   r   rs   isdtyper  r*  default_dtype)r  rn   r@  loexpectedr  s    `   @r/   #test_determine_lo_dtype_from_matvecr    s    z***8B<<:;ZZ*56F/ 
	!	!&	;B ||H	zz(ABB	>JJqMBJJsO+ 88x  	>((*=H	>s   #C C65C6c                    ^  U 4S jn[         R                  " SUT S9nT R                  UR                  S5      (       d   eg )Nc                 <   > TR                  SU S   -  U S   /5      $ )N   r   r*   r  )r  rn   s    r/   r@  +test_determine_lo_dtype_for_int.<locals>.mv  s#    zz31:qt,--r`   r  r  r  )r   r   r  rs   )rn   r@  r  s   `  r/   test_determine_lo_dtype_for_intr#    s9    . 
	!	!&	;B::bhh
++++r`   c                 F   U R                  S//U R                  S9n[        R                  " U5      nSU-  nSU-  nU R                  S/U R                  S9n[	        UR                  U5      U R                  XE5      5        [	        UR                  R                  U5      U R                  U R                  UR                  5      U5      5        [	        UR                  5       R                  U5      U R                  U R                  UR                  5      U5      5        g Nr   rw   r*   )r   r   r   r   r   r   r  r   rl   r?   r   rn   r   rZ   r[   Yr  s         r/   test_adjoint_conjugater(  	  s    


RD6
/A""1%A
QA
QA


A3bmm
,AAEE!Hbiio.ACCGGAJ		"''!##, :;AIIKOOA&		"''!##,(BCr`   c                 z    U R                  S//5      n[        R                  " U5      nUR                  S:X  d   eg )Nr*   r!   )r   r   r   r$   )rn   r   rZ   s      r/   	test_ndimr*    s4    


QC5A""1%A66Q;;r`   c                    U R                  S//U R                  S9n[        R                  " U5      nSU-  nSU-  nU R                  S/U R                  S9n[	        UR                  U5      U R                  XE5      5        [	        UR                  R                  U5      U R                  UR                  U5      5        g r%  )r   r   r   r   r   r   r  r?   r&  s         r/   test_transpose_noconjugater,    s    


RD6
/A""1%A
QA
QA


A3bmm
,AAEE!Hbiio.ACCGGAJ		!##q 12r`   r   c                   ^  [        T R                  T R                  S9n " U 4S jS[        R                  5      nU" U" SS/SS//5      5      nU" SS/5      nUnU" SS	/S
S//5      nT R                  US5      nU" SS/SS//5      n[        X6-  X-  5        [        UR                  U-  UR                  U-  5        [        UR                  U-  UR                  U-  5        [        X4-  X-  5        [        XS-  XX-  5        [        UR                  U-  UR                  U-  5        [        X7-  X-  5        [        UR                  U-  UR                  U-  5        [        UR                  U-  UR                  U-  5        g )Nrw   c                   8   >^  \ rS rSrU U4S jrS rS rSrU =r$ )/test_transpose_multiplication.<locals>.MyMatrixi1  c                 X   > [         TU ]  UR                  UR                  TS9  Xl        g rX  r  r  s     r/   r   8test_transpose_multiplication.<locals>.MyMatrix.__init__2  r  r`   c                      U R                   U-  $ r5   r   r]   others     r/   rd  7test_transpose_multiplication.<locals>.MyMatrix._matmat5  s    %"7r`   c                 4    U R                   R                  U-  $ r5   )rZ   r  r3  s     r/   r  8test_transpose_multiplication.<locals>.MyMatrix._rmatmat6  s    $&&))e*;#;r`   r   )	r   r   r   r   r   rd  r  r   rk  r  s   @r/   MyMatrixr/  1  s    	 	8;;r`   r8  r*   r!   rT   rV   r"      r~   (   r   )	r   r   r   r   r   r   r   r?   r  )	rn   r   r8  rZ   r   X_Tr[   X2r'  s	   `        r/   test_transpose_multiplicationr=  *  sT    rzz7H<9++ < 	Aq6Aq6*+,A!QA
C2r(RH%&A	Aw	B1a&1a&!"AAE15!ACC!GQSS1W%ACC!GQTTAX&AE15!CGSW%ACC!GQTTAX&AFAF#BEEAIruuqy)ACC"HaddRi(r`   Trr  c                     [         R                  " S5      n [        R                  " [         R                  " S5      5      n[	        X-  [         R
                  5      (       d   e[	        X-  [         R
                  5      (       d   e[        X-  R                  5       [        R                  " S5      5        [        X-  R                  5       [        R                  " S5      5        [        R                  " SS S9nSn[        [        US9   X-    S S S 5        [        [        US9   X-    S S S 5        [        R                  " U 5      n [	        X-  [        R                  5      (       d   e[	        X-  [        R                  5      (       d   e[        X-  R                  [        R                  " S5      5      [        R                  " S5      5        g ! , (       d  f       N= f! , (       d  f       N= f)Nr!   r  c                     U $ r5   rd   r  s    r/   rg   .test_sparse_matmat_exception.<locals>.<lambda>T  s    !r`   )r   z6Try wrapping the matrix with `aslinearoperator` first.r{   )ru  	eye_arrayr   r   r   sparrayr   toarrayr8   eyer   r   r  r   r   )r[   rZ   r   s      r/   test_sparse_matmat_exceptionrE  J  sQ   A""6#3#3A#67AaeV^^,,,,aeV^^,,,,QUOO%rvvay1QUOO%rvvay1  <A
BC	y	,	 
-	y	,	 
- 	""1%AaeY556666aeY556666QUNN2771:.
; 
-	,	,	,s   G(G(
G%(
G6z	jax.numpyz.remaining reference (due to lazy_xp_function?)c                     U R                  S5      n[        [        R                  X5       nUR	                  5         AS S S 5        g ! , (       d  f       g = fr   )rD  r   r   MatrixLinearOperatorr   )rn   rZ   r   s      r/   "test_MatrixLinearOperator_refcyclerH  a  s<     	q	A	I::A	Bb


 
C	B	Bs   A
AleftFoperator_definition)subclass_matvecsubclass_matmat__init__matvec__init__matmatr   batch_A)rd   r  r'  batch_x)rd   )rX   r*   )r   r*   rs   c                 v  ^^^^^ [         R                  R                  S5      nSu  pxn	UR                  / UQUPUP75      mUR                  / TQU (       a  UOUP75      n
UR                  / TQU (       a  UOUPSP75      nUR                  / TQU (       a  UOUPU	P75      nU[         R                  :X  a  TSUR                  TR                  5      -  -   mU
SUR                  U
R                  5      -  -   n
USUR                  UR                  5      -  -   nUSUR                  UR                  5      -  -   nU4S jTXU4 5       u  mpnUU4S jmU4S jmUS:X  a  [
        R                  " T5      nOUS	:X  a8  [
        R                  " TR                  TR                  UU4S
 jUUU4S jTS9nOUS:X  a  [        R                  " S5        OUS:X  a;   " UUU4S jS[
        R                  5      nU" TR                  TR                  TS9nO@US:X  a:   " UUU4S jS[
        R                  5      nU" TR                  TR                  TS9n[        U (       a  WR                  U
5      OWR                  U
5      U (       a	  T" TU
5      O!T" TR                  TR                  5      U
5      5        T(       aN  Sn[        R                   " ["        US9   U (       a  UR                  U5      OUR                  U5        S S S 5        OU (       a  SOSn[        R$                  " [&        US9   [        U (       a  UR                  U5      OUR                  U5      U (       a  TU-  OTR                  TR                  5      U-  5        S S S 5        [        R                   " ["        SS9   U (       a  UR                  U5      OUR                  U5        S S S 5        T(       a  SOSn[        R                   " ["        US9   U (       a  UR)                  U
5      OUR+                  U
5        S S S 5        [        U (       a  UR)                  U5      OUR+                  U5      U (       a  TU-  OTR                  TR                  5      U-  5        [        U (       a  UR)                  U5      OUR+                  U5      U (       a  TU-  OTR                  TR                  5      U-  5        U (       a  T(       a'  [        R                   " ["        SS9   X-    S S S 5        OD[        X-  TU
-  5        [        U" U
5      TU
-  5        [        UR-                  U
5      TU
-  5        [        X-  TU-  5        [        U" U5      TU-  5        [        UR-                  U5      TU-  5        [        X-  TU-  5        [        U" U5      TU-  5        [        UR-                  U5      TU-  5        g Sn [         R.                  " UTS S 5        U(       d/  Sn[        R                   " ["        [0        4US9   X-    S S S 5        O/[        X-  U
T-  5        [        UR3                  U
5      U
T-  5        [        R                   " ["        SS9   X-    S S S 5        [        TR                  UR                  5      U-  TR                  UR                  5      T-  5        [        UR3                  TR                  UR                  5      5      TR                  UR                  5      T-  5        g ! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN~= f! , (       d  f       GN:= f! , (       d  f       GN= f! ["         a    Sn GNf = f! , (       d  f       GN7= f! , (       d  f       GN#= f)Nl   w{3j)rV   rT   r!   r*   r   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr5   r  )r,   rf   rn   s     r/   r0   test_batch.<locals>.<genexpr>  s     P6Orzz!}}6Os   !c                    > T(       d  UR                   S:X  d   eX-  $ UR                   S:  d   eXSTR                  4   -  S   $ )Nr*   r!   .).r   )r$   newaxis)rZ   rf   rP  rn   s     r/   r   test_batch.<locals>.matvec  sJ    66Q;;5L 66Q;;3

?+,f55r`   c                 l   > T(       d  UR                   S:X  d   e X-  $ UR                   S:  d   eX-  $ )Nr!   rT   )r$   )rZ   r   rP  s     r/   r   test_batch.<locals>.matmat  s8    66Q;;
 u 66Q;;ur`   r   rM  c                    > T" TU 5      $ r5   rd   )rf   r   r   s    r/   rg   test_batch.<locals>.<lambda>  s    VB]r`   c                 H   > T" TR                  TR                  5      U 5      $ r5   rl   r  )rf   r   r   rn   s    r/   rg   rZ    s    fRWWRUU^Q7r`   r-  rN  z&should work but doesn't - see gh-24510rK  c                   4   > \ rS rSrU U4S jrU UU4S jrSrg)$test_batch.<locals>.MyLinearOperatori  c                    > T" TU5      $ r5   rd   )r]   rf   r   r   s     r/   r  ,test_batch.<locals>.MyLinearOperator._matvec      b!}$r`   c                 H   > T" TR                  TR                  5      U5      $ r5   r\  )r]   rf   r   r   rn   s     r/   r  -test_batch.<locals>.MyLinearOperator._rmatvec      bggbeena00r`   rd   N)r   r   r   r   r  r  r   )r   r   rn   s   r/   MyLinearOperatorr^        %1 1r`   re  )rL   rs   rn   rL  c                   4   > \ rS rSrU U4S jrU UU4S jrSrg)r^  i  c                    > T" TU5      $ r5   rd   )r]   r   r   r   s     r/   rd  ,test_batch.<locals>.MyLinearOperator._matmat  ra  r`   c                 H   > T" TR                  TR                  5      U5      $ r5   r\  )r]   r   r   r   rn   s     r/   r  -test_batch.<locals>.MyLinearOperator._rmatmat  rd  r`   rd   Nr  )r   r   rn   s   r/   re  r^    rf  r`   zDimension mismatch:...r{   z'Calling `matvec` on 'column vectors'...z(Calling `rmatvec` on 'column vectors'...zExpected at least 2-d...Tr   Fz<Incompatible shapes|size of tensor|could not be broadcast...)r8   r9   r:   r   rL   r   r   r   rs   r   r  r   r   r   rl   r  r   r   r   r   r   r    r   rF   RuntimeErrorr   )rI  rJ  rO  rP  rs   rn   r'   mr  r  x_rowx_colx_matrZ   re  messagebroadcastabler   r   r   r   s      ` `            @@@r/   
test_batchrs  m  s   " ))

 1
2CGA!	$g$q$!$	%BJJ33t!34EJJ66t!6A67EJJ66t!6A67E"szz"((+++SZZ444SZZ444SZZ444Pr56OPBe6 00&&r*	 0	0$$(("((*7	
 
 0	0 	<=	 1	1	1 	1y77 	1
 288288C	 1	1	1 	1y77 	1
 288288C QYYu%5!r5vbggbeene'D
 *]]:W5#AHHUO5)9 65 AE<B 	\\-w7#'QYYu-="U
(> 8 
z)A	BQYYu%5 
C
 +2&7QG	z	1QYYu%5 
2 QYYu%5U
 6
 QYYu%5U
 6 z1IJ	 KJ AIrEz2AeHb5j1AEE%L"u*5	2:.%"u*-eb5j1	2:.%"u*-eb5j1 	"
 "6 PC
L9E	 FE EIurz2AFF5M52:6]]:-EFI G 	)A-rwwuxx/@2/EFrwwuxx012775883Dr3IJQ 65
 87 
C	B 
2	1" KJ.  	"!M	"
 FE GFsg   *\*0A\<-*]*] ]20^ 2^^)*
\9<
]
] 
]/2
^^^
^&)
^8)Wr   r   	functoolsr   	itertoolsr   r   typesr   typingr   r   r   r   r   numpy.testingr	   r
   numpyr8   scipy._lib._array_apir   r   r   r   r   r   r   r   r   r   scipy._externalr   r*  scipy.sparseru  scipy.sparse.linalg._interfacelinalg
_interfacer   scipy.sparse.linalgr   r   scipy.sparse._sputilsr   scipy._lib._gcutilsr   
pytestmarkrN   rP   r   r   r   r{  r  r  r  r  r  r  r  r  int8int16r   r  
INT_DTYPESr   rt   r  REAL_DTYPESr   r   clongdoubleCOMPLEX_DTYPESINEXACTDTYPES	ALLDTYPESry  r  r#  r(  r*  r,  r=  rE  rH  rs  rd   r`   r/   <module>r     sr          1 /    3  2 2 @ ( 2!Z XXUVYY	
 45! @0M$ M$` l3^_CL CL `CLL
W& W&t5F&"
 =  
2	
2C<. 
# ggrxx2884
zz2::r}}5,,r~~>n,&	 y1  2 .,D
3 l3^_E  )	 `
)6 d+< ,<, H   %/. 1E F $45$892::r}}"=>l3^_E  XK	 ` ? : 6F 0XKr`   