U
    Hvf|                    @   sJ  d dl Z d dlmZ d dlmZmZmZmZmZm	Z	 d dl
Z
d dl
mZ d dlZd dlmZmZmZmZmZmZmZmZ d dlmZmZmZ d dlmZ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+m,Z, d dl-m.Z/ zd d
lm0Z1 W n e2k
r   dZ1Y nX d dl(m3Z3 d dl4m5Z5 ej6ej7gZ8ej9ej:gZ;e8e; Z<dd Z=dd Z>G dd dZ?G dd dZ@G dd dZAe
jBCde<e
jBCddddgdd ZDG dd dZEG d d! d!ZFG d"d# d#ZGG d$d% d%ZHd&d' ZId(d) ZJd*d+ ZKd,d- ZLG d.d/ d/ZMG d0d1 d1ZNd2d3 ZOd4d5 ZPd6d7 ZQd8d9 ZRd:d; ZSd<d= ZTd>d? ZUd@dA ZVdBdC ZWdDdE ZXdFdG ZYdHdI ZZdJdK Z[dLdM Z\G dNdO dOZ]dPdQ Z^dRdS Z_dTdU Z`dVdW Zae
jBjbdXdYdZd[d\ Zcd]d^ Zde
jBCd_d`dage
jBCde8e
jBCdbeedce
jBCddeedee
jBCdfeedee
jBCdgd dhge
jBCdid dhgddjdkZfe
jBCde8dldm Zge
jBCdndbdoidddoidfdoidgdoidpdoididoifdqdr Zhe
jBCdseidtdudvdwgdxdydzd{gd|d}d~dgddddgddddgddddggeiddddgeiddddgddddgddddgddddgddddgddddggeiddddgddddgddddgddddggfgdd Zje
jBCde<dd Zke
jBCdeiddddgeidddddgeiddddgeiddddgeidddddgeidddgeidddeddgeiddgddgddgddgddggeiddgddgddgddgddhggf	eiddddgeidddddgeiddddgeiddddgeidddddgeidddgeidddeddgeiddgddgddgddgddggeiddgddgddgddgddggf	gdd Zle
jBCde<e
jBCddddgdd Zme
jBCdene8e8 e<d d Zoe
jBCdene8e8 e<dd Zpe
jBCdene8e8 e<dd Zqe
jBCdeideddd	dgeiddːd
dgeidedod	ddhgeidԐdddgeidcdgdodegddogddgdʐdggeiddgddgdhdgddcgddggfeiddddgeidddgeiddodhdegeiddސdgeiddgddgddgddggeidߐdgddgddgddggfgd d! Zrd"d# Zse
jBCd$ene<e8e8 e
jBCd%eedЃd&d' Zte
jBCd$ene<e8e8 e
jBCd%eedЃd(d) Zue
jBCd$ene<e8e8 e
jBCd%eedЃd*d+ Zve
jBCd$ene<e8e8 e
jBCd%eedЃd,d- Zwe
jBCd.deid/d0d1dgeid2d3d4geid5d6d7d8geid9d:d;d<gd=d>d?d@gdAdBdCdDgdEdFdGdHggfgdIdJ Zxe
jBCde<e
jBCdKddLdMgdNdO ZydPdQ Zze
jBCdRdSdTdUdVge
jBCdWdXdYgdZd[ Z{e
jBCdRd\d]ge
jBCdWdXdYgd^d_ Z|e
jBCd`e<e
jBCdadhddbdcgddde Z}e
jBCd`e<dfdg Z~e
jBCde<e
jBCdhdidXge
jBCdjdkdlgdmdn Ze
jBCde<e
jBCdhd dhge
jBCdjdkdlgdodp Ze
jBCde<d e
jBCdhdidXge
jBCdjdkdlgdqdr Ze
jBCdseiddddgeidddddgeiddddgeiddgddgddgddgddggeiddgddgddgddgddhggfeiddddgeidddddgeiddddgeiddgddgddgddgddggeiddgddgddgddgddggfgdtdu Ze
jBCd$ene<e8e8 e
jBCdvdkdwdx fdldydx fgdzd{ Ze
jBCd$ene<e8e8 e
jBCdvdkd|dx fdld}dx fgd~d Ze
jBCd$ene<e8e8 e
jBCdvdkddx fdlddx fgdd Ze
jBCdeideddd	dgeiddːd
dgeidcdgdodegddogddgdʐdggeiddgddgdhdgddcgddggfeiddddgeidddgeiddgddgddgddggeidߐdgddgddgddggfgdd Ze
jBCddidXge
jBCde<dd Ze
jBCde<dd Ze
jBCdeiddddgddddgddddgddddggeiddddgddddgddddgddddggddhfeiddddgddddgddddgddddggeiddddgddddgddddgddddggdhdefgdd Ze
jBCde<dd Ze
jBCde<dd Ze
jBCdeiddddgddddgddddgddddggeiddddgdĐdŐdƐdgdȐdɐdʐdgd̐d͐ddggeiddϐdАdgdҐdddgdԐdՐd֐dgddؐdِdggeidhd d dhgdېdfeidݐdސdߐdgddddgddddgddddggeiddddgddddgddddgddddggeiddddgddddgdd ddgddddggeidhd d dhgddfgd	d
 Ze
jBCde<dd ZdS (      N)reduce)assert_equalassert_array_almost_equalassert_assert_allcloseassert_almost_equalassert_array_equal)raises)eyeoneszeros
zeros_liketriutriltril_indicestriu_indices)randrandintseed)_flapacklapackinvsvdcholeskysolveldlnorm
block_diagqreigh)_compute_lwork)ortho_groupunitary_group)_clapack)get_lapack_funcs)get_blas_funcsc                 C   s<   |t kr*tjj|  tjj|  d  |S tjj|  |S )N              ?)COMPLEX_DTYPESnprandomr   astype)shapedtype r-   B/tmp/pip-unpacked-wheel-96ln3f52/scipy/linalg/tests/test_lapack.pygenerate_random_dtype_array)   s    
r/   c                  C   s   t jdkrtd tt j } tddddddd	g}t }tt D ](}|d
sF||krF|| krF|	| qF|g kst
ddS )z%Test that all entries are in the doc.Nzlapack.__doc__ is Noneabsolute_importclapackdivisionZfind_best_lapack_typeflapackprint_functionZ	HAS_ILP64_z2Name(s) missing from lapack.__doc__ or ignore_list)r   __doc__pytestskipsetsplitlistdir
startswithappendAssertionError)namesZignore_listmissingnamer-   r-   r.   test_lapack_documented1   s&    

     rC   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestFlapackSimplec           
      C   s   dddgdddgddd	gg}dd
d
dgdd
d
dgddd
d
gd
dd
d
gg}dD ]}t t|d d }|d krjqL||\}}}}}	t|	 t|	 t|| t||fd
t|d
 d f t|tt| ||ddd\}}}}}	t|	 t|	 qLd S )N                        	   r   ga2U0*3?gMb`?ZsdzcZgebal)Zpermutescale)	getattrr3   r   reprr   r   lenr(   r   )
selfaa1pfbalohiZpivscaleinfor-   r-   r.   
test_gebalD   s"    




zTestFlapackSimple.test_gebalc                 C   sb   dddgdddgddd	gg}d
D ]<}t t|d d }|d kr>q ||\}}}t| t| q d S )Nkf     "  dZgehrd)rO   r3   r   rP   )rR   rS   rU   rV   ZhttaurZ   r-   r-   r.   
test_gehrdY   s    zTestFlapackSimple.test_gehrdc                 C   s\  t ddgddgg}t ddgddgg}t dd	gd
dgg}d}dD ]
}||||||  }}}td|f\}	| r|d  d7  < d}|	|||\}
}}tt ||
t |
| ||  |	|||||d\}
}}tt | j|
t |
| j || dd |	|||dd\}
}}tt ||
t |
| || dd qJd S )NrE   rF   r   rH   rI   rJ   rL   rM   
         TfdFD)trsylr&   C)ZtranaZtranbdecimal)Zisgn)	r(   arrayr*   r$   isupperr   dot	conjugaterk   )rR   rS   bctransr,   rT   b1Zc1rm   xrN   rZ   r-   r-   r.   
