
    tKg                     |   d Z ddlZddlZddl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 ddlZddlZddlmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ ddl Zddl!m"Z" d	 Z# G d
 d      Z$ G d d      Z% G d d      Z& G d d      Z' G d d      Z( G d d      Z)d Z*d Z+d Z, G d d      Z- G d d      Z.y)z, Test functions for linalg.matfuncs module

    N)arrayidentitydotsqrt)assert_array_almost_equalassert_allcloseassert_assert_array_lessassert_array_equalassert_warns)
funmsignmlogmsqrtmfractional_matrix_powerexpmexpm_frechet	expm_condnorm
khatri_rao)_matfuncs_inv_ssq)pick_pade_structure)minimizec                  T    t        j                  g dg dg dg dgt              } | S )aW  
    Return the test matrix from Experiment (1) of [1]_.

    References
    ----------
    .. [1] Awad H. Al-Mohy and Nicholas J. Higham (2012)
           "Improved Inverse Scaling and Squaring Algorithms
           for the Matrix Logarithm."
           SIAM Journal on Scientific Computing, 34 (4). C152-C169.
           ISSN 1095-7197

    )g3d?     L@r   r   )r   gRal!A?r   r   )r   r   gQI?r   )r   r   r   g^?dtype)npr   float)As    d/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/linalg/tests/test_matfuncs.py%_get_al_mohy_higham_2012_experiment_1r"      s/     	" 	 &+		,A
 H    c                   $    e Zd Zd Zd Zd Zd Zy)	TestSignMc                     t        g dg dg dg dg dg      }t        g dg dg dg d	g d
g      }t        |      }t        ||       y )Ng333333=@g3333338g     `Q@gfffffH@g      @gffffff"g@      2g0       g      $g      @g      4r)   r*   g333333#g333333#@g     9g.r*   g#@g333333g      2@g3333332@       @)g'@'Rqgy.@ge@5@r/   )g@ȽUЛ'?g9\g+%r0   )gRQQ?gGzgffffffr1   )gר#w?î?gk#egC,Nr2   )g@42
gF(@gcs@@r3   )r   r   r   )selfacrrs       r!   	test_nilszTestSignM.test_nils1   sW    00.1-	/ 0
 QO0ON	P Q
 !H!!B'r#   c                 L    t        g dg dg dg dg      }t        |d       y )N)           r   r   )r;   r   r;   r   r   r   r   r;   )r   r   r;   r   Fdispr   r   r4   r5   s     r!   test_defective1zTestSignM.test_defective1?   s    ;y9=>aer#   c                 R    t        g dg dg dg dg df      }t        |d       y )Nr'   r(   r+   r,   r-   Fr=   r?   r@   s     r!   test_defective2zTestSignM.test_defective2D   s,    &'('$& ' 	aer#   c           
      ^    t        g dg dg dg dg dg dg dg      }t        |d	       y )
Nr*         9@r:   r:   r:   r:   r:   r:               $@      @rJ   rJ   r:   r:   r:   r.         .@rJ   rJ   r:   r:   r:   r:   r:   rL   rJ   r:   r:   r:   r:   r:   rJ   rI   r:   r:   r:   r:   r:   r:   r*   rF   r:   r:   r:   r:   r:   r:   rH   Fr=   r?   r@   s     r!   test_defective3zTestSignM.test_defective3N   s2    11000102 3 	aer#   N)__name__
__module____qualname__r8   rA   rC   rQ    r#   r!   r%   r%   /   s    (
r#   r%   c            	          e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zej                   j#                  d      ej                   j%                  deeej,                  eej0                  g      d               Zy)TestLogMc           
          t        g dg dg dg dg dg dg dg      }t        d      d	z  d
z   |z
  }t        |d       y )NrE   rG   rK   rM   rN   rO   rP      g@y                Fr=   )r   r   r   )r4   r5   ms      r!   r8   zTestLogM.test_nils\   sI    11000102 3 a[_R"QUr#   c                 l    t               }t        |d      \  }}t        |      }t        ||dd       y )NFr=   g-C6
?+=rtolatol)r"   r   r   r   )r4   r    A_logminfoA_round_trips        r!   *test_al_mohy_higham_2012_experiment_1_logmz3TestLogM.test_al_mohy_higham_2012_experiment_1_logmh   s3     23AE*F|ad?r#   c                     t               }t        |t        j                  d      \  }}t	        |      }t        t        j                  ||dd              y )NFr=   h㈵>r\   r]   )r"   r   r   logr   r	   allclose)r4   r    
A_funm_logra   rb   s        r!   .test_al_mohy_higham_2012_experiment_1_funm_logz7TestLogM.test_al_mohy_higham_2012_experiment_1_funm_logp   sG     232666
DJ'BKKadGGHr#   c                    t         j                  j                  d       t        dd      D ]  }t         j                  j	                  ||      }t        j
                  ddd      D ]  }||z  }t         j                  j                  |      }d| d| }t        |d	
      \  }}|j                  |      }	t        |	|       t        |d	
      \  }
}t        |
      }t        |||         y )N  r;         	   zM:z eivals:Fr=   )err_msg)r   randomseedrangerandnlogspacelinalgeigvalsr   r   r   r   r   )r4   n
M_unscaledscaleMWrp   M_sqrtmra   M_sqrtm_round_tripM_logmM_logm_round_trips               r!   test_round_trip_random_floatz%TestLogM.test_round_trip_random_floatx   s    
		tq!AA.JRA.& II%%a(qc!- !&ae 4%,[[%9" 2A6  $AE2$(L! 11gF / r#   c                 |   t         j                  j                  d       t        dd      D ]  }t         j                  j	                  ||      dt         j                  j	                  ||      z  z   }t        j
                  ddd      D ].  }||z  }t        |d	      \  }}t        |      }t        ||       0  y 
Nrk   r;   rl                 ?rm   rn   ro   Fr=   )	r   rq   rr   rs   rt   ru   r   r   r   )r4   rx   ry   rz   r{   r   ra   M_round_trips           r!   test_round_trip_random_complexz'TestLogM.test_round_trip_random_complex   s    
		tq!AA.biiooa6K1KKJRA.&#AE2#F|a0	 / r#   c                    d}ddgddggddgddggddgddggddgddggfD ]#  }t         j                  j                  |      }t        t	        d |D                      t        j                  |t              }t        |d	      \  }}t        |j                  j                  |v       t        j                  |t              }t        |d	      \  }}t        |j                  j                  |v        t        j                  |t               }t        |d	      \  }}t        |j                  j                  |v        & y )
NFDGr;   r         c              3   V   K   | ]!  }|j                   xs |j                  d k   # ywr   Nimagreal.0ws     r!   	<genexpr>zFTestLogM.test_logm_type_preservation_and_conversion.<locals>.<genexpr>   %     <!QAFF0affqj0!   ')r   Fr=   )scipyrv   rw   r	   anyr   r   r   r   r   charcomplex)r4   complex_dtype_charsmatrix_as_listr|   r    r`   ra   s          r!   *test_logm_type_preservation_and_conversionz3TestLogM.test_logm_type_preservation_and_conversion   s3    .Q!Q Q!Q Q!Q Q!Q 	"N $$^4A<!<<<= u5A.LFDFLL%%-@@A w7A.LFDFLL%%)<<= .66A.LFDFLL%%)<<=/"r#   c                    g dg dg dg}t         t        fD ]  }t        j                  ||      }t        j
                  j                  |      }t        dt        j                  |j                        j                         k         t        |d      \  }}t        t        j                  |j                  t        j                               t        t!        |      |        y )N)r;   r;   r   )r   r;   r;   )r;   r   r;   r   {Gz?Fr=   )r   r   r   r   r   rv   rw   r	   absoluter   sumr   