test_trsyld   s2    
""  zTestFlapackSimple.test_trsylc           	      C   s$  t dddgdddgddd	gg}d
D ]}dD ]}||}| rT|d  d7  < td|f\}|||}|dkr|dkrd}nd}t t t t |}t	||| q.|dkrt 
t |}nH|dkrt 
t jt |dd}n$|dkrt 
t jt |dd}t|| q.q&d S )Nr\   r]   r^   r_   r`   ra   rb   rc   rd   rl   ZMm1OoIiFfEer   r   r&   )langeZFfEeZFfrG   rK   ZMmZ1Oor   ZaxisZIirE   )r(   rr   r*   rs   r$   sqrtsumZsquareabsr   maxr   )	rR   rS   r,   Znorm_strrT   r}   valuerp   refr-   r-   r.   
test_lange   s2    


zTestFlapackSimple.test_langeN)__name__
__module____qualname__r[   rg   r{   r   r-   r-   r-   r.   rD   B   s   rD   c                   @   s   e Zd Zdd Zdd ZdS )
TestLapackc                 C   s   t tdr
d S NZempty_module)hasattrr3   rR   r-   r-   r.   test_flapack   s    
zTestLapack.test_flapackc                 C   s   t tdr
d S r   )r   r1   r   r-   r-   r.   test_clapack   s    
zTestLapack.test_clapackN)r   r   r   r   r   r-   r-   r-   r.   r      s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestLeastSquaresSolversc                 C   s~  t d ttD ]\}}d}d}d}t|||}t||}td|d\}}	t|	|||}
||||
d\}}}t|dk |||d	| |
d
\}}}t|dk qtD ]}t	j
ddgddgddgg|d}t	j
dddg|d}td||f\}}}|j\}}t|jdkr|jd }nd}t||||}
||||
d\}}}t|d d t	j
ddg|ddt	|j d ||\}}}}t|| qtD ]}t	j
ddgddgddgg|d}t	j
dd d!g|d}td||f\}}}|j\}}t|jdkr|jd }nd}t||||}
||||
d\}}}t|d d t	j
d"d#g|ddt	|j d ||\}}}}t|| qd S )$N  rh      rE   )gels
gels_lworkr,   lworkr   ZTTCCrx   r         ?       @      @      @      @       @      0@      1@      4@)r   r   geqrfrF   rq   祪,-@   rtol      ?      @      @      ?      @            @              @ffffff?      1@       @      4@      R ?\j,? W?)r   	enumerateDTYPESr   r*   r$   r    r   REAL_DTYPESr(   rr   r+   rQ   r   finfoepsr   r'   )rR   indr,   mnnrhsrT   ry   ZglsZglslwr   r5   rZ   r   r   r   Zlqrrz   Z	lqr_truthr-   r-   r.   	test_gels   s    
 


 

z!TestLeastSquaresSolvers.test_gelsc              
   C   s<  t D ]}tjddgddgddgg|d}tjdd	d
g|d}td||f\}}|j\}}t|jdkrt|jd }nd}||||d\}	}
}tt|	}|
}|||||ddd\}}}}t|d d tjddg|ddt	|j
 d t|tjddg|ddt	|j
 d qtD ]}tjddgddgddgg|d}tjdddg|d}td||f\}}|j\}}t|jdkr|jd }nd}||||d\}	}}
}tt|	}t|}|
}||||||ddd\}}}}t|d d tjddg|ddt	|j
 d t|tjdd g|ddt	|j
 d qd S )!Nr   r   r   r   r   r   r   r   r   r   )gelsdgelsd_lworkrF   rE   rq   Fr   r   r   r   YN))1)@*@.?r   r   r   r   r   r   r   r   r   U.*@_Y@r   r(   rr   r$   r+   rQ   intrealr   r   r   r'   )rR   r,   rT   ry   r   r   r   r   r   workiworkrZ   r   Z
iwork_sizerz   srankZrworkZ
rwork_sizer-   r-   r.   
test_gelsd   s    



  



  
z"TestLeastSquaresSolvers.test_gelsdc                 C   s(  t D ]}tjddgddgddgg|d}tjdd	d
g|d}td||f\}}|j\}}t|jdkrt|jd }nd}||||d\}	}
tt|	}|||d|dd\}}}}}	}
t|d d tjddg|ddt	|j
 d t|tjddg|ddt	|j
 d qtD ]}tjddgddgddgg|d}tjdddg|d}td||f\}}|j\}}t|jdkr|jd }nd}||||d\}	}
tt|	}|||d|dd\}}}}}	}
t|d d tjddg|ddt	|j
 d t|tjdd g|ddt	|j
 d qd S )!Nr   r   r   r   r   r   r   r   r   r   )gelssgelss_lworkrF   rE   rq   Fr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rR   r,   rT   ry   r   r   r   r   r   r   rZ   r   vrz   r   r   r-   r-   r.   
test_gelss1  s    







z"TestLeastSquaresSolvers.test_gelssc              	   C   s4  t D ]}tjddgddgddgg|d}tjdd	d
g|d}td||f\}}|j\}}t|jdkrt|jd }nd}||||dt|j \}	}
tt	|	}tj
|jd dftjd}||||t|j|dd\}}}}}
t|d d tjddg|ddt|j d qtD ]}tjddgddgddgg|d}tjdddg|d}td||f\}}|j\}}t|jdkr|jd }nd}||||dt|j \}	}
tt	|	}tj
|jd dftjd}||||t|j|dd\}}}}}
t|d d tjddg|ddt|j d qd S )Nr   r   r   r   r   r   r   r   r   r   )gelsyr   rF   rE   rh   Frq   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r(   rr   r$   r+   rQ   r   r   r   r   r   Zint32r   r'   )rR   r,   rT   ry   r   Zgelsy_lworkr   r   r   r   rZ   r   Zjptvr   rz   jr   r-   r-   r.   
test_gelsyj  sz    


  


  z"TestLeastSquaresSolvers.test_gelsyN)r   r   r   r   r   r   r   r-   r-   r-   r.   r      s   D<9r   r,   r+   rG   rH   )rI   rF   )   r   c                 C   s2   t d| d}|\}}|||d\}}t|d d S )Ngeqrf_lworkr   r   r   r   r$   r   )r,   r+   r   r   r   r   rZ   r-   r-   r.   test_geqrf_lwork  s    r   c                   @   s   e Zd Zdd ZdS )TestRegressionc           
      C   s   t D ]}tjd|d}tdg|g\}tt||dd ||\}}}}|tkrtdg|g\}tt||dd  |dd ||dd  |dd q|tkrtd	g|g\}	tt|	|dd  |dd |	|dd  |dd qd S )
N)i,  rF   r   gerqfrF   r   orgrqrE   ungrq)r   r(   r   r$   assert_raises	Exceptionr   r'   )
rR   r,   rS   r   Zrqrf   r   rZ   r   r   r-   r-   r.   test_ticket_1645  s    zTestRegression.test_ticket_1645N)r   r   r   r   r-   r-   r-   r.   r     s   r   c                   @   s   e Zd Zdd ZdS )	TestDpotrc           
      C   s   dD ]}dD ]}t jd t jjdd}||j}td|f\}}||||d\}}|||d }	|rtt |	t t	| qtt 
|	t 
t	| qqd S )N)TF*   )rG   rG   )size)potrfZpotri)cleanr   )r(   r)   r   normalrt   rk   r$   r   r   r   r   )
rR   lowerr   rz   rS   ZdpotrfZdpotrirw   rZ   Zdptr-   r-   r.   test_gh_2691  s    zTestDpotr.test_gh_2691N)r   r   r   r   r-   r-   r-   r.   r     s   r   c                   @   s   e Zd Zdd ZdS )
TestDlasd4c              
   C   st  t ddddg}t ddddg}t t t |dd	 t d
t|d
 ff|d d t jf f}t|ddddd}t|}t 	|d d d	 |d |t
|  gf}t 	|d d d	 df}td|f}g }	td|D ]4}
||
||}|	|d
  t|d dkd|
  qt |	d d d	 }	tt t |	 df t||	dt t jj dt t jj d d S )Nr         @r   r   g(\@g@g333333皙rq   rE   F)full_matrices
compute_uvoverwrite_aZcheck_finiter   lasd4rG   zcLAPACK root finding dlasd4 failed to find                                     the singular value %izThere are NaN rootsd   atolr   )r(   rr   hstackZvstackdiagr   rQ   Znewaxisr   concatenater   r$   ranger>   r   anyisnanr   r   float64r   )rR   ZsigmasZm_vecMZSMZit_lenZsgmZmvcr   rootsiresr-   r-   r.   test_sing_val_update  s4    
*zTestDlasd4.test_sing_val_updateN)r   r   r   r   r-   r-   r-   r.   r     s   r   c                   @   s   e Zd Zejdedd Zejddd eD ejddd	gejd
ddgdd Zejddddgdddgdddggdd Z	dd Z
ejdddgdd ZdS )	TestTbtrsr,   c                 C   sF  |t krxtjddddgddddgg|d	}tjd
dgddgddgddgg|d	}tjddgddgddgddgg|d	}n|tkrtjddddgddddgdd ddgg|d	}tjd!d"gd#d$gd%d&gd'd(gg|d	}tjd)d*gd+d,gd-d.gd/d0gg|d	}ntd1| d2td3|d	}|||d4d5\}}t|d t||dd6d7 d8S )9zTest real (f07vef) and complex (f07vsf) examples from NAG

        Examples available from:
        * https://www.nag.com/numeric/fl/nagdoc_latest/html/f07/f07vef.html
        * https://www.nag.com/numeric/fl/nagdoc_latest/html/f07/f07vsf.html

        gp=
ףgQ@gHzG@g{Gz?g      gq=
ףp@gHzGr   r   gp=
ף0g(\+gףp=
0g333333*@g(\gHzG,gQ#rH   rE   rq   rG   rF   r   y
ףp=
Q@y{Gz@GzyQ?HzGy)\(??yQQ@yq=
ףpGz@yףp=
?{GzyQ?q=
ףp@y)\(zGyQ!
ףp=
yףp=
8Gzyp=
#/)\h7y\(LHzG @yQHz6@yףp=
3@(\=y{Gz-333333yQ+3@GzT5@y               @y      ?      @y      ?      y             yt&m=#yi6@Ug$B@y[a^C?b->y-@ji& *!z	Datatype z not understood.tbtrsLabrv   uploh㈵>r   r   N)r   r(   rr   r'   
ValueErrorr$   r   r   )rR   r,   r  rv   Zx_outr   rz   rZ   r-   r-   r.   test_nag_example_f07vef_f07vsf  s\    	







z(TestTbtrs.test_nag_example_f07vef_f07vsfzdtype,transc                 C   s.   g | ]&}d D ]}|dkr |t ks||fqqS ))Nrk   rn   rn   )r   ).0r,   rx   r-   r-   r.   
<listcomp>%  s      zTestTbtrs.<listcomp>r  Ur   r   r  c                    sz  t d d\}}td d}|dk}|| }	||	 }
t|	|
 d d}fdd	|D } fd
d	|D }|dkrtj d||	< tj||dd}t|d f }t|D ].\}}|	|||t
|dt| f< qt|f }||||||d\}}t|d |dkr.t|| |dd nH|dkrNt|j| |dd n(|dkrnt|j| |dd ntdd S )Ni  )rH   rG   rF   r   r   r
  rE   rq   c                    s   g | ]} t | qS r-   )r   r  rz   r   r-   r.   r	  9  s     z2TestTbtrs.test_random_matrices.<locals>.<listcomp>c                    s   g | ]}t |f qS r-   )r/   )r  widthr   r-   r.   r	  :  s   Zdia)formatr   )r  rv   r  rx   r   r  g-C6
?r   rk   rn   zInvalid trans argument)r   r$   r   r(   r   spsZdiagsr   r   Zdiagonalr   minr/   r   r   rk   Hr  )rR   r,   rx   r  r   r   Zkdr   Zis_upperZkuklZband_offsetsZband_widthsZbandsrS   r  rowkrv   rz   rZ   r-   )r,   r   r.   test_random_matrices$  s6    

(



zTestTbtrs.test_random_matriceszuplo,trans,diagZInvalidc                 C   s:   t dtjd}tdd}tdd}tt|||||| dS )z?Test if invalid values of uplo, trans and diag raise exceptionsr   r   rH   rF   N)r$   r(   r   r   r   r   )rR   r  rx   r   r   r  rv   r-   r-   r.   &test_invalid_argument_raises_exceptionW  s    

z0TestTbtrs.test_invalid_argument_raises_exceptionc                 C   sP   t jdtd}t jdtd}tdtd}d|d< |||dd\}}t|d d	S )
aH  Test if a matrix with a zero diagonal element is singular

        If the i-th diagonal of A is zero, ?tbtrs should return `i` in `info`
        indicating the provided matrix is singular.

        Note that ?tbtrs requires the matrix A to be stored in banded form.
        In this form the diagonal corresponds to the last row.r   r   rH   r   r   )rq   rG   r
  r   N)r(   r   floatr$   r   )rR   r  rv   r   r5   rZ   r-   r-   r.   test_zero_element_in_diagonald  s    z'TestTbtrs.test_zero_element_in_diagonalzldab,n,ldb,nrhs)rI   rI   r   rI   )rI   rI   rG   rI   c                 C   sB   t j||ftd}t j||ftd}tdtd}tt||| dS )z2Test ?tbtrs fails correctly if shapes are invalid.r   r   Nr(   r   r  r$   r   r   )rR   Zldabr   Zldbr   r  rv   r   r-   r-   r.   test_invalid_matrix_shapest  s    z$TestTbtrs.test_invalid_matrix_shapesN)r   r   r   r7   markparametrizer   r  r  r  r  r  r-   r-   r-   r.   r     s.   
--
	r   c                  C   s   dD ]} t d| d}td| }td| }t|r>|d9 }|||\}}}t|d t|d t|rt|d	 tt|tk tt|tk qt|d
 qd S )Nrl   lartgr   rG   rH   r&   333333?r   y       皙?)	r$   r(   rr   iscomplexobjr   r   typecomplexr  )r,   r  rV   gcsZsnrr-   r-   r.   
test_lartg  s    




r&  c            
      C   sB  dD ]6} d}d}t dd| }t dd| }dt | jd   }| dkr^td	| d
}d}n td	| d
}|d9 }|d9 }d}t|||||ddddgddddgg|d t|||||ddddddgdd||gg|d t|||||dddddddg||ddgg|d t|||||ddddddddg||ddgg|d t|||||ddddddddgd|d|gg|d t|||||dddddd	ddddg||d|gg|d t|||||ddddddddgd|d|gg|d |||||ddd\}}	t||k t|	|k t|ddddg|d t|	ddddg|d qd S )Nrl   r  r  rH   rG   rh   rE   fdrotr   y             r&   y              @rI   r   r   rF   r  )offxoffy)incxr+  r   )r*  incyr   )r*  r,  r+  r-  r   r   )r,  r-  r   )Zoverwrite_xZoverwrite_y)r(   fullr   Z	precisionr%   r$   r   r   )
r,   rw   r   ur   r   r(  rV   rS   rv   r-   r-   r.   test_rot  s`    


     r0  c               	   C   s  t jd t jd} | j| } t jddt jd  }|j |}dD ]b}tddg|d\}}|dkr| }n|  }||jd	 d
 |d |dd d	f \}}}t 	|d d d	f }	|d |	d	< ||	d