issubdtyper   inexactr   r   )r4   r{   dtXr   Yra   s          r!   test_complex_spectrum_real_logmz(TestLogM.test_complex_spectrum_real_logm   s     	9-.B"%A$$Q'AD2;;qvv.2244515)GAtBMM!''2::67DGQ' !r#   c                    ddgddggddgddggfD ]q  }t         t        fD ]`  }t        j                  ||      }t	        |d      \  }}t        t        j                  |j                  t        j                               b s y )Nr;   r   r   Fr=   )	r   r   r   r   r   r	   r   r   complexfloating)r4   r{   r   r    r`   ra   s         r!   test_real_mixed_sign_spectrumz&TestLogM.test_real_mixed_sign_spectrum   s}     Q!R!Q!Q "A WnHHQb)#AE2fllB4F4FGH %"r#   c                 ,   t        j                  ddgddgg      }t        j                  ddgddgg      }||j                  ||j                  fD ]A  }t        j
                  }t        |t        |d      \  }}t        |      }t        ||d       C y )Nr   r   r;   Fr=   r\   r_   )
r   r   asarrayTr   LogmExactlySingularWarningr   r   r   r   )r4   r    Br{   expected_warningLra   Es           r!   test_exactly_singularzTestLogM.test_exactly_singular   s    HHq!fr2h'(JJAA'(ACCACCA0KK"#3T15IGAtQAAqu-	  r#   c                     t        j                  dgg      }t        j                  }t	        |t
        |d      \  }}t        |      }t        ||d       y )Ng0.++Fr=   r\   r   )r   r   r   LogmNearlySingularWarningr   r   r   r   )r4   r{   r   r   ra   r   s         r!   test_nearly_singularzTestLogM.test_nearly_singular   sJ    HHvhZ ,FF/quE4G15)r#   c                    ddgddgg}dt         j                  dz  gt         j                   dz  dgg}t        t        |      |d       t        t	        |      |d       ddgdd	gg}dt         j                  z  dz  d
t         j                  z  gdd	t         j                  z  dz  gg}t        t        |      |d       t        t	        |      |d       ddgdd	gg}dt         j                  z  dz  dgdd	t         j                  z  dz  gg}t        t        |      |d       t        t	        |      |d       y )Nr   r;   r         ?r\   r   r   rn   y             r   )r   pir   r   r   )r4   r   r   s      r!   &test_opposite_sign_complex_eigenvaluesz/TestLogM.test_opposite_sign_complex_eigenvalues   s   Vb!Ws^ruufSj!_-Q/Q/!Wq#hhslAbeeG$q#bee)C-&89Q/Q/!Wq#hhslACIcM 23Q/Q/r#   c                     d}t        j                  ||f      t        j                  |      z   }d|j                  _        t        |       y )N   F)r   onesr   flags	writeabler   r4   rx   r5   s      r!   test_readonlyzTestLogM.test_readonly   s8    GGQFObkk!n,!Qr#   z6ValueError: attempt to get argmax of an empty sequencereasonr   c                     t        j                  d|      }t        |      }t        j                  d|      }t        |      }|j                  dk(  sJ |j
                  |j
                  k(  sJ y Nr   r   r   r   )r   emptyr   eyeshaper   )r4   r   r5   log_aa0log_a0s         r!   
test_emptyzTestLogM.test_empty   s^     HHV2&QVVAR b{{f$$${{fll***r#   N)rR   rS   rT   r8   rc   ri   r   r   r   r   r   r   r   r   r   pytestmarkxfailparametrizeintr   r   float32r   	complex64r   rU   r#   r!   rW   rW   Z   s    	@IG*1><
(	I.*0 [[VW[[TC

GR\\#RS+ T X+r#   rW   c                   >   e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zej$                  j'                  d      d        Zd Zd Zd Zd Zd Zd Zej$                  j7                  deeej>                  e ejB                  g      d        Z"y)	TestSqrtMc                 @   t         j                  j                  d       t        dd      D ]p  }t         j                  j	                  ||      }t        j
                  ddd      D ]4  }||z  }t        |d      \  }}|j                  |      }t        ||       6 r y )	Nrk   r;   rl   rm   rn   ro   Fr=   	r   rq   rr   rs   rt   ru   r   r   r   r4   rx   ry   rz   r{   r}   ra   r~   s           r!   r   z&TestSqrtM.test_round_trip_random_float   s    
		tq!AA.JRA.& %ae 4%,[[%9" 2A6	 / r#   c                    t         j                  j                  d       t        dd      D ]  }t         j                  j	                  ||      dt         j                  j	                  ||      z  z   }t        j
                  ddd      D ]4  }||z  }t        |d	      \  }}|j                  |      }t        ||       6  y r   r   r   s           r!   r   z(TestSqrtM.test_round_trip_random_complex  s    
		tq!AA.biiooa6K1KKJRA.& %ae 4%,[[%9" 2A6	 / r#   c                 p   d}t        |      }t        g dd|ddgdd|dgg dg      }t        g dd|ddgdd|dgg dg      }|j                  d   }t        t	        ||      |       t        |d|      d   }t        t	        ||      |       t        |dd      d   }t        t	        ||      |       y )	Ng      ?)      ?r   r   r;   r   r<   )r;   r   r   r   Fr>   	blocksizer   )r   r   r   r   r   r   )r4   eser5   sarx   esas          r!   test_badzTestSqrtM.test_bad  s    !W;a!9a!9  Kr!AJqAJ   GGAJ!#b*Q/AEQ/2!#c#,q1AEQ/2!#c#,q1r#   c                    d}ddgddggddgddggddgddggddgddggddgddggfD ]#  }t         j                  j                  |      }t        t	        d |D                      t        j                  |t              }t        |d	      \  }}t        |j                  j                  |v       t        j                  |t              }t        |d	      \  }}t        |j                  j                  |v        t        j                  |t               }t        |d	      \  }}t        |j                  j                  |v        & y )
Nr   r;   r   r   r   c              3   V   K   | ]!  }|j                   xs |j                  d k   # ywr   r   r   s     r!   r   zHTestSqrtM.test_sqrtm_type_preservation_and_conversion.<locals>.<genexpr>5  r   r   r   Fr=   )r   rv   rw   r	   r   r   r   r   r   r   r   r   r4   r   r   r|   r    A_sqrtmra   s          r!   +test_sqrtm_type_preservation_and_conversionz5TestSqrtM.test_sqrtm_type_preservation_and_conversion'  sC    .Q!Q Q!Q Q!Q Q!Q Q!Q "N $$^4A<!<<<= u5A!!%0MGTGMM&&.AAB w7A!!%0MGTGMM&&*==> .66A!!%0MGTGMM&&*==>1"r#   c                    d}ddgddggddgddggg dg dg dgfD ]  }t         j                  j                  |      }t        t	        d |D                     t        j                  |t        	      }t        |d
      \  }}t        |j                  j                  |v        t        j                  |t        	      }t        |d
      \  }}t        |j                  j                  |v         y )Nr   r;   r   r   r   r;   r   r   r   r;   r;   r   r   c              3   V   K   | ]!  }|j                   xs |j                  d k   # ywr   r   r   s     r!   r   zVTestSqrtM.test_sqrtm_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>O  %     8a,!&&1*,ar   r   Fr=   )r   rv   rw   r	   r   r   r   r   r   r   r   r   r   s          r!   9test_sqrtm_type_conversion_mixed_sign_or_complex_spectrumzCTestSqrtM.test_sqrtm_type_conversion_mixed_sign_or_complex_spectrumF  s    -Q!R!Q!Q Iy13N $$^4AC8a889 w7A!!%0MGTGMM&&*==> u5A!!%0MGTGMM&&*==>#3r#   c                    t         j                  j                  d       t        dd      D ]  }t         j                  j	                  ||      dt         j                  j                  ||      z  z   }t        |d|      \  }}t        |t         j                  j                  |d             t        dd      D ]  }t        |d|      \  }}t        ||       !  y )	Nrk   r;      r   Fr   r   
   )
r   rq   rr   rs   randrt   r   r   rv   matrix_power)r4   rx   r    A_sqrtm_defaultra   r   A_sqrtm_news          r!   test_blocksizeszTestSqrtM.test_blocksizes[  s    
		tq!A		q!$r"))//!Q*?'??A$)!%1$E!OTAryy55oqIJ"1b\	$)!%9$M!T= *	 r#   c                     t               }t        |d      \  }}|j                  |      }t        ||d       t        t	        j
                  |      t	        j
                  |             y )NFr=   re   r^   )r"   r   r   r   r   tril)r4   r    r   ra   rb   s        r!   %test_al_mohy_higham_2012_experiment_1z/TestSqrtM.test_al_mohy_higham_2012_experiment_1f  sO    13ae,{{7+ad3-rwwqz:r#   c                     t         t        fD ]a  }t        j                  g dg dg dg dg|      }t	        |d      \  }}t        t        j                  |      j                                c y )N)r   r   r   r   )r   r   r   r   )r   r   r   r   r   r   r   r   r   Fr=   )r   r   r   r   r   r	   isnanall)r4   r   r    r   ra   s        r!   test_strict_upper_triangularz&TestSqrtM.test_strict_upper_triangularn  s`    u*B	 &(	)A
 "!%0MGTBHHW%))+, r#   c                 T   t         t        fD ]  }t        j                  g dg dg dg|      }t        j                  g dg dg dg|      }t	        ||j                  |             t        |d      \  }}t        t        j                  |      j                                 y )Nr   r   r   r   r   r   Fr=   )
r   r   r   r   r   r   r   r	   r  r  )r4   r   r    r   B_sqrtmra   s         r!   test_weird_matrixzTestSqrtM.test_weird_matrixy  s    u*B #%&A  #%&A q!%%(+ "!%0MGTBHHW%))+, r#   c                     t         j                  j                  d       t         j                  j                  dd      }t	        |d      }t        |j                  |      |       y )Nrk   r   Tr=   )r   rq   rr   r   r   r   r   )r4   r    r   s      r!   	test_dispzTestSqrtM.test_disp  sD    
		tIINN1a !$a!$r#   c                     ddgddgg}ddgddgg}t        t        j                  ||      |d	       t        t        |      |d	       y )