< t 	|d
d d	f }
d|
d	< ||
d
d < ||
|
 |d
d d d f t |jd
 |d
d d d f< ||
||d d d
d f t |jd	 dd|d d d
d f< t|d d d	f |	dd t|d	d d f |	dd qTd S )Nr   )rH   rH   r&   rl   larfglarfr   ZFDr   rE   rE   r   rF   r|   r   Rsider  r)  )r(   r)   r   rk   rt   conjr$   copyr+   r   ru   r   r   )Za0Za0jr,   r1  r2  rS   alpharz   rf   expectedr   r-   r-   r.   test_larfg_larf  s*    

,>>r;  c                  C   s>   t dtjdd} d}t| ||ddd}|dks:|dks:td S )	NZgesdd_lwork	preferredr,   Zilp64iA%  T)r   r   i`DiD)r$   r(   float32r    r?   )Zsgesdd_lworkr   r   r-   r-   r.    test_sgesdd_lwork_bug_workaround  s     r?  c                   @   sF   e Zd Zejdedd Zejdeejdddd ZdS )		TestSytrdr,   c                 C   s*   t jd|d}td|f}tt|| d S )Nr|   r   sytrdr(   r   r$   r   r  )rR   r,   ArA  r-   r-   r.   test_sytrd_with_zero_dim_array  s    z(TestSytrd.test_sytrd_with_zero_dim_arrayr   rE   rG   c                 C   s  t j||f|d}td|f\}}t jd||d  d d |d|t |< ||\}}t|d ||d|d\}}	}
}}t|d t||dt |j dd	 t|	t 	| t|
d
 t|d
 |||d\}}	}
}}t|d t j
||d}t |jd }|	|||f< t |jd d }|
||d |f< |
|||d f< t j|||d}t|d D ]h}t j||d}|d ||d f |d |< d||< t j|||d|| t ||  }t ||}q^t |d}|j| ||< t |jt ||}t||dt |j dd	 d S )Nr   )rA  sytrd_lworkrE   rF   r   r   r   rI   r   r           r   rq   )r(   r   r$   arangetriu_indices_fromr   r   r   r   r   r   r+   r
   r   outerrt   r   rk   )rR   r,   r   rC  rA  rF  r   rZ   datare   erf   rk   r  k2Qr   r   r  i_lowerZQTAQr-   r-   r.   
test_sytrd  s@    





$zTestSytrd.test_sytrdN)	r   r   r   r7   r  r  r   rD  rQ  r-   r-   r-   r.   r@    s
   
r@  c                   @   sL   e Zd Zejdedd Zejdee	eejdddd Z
d	S )
	TestHetrdcomplex_dtypec                 C   s*   t jd|d}td|f}tt|| d S )Nr|   r   hetrdrB  )rR   rS  rC  rT  r-   r-   r.   test_hetrd_with_zero_dim_arrayL  s    z(TestHetrd.test_hetrd_with_zero_dim_arrayzreal_dtype,complex_dtyper   rE  c              	   C   s  t j||f|d}td|f\}}t jd||d  d d |ddt jd||d  d d |d  |t |< t |t t | dD ]}|||d\}}	t|	d qt	||}
||d|
d	\}}}}}	t|	d t
||d
t |j dd t
|t t | t
|d t
|d |||
d\}}}}}	t|	d t j||d}t j|jd td}||||f< t j|jd d td}|||d |f< ||||d f< t j|||d}t|d D ]n}t j||d}|d ||d f |d |< d||< t j|||d|| t |t |  }t ||}qt |d}t |j| ||< t t |jt ||}t
||dt |j dd d S )Nr   )rT  hetrd_lworkrE   rF   r&   )r   rE   r   r   rG  rI   r   r   rH  r   rq   rh   )r(   r   r$   rI  rJ  Zfill_diagonalr   r   r   r    r   r   r   r   r+   r   r
   r   rK  r7  rt   r   rk   )rR   r   Z
real_dtyperS  rC  rT  rV  rz   r5   rZ   r   rL  re   rM  rf   rk   r  rN  rO  r   r   r  rP  ZQHAQr-   r-   r.   
test_hetrdS  sX    
"




   zTestHetrd.test_hetrdN)r   r   r   r7   r  r  r'   rU  zipr   rX  r-   r-   r-   r.   rR  K  s   
rR  c                  C   s  t tD ]\} }td|d\}}t|dddd}| dk rtjddd	d
gddddgddddgddddgddddgddddgg|d}tjddddd d!g|d}tjd"d"g|d}nvtd#d$d%d&gd'd(d)d*gd+d,d-d.gd/d0d1d2gd3d4d5d6gd7d8d9d:gg}td;gd<gd=gd>gd?gd@gg}tjd|d}tjdAd"dBd"gd"dAd"dBgg|d}||||||dC\}	}	}	}
}	| dk rtdDdEdDdEg}ntdFdGdHdIg}t|
|ddJ qd S )KN)ZgglseZgglse_lworkr   rJ   rH   rF   )r   r   rU   g=
ףp=g{Gzg(\ؿ      ?gzGgHzG?gףp=
ӿgQffffff@gQ?g?gffffffֿg{Gz?Qg{Gz?g333333?g333333?g
ףp=
g{Gz{Gz?gzG      ?g      gGz?gHzGgzGg=
ףp=?rH  yQ?QyQQ?yQ{Gz @y=
ףp=?y\(\￮Gz?y333333RQ?yQzG?yQQ?yףp=
?q=
ףpݿy)\(?{Gz?y)\(?(\ſy(\333333?yGz?RQ?yRQ?HzGy\(\
ףp=
׿y)\(?ɿy(\?RQ?y?{Gz?y(\ſq=
ףpݿyQ?q=
ףp?yHzG?Qѿy?QyQ뱿Gz?yp=
ף?p=
ף?yRQ
ףp=
?yffffff?GzyzG GzyQ?ffffff
@yp=
ף)\(@y(\ @Q?r         r   g^"L?g\}?y!f?$_Kdy^gŵ翸F@y!f?}dy61ŵe_@ro   )r   r   r$   r    r(   rr   r   r   )r   r,   func
func_lworkr   rS   rw   re   rv   r5   resultr:  r-   r-   r.   
test_gglse  s\    










"
rc  c                  C   s   t d ttt D ]\} }d}| dk rXtd|d}td|d\}}t|||}n:td|d}td|d\}}t||t||d	  |}|| j d
 d
t	j
||d  }t|d}t||}|||dd\}	}
}||	|
|dd\}}ttd| t	jj|dd | dk  qd S )Nr   rh   rH   sytrf_lworkr   )ZsyconsytrfZhetrf_lwork)ZheconZhetrfr&   rF   rE   )r   r   )rS   ipivanormr   rU   )r   r   r   r'   r$   r   r*   r7  rk   r(   r
   r   r    r   r   linalgcond)r   r,   r   ra  ZfunconZfunctrfrC  rg  r   ldurf  r5   rcondr-   r-   r.   test_sycon_hecon  s     $

rm  c                  C   s   t d ttD ]\} }d}td|d\}}}}t|||}||j d }t|||}||j d dtj||d  }|||\}	}
}t	|dk ||\}}t	|dk |||\}}t	|dk ||\}}
}t	|dk t
||	dd qd S )	Nr   rh   )r   sygstsyevdsygvdr   rF   r   -C6?r   )r   r   r   r$   r   r*   rk   r(   r
   r   r   )r   r,   r   r   rn  ro  rp  rC  Beig_gvdr5   rZ   rv   rS   eigr-   r-   r.   
test_sygst  s&     ru  c                  C   s,  t d ttD ]\} }d}td|d\}}}}t|||dt|||  }|| j d }t|||dt|||  }|| j d dtj	||d  }|||\}	}
}t
|dk ||\}}t
|dk |||\}}t
|dk ||\}}
}t
|dk t||	dd	 qd S )
Nr   rh   )r   hegstheevdhegvdr   r&   rF   r   rq  r   )r   r   r'   r$   r   r*   r7  rk   r(   r
   r   r   )r   r,   r   r   rv  rw  rx  rC  rr  rs  r5   rZ   rv   rS   rt  r-   r-   r.   
test_hegst  s&    $$$ry  c               	      sn  t d d\} }ttD ]N\}}td|d\}}t|| |}|dk r\tt| ||}n"tt| |t| |d  |}tt	||j
 |||d\}}	t|	dk t|d	d	d	| f tj| ||  f|df}
ttj| |d|d	d	| d	f ftj||d  fd
dt| D }ttj|}t|
|| t||ddt|dj dd qd	S )z
    This test performs an RZ decomposition in which an m x n upper trapezoidal
    array M (m <= n) is factorized as M = [R 0] * Z where R is upper triangular
    and Z is unitary.
    r   )rh      tzrzfZtzrzf_lworkr   rF   r&   r   r   Nc              
      sD   g | ]<} | |gd d f j |gd d f    qS Nrk   rt   r7  r  ZIdVrf   r-   r.   r	  @  s     ztest_tzrzf.<locals>.<listcomp>rh   r   rH  r   )r   r   r   r$   r    r   r   r*   r   r   rk   r   r(   r   r   r
   r   r   rt   r   r   spacingr   )r   r   r   r,   r|  tzrzf_lwr   rC  rzrZ   r4  r   Zr-   r  r.   
test_tzrzf$  s,    
"0( r  c               	   C   s  t d ttD ]\} }d}| dkrVtt||t||d  t| |}d}n tt||t| |}d}td|d\}}}||\}}	t|d	|}
|d
||
}t|t	| |
| d	 dkrdndd |d
||
|d}t|t	|
 j |
| d	 dkrdndd |d|t|t|f< |d
||
|dd}t|t	|
 j |
| d	 dkrhdndd td||}|d
|||ddd}t|t	| |j
 j| d	 dkrdndd qdS )z
    Test for solving a linear system with the coefficient matrix is a
    triangular array stored in Full Packed (RFP) format.
    r   r   rE   r&   rn   rk   )trttftfttrtfsmr   rF   rq   r   rH   rJ   ro   rx   r   r
  )rx   r   rG   r4  )rx   r   r6  N)r   r   r   r   r   r
   r*   r$   r   r   r7  rk   r(   rI  )r   r,   r   rC  rx   r  r  r  Afpr5   rr  solnZB2r-   r-   r.   	test_tfsmF  s>    *r  c               	      s  t d d\} }}ttD ]^\}}td|d\}}t|| |}|dk r~tt| ||}t|||}	td|d\}
}nPtt| |t| |d  |}t||t||d  |}	td|d\}
}t|||}|||d	\}}t	tj
| |d|d
d
| d
f ftj
||d  fddt| D }ttj|}|dk rVdnd}dt|dj }|
||	|d	\}}t|dk t|||	 t|	|dd |
||	||d\}}t|dk t|| j|	 t|	|dd |
||	d|d\}}t|dk t||	| t|	|dd |
||	d||d\}}t|dk t||	| j t|	|dd qd
S )a  
    This test performs a matrix multiplication with an arbitrary m x n matric C
    and a unitary matrix Q without explicitly forming the array. The array data
    is encoded in the rectangular part of A which is obtained from ?TZRZF. Q
    size is inferred by m, n, side keywords.
    r   )rh   rz  rz  r{  r   rF   )ZormrzZormrz_lworkr&   )ZunmrzZunmrz_lworkr   Nc              
      sD   g | ]<} | |gd d f j |gd d f    qS r}  r~  r  r  r-   r.   r	    s     z$test_ormrz_unmrz.<locals>.<listcomp>rk   rn   rh   r   r   rH  r   r   r4  )r6  r   )r6  rx   r   )r   r   r   r$   r    r   r   r*   r(   r   r
   r   r   rt   r  r   r   r   r   r7  rk   )ZqmqnZcnr   r,   r|  r  Zlwork_rzrC  rn   Zorun_mrzZorun_mrz_lwZ	lwork_mrzr  rZ   r   rO  rx   tolZcqr-   r  r.   test_ormrz_unmrzo  sT    

"
(r  c               	   C   s   t d ttD ]\} }d}| dkrJt||t||d  |}d}nt|||}d}td|d\}}||\}}t|d	k ||d
d\}	}t|d	k |||dd\}
}t|d	k |||d
d\}}t|d	k t|d |d f|d}t|dd|d df |ddddf< ||d d dddf  t|d|d d|d f 	 j
7  < t|d |d f|d}t|ddd|d f |ddddf< |d|d ddf  t||d d|d df 	 j
7  < t||jddd t|
|	 j
jddd t|	|jddd t||	 j
jddd |||\}}t|d	k |||	d
d\}}t|d	k |||
|dd\}}t|d	k ||||d
d\}}t|d	k t|t| t|t| t|t| t|t| qdS )z
    Test conversion routines between the Rectengular Full Packed (RFP) format
    and Standard Triangular Array (TR)
    r   r   rE   r&   rn   rk   )r  r  r   r   r   r  r
  )transrr  rF   Nrq   F)order)r   r   r   r   r*   r$   r   r   r   r7  rk   r   r   reshape)r   r,   r   A_fullr  r  r  ZA_tf_UrZ   ZA_tf_LZA_tf_U_TZA_tf_L_TZA_tf_U_mZA_tf_L_mA_tr_UA_tr_LZA_tr_U_TZA_tr_L_Tr-   r-   r.   test_tfttr_trttf  sV    ,F,Br  c                  C   st  t d ttD ]\\} }d}| dkrFt||t||d  |}nt|||}td|d\}}||\}}t|dk ||dd	\}}t|dk t|}	t||d  d
 |d}
t	|j
|	 |
dd< t|}	t||d  d
 |d}t|j
|	 |dd< t||
 t|| |||\}}t|dk |||dd	\}}t|dk t|t	| t|t| qdS )r  r   r   rE   r&   )trttptpttrr   r   r   r  rF   N)r   r   r   r   r*   r$   r   r   r   r   rk   r   r   r   )r   r,   r   r  r  r  ZA_tp_UrZ   ZA_tp_LindsZA_tp_U_mZA_tp_L_mr  r  r-   r-   r.   test_tpttr_trttp  s2     

r  c                  C   s   t d ttD ]\} }d}| dkr^t||t||d  |}|| j |t|  }n&t|||}||j |t|  }td|d\}}}||\}}|||\}	}t	|dk |||	\}
}t
|}t|
| qdS )	zk
    Test Cholesky factorization of a positive definite Rectengular Full
    Packed (RFP) format array
    r   r   rE   r&   )pftrfr  r  r   r   N)r   r   r   r   r*   r7  rk   r
   r$   r   r   r   )r   r,   r   rC  r  r  r  r  rZ   Z	Achol_rfpZA_chol_rr5   ZAcholr-   r-   r.   
test_pftrf  s"    r  c                  C   s
  t d ttD ]\} }d}| dkr^t||t||d  |}|| j |t|  }n&t|||}||j |t|  }td|d\}}}}||\}}	|||\}
}	|||
\}}	t	|	dk |||\}}t
|}t|t|| d dkrd	nd
d qdS )z
    Test Cholesky factorization of a positive definite Rectengular Full
    Packed (RFP) format array to find its inverse
    r   r   rE   r&   )pftrir  r  r  r   r   rF   rH   rJ   ro   N)r   r   r   r   r*   r7  rk   r
   r$   r   r   r   r   )r   r,   r   rC  r  r  r  r  r  rZ   
A_chol_rfpZ	A_inv_rfpZA_inv_rr5   ZAinvr-   r-   r.   
test_pftri'  s(    
r  c                  C   s`  t d ttD ]H\} }d}| dkr`t||t||d  |}|| j |t|  }n&t|||}||j |t|  }t|df|d}t|d df|d}t|d df|d}t	d|d\}}}	}
|	|\}}|||\}}||||\}}t
|d	k tt|||| ||||\}}t
|d	k tt|||| d d	krRd
ndd qdS )z
    Test Cholesky factorization of a positive definite Rectengular Full
    Packed (RFP) format array and solve a linear system
    r   r   rE   r&   rG   r   rF   )pftrsr  r  r  r   rH   rJ   ro   N)r   r   r   r   r*   r7  rk   r
   r   r$   r   r   r   r   r   )r   r,   r   rC  rr  ZBf1ZBf2r  r  r  r  r  rZ   r  r  r-   r-   r.   
test_pftrsG  s0    r  c                  C   s4  t d ttD ]\} }d}| dkr`t||t||d  |}|| j |t|  }n&t|||}||j |t|  }| dk rdnd}tdd	d
	|f|d\}}}||\}}	t