N               @rn   r                       ?      ?r         ?      r\   r   )r   r   r   r   r4   r{   Rs      r!   r   z0TestSqrtM.test_opposite_sign_complex_eigenvalues  sL    !Wq#hAYD	"q!ae4a!%0r#   c                 J   t        j                  g dg dg dg dg      }t        j                  t        d      ddt        d      gg dg dt        d      ddt        d      gg      }t        t        j                  ||      |d       t        t        |      |d       y )N)r;   r   r   r;   r  r   r   r\   r   )r   r   r   r   r   r   r  s      r!   test_gh4866zTestSqrtM.test_gh4866  s    HHl"""$ % HHtCy!QS	2""Cy!QS	24 5 	q!ae4a!%0r#   c                     t        j                  g d      }t        j                  t        d      ddg      }t        t        j                  ||      |d       t        t        |      |d       y )N)r   r;   r   r   r;   r   r\   r   )r   diagr   r   r   r   r  s      r!   test_gh5336zTestSqrtM.test_gh5336  sN    GGIGGT!WaO$q!ae4a!%0r#   c                     t        j                  d      }t        j                  d      }t        t        j                  ||      |d       t        t	        |      |d       y )N)r   r   r\   r   )r   zerosr   r   r   r  s      r!   test_gh7839zTestSqrtM.test_gh7839  sD    HHVHHVq!ae4a!%0r#   zfailing on macOS after gh-20212r   c                     t        j                  d      }|j                  d       t        j                  |d       t        j                  t        |            sJ y )N)   r  gGz?r;   )r   r   fillfill_diagonal	isrealobjr   r4   r{   s     r!   test_gh17918zTestSqrtM.test_gh17918  sA    HHX	t
A||E!H%%%r#   c                 l   t        j                  dt         j                        }t        |      j                  t         j
                  k(  sJ t        j                  dt         j                        }t        |      j                  t         j
                  k(  sJ t        j                  dt         j                        }t        |      j                  t         j                  k(  sJ t        j                  dt         j                        }t        |      j                  t         j                  k(  sJ y Nr   r   r   )r   r  uint8r   r   float16uint16uint32r   uint64float64r  s     r!   -test_data_size_preservation_uint_in_float_outz7TestSqrtM.test_data_size_preservation_uint_in_float_out  s    HHXRXX.Qx~~+++HHXRYY/Qx~~+++HHXRYY/Qx~~+++HHXRYY/Qx~~+++r#   c                 l   t        j                  dt         j                        }t        |      j                  t         j
                  k(  sJ t        j                  dt         j                        }t        |      j                  t         j
                  k(  sJ t        j                  dt         j                        }t        |      j                  t         j                  k(  sJ t        j                  dt         j                        }t        |      j                  t         j                  k(  sJ y r"  )r   r  int8r   r   r%  int16int32r   int64r)  r  s     r!   ,test_data_size_preservation_int_in_float_outz6TestSqrtM.test_data_size_preservation_int_in_float_out  s    HHXRWW-Qx~~+++HHXRXX.Qx~~+++HHXRXX.Qx~~+++HHXRXX.Qx~~+++r#   c                    t        j                  ddgddggt         j                        }t        |      j                  t         j
                  k(  sJ t        j                  ddgddggt         j                        }t        |      j                  t         j
                  k(  sJ t        j                  ddgddggt         j                        }t        |      j                  t         j
                  k(  sJ t        j                  ddgddggt         j                        }t        |      j                  t         j                  k(  sJ y )Nr   rn   r   r   )
r   r   r,  r   r   r   r-  r.  r/  
complex128r  s     r!   +test_data_size_preservation_int_in_comp_outz5TestSqrtM.test_data_size_preservation_int_in_comp_out  s    HHq!fq"g&bgg6Qx~~---HHq!fq"g&bhh7Qx~~---HHq!fq"g&bhh7Qx~~---HHq!fq"g&bhh7Qx~~...r#   c                    t        j                  dt         j                        }t        |      j                  t         j                  k(  sJ t        j                  dt         j
                        }t        |      j                  t         j
                  k(  sJ t        j                  dt         j                        }t        |      j                  t         j                  k(  sJ t        t         d      rNt        j                  dt         j                        }t        |      j                  t         j                  k(  sJ y y )Nr#  r   float128)	r   r  r%  r   r   r   r)  hasattrr6  r  s     r!   .test_data_size_preservation_float_in_float_outz8TestSqrtM.test_data_size_preservation_float_in_float_out  s    HHXRZZ0Qx~~+++HHXRZZ0Qx~~+++HHXRZZ0Qx~~+++2z"5A8>>R[[000 #r#   c                    t        j                  ddgddggt         j                        }t        |      j                  t         j
                  k(  sJ t        j                  ddgddggt         j                        }t        |      j                  t         j
                  k(  sJ t        j                  ddgddggt         j                        }t        |      j                  t         j                  k(  sJ t        t         d      ret        t         d      rTt        j                  ddgddggt         j                        }t        |      j                  t         j                  k(  sJ y y y )Nr   rn   r   r2  r   r6  
complex256)r   r   r%  r   r   r   r   r)  r3  r7  r6  r:  r  s     r!   -test_data_size_preservation_float_in_comp_outz7TestSqrtM.test_data_size_preservation_float_in_comp_out  s
   HHq!fq"g&bjj9Qx~~---HHq!fq"g&bjj9Qx~~---HHq!fq"g&bjj9Qx~~...2z"wr<'@1a&1b'*"++>A8>>R]]222 (A"r#   c                    t        j                  ddgddggt         j                        }t        |      j                  t         j
                  k(  sJ t        t         d      rt        j                  ddgddggt         j
                        }t        |      j                  t         j                  k(  sJ t        j                  ddgddggt         j                        }t        |      j                  t         j                  k(  sJ y y )Nr  rn   r   r  r   r:  )r   r   r   r   r   r3  r7  r:  r  s     r!   ,test_data_size_preservation_comp_in_comp_outz6TestSqrtM.test_data_size_preservation_comp_in_comp_out  s    HHr1g3x(=Qx~~...2|$2q'As8,BMMBA8>>R]]2222q'As8,BMMBA8>>R]]222	 %r#   r   c                     t        j                  d|      }t        |      }t        j                  d|      }t        |      }|j                  dk(  sJ |j
                  |j
                  k(  sJ y r   )r   r   r   r   r   r   )r4   r   r5   sr   s0s         r!   r   zTestSqrtM.test_empty  s\    HHV2&!HVVAR 2Yww&   ww"(("""r#   N)#rR   rS   rT   r   r   r   r   r   r   r   r  r  r
  r   r  r  r  r   r   r   r   r*  r0  r4  r8  r;  r=  r   r   r   r   r   r   r   r   rU   r#   r!   r   r      s    772*?>?*	>;	--"%1
111 [[?@& A&	,	,
/	1
33 [[TC

GR\\#RS# T#r#   r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ej                  j                  d	
      d        Zd Zy)TestFractionalMatrixPowerc                    t         j                  j                  d       t        dd      D ]  }t        dd      D ]  }t         j                  j	                  ||      dt         j                  j	                  ||      z  z   }t        j
                  ddd      D ]B  }||z  }t        |d|z        }t         j                  j                  ||      }t        ||       D   y )Nrk   r;   r   r   rm   rn   ro   
r   rq   rr   rs   rt   ru   r   rv   r   r   r4   prx   ry   rz   r{   M_rootr   s           r!   r   z8TestFractionalMatrixPower.test_round_trip_random_complex  s    
		tq!A1a[YY__Q2R"))//!Q:O5OO
[[Q2E"U*A4Q!<F#%99#9#9&!#DL#L!4	 3 ! r#   c                 ~   t         j                  j                  d       t        dd      D ]  }t        dd      D ]~  }t         j                  j	                  ||      }t        j
                  ddd      D ]B  }||z  }t        |d|z        }t         j                  j                  ||      }t        ||       D   y )Nrk   r;   r   rm   rn   ro   rD  rE  s           r!   r   z6TestFractionalMatrixPower.test_round_trip_random_float  s    
 			tq!A1a[YY__Q2
[[Q2E"U*A4Q!<F#%99#9#9&!#DL#L!4	 3 ! r#   c                 J   t         j                  j                  d       dD ]  }t        d      D ]  }t         j                  j	                  ||      dt         j                  j	                  ||      z  z   }t        |d      }t         j                  j                  |d      }t        ||       t        |d      }t         j                  j                  |d      }t        ||       t        |d	      }t         j                  j                  |d
      }t        ||         y )Nrk   )r   r   r   r   r   皙?r   gigffffff@r  )	r   rq   rr   rs   rt   r   rv   r   r   )r4   rx   ir{   M_one_fifthr   r   r   s           r!   (test_larger_abs_fractional_matrix_powerszBTestFractionalMatrixPower.test_larger_abs_fractional_matrix_powers  s    
		tA2YIIOOAq)BA1F,FF5a=!yy55k1E<0+At4II**;<1%+As3II**;;1%  r#   c                 L   t         j                  j                  d       d}t        |      D ]  }t        j                  dd      }t         j                  j                         }t        j                  t        j                  dd            }t         j                  j                  ||      }t        j                  d      r&|dt         j                  j                  ||      z  z   }||z  }t        ||      }t        |d	      \  }}	t        ||z        }
t        ||
        y )
Nrk      r;   r   rm   )TFr   Fr=   )r   rq   rr   rs   	randrangert   expchoicer   r   r   r   )r4   nsamplesrK  rx   rF  matrix_scaler    A_powerr`   ra   A_power_expm_logms              r!   test_random_matrices_and_powersz9TestFractionalMatrixPower.test_random_matrices_and_powers0  s     			txA  A&A		!A 66&"2"22q"9:L		1%A}}]+RYY__Q222L A
 .a3G.LFD $VaZ 0G%67% !r#   c                    t               }t        |t        j                  d      \  }}t	        |d      \  }}t        j                  |d      }t        |d      }t        ||d       t        ||       t        ||       dD ]_  }t        ||      }t        |d|z        }t        ||d       t        t        j                  |d      t        j                  |d             a y )	NFr=   r   gdy=r   )r   g?r;   r   )
r"   r   r   r   r   r   _remainder_matrix_powerr   r   r   )	r4   r    A_funm_sqrtra   r   A_rem_powerrU  rF  rb   s	            r!   r   z?TestFractionalMatrixPower.test_al_mohy_higham_2012_experiment_1I  s    13 !BGG%8Tae,'??3G)!S1W59)- A-a3G27AaC@LL!$7BGGL!4bggamD	 r#   c                 l   t         j                  j                  d       t         j                  j                  d      dt         j                  j                  d      z  z   D ]P  }t	        d      D ]@  }t        j                  ||      }|t        j                  |       z  dz
  }t        ||       B R y )Nrk   r   r   r   r;   )	r   rq   rr   rt   rs   r   _briggs_helper_functionexp2r   )r4   r5   k
x_observed
x_expecteds        r!   test_briggs_helper_functionz5TestFractionalMatrixPower.test_briggs_helper_function]  s    
		t$rBIIOOB,?'??A1X.FFq!L
"''1"+-1

J7  @r#   c                    d}ddgddggddgddggddgddggddgddggfD ]  }t         j                  j                  |      }t        t	        d |D                      dD ]  }t        j                  |t              }t        ||      }t        |j                  j                  |v       t        j                  |t              }t        ||      }t        |j                  j                  |v        t        j                  |t               }t        ||      }t        |j                  j                  |v         ! y )	Nr   r;   r   r   r   c              3   V   K   | ]!  }|j                   xs |j                  d k   # ywr   r   r   s     r!   r   zRTestFractionalMatrixPower.test_type_preservation_and_conversion.<locals>.<genexpr>s  r   r   333333rJ  gffffff
@r   )r   rv   rw   r	   r   r   r   r   r   r   r   r   r4   r   r   r|   rF  r    rU  s          r!   %test_type_preservation_and_conversionz?TestFractionalMatrixPower.test_type_preservation_and_conversione  s3   
 .Q!Q Q!Q Q!Q Q!Q 	"N $$^4A<!<<<= , HH^591!Q7**2EEF HH^7;1!Q7**.AAB XXnE::1!Q7**.AAB ,"r#   c                    d}ddgddggddgddggg dg dg dgfD ]  }t         j                  j                  |      }t        t	        d |D                     d	D ]  }t        j                  |t        
      }t        ||      }t        |j                  j                  |v        t        j                  |t        
      }t        ||      }t        |j                  j                  |v          y )Nr   r;   r   r   r   r   r   c              3   V   K   | ]!  }|j                   xs |j                  d k   # ywr   r   r   s     r!   r   z`TestFractionalMatrixPower.test_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>  r   r   re  r   )r   rv   rw   r	   r   r   r   r   r   r   r   r   rh  s          r!   3test_type_conversion_mixed_sign_or_complex_spectrumzMTestFractionalMatrixPower.test_type_conversion_mixed_sign_or_complex_spectrum  s    -Q!R!Q!Q Iy13N $$^4AC8a889 , HH^7;1!Q7**.AAB HH^591!Q7**.AAB ,3r#   zToo unstable across LAPACKs.r   c                 z   ddgddggddgddggddgddggg dg dg dgfD ]  }t         t        fD ]  }t        j                  ||	      }d