j|d|}
||dd|
d|}|||\}}	t|t|
|
 j d|  | d dkr&dndd qdS )zT
    Test for performing a symmetric rank-k operation for matrix in RFP format.
    r   r   rE   r&   rF   r   hr  r  z{}frkr   rq   r   rH   rJ   ro   N)r   r   r   r   r*   r7  rk   r
   r$   r  r(   r)   r   r   rt   )r   r,   r   rC  prefixr  r  Zshfrkr  r5   rn   ZAfp_outZA_outr-   r-   r.   test_sfrk_hfrkl  s*    
 r  c                  C   s  t d ttD ]\} }d}| dkr`tdd||ftdd||fd  |}|| j }n,tdd||f|}||j |t|  }dt	|dj
 }td	|d
\}}}t||dd}t|ddd\}	}
}t||dd}||d|d\}}}|||dd\}}}tt|dt|	|ddf d|dd t|ddd\}}
}||dd\}}}|||dd\}}}tt|dt||ddf d|dd qdS )zt
    Test for going back and forth between the returned format of he/sytrf to
    L and D factors/permutations.
    r   rh   rE   i   r&   r   r   )syconvre  rd  r   rW  F)r   Z	hermitianrG  rq   NrH  r   r   )r   r   r   r   r*   r7  rk   r
   r(   r  r   r$   r    r   r   r   r   )r   r,   r   rC  r  r  ZtrfZ	trf_lworklwr   Dpermrk  rf  rZ   rS   rM  r
  r-   r-   r.   test_syconv  s4    (r  c                   @   s    e Zd ZdZdd Zdd ZdS )TestBlockedQRzd
    Tests for the blocked QR factorization, namely through geqrt, gemqrt, tpqrt
    and tpmqr.
    c              
   C   s>  t d ttD ]&\}}d}|dkrFt||t||d  |}nt|||}dt|dj }td|d\}}|||\}}	}
|
d	kst	t
|d
tj||d }tj||d||	 |j   }t|}t|j | tj||d|dd t|| ||dd |dkr@t||t||d  |}d}nt|||}d}dD ]}d|fD ]}|||	|||d\}}
|
d	kst	||kr|j }n|}|dkr|| }n|| }t|||dd ||fdkrd|||	|\}}
|
d	kst	t|| qdqXtt|||	|dd tt|||	|dd qd S )Nr   r   rE   r&   r   r   )geqrtgemqrtr   r   rq   rH  r   rn   rk   r   r4  r  r6  rx   r   r   r  rC  r5  r  )r   r   r   r   r*   r(   r  r   r$   r?   r   r
   rk   r7  r   r   r   r   r   )rR   r   r,   r   rC  r  r  r  rS   trZ   r   rO  r4  rn   	transposer6  rx   rw   qZqC	c_defaultr-   r-   r.   test_geqrt_gemqrt  sN      




zTestBlockedQR.test_geqrt_gemqrtc                  C   s  t d ttD ]\}}d}|dkrdt||t||d  |}t||t||d  |}n t|||}t|||}dt|dj }td|d\}}d	|d
 |fD ]}	||	|||\}
}}}|d	kst	t
t|
dt|d t
t||	| d t||	| d  t||	| t||	|  }}ttj||d|f}tjd
| |d|| |j   }tt|
t|
f}t|j | tjd
| |d|dd t|| tt||f|dd |dkr2t||t||d  |}t||t||d  |}d}n$t|||}t|||}d}dD ]}d|fD ]}||	||||||d\}}}|d	kst	||kr|j }n|}|dkrtj||fd	d}tj||fd	d}|| }n,tj||fdd}tj||fdd}|| }t|||dd ||fdkrh||	||||\}}}|d	ksXt	t
|| t
|| qhqZtt||	||||dd tt||	||||dd qqd S )Nr   r   rE   r&   r   r   )tpqrttpmqrtr   r   rF   rq   rH  r   rn   rk   r  r  r  r   r~   r  rC  r5  r  )r   r   r   r   r*   r(   r  r   r$   r?   r   r   r   r   r
   rk   r7  r   r   r   r   ) rR   r   r,   r   rC  rr  r  r  r  lrS   rv   r  rZ   ZB_pentZb_pentr   rO  r4  rn   r  r  r6  rx   rw   re   r  ZcdZCDZqCDr  Z	d_defaultr-   r-   r.   test_tpqrt_tpmqrt  st     *"$  





zTestBlockedQR.test_tpqrt_tpmqrtN)r   r   r   r6   r  r  r-   r-   r-   r.   r    s   >r  c                  C   s  t d ttD ]\} }d}d}td|d}| dkrrt||| |dt||| |  }|| j }nt||| |}||j }||\}}}}	t|}
d|
|| d || d f< t	|	d d	t
t
jj }d	t
t
jj }| d
kr|n|}t||d  d d |d f |
 j|
 d|d ||dd\}}}}	t|}d||| d || d f< t	|	d d	t
t
jj }d	t
t
jj }| d
kr|n|}t||d  d d |d f || j d|d qd S )Nr   rh   rF   pstrfr   rE   r&   rH    r   rF   r  rW  r   r   r   r$   r   r*   r7  rk   r   r   r(   r   r>  r   r   r   r   )r   r,   r   r%  r  rC  rw   pivr_crZ   r
  single_atoldouble_atolr   r   r-   r-   r.   
test_pstrfB  s4    ,

2
r  c                  C   s  t d ttD ]\} }d}d}td|d}| dkrrt||| |dt||| |  }|| j }nt||| |}||j }||\}}}}	t|}
d|
|| d || d f< t	|	d d	t
t
jj }d	t
t
jj }| d
kr|n|}t||d  d d |d f |
 j|
 d|d ||dd\}}}}	t|}d||| d || d f< t	|	d d	t
t
jj }d	t
t
jj }| d
kr|n|}t||d  d d |d f || j d|d qd S )Nr   rh   rF   pstf2r   rE   r&   rH  r  r  r  rW  r  )r   r,   r   r%  r  rC  rw   r  r  rZ   r
  r  r  r   r   r-   r-   r.   
test_pstf2j  s4    ,

2
r  c               
   C   s  t ddddgddddgdddd	gdd
ddgg} t dddgdddgdddgg}ttD ](\}}|dk rt ddddgddddgdd d!d"gd#d$d%d&gg}||}nZt jd'd(d)gd*d+d,gd-d.d/gg|d0}|t d1d2d3gd4d5d6gd7d8d9ggd: 7 }||}td;|d0}||\}}}}	}
}|dk r\t| ||d d d f | | d<d=d> q\t|||d d d f | | d<d=d> q\d S )?Ng      ?r   g1w-!?gd`TRۿgsr_  gs?g2%䃮g,eXgsFg%ug??y/nҿ&?yDioɴ?Af?y o_[ AcпysֿAfҿyPkw?JY8y5;NёCl?yYڊ?1*?y=yXѿ@a+?yh oſFxrF   g   ЈBg   tBgffffff @g   ٓ       @gg#fDgffffffgHzG?gQg'Vgp=
ףg(\r\  gS7нr  gq=
ףpg   Ag(\g333333g   Bg333333ÿgZ9=gQgֽr   gffffff@g   tޅBr   g(\g   Zgq=
ףp?gEop=gQ?gZEqҽr&   geequr   rq  r  )r(   rr   r   r   r*   r$   r   )desired_realdesired_cplxr   r,   rC  r  r%  rw   ZrowcndZcolcndamaxrZ   r-   r-   r.   
test_geequ  sd    








    r  c            
         s   t ddddddddddg
} ttD ]\}}t jd|d}||dk rJdnd	 t j fd
dtddD |d}|t t |7 }td|d}||\}}}}	t	t 
|t|  q&d S )Nr   rq   r   r   rh   r   rF   r   r&   c                    s   g | ]} d |  qS )r   r-   r  r9  r-   r.   r	    s     ztest_syequb.<locals>.<listcomp>rI   syequb)r(   rr   r   r   r
   r   Zrot90r   r$   r   log2r*   r   )