D ]:  }t	        ||      }t        t        j                  |      j                                < dD ])  }t	        ||      }t	        |d|z        }t        ||       +   y )Nr   r;   r   r   rl   r  )r   r;   r;   )r   r   r;   r   )gffffffrg  rf  g)rJ  gzG?)	r   r   r   r   r   r	   r  r  r   )r4   r   newtyper    rF  rU  rb   s          r!   test_singularz'TestFractionalMatrixPower.test_singular  s     Q!Q Q!Q Q!Q Iz2	4N "7+HH^7;1A5a;GBHHW-1134 2 %A5a;G#:7AaC#HL#L!4 % ,4r#   c                     ddgddgg}ddgddgg}t        t        j                  ||      |d	       t        t        |d
      |d	       y )Nr  rn   r   r  r  r   r  r\   r   r   )r   r   r   r   r  s      r!   r   z@TestFractionalMatrixPower.test_opposite_sign_complex_eigenvalues  sP    !Wq#hAYD	"q!ae4/37Gr#   N)rR   rS   rT   r   r   rM  rW  r   rb  ri  rl  r   r   r   ro  r   rU   r#   r!   rB  rB    s[    	55&$82E(8!CFC2 [[<=5 >5&Hr#   rB  c                       e Zd Zd Zd Zej                  j                  dee	e
j                  ee
j                  g      d        Zd Zd Zd Zej                  j%                  d      d	        Zy
)TestExpMc                 \    t        ddgddgg      }t        t        |      ddgddgg       y )Nr:   r   r;   )r   r   r   r@   s     r!   	test_zerozTestExpM.test_zero  s2    Bq61Q%.!!$q'Aa5!A-8r#   c                 x    t        d      }t        |t        j                  t        j                  gg             y )Nr;   )r   r   r   r   r   )r4   elts     r!   test_single_eltzTestExpM.test_single_elt  s&    1gRXXvh/0r#   r   c                     t        j                  d|      }t        |      }|j                  dk(  sJ |j                  |j                  k(  sJ y )Nr   r   r   )r   r  r   sizer   )r4   r   r    results       r!   test_empty_matrix_inputz TestExpM.test_empty_matrix_input  sE     HHV2&a{{a||qww&&&r#   c                    t         j                  }t        ddgddgg      }|dz  dz   d|z  z  }|dz  dz
  |z  }t        t	        |      t        ||g|dz  |gg             t	        |j                  t         j                              j                  j                  dk(  sJ t	        |j                  t         j                              j                  j                  dk(  sJ y )Nr;   rn   r   r   f)
r   r   r   r   r   astyper   r   r   r   )r4   r   r5   aabbs        r!   test_2x2_inputzTestExpM.test_2x2_input  s    DDAq6Aq6"#dQh1dQh\QR2a4*'=!>?AHHR\\*+1166#===AHHRZZ()//44;;;r#   c                    t         j                  }t        j                  ddgddggddgddggddgddggddgddggddgddgggd	      }t        j                  |dz  dz   d
|z  z  |dz  dz
  |z  g|dz  dz
  dz  |z  |dz  dz   d
|z  z  ggdd|d
z  z  z  d|d
z  z  dz  z   d|d
z  z  dz  dd|d
z  z  z  z
  g|d
z  dz  dd|d
z  z  z  z
  dd|d
z  z  z  |d
z  dz  z   ggdd|z  z  |dz  dz  z   dd|z  z  d|dz  z  dz  z   gdd
|z  z  |dz  d
z  z   dd|z  z  d|dz  z  dz  z   ggdd|d
z  z  z  d|dz  z  dz  z   dd|d
z  z  z  d|dz  z  dz  z   gdd|d
z  z  z  d|dz  z  dz  z   dd|d
z  z  z  d|dz  z  dz  z   ggdd
|z  z  d|z  d
z  z   dd
|z  z  d|z  d
z  z   gdd
|z  z  d|z  d
z  z
  dd
|z  z  d|z  d
z  z
  ggg      }t        t	        |      |       y )Nr;   rn   r   r   r   rm   r   )orderr   rY   r   rl   )r   r   r   r   r   )r4   r   r5   a_ress       r!   test_nx2x2_inputzTestExpM.test_nx2x2_input  s   DDHH1v1v&1v2w'1v1v&1v1v&1vBx(	* 25	6 T!VacNQT!VQJ7T!VQJqL1a46AaC.9;qAvJ!Q$z1AadFA:a1a4j3HIqDF1a1f:-q!AqD&z!Q$q&/@ACqsGAqDFNB!Ha1faZ,?@!HQT!VOQ!Wa1faZ-?@BqAvJ!Q$z12qAv;!Q$z3IJ!Q$K1a4
2AqAvJ!Q$z4IJL!Hac1W,b!A#h!Qw.>?qsGQqS!GOQ!Wac1W_=?  	Q'r#   c                 n    d}t        j                  ||f      }d|j                  _        t	        |       y )NrY   F)r   r   r   r   r   r   s      r!   r   zTestExpM.test_readonly  s+    GGQFO!Qr#   r   c                 T   t        j                  dt              }t         j                  j	                  d      }|j                  ddd      }|j                  ddd      }|j                  d      |||f<   t        j                  dt              }|j                         |d<   t        |      \  }}|dk(  sJ t        |      }t         j                  j                  t        |      |       t        d	      D ]-  }t        |      }	t         j                  j                  ||	       / y )
N)  r  r   d   r   i  i  )r   r  r  ro   r   )r   r  r   rq   default_rngintegersr   copyr   r   testingr   r   rs   )
r4   r    rngrK  jAmrZ   r?  	first_resnext_ress
             r!   test_gh18086zTestExpM.test_gh18086  s    HHZu-ii##C(LLC%LLC%**S/!Q$XXm511"2&1AvvG	


,,T)_a@qAAwHJJ00HE r#   N)rR   rS   rT   rt  rw  r   r   r   r   r   r   r   r   r   r{  r  r  r   	fail_slowr  rU   r#   r!   rr  rr    sy    91 [[TC

GR\\#RS' T'<(. [[1F Fr#   rr  c                       e Zd Zd Zd Zd Zd Zej                  j                  ej                  j                  d      d               Zy)	TestExpmFrechetc                    t        j                  g dg dg dg dgt              }t        j                  ddgdd	ggt              }t        j                  d
dgddggt              }t        j                  j                  |      }t        j                  j                  |      d ddd f   }i ddiddifD ]*  }t        ||fi |\  }}t        ||       t        ||       , y )Nr;   r   r   rn   r   rl   rY   r   r   r   r;   r   r   r   r   rl   r   r;   r   r   rl   r   rn   rY   r   methodSPSblockEnlarge)r   r   r   r   rv   r   r   r   )	r4   r{   r    r   expected_expmexpected_frechetkwargsobserved_expmobserved_frechets	            r!   test_expm_frechetz!TestExpmFrechet.test_expm_frechet
  s    HH	
  HHFF  HHFF  ))!, <<,,Q/AB7HU+h~-FGF.:1a.J6.J+M+M=9,.>? Hr#   c                    t        j                  g dg dg dg dgt              }t        j                  ddgdd	ggt              }t        j                  d
dgddggt              }t        j                  j                  |d      }g d}t        |d d |dd        }|D ]  \  }}t        j                  j                  j                  |   }	t        j                  j                  j                  |   }
d|	|
z   z  }||z  }||z  }||z  }||z  }t        j                  j                  |      }t        j                  j                  |      d ddd f   }t        ||      \  }}t        ||       t        ||        y )Nr  r  r  r  r   r;   r   r   rl   r   rn   rY   r   )r;   r   r   rY   ro            r   r   )r   r   r   r   rv   r   zip_expm_frechetell_table_61r   r   r   )r4   
M_original
A_original
E_originalA_original_norm_1selected_m_listm_neighbor_pairsmambell_aell_btarget_norm_1rz   r{   r    r   r  r  r  r  s                       r!   test_small_norm_expm_frechetz,TestExpmFrechet.test_small_norm_expm_frechet!  s   XX	
 
 XXFF 
 XXFF 
 "LL--j!<5s3_QR5HI&FBLL..;;B?ELL..;;B?E55=1M!$55E
"A
"A
"A!LL--a0M$||003BQBF;.:1a.@+M+M=9,.>? 'r#   c           	         t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j
                  f}d}t        |      D ]N  }t        j                  |      }t        j                  d      }t        j                  dd      } |||f      } |||f      }t        j                  j                  |d      }	||	z  }
|
|z  }|
|z  }t        j                  t        j                  ||g      t        j                  t        j                  |      |g      g      }t        j                  j!                  |      }t        j                  j!                  |      d ||d f   }t#        ||      \  }}t%        ||d       t%        ||d	       Q y )
Nr  r   r      ry  r;   gHj>r   gHz>)r   rq   uniformnormalstandard_cauchyexponentialrs   rR  expovariaterP  r   rv   r   vstackhstack
zeros_liker   r   r   )r4   rfuncsntestsrK  rfuncr  rx   r  r  r  rz   r    r   r{   r  r  r  r  s                     r!   	test_fuzzzTestExpmFrechet.test_fuzzB  sy    		!!		  		))		%%	'
 vAMM&)E"..s3M  B'AQqE*JQqE*J % 1 1*a @!$55E
"A
"A				1a&!		2==+Q/02 3A "LL--a0M$||003BQBF;.:1a.@+M+M=tD,.>TJ# r#   c                 <   t        j                  ddgddggt              }t        j                  ddgdd	ggt              }t        j                  j                  |d
       t        ||d      \  }}t        ||d      \  }}t        ||       t        ||       y )Ng]؉??gvP?g^?guÝ?r   gS,?g| @gJt?g~3?r;   r  r  r  )r   r   r   r   rv   r   r   r   )r4   r    r   sps_expmsps_frechetblockEnlarge_expmblockEnlarge_frechets          r!   test_problematic_matrixz'TestExpmFrechet.test_problematic_matrix]  s    HHZ(Z(   HHZ(Z(   	!Q ,1U!$+2>1^3-//"34%9:r#   zthis test is deliberately slowr   c                    d}t         j                  j                  ||f      }t         j                  j                  ||f      }t        ||d      \  }}t        ||d      \  }}t	        ||       t	        ||       y )Ni  r  r  r  r  )r   rq   r  r   r   )r4   rx   r    r   r  r  r  r  s           r!   test_medium_matrixz"TestExpmFrechet.test_medium_matrixo  s     II!!1v!.II!!1v!. ,1U!$+2>1^3-//"34%9:r#   N)rR   rS   rT   r  r  r  r  r   r   slowskipr  rU   r#   r!   r  r    sS    @.@BK6;$ [[[[=>
; ? 
;r#   r  c                     t        j                  || j                        }t        |      }||z  ||z  z  }t	        | |z         }t        ||z
        ||z  z  }	|	 S N)r   reshaper   r   r   )
r    A_normr   X_normepsrF  p_normperturbationX_primescaled_relative_errors
             r!   _help_expm_cond_searchr  ~  sa    