Zdesired_log2sr   r,   rC  re   r  r   scondr  rZ   r-   r  r.   test_syequb  s    "r  Tz.Failing on some OpenBLAS version, see gh-12276)reasonc                  C   s   t dgd dgd  t jt dddd  } t| \}}}}t|d tt |d	d
gd d	g dgd   t dt t 	dd d } d| d< d| d< tj
| t jdd\}}}}t|d tt |dddddddddddg d S )NrF   rI   i  rM   rE   )r  r&   r   rH  r_  r  rJ                   i   rI   rI   y              0@)rI   r   rW  r   rq   )r(   r   r   r   Zzheequbr   r   r  r   rI  Zcheequbr*   	complex64)rC  r   r  r  rZ   r-   r-   r.   test_heequb  s    2
( 
r  c                  C   s<  t jd d} t j| }t j| t j| d  }ttD ]\}}|dk r|t j| | }||}|| }||}n<t j| | t j| | d  }||}|| }||}td|d}td|d}||dd	\}	}
}}||	||
|dd
\}}|dk rt|||| dd q@t|||| dd q@d S )Nr   rh   r&   rF   getc2r   gesc2r   r   )Zoverwrite_rhsrH   ro   )	r(   r)   r   r   r   r   r*   r$   r   )r   r  r  r   r,   rC  rv   r  r  Zlurf  ZjpivrZ   rz   rN   r-   r-   r.   test_getc2_gesc2  s6    
 



 
 r  r   )rJ   rI   r  jobarJ   joburH   jobvjobrrE   jobpc              
   C   s  t d | \}}	dt|j }
t| |}td|d}|dk }|dk }|dkoT||	k}t|}|dkor| or| }|dko|o| o|}|dko|o| o|}|rd}n|s|rd}nd	}|dkr|dkrtt||||||||	 n0||||||||d
\}}}}}}t	|| |s|d	 |d  |d|	  }t
|t|dd|
d |dkrj|ddd|	f }|r|rt
|t| | j ||
d |rt
| j| t|	|
d |rt
| j| t|	|
d t	|d	 tj| t	|d t| t	|d d	 dS )a  Test the lapack routine ?gejsv.

    This function tests that a singular value decomposition can be performed
    on the random M-by-N matrix A. The test performs the SVD using ?gejsv
    then performs the following checks:

    * ?gejsv exist successfully (info == 0)
    * The returned singular values are correct
    * `A` can be reconstructed from `u`, `SIGMA`, `v`
    * Ensure that u.T @ u is the identity matrix
    * Ensure that v.T @ v is the identity matrix
    * The reported matrix rank
    * The reported number of singular values
    * If denormalized floats are required

    Notes
    -----
    joba specifies several choices effecting the calculation's accuracy
    Although all arguments are tested, the tests only check that the correct
    solution is returned - NOT that the prescribed actions are performed
    internally.

    jobt is, as of v3.9.0, still experimental and removed to cut down number of
    test cases. However keyword itself is tested externally.
    r   r   gejsvr   rF   rE   r   r   r   )r  r  r  r  jobtr  NF)r   r)  )r   r(   r   r   r/   r$   r   r   r   r   r   r   r   r7  rk   identityri  Zmatrix_rankZcount_nonzero)r   r,   r  r  r  r  r  r  r   r   r   rC  r  ZlsvecZrsvecZl2tranZ
is_complexZinvalid_real_jobvZinvalid_cplx_jobuZinvalid_cplx_jobvexit_statussvar/  r   r   r   rZ   sigmar-   r-   r.   test_gejsv_general  sT    !

	

"r  c                 C   sX  t d| d}|d\}}}}}}t|d t|jd t|jd t|tjdg| d tjd| d}||\}}}}}}t|d t|jd t|jd t|tjdg| d tjd| d}||\}}}}}}t|d t|jd t|jd t|tjg | d ttdd	d		| }t
||j }|d
}	||}
t||	 dS )z*Test edge arguments return expected statusr  r   r   r   rE   rE   rE   r3  r   rh   rC  N)r$   r   r+   r(   rr   r   sinrI  r  r*   Zasfortranarrayrk   r8  r   )r,   r  r  r/  r   r   r   rZ   rC  ZAcr5   r-   r-   r.   test_gejsv_edge_argumentsm  s.    