1aggA!WF7fvo.L1|#$G 1-#>!!!r#   c                     | t         j                  j                  |      t         j                  j                  |       z  z  S r  )r   rv   r   )r    r   s     r!   _normalized_liker    s0    !!!$u||'8'8';;<<r#   c                 \     | |      } | ||z         }t        ||z
        t        |      z  S r  )r   )r}  r    r  r   r  s        r!   _relative_errorr    s2    	!AL !G!tAw&&r#   c                   V    e Zd Zd Zd Zd Zej                  j                  d        Z	y)TestExpmConditionNumberc                     t         j                  j                  d       t        dd      D ]9  }t         j                  j	                  ||      }t        |      }t        d|       ; y )Nrk   r;   rn   r   )r   rq   rr   rs   rt   r   r
   )r4   rx   r    kappas       r!   test_expm_cond_smokez,TestExpmConditionNumber.test_expm_cond_smoke  sI    
		tq!A		1%AaLEa' r#   c                 t    t        j                  g dg dg dg dg      }t        |      }t        d|       y )N)g(gٙBgx@g  =g ZdB)r   gzNV7g@g  2p)r   r   gᙥT g?W[E@)r   r   r   gT!g yhG)r   r   r   r
   )r4   r    r  s      r!   test_expm_bad_condition_numberz6TestExpmConditionNumber.test_expm_bad_condition_number  s6    HHI</#	  !$&r#   c                 @   t         j                  j                  d       t        j                  ddd      D ]7  }t        j                  |gg      }t        t        |      t        |             9 t        j                  ddd      D ]7  }t        j                  |gg      }t        t        |      t        |             9 t        d      D ]M  }t         j                  j                  d	d	      }t        t        |      t        j                  |      d
          O y )N90  r  r   r  )numr2  r   r   r;   r   )r   rq   rr   linspacer   r   r   absru   rs   rt   r   )r4   xr    rK  s       r!   test_univariatez'TestExpmConditionNumber.test_univariate  s    
		uR+A1#AIaL#a&1 , R+A1#AIaL#a&1 , rA		1%AIaL"++a.*>? r#   c           	         t         j                  j                  d       d}d}t        |      D ]  }t         j                  j	                  dd      }t         j                  j                  ||      }t        j                  j                  |      }t        |      }t        j                  j                  |      }t        |      }	t        j                  t        |||||      }
t        j                  ||z        }t        |
|d      }|j                   } |
|      }|t#        t        j$                  ||j&                        |      z  }t)        t        ||      }t+        || |z         t        d      D ]p  }|t#        t        j                  j
                  |j&                   |      z  }t+        t        |      t        |             t)        t        ||      }t-        ||       r t-        |dd|z  z   |z  |	z          y )	Nr  re   r   r   r   zL-BFGS-Br  r;   )r   rq   rr   rs   randintrt   r   rv   r   r   r   	functoolspartialr  r   r   r  r  r  r   r  r   r
   )r4   r  rS  rK  rx   r    r  r   r  r  r}  guessoutxoptyoptp_bestp_best_relerrr  p_randp_rand_relerrs                       r!   test_expm_cond_fuzzz+TestExpmConditionNumber.test_expm_cond_fuzz  s   
		uxA		!!!Q'A		1%A\\&&q)FQA\\&&q)FaLE !!"8vq&#/AGGAaCLE1eJ7C55DT7D+BJJtQWW,EqIIF+D!V<MMD53;7 1X/		0I1MMVd6l; /a @!-?	  ma!C%i3->-FG? !r#   N)
rR   rS   rT   r  r  r  r   r   r  r  rU   r#   r!   r  r    s2    ('
@ [[#H #Hr#   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestKhatriRaoc           
      2   t        t        ddgddgg      t        ddgddgg            }t        |t        dd	gdd
gddgddgg             t        t        j                  ddg      t        j                  ddg            }t        |j
                  d       y )Nr;   r   r   rn   r   rl   rY   r      r  r            )rn   r   )r   r   r   r   r   r   r4   r5   bs      r!   
test_basiczTestKhatriRao.test_basic  s    uq!fq!f-.q!fq!f-.0 	1eaW&'W&("X&("X%/ 0 	1
 rxxA'1a&)9:177F+r#   c                     t        j                  t              5  t        g dg dg      }t        ddgddgg      }t	        ||       d d d        y # 1 sw Y   y xY w)Nr;   r   r   rn   r   rl   r;   r   r   rn   r   raises
ValueErrorr   r   r  s      r!   test_number_of_columns_equalityz-TestKhatriRao.test_number_of_columns_equality  sT    ]]:&y " #A1v1v  Aq! '&&s   /AAc                    t        j                  t              5  t        g d      }t        g d      }t	        ||       d d d        t        j                  t              5  t        g d      }t        g dg dg      }t	        ||       d d d        t        j                  t              5  t        g dg dg      }t        g d      }t	        ||       d d d        y # 1 sw Y   xY w# 1 sw Y   bxY w# 1 sw Y   y xY w)Nr	  r
  )rY   r   ro   r  r  s      r!   test_to_assure_2d_arrayz%TestKhatriRao.test_to_assure_2d_array  s    ]]:&i Ai Aq!	 ' ]]:&i A A q! ' ]]:& A i Aq! '& '& '& '&s#   'C""+C..+C:"C+.C7:Dc                 L   t        ddgddgg      }t        ddgddgg      }t        ||      }t        j                  t	        |j
                  d         D cg c]&  }t        j                  |d d |f   |d d |f         ( c}      j                  }t        ||       y c c}w )	Nr;   r   r   rn   r   rl   rY   r   )	r   r   r   r  rs   r   kronr   r   )r4   r5   r  res1r_  res2s         r!   test_equality_of_two_equationsz,TestKhatriRao.test_equality_of_two_equations  s    Aq6Aq6"#Aq6Aq6"#!Qyy#(#46#4a ''!AqD'1QT73#46 778q 	 	4&6s   +B!c                 X   t        j                  d      }t        j                  d      }t        ||      }t        |t        j                  d             t        j                  d      }t        j                  d      }t        ||      }t        |t        j                  d             y )N)r   r   )r   r   )r   r   )r   r   )r  r   )r   r   r   r   )r4   r5   r  ress       r!   r   zTestKhatriRao.test_empty  sx    HHVHHVARXXf-.HHVHHVARXXg./r#   N)rR   rS   rT   r  r  r  r  r   rU   r#   r!   r  r    s    
,2'	0r#   r  )/__doc__rq   r  numpyr   r   r   r   r   numpy.testingr   r   r	   r
   r   r   r   scipy.linalgr   r   r   r   r   r   r   r   r   r   r   r   scipy.linalg._matfuncsr   scipy.linalg._expm_frechetscipy.optimizer   r"   r%   rW   r   rB  rr  r  r  r  r  r  r  rU   r#   r!   <module>r     s       , ,P P  K K K * 6 ! #*' 'V`+ `+FC# C#LvH vHrIF IFXs; s;l"='BH BHJB0 B0r#   