r  kwargsrM   r  c                 C   s.   t jdtd}tdtd}tt||f|  dS )z-Test invalid job arguments raise an Exception)rF   rF   r   r  Nr  )r  rC  r  r-   r-   r.    test_gejsv_invalid_job_arguments  s    
r  zA,sva_expect,u_expect,v_expectg)\(@gp=
ףgffffff?g
ףp=
gQ?gQgGz?g(\gQ޿gQgGz?gzGʿgQ?gQ?gHzG?g)\(?ggq=
ףp@g333333r[  gףp=
?g(\r]  g(\g cZB#@gI.!v@g?ܵ?r^  gC?g=yX5gc=yXga4?gB`"?g:pΈҞgʡE?gn4@?g[B>٬?g٬\m?gJ{/L?gOe?gc]Fgꕲq׿g\m?gfc]Fg؁sFڿgZB>?g0L
F%?gq=
ףpg ?gR!u?guVſg&Sٿgǘ?gV-g	^)p?g(gFx$g6[ ٿgUN@giq?g1Zd?gOnӿgΈ?g_vO?g}?5^Iؿg58EGr?gi o?g7[ Ac                 C   sT   d}t d| jd}|| \}}}}	}
}t|||d t|||d t|||d dS )z~
    This test implements the example found in the NAG manual, f08khf.
    An example was not found for the complex case.
    rq  r  r   r)  N)r$   r,   r   )rC  Z
sva_expectZu_expectZv_expectr   r  r  r/  r   r   r   rZ   r-   r-   r.   test_gejsv_NAG  s    r  c           !   	   C   s\  t d d}dt| j }t|d f| d}t|f| d}t|d f| d}| | | g}t|t|d t|d }tj|}|| }	t	d| d\}
}|
|||\}}}}}}t
||d  t
||d  t
||d	  t|dt|d t|d	 }tj|| d}t|D ]f\}}|| d }|d d ||gf |d d ||gf< |d d |f  |d d |d f | 7  < q&d|d d  }}|d d ||gf |d d ||gf< t||| |d
 |	 }|||||||	\}}t
|	| t|||d
 | tkr&d}|j| }nd}| j| }||||||||d\}}t|||d
 tt |
|d d || W 5 Q R X tt |
||d d | W 5 Q R X tt |
|||d d  W 5 Q R X tt" |
|d |d d |d  W 5 Q R X d|d< d|d< |
|||\}}}}}} tj||d  dkd||d   d S )Nr   rh   r   rE   r   rq   gttrfgttrsr   rF   r)  rk   rn   r  z3?gttrf: _d[info-1] is {}, not the illegal value :0.)r   r(   r   r   r/   r8  r   r)   r   r$   r   r
   r   r   r   rk   r7  r   r  r   Ztestingr   r  )!r,   r   r   dure   dldiag_cpyrC  rz   rv   r  r  _dl_d_dudu2rf  rZ   r
  r   r   r   r  Zb_cpyx_gttrsrx   Zb_transZ__dlZ__dZ__duZ_du2Z_ipiv_infor-   r-   r.   test_gttrf_gttrs  sf    "$$0$





&
r  z1du, d, dl, du_exp, d_exp, du2_exp, ipiv_exp, b, xg @r_  gffffff?r   r   g      ggffffff@g333333@g@r   g      r  rK   gC>rq   rL   rF   rG   rI   g@gffffff@g      g%@g@g	r  gffffff&g3@r  r   r   y       @      y       @      ?y            ?y      ?      y?yffffff
@y333333ӿ333333@yffffff
?y      ?       y      ?      ?y       @      y ~:pffffff?y333333@      y@@y333333@3333332@y333333yffffff-ffffff#@y      333333yfffff?@y333333"@y      𿚙?y      ffffff(@y      @      y      ?       @y      @      @y             y       @       c	                 C   s   t d| d | d f\}	}
|	||| \}}}}}}t|| t|| t||dd t|| |
||||||\}}t|| d S )Nr  r   rq  r)  )r$   r   )r  re   r  Zdu_expZd_expZdu2_expZipiv_exprv   rz   r  r  r  r  r  r  rf  rZ   r  r-   r-   r.   0test_gttrf_gttrs_NAG_f07cdf_f07cef_f07crf_f07csf  s    2


r  )rG   rK   )rK   rG   c                 C   s2   t d| d}|\}}|||d\}}t|d d S )Ngeqrfp_lworkr   r   r   r   )r,   r+   r   r   r   r   rZ   r-   r-   r.   test_geqrfp_lwork^  s    r  zddtype,dtypec                 C   s\  t d dt|j }d}t|f| d }t|d f|}t|t|d tt|d }| | g}td|d}|||\}	}
}t	||d	  t	||d  t
|d	d
|d t|
dtt| }t|	}t||| | j |d t|f|}|| }td|d}||	|
 |\}}t
|d	d|d t|||d d S )Nr   r   rh   rH   rE   rq   pttrfr   r   zpttrf: info = {}, should be 0)err_msgr)  pttrszpttrs: info = {}, should be 0)r   r(   r   r   r/   r   r7  r8  r$   r   r   r  r   r   ru   rk   )ddtyper,   r   r   re   rM  rC  r  r  r  _erZ   r   r  rz   rv   r  _xr-   r-   r.   test_pttrf_pttrsg  s*    (
r  c                 C   s`   d}t d|d}t|f| d }t|d f|}tt||d d | tt|||d d  d S )Nrh   r  r   rF   rE   rq   )r$   r/   r   r  )r  r,   r   r  re   rM  r-   r-   r.   *test_pttrf_pttrs_errors_incompatible_shape  s    r	  c           	      C   s   d}t d|d}t|f| d }t|d f|}d|d< d|d< |||\}}}t||d  dd||d   t|f| }|||\}}}t|dkd d S )	Nrh   r  r   rF   rE   r   z3?pttrf: _d[info-1] is {}, not the illegal value :0.z2?pttrf should fail with non-spd matrix, but didn't)r$   r/   r   r  r   )	r  r,   r   r  re   rM  r  r  rZ   r-   r-   r.   'test_pttrf_pttrs_errors_singular_nonSPD  s    
r
  z%d, e, d_expect, e_expect, b, x_expectrh      r   rz     gK=U   A      g      @)   .      y      0@      0@y      2@      "y      ?      y      P@      0@y      0      @y     @W@      O@y     N@     Py     S@      Ty     Q@     Ry      ,@      ;y     A@      .@y             c                 C   s   d}t d|d d}|| |\}}	}
t|||d t|	||d t d|d d}|||	 |\}}
t|||d |jtkr|||	|dd\}}
t|||d d S )	Nrq  r  r   r   r)  r  rE   rW  )r$   r   r7  r,   r'   )re   rM  d_expectZe_expectrv   Zx_expectr   r  r  r  rZ   r  r  r-   r-   r.   test_pttrf_pttrs_NAG  s    
r  c                 C   s  |dkrt ||f| }|tt|d|   }|| j d }t|d }t |f|d }t |d f|}t|t|d t|d }|| | j }	|}
nht |f|}t |d f|}|d }t|t|d t|d }	t|t|d t|d }
|||	|
fS )NrE   rH   rF   rq   )r/   r(   r   r   r7  rk   r   )r,   realtyper   	compute_zZA_eigZvrre   rM  ZtrirC  zr-   r-   r.   pteqr_get_d_e_A_z  s     """r  zdtype,realtyper  c                 C   s   t d dt| j }td| d}d}t| |||\}}}}	||||	|d\}
}}}t|dd| tt	t
|d t	|
|d	 |rt|t|j t||d	 t|t|
 t|j ||d	 d
S )a  
    Tests the ?pteqr lapack routine for all dtypes and compute_z parameters.
    It generates random SPD matrix diagonals d and e, and then confirms
    correct eigenvalues with scipy.linalg.eig. With applicable compute_z=2 it
    tests that z can reform A.
    r   r  pteqrr   rh   re   rM  r  r  r   zinfo = {}, should be 0.r)  N)r   r(   r   r   r$   r  r   r  r   sortr   r7  rk   r  r   )r,   r  r  r   r  r   re   rM  rC  r  d_pteqre_pteqrz_pteqrrZ   r-   r-   r.   
test_pteqr	  s     
" r  c                 C   sZ   t d td| d}d}t| |||\}}}}||d |||d\}	}
}}|dksVtd S )Nr   r  r   rh   rH   r  r  r   r   r$   r  r?   r,   r  r  r  r   re   rM  rC  r  r  r  r  rZ   r-   r-   r.   test_pteqr_error_non_spd#	  s    r#  c           	      C   s   t d td| d}d}t| |||\}}}}tt||d d |||d tt|||d d ||d |rtt||||d d |d d S )Nr   r  r   rh   rq   r   )r   r$   r  r   r  )	r,   r  r  r  r   re   rM  rC  r  r-   r-   r.   "test_pteqr_raise_error_wrong_shape2	  s    r$  c                 C   sf   t d td| d}d}t| |||\}}}}d|d< d|d< |||||d\}	}
}}|dksbtd S )Nr   r  r   rh   r   r   r!  r"  r-   r-   r.   test_pteqr_error_singularA	  s    r%  zcompute_z,d,e,d_expect,z_expectgp=
ף@r  gq=
ףp?g\(\	@g
ףp=
g?gŏ1w- @gR'?g/n?g&䃞ͪ?g cZB>?gCl?g:pΈڿg??gaTR'?gSۿg}гY?g%uοg\mg٬\m?gAf?gL
F%ugǘgŏ1w-!?g333333?gz6?c                 C   sx   d}t d|jd}t|t|d t|d }||||| d\}}	}
}t|||d tt|
t||d dS )	zb
    Implements real (f08jgf) example from NAG Manual Mark 26.
    Tests for correct outputs.
    rq  r  r   rE   rq   r  r)  N)r$   r,   r(   r   r   r   )r  re   rM  r  Zz_expectr   r  r  r  r  Z_zrZ   r-   r-   r.   test_pteqr_NAG_f08jgfP	  s    "r&  matrix_size)rK   rJ   rJ   rJ   c              
   C   s  t jd dt | j }dt | j }td| d}td| d}|\}}t||f| d}||\}	}
}t |	}||krt j||f| d}|	|d d d |f< |||
|dd }n"||	d d d |f |
|dd }t	|| ||d	 t	t 
|jd || j ||d
 t	|t ||d	 tt t |t tt |k t|dk t||f| dd }t|\}}||\}}}tt t |dk ot t |dk d S )Nr      r   geqrfpr   Zorgqr)rf   r   r   r   r  rq   )r(   r)   r   r   r   r$   r/   r   r   r   r
   r+   r7  rk   r   allr   rQ   r   r   )r,   r'  r   r   r*  Zgqrr   r   rC  Zqr_Arf   rZ   r%  Zqqrr  Z
A_negativeZr_rq_negZq_rq_negZrq_A_negZtau_negZinfo_negr-   r-   r.   test_geqrfpi	  s6    
"(r,  c                  C   s(   t g } td| jd}tt||  d S )Nr*  r   )r(   rr   r$   r,   r   r   )ZA_emptyr*  r-   r-   r.   #test_geqrfp_errors_with_empty_array	  s    
r-  driverZevZevdZevrZevxpfxsyhec              
   C   s   d}| dkrt nt}t| | d |d d}t| | d |d d}z t||dd t||dd W n8 tk
r } ztd| | | W 5 d }~X Y nX d S )	N  r0  _lworkr   r   rE   rW  ({}_lwork raised unexpected exception: {}r   r'   r$   r    r   r7   Zfailr  r/  r.  r   r,   Zsc_dlwZdz_dlwrM  r-   r-   r.   test_standard_eigh_lworks	  s     r7  gvZgvxc              
   C   s   d}| dkrt nt}t| | d |d d}t| | d |d d}z t||dd t||dd W n8 tk
r } ztd	| | | W 5 d }~X Y nX d S )
Nr2  r0  r3  r   r   rE   r   r  r4  r5  r6  r-   r-   r.   test_generalized_eigh_lworks	  s     r9  dtype_r   r   r  c                 C   sx   t d td|}|| }| tkr&dnd}|d }t|| d}t||||}|dkrX|n|f}tdd |D sttd S )	Nr   r   orun	csd_lworkr   c                 S   s   g | ]}|d kqS r   r-   r  r-   r-   r.   r	  	  s     z*test_orcsd_uncsd_lwork.<locals>.<listcomp>)r   r   r   r$   r    r+  r?   )r:  r   rU   r  r/  dlwr  lwvalr-   r-   r.   test_orcsd_uncsd_lwork	  s    
r@  c              
   C   s  d\}}}| t krdnd}|dkr,t|nt|}t|d |d f| d\}}t||||}|dkrpd|inttddg|}	||d |d |f |d ||d f ||d d |f ||d |d f f|	\
}
}}}}}}}}}|d	kstt	||}t	||}t
t
||t
|| || }t
||| }t
||| | }t
|| || }t
|| || | }tj||f| d}| d
}t|D ]}||||f< qt|D ]}|||| || f< qt|D ]0}| ||| | || | | | | f< qt|D ]&}|||| | | || | f< q
t|D ]}t|| ||| || f< t|| ||| | || | | f< t||  ||| || | | | f< t|| ||| | || f< q:|| | }t||ddt| j d d S )N)r)  P      r;  r<  csdr=  r   r   Zlrworkr   r   rH  g     @r  )r   r!   Zrvsr"   r$   r    dictrY  r?   r   r  r(   r   r   cosr  r   r   r   )r:  r   rU   r  r/  Xdrvr>  r?  ZlwvalsZcs11Zcs12Zcs21Zcs22thetau1u2Zv1tZv2trZ   r
  ZVHr%  Zn11Zn12Zn21Zn22SZoner   ZXcr-   r-   r.   test_orcsd_uncsd	  sJ    
P

.$*,&rL  
trans_boolFfactr  r  c                  C   s  t d dt| j }td| d\}}d}t|d f| d}t|f| d}t|d f| d}	t|dt| t|	d }
t|df| d}|r| tkrd	qd
nd}|r|
 j	n|
| }|
 |
 |	
 |
 g}|dkr||||	ndgd \}}}}}}||||	||||||||d}|\
}}}}}}}}}}t|dkd| t||d  t||d  t|	|d  t||d  t|||d tt|ddk	d| t|jd |jd kd|jd |jd  t|jd |jd kd|jd |jd  dS )aS  
    These tests uses ?gtsvx to solve a random Ax=b system for each dtype.
    It tests that the outputs define an LU matrix, that inputs are unmodified,
    transposal options, incompatible shapes, singular matrices, and
    singular factorizations. It parametrizes DTYPES and the 'fact' value along
    with the fact related inputs.
    r   r   gtsvxr  r   rh   rE   rq   rF   rk   rn   r  r  NrJ   rN  rx   dlfdfdufr  rf  r   z ?gtsvx info = {}, should be zerorG   r)  __len__T rcond should be scalar but is {}z!ferr.shape is {} but shoud be {},z!berr.shape is {} but shoud be {},)r   r(   r   r   r$   r/   r   r   r7  rk   r8  r   r  r   r   r   r+   ) r,   rM  rN  r   rP  r  r   r  re   r  rC  rz   rx   rv   Z
inputs_cpydlf_df_duf_du2f_ipiv_info_	gtsvx_outrR  rS  rT  du2frf  x_solnrl  ferrberrrZ   r-   r-   r.   
test_gtsvx
  sJ    "    rb  c                 C   s  t d td| d\}}d}t|d f| d}t|f| d}t|d f| d}t|dt| t|d }	t|df| d}
| tkrdnd	}|r|	 jn|	|
 }|d
kr||||nd gd \}}}}}}||||||||||||d}|\
}}}}}}}}}}|dkrZd|d< d|d< |||||}|\
}}}}}}}}}}|dkstdnh|d
krd|d< d|d< d|d< |||||||||||d
}|\
}}}}}}}}}}|dkstdd S )Nr   rO  r   rh   rE   rq   rF   rk   rn   r  rJ   rQ  r  r   z&info should be > 0 for singular matrix)rN  rR  rS  rT  r  rf  )	r   r$   r/   r(   r   r   r7  rk   r?   )r,   rM  rN  rP  r  r   r  re   r  rC  rz   rx   rv   rW  rX  rY  rZ  r[  r\  r]  rR  rS  rT  r^  rf  r_  rl  r`  ra  rZ   r-   r-   r.   test_gtsvx_error_singularK
  sD    "  

 rc  c                 C   s0  t d td| d\}}d}t|d f| d}t|f| d}t|d f| d}t|dt| t|d }	t|df| d}
| tkrdnd	}|r|	 jn|	|
 }|d
kr||||nd gd \}}}}}}|dkrtt	||d d ||||||||||d tt	|||d d |||||||||d tt	||||d d ||||||||d tt
|||||d d |||||||d ntt	||||||||d d ||||d tt	|||||||||d d |||d tt	||||||||||d d ||d tt	|||||||||||d d |d d S )Nr   rO  r   rh   rE   rq   rF   rk   rn   r  rJ   r  rQ  )r   r$   r/   r(   r   r   r7  rk   r   r  r   )r,   rM  rN  rP  r  r   r  re   r  rC  rz   rx   rv   rW  rX  rY  rZ  r[  r\  r-   r-   r.   "test_gtsvx_error_incompatible_size~
  s    "
                      
      
     
      
 rd  zdu,d,dl,b,xc              
   C   sB   t d|jd}|||| |}|\
}}}	}
}}}}}}t|| d S )NrP  r   r$   r,   r   )r  re   r  rv   rz   rP  r]  rR  rS  rT  r^  rf  r_  rl  r`  ra  rZ   r-   r-   r.   test_gtsvx_NAG
  s    rf  zfact,df_de_lambdac                 C   s   t d|jd| |S Nr  r   r$   r,   re   rM  r-   r-   r.   <lambda>
  s
    rj  c                 C   s   dS N)NNNr-   ri  r-   r-   r.   rj  
      c                 C   s  t d dt| j }td| d}d}t|f|d }t|d f| }t|t|d tt|d }	t|d	f| d}
|	|
 }|||\}}}| | | g}|||||||d
\}}}}}}}t	||d  t	||d  t	||d	  t
|dkd| t|
| t|dtt| }t|}t|	|| t|j |d t|drvtd|t
|jdkd|j|
jd  t
|jdkd|j|
jd  dS )a  
    This tests the ?ptsvx lapack routine wrapper to solve a random system
    Ax = b for all dtypes and input variations. Tests for: unmodified
    input parameters, fact options, incompatible matrix shapes raise an error,
    and singular matrices return info of illegal value.
    r   r   ptsvxr   rI   rH   rE   rq   rF   rN  rS  efr   zinfo should be 0 but is {}.r)  rU  rV  )rF   z#ferr.shape is {} but shoud be ({},)z#berr.shape is {} but shoud be ({},)N)r   r(   r   r   r$   r/   r   r7  r8  r   r   r  r   r   r   rk   r   r?   r+   )r,   r  rN  df_de_lambdar   rm  r   re   rM  rC  r_  rv   rS  ro  rZ   r  rz   rl  r`  ra  r   r  r-   r-   r.   
test_ptsvx
  sD    (
 

  rq  c                 C   s   t d|jd| |S rg  rh  ri  r-   r-   r.   rj    s
    c                 C   s   dS rk  r-   ri  r-   r-   r.   rj    rl  c              
   C   s   t d td| d}d}t|f|d }t|d f| }t|t|d tt|d }t|df| d}	||	 }
|||\}}}tt||d d ||
|||d	 tt|||d d |
|||d	 tt||||
d d |||d	 d S )
Nr   rm  r   rI   rH   rE   rq   rF   rn  )	r   r$   r/   r(   r   r7  r   r  r   )r,   r  rN  rp  rm  r   re   rM  rC  r_  rv   rS  ro  rZ   r-   r-   r.   test_ptsvx_error_raise_errors  s    (  rr  c                 C   s   t d|jd| |S rg  rh  ri  r-   r-   r.   rj  *  s
    c                 C   s   dS rk  r-   ri  r-   r-   r.   rj  ,  rl  c                 C   sl  t d td| d}d}t|f|d }t|d f| }t|t|d tt|d }t|df| d}	||	 }
|||\}}}|d	krd
|d< |||\}}}||||
\}}}}}}}|d
kr||kstt|f|}||||
\}}}}}}}|d
kr||kshtnP|||\}}}d
|d
< d
|d
< ||||
|||d\}}}}}}}|d
kshtd S )Nr   rm  r   rI   rH   rE   rq   rF   r  r   rG   rn  )r   r$   r/   r(   r   r7  r?   )r,   r  rN  rp  rm  r   re   rM  rC  r_  rv   rS  ro  rZ   rz   rl  r`  ra  r-   r-   r.   test_ptsvx_non_SPD_singular&  s2    (

 rs  zd,e,b,xc                 C   s6   t d|jd}|| ||\}}}}}	}
}t|| d S )Nrm  r   re  )re   rM  rv   rz   rm  rS  ro  Zx_ptsvxrl  r`  ra  rZ   r-   r-   r.   test_ptsvx_NAGR  s    rt  r   c                    s  t d t| jd }d\ }t  g| d}t |g| d}| j| tj | d| d  }|r fddt D  fddt D f}n0d	d td
 d
 D dd td
 d
 D f}|| }t	d| dd\}}	}
}}|	 ||d\}}t
|d t||d| }t||d|d | ||d\}}t
|d t|| }t||d|d |
 |||d\}}t
|d t||}t||d|d | |||d\}}t
|d t||d|d tj|d
}| |||d\}}t
|d ttd
| tjj|d
d | d
k  d S )Nr   r   )rh   rH   r   r   c                    s    g | ]}t | D ]}|qqS r-   r   r  yrz   r  r-   r.   r	  |  s       z5test_pptrs_pptri_pptrf_ppsv_ppcon.<locals>.<listcomp>c                    s    g | ]}t | D ]}|qqS r-   ru  rv  r  r-   r.   r	  }  s       c                 S   s   g | ]}t |D ]}|qqS r-   ru  rv  r-   r-   r.   r	    s     
  rE   c                 S   s"   g | ]}t |D ]}|d  qqS r  ru  rv  r-   r-   r.   r	    s     
  )ppsvpptrfpptrspptrippconr<  r=  rW  r   r  )rg  r   rh  )r   r(   r   r   r/   r7  rk   r
   r   r$   r   r   r   r   r   ri  r   r   r   rj  )r,   r   r   r   rS   rv   r  Zaprx  ry  rz  r{  r|  ulrZ   ZaulZuliZaulirz   ZbxZxvrg  rl  r-   r  r.   !test_pptrs_pptri_pptrf_ppsv_ppconp  sL    $





r~  c           
      C   s0  t d t| jd }d}t||g| d}td| d\}}|dd |dd	}t|d
 d |d }|d }|d }	| tkrt|t	|d|d t|| |
 j |d|d |||dd}t|d
 d |d }|d }| tkrt|t	|d|d t|| |
 j |d|d t|d |	d|d d S )Nr   r   rh   r   )geestrexcc                 S   s   d S r}  r-   rz   r-   r-   r.   rj    rl  z!test_gees_trexc.<locals>.<lambda>Fr  rq   r   r   r(  r  rK   rE   r   r|   )r   r(   r   r   r/   r$   r   r'   r   r   r7  rk   )
r,   r   r   rS   r  r  rb  r  r  d2r-   r-   r.   test_gees_trexc  s*    r  zt, expect, ifst, ilstr  g)\({Gz?gQ?rH  grZ  gffffff?gg?glV}gV_?g|?5^?g?gV/?g;On?ggj+y            y
ףp=
?
ףp=
׿yRQȿQ?y)\(?      пr  y             @yQ
ףp=
yq=
ףpͿp=
ף?y       @      yGz?(\?y      @      y1%Ŀq?ys??ܵ|ȿyHzG??ܵ?yV/?ݓ?yjt?vտyB>٬?=U?c                 C   sL   d}t d| jd}|| | ||dd}t|d d |d } t|| |d dS )	zg
    This test implements the example found in the NAG manual,
    f08qfc, f08qtc, f08qgc, f08quc.
    rq  r  r   r   )Zwantqrq   r)  N)r$   r,   r   r   )r  ZifstZilstexpectr   r  rb  r-   r-   r.   test_trexc_NAG  s    r  c                 C   s.  | t jkrtjdkrtd td t | jd }d}t	||g| d}t	||g| d}t
d| d\}}|dd	 ||d
d
d}t|d d |d }|d }	|d }
|d }|d |	d  }|d |	d  }| tkrt|t |d|d t|	t |	d|d t|
| | j |d|d t|
|	 | j |d|d |||	|
|dd}t|d d |d }|d }	|d }
|d }| tkrt|t |d|d t|	t |	d|d t|
| | j |d|d t|
|	 | j |d|d t|d |	d  |d|d t|d |	d  |d|d d S )Ndarwin8gges[float32] broken for OpenBLAS on macOS, see gh-16949r   r   rh   r   )ggestgexcc                 S   s   d S r}  r-   r  r-   r-   r.   rj    rl  z!test_gges_tgexc.<locals>.<lambda>Fr   Zoverwrite_brq   r   rE   r  r   r|   r(  r  rK   rF   rG   r  )r(   r>  sysplatformr7   xfailr   r   r   r/   r$   r   r'   r   r   r7  rk   )r,   r   r   rS   rv   r  r  rb  r   r  r  r  d1r  r-   r-   r.   test_gges_tgexc  sD    


r  c                 C   st  t d t| jd }d}t||g| d}td| d\}}}|dd |dd	}t|d
 d |d }|d }	|d }
| tkrt|t	|d|d t|	| |	
 j |d|d t|}d|d< t|||}| tkr||||	|d}n||||	||d d}t|d
 d |d }|d }	| tkr>t|t	|d|d t|	| |	
 j |d|d t|d |
d|d d S )Nr   r   rh   r   )r  trsentrsen_lworkc                 S   s   d S r}  r-   r  r-   r-   r.   rj  +  rl  z!test_gees_trsen.<locals>.<lambda>Fr  rq   r   r   r(  r  rE   rJ   r   r   Zliworkr|   )r   r(   r   r   r/   r$   r   r'   r   r   r7  rk   r   r    )r,   r   r   rS   r  r  r  rb  r  r  r  selectr   r-   r-   r.   test_gees_trsen   s:     

r  z*t, q, expect, select, expect_s, expect_sepg/$?gQIg~jtx?gJ4?g58EGrgGr?gyX5;?g?߾gt?gyǹg؁sF?g_L?gGz?gUN@?goT?g0*g'gz6>Wg(g&䃞ͪӿgbX9ҿg-!lV?gb=y?gۊe?g8EGr?g?gQg(\ſg
ףp=
?gQ?g)\(ܿgQտgQg(\?g{GzԿgp=
ףg)\(?g      ?g(\	@yqh yfc]F?ڊe׿yMbȿ&S?y&1??пy      ?5^I @yo0*yZd;OͿ~:p?yx$(@4@y[ A?&?y?ܵ@St$y?ܵ꿽R!uy2U0*6[?yV-?=yXy8m4?1%̿ySt$?\mҿyʡE?S㥛?y~:p	cڿyK7A`?[ A?y:pΈ~jtԿyH}?9#J{yH}?	cZy+eXw?-ٿy"u?	c?y?տN@ayRQȿ{GzĿyh"lxz?EGrǿy47)yS!uqF%u@yyտGx$(?y3ı.n?rh|yv?
F%uyd`TR?I&ۿyN@?ݓy4@
@	^)?ys{
@ o_yH.@|Pk@y0*?*:Hy]m{?Gzy)0[<?yI.!? ryqh 
@ׁsF?y1w-!?h ogRQ?gK?c                 C   s   d}d}t d| jd\}}	t|	|| }
| jtkrB||| ||
d}n||| ||
|
d d}t|d d	 |d	 } |d }| jtkr|d
 }|d }n|d }|d }t|||  | j |d t|d| |d t|d| |d dS )zW
    This test implements the example found in the NAG manual,
    f08qgc, f08quc.
    rq  r  )r  r  r   r   rE   r  rq   r   rH   rI   rJ   r)  N)r$   r,   r    r'   r   r   r7  rk   )r  r  r  r  Zexpect_sZ
expect_sepr   Zatol2r  r  r   rb  r   sepr-   r-   r.   test_trsen_NAGN  s*    0 



r  c                 C   sf  | t jkrtjdkrtd td t | jd }d}t	||g| d}t	||g| d}t
d| d\}}}|dd	 ||d
d
d}t|d d |d }	|d }
|d }|d }|	d |
d  }|	d |
d  }| tkrt|	t |	d|d t|
t |
d|d t||	 | j |d|d t||
 | j |d|d t |}d|d< t|||	|
}|d d |d f}|||	|
|||d}t|d d |d }	|d }
|d }|d }| tkrt|	t |	d|d t|
t |
d|d t||	 | j |d|d t||
 | j |d|d t|	d |
d  |d|d t|	d |
d  |d|d d S )Nr  r  r   r   rh   r   )r  tgsentgsen_lworkc                 S   s   d S r}  r-   r  r-   r-   r.   rj    rl  z!test_gges_tgsen.<locals>.<lambda>Fr  rq   r   rE   r  r   r|   r(  r  rJ   r   ir  r  )r(   r>  r  r  r7   r  r   r   r   r/   r$   r   r'   r   r   r7  rk   r   r    )r,   r   r   rS   rv   r  r  r  rb  r   r  r  r  r  r  r  r   r-   r-   r.   test_gges_tgsen  sR    
 


r  )r   )r  	functoolsr   Znumpy.testingr   r   r   r   r   r   r7   r	   r   Znumpyr(   r
   r   r   r   r   r   r   r   Znumpy.randomr   r   r   Zscipy.linalgr   r3   r   r   r   r   r   r   r   r   r   r   Zscipy.linalg.lapackr    Zscipy.statsr!   r"   Zscipy.sparsesparser  r#   r1   ImportErrorr$   Zscipy.linalg.blasr%   r>  r   r   r  Z
complex128r'   r   r/   rC   rD   r   r   r  r  r   r   r   r   r   r&  r0  r;  r?  r@  rR  rc  rm  ru  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Zskipifr  r  r   r  r  r  rr   r  r  r  r  rY  r  r	  r
  r  r  r  r#  r$  r%  r&  r,  r-  r7  r9  r@  rL  rb  rc  rd  rf  rq  rr  rs  rt  r~  r  r  r  r  r  r  r-   r-   r-   r.   <module>   s   (4
` t  **DO1")::) %# ((-
e
#















\

  

+
/

"	
 






@.:00
 
 
 

4



%
" 


.$ 	     2-              *!