o
    i}                    @   s  d dl mZ d dl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'm(Z( d dl)m*Z* d d	l+m,Z,m-Z- d dl.m/Z0 zd d
l1m2Z2 W n e3y   dZ2Y nw zd dlm4Z5 W n e3y   dZ5Y nw d dl)m6Z6 d dl7m8Z8 ej9ej:gZ;ej<ej=gZ>e;e> Z?d Z@ZAe2dure2d d d Z@e2d d d ZAdd ZBdd ZCG dd dZDG dd dZEG dd dZFe
jGHde?e
jGHdg ddd  ZIG d!d" d"ZJG d#d$ d$ZKG d%d& d&ZLG d'd( d(ZMe
jGHde?e
jGHd)g d*e
jGHd+d,d-ge
jGHd.d/d,ge
jGHd0d1d2gd3d4 ZNd5d6 ZOd7d8 ZPd9d: ZQd;d< ZRG d=d> d>ZSG d?d@ d@ZTdAdB ZUdCdD ZVdEdF ZWdGdH ZXdIdJ ZYdKdL ZZdMdN Z[dOdP Z\dQdR Z]dSdT Z^dUdV Z_dWdX Z`dYdZ Zad[d\ ZbG d]d^ d^Zcd_d` Zddadb Zedcdd Zfdedf Zge
jGjhdgdhdidjdk Zidldm Zje
jGHdndodpge
jGHde;e
jGHdqekdre
jGHdsekdte
jGHduekdte
jGHdvd dwge
jGHdxd dwgddydzZle
jGHde;d{d| Zme
jGHd}dqd~idsd~idud~idvd~idd~idxd~ifdd Zne
jGHdeog dg dg dg dg dg dgeog deog dg dg dg dg dg dgeog dg dg dg dgfgdd Zpe
jGHde?dd Zqe
jGHdeog deog deog deog deog deog deog deoddgddgddgddgddggeoddgddgd1dgddgddwggf	eog deog deog deog deog deog deog deoddgddgddgddgddggeoddgddgddgddgddggf	gddɄ Zre
jGHde?e
jGHd)g dʢe
jGHd0d1d2gdd̄ Zse
jGHde?e
jGHdg d͢ddτ Zte
jGHdeue;e; e?dd҄ Zve
jGHdeue;e; e?ddԄ Zwe
jGHdeue;e; e?ddք Zxe
jGHdeog dآeog d٢eog dڢeog dۢeodrd2gd~dtgdd~gddgddggeoddgddgdwdgddrgd1dggfeog deog deog deog deoddgddgddgddggeoddgddgddgddggfgdd Zydd Zze
jGHdeue?e;e; e
jGHdekd1dd Z{e
jGHdeue?e;e; e
jGHdekd1dd Z|e
jGHdeue?e;e; e
jGHdekd1dd Z}e
jGHdeue?e;e; e
jGHdekd1dd Z~e
jGHddeog d eog deog deog dg dg dg dgfgdd Ze
jGHde?e
jGHd	g d
dd Zdd Ze
jGHdg de
jGHdddgdd Ze
jGHdddge
jGHdddgdd Ze
jGHde?e
jGHdg ddd Ze
jGHde?dd  Ze
jGHde?e
jGHd!d"dgge
jGHd#d$d/gd%d& Ze
jGHde?e
jGHd!d dwge
jGHd#d$d/gd'd( Ze
jGHde?d e
jGHd!d"dgge
jGHd#d$d/gd)d* Ze
jGHd+eog deog deog deoddgddgddgddgddggeoddgddgd1dgddgddwggfeog deog deog deoddgddgddgddgddggeoddgddgddgddgddggfgd,d- Ze
jGHdeue?e;e; e
jGHd.d$d/d0 fd/d1d0 fgd2d3 Ze
jGHdeue?e;e; e
jGHd.d$d4d0 fd/d5d0 fgd6d7 Ze
jGHdeue?e;e; e
jGHd.d$d8d0 fd/d9d0 fgd:d; Ze
jGHd<eog dآeog d٢eodrd2gd~dtgdd~gddgddggeoddgddgdwdgddrgd1dggfeog deog deoddgddgddgddggeoddgddgddgddggfgd=d> Ze
jGHd?d"dgge
jGHde?d@dA Ze
jGHde?dBdC Ze
jGHdDeog dEg dFg dGg dHgeog dIg dJg dKg dHgddwfeog dLg dMg dNg dOgeog dPg dQg dRg dSgdwdtfgdTdU Ze
jGHde?dVdW Ze
jGHde?dXdY Ze
jGHdZeog d[g d\g d]g d^geog d_g d`g dag dbgeog dcg ddg deg dfgeog dgdhdifeog djg dkg dlg dmgeog dng dog dpg dqgeog drg dsg dtg dugeog dgdvdwfgdxdy Ze
jGHde?dzd{ Ze
jGHd|eog d}g d~g dg dgeog dg d~g dg dgeog dg dg dg dgeog dg dg dg dgeog dg dg dg dgeog dg dg dg dgeog dg dg dg dgeog dg dg dg dgfge
jGHde;dd Ze
jGHde;e
jGHdde
jGHdg ddd Ze
jGHdddge
jGHde?e
jGHd?ddd Ze
jGHd)ede
jGHdg de
jGHd.d/d,ge
jGHde?dd ZdS (      )reduceN)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qz)_compute_lwork)ortho_groupunitary_group)CONFIG)_clapack)get_lapack_funcs)get_blas_funcszBuild DependenciesZblasnameversionc                 C   s6   |t v r|j|  |j|  d  |S |j|  |S )N              ?)COMPLEX_DTYPESr   astype)shapedtyperng r0   X/home/kim/smarthome/.venv/lib/python3.10/site-packages/scipy/linalg/tests/test_lapack.pygenerate_random_dtype_array1   s   r2   c                  C   sv   t jdu r
td tt j } h d}t }tt D ]}|ds0||vr0|| vr0|	| q|g ks9J ddS )z%Test that all entries are in the doc.Nzlapack.__doc__ is None>   npclapackdivisionZ	HAS_ILP64flapackZfind_best_lapack_typeprint_functionabsolute_import_z2Name(s) missing from lapack.__doc__ or ignore_list)
r   __doc__pytestskipsetsplitlistdir
startswithappend)namesZignore_listmissingr(   r0   r0   r1   test_lapack_documented9   s   



rE   c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestFlapackSimplec           
      C   s   g dg dg dg}g dg dg dg dg}dD ]R}t t|d	 d }|d u r*q||\}}}}}	t|	 t|	 t|| t||fd
t|d
 d f t|tt| ||ddd\}}}}}	t|	 t|	 qd S )N)         )         )      	   )rH   r   r   ga2U0*3?)rK   r   r   gMb`?)rN   rH   r   r   )r   rH   r   r   ZsdzcZgebalr   rH   )Zpermutescale)	getattrr6   r   reprr   r   lenr3   r   )
selfaa1pfbalohiZpivscaleinfor0   r0   r1   
test_gebalR   s$   
zTestFlapackSimple.test_gebalc                 C   s\   g dg dg dg}dD ]}t t|d d }|d u rq||\}}}t| t| qd S )Nikiifi     i"  iiidZgehrd)rR   r6   r   rS   )rU   rV   rX   rY   Zhttaur]   r0   r0   r1   
test_gehrdg   s   zTestFlapackSimple.test_gehrdc                 C   sZ  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\}	| rM|d  d7  < d}|	|||\}
}}tt ||
t |
| ||  |	|||||d\}
}}tt | j|
t |
| j || dd |	|||dd\}
}}tt ||
t |
| || dd q%d S )NrH   rI   r   rK   rL   rM   rO   rP   
         TfdFD)trsylr*   C)ZtranaZtranbdecimal)Zisgn)	r3   arrayr,   r&   isupperr   dot	conjugateri   )rU   rV   bctransr.   rW   b1c1rk   xrQ   r]   r0   r0   r1   
test_trsylr   s0   ""zTestFlapackSimple.test_trsylc           	      C   s  t g dg dg dg}dD ]{}dD ]v}||}| r'|d  d7  < td|f\}|||}|d	v rU|d
v r>d}nd}t t t t |}t	||| q|dv rbt 
t |}n#|dv rtt 
t jt |dd}n|dv rt 
t jt |dd}t|| qqd S )Nr_   r`   rb   rj   Mm1OoIiFfEer   r   r*   )langeZFfEeZFfrJ   rN   ZMmZ1Oor   ZaxisZIirH   )r3   rp   r,   rq   r&   sqrtsumZsquareabsr   maxr   )	rU   rV   r.   Znorm_strrW   r}   valuern   refr0   r0   r1   
test_lange   s6   

zTestFlapackSimple.test_langeN)__name__
__module____qualname__r^   re   rz   r   r0   r0   r0   r1   rG   P   s
    rG   c                   @   s   e Zd Zdd Zdd ZdS )
TestLapackc                 C      t tdr	 d S d S NZempty_module)hasattrr6   rU   r0   r0   r1   test_flapack      
zTestLapack.test_flapackc                 C   r   r   )r   r4   r   r0   r0   r1   test_clapack   r   zTestLapack.test_clapackN)r   r   r   r   r   r0   r0   r0   r1   r      s    r   c                   @   rF   )
TestLeastSquaresSolversc                 C   st  t d ttD ]K\}}d}d}d}t|||}t||}td|d\}}	t|	|||}
||||
d\}}}t|dk |||d	| |
d
\}}}t|dk qtD ]o}t	j
ddgddgddgg|d}t	j
g d|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|| qVtD ]o}t	j
ddgddgddgg|d}t	j
g d|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  rf      rH   )gels
gels_lworkr.   lworkr   ZTTCCrv   r         ?       @      @      @      @       @      0@g      1@g      4@)r   r   geqrfrI   ro   祪,-@   rtol      ?      @      @      ?      @            @              @ffffff?r   y      1@       @y      4@      R ?\j,? W?)r   	enumerateDTYPESr   r,   r&   r!   r   REAL_DTYPESr3   rp   r-   rT   r   finfoepsr   r+   )rU   indr.   mnnrhsrW   rw   ZglsZglslwr   r9   r]   r   r   r   Zlqrry   Z	lqr_truthr0   r0   r1   	test_gels   s   





z!TestLeastSquaresSolvers.test_gelsc              
   C   s0  t D ]}tjddgddgddgg|d}tjg d|d}td	||f\}}|j\}}t|jd
kr8|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g d|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 qd S )Nr   r   r   r   r   r   r   r   )gelsdgelsd_lworkrI   rH   ro   Fr   r   r   r   YN))1)@*@.?r   r   r   r   r   r   r   r   U.*@_Y@r   r3   rp   r&   r-   rT   intrealr   r   r   r+   )rU   r.   rW   rw   r   r   r   r   r   workiworkr]   r   Z
iwork_sizery   srankZrworkZ
rwork_sizer0   r0   r1   
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g d|d}td	||f\}}|j\}}t|jd
kr8|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g d|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 qd S )Nr   r   r   r   r   r   r   r   )gelssgelss_lworkrI   rH   ro   Fr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rU   r.   rW   rw   r   r   r   r   r   r   r]   r   vry   r   r   r0   r0   r1   
test_gelss?  s   





z"TestLeastSquaresSolvers.test_gelssc              	   C   s(  t D ]}tjddgddgddgg|d}tjg d|d}td	||f\}}|j\}}t|jd
kr8|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g d|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 qd S )Nr   r   r   r   r   r   r   r   )gelsyr   rI   rH   rf   Fro   r   r   r   r   r   r   r   r   r   r   r   r   )r   r3   rp   r&   r-   rT   r   r   r   r   r   Zint32r   r+   )rU   r.   rW   rw   r   Zgelsy_lworkr   r   r   r   r]   r   Zjptvr   ry   jr   r0   r0   r1   
test_gelsyx  st   



z"TestLeastSquaresSolvers.test_gelsyN)r   r   r   r   r   r   r   r0   r0   r0   r1   r      s
    D<9r   r.   r-   )rJ   rK   )rL   rI      r   c                 C   2   t d| d}|\}}|||d\}}t|d d S )Ngeqrf_lworkr   r   r   r   r&   r   )r.   r-   r   r   r   r   r]   r0   r0   r1   test_geqrf_lwork     r   c                   @      e Zd Zdd ZdS )TestRegressionc           
      C   s   t D ]j}tjd|d}tdg|g\}tt||dd ||\}}}}|tv rHtdg|g\}tt||dd  |dd ||dd  |dd q|tv rltd	g|g\}	tt|	|dd  |dd |	|dd  |dd qd S )
N)i,  rI   r   gerqfrI   r   orgrqrH   ungrq)r   r3   r   r&   assert_raises	Exceptionr   r+   )
rU   r.   rV   r   Zrqrd   r   r]   r   r   r0   r0   r1   test_ticket_1645  s   zTestRegression.test_ticket_1645N)r   r   r   r   r0   r0   r0   r1   r     s    r   c                   @   r   )	TestDpotrc           
      C   s   dD ]O}dD ]J}t jd t jjdd}||j}td|f\}}||||d\}}|||d }	|rCtt |	t t	| qtt 
|	t 
t	| qqd S )N)TF*   )rJ   rJ   size)potrfZpotri)cleanr   )r3   randomr   normalrr   ri   r&   r   r   r   r   )
rU   lowerr   ry   rV   ZdpotrfZdpotriru   r]   Zdptr0   r0   r1   test_gh_2691  s   zTestDpotr.test_gh_2691N)r   r   r   r   r0   r0   r0   r1   r         r   c                   @   r   )
TestDlasd4c              
   C   sl  t g d}t g d}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 ]}
||
||}|	|d  t|d
 dkd|
  qlt |	d d d }	tt t |	 df t||	dt t jj dt t jj d d S )N)r         @r   r   )g(\@g@g333333皙r   ro   rH   F)full_matrices
compute_uvoverwrite_aZcheck_finiter   lasd4rJ   zcLAPACK root finding dlasd4 failed to find                                     the singular value %izThere are NaN rootsd   atolr   )r3   rp   hstackZvstackdiagr   rT   newaxisr   concatenater   r&   rangerB   r   anyisnanr   r   float64r   )rU   ZsigmasZm_vecMZSMZit_lenZsgmZmvcr   rootsiresr0   r0   r1   test_sing_val_update  s4   
*
zTestDlasd4.test_sing_val_updateN)r   r   r   r  r0   r0   r0   r1   r     r   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g dg dg dgdd Z	dd Z
ejdddgdd ZdS )	TestTbtrsr.   c                 C   s2  |t v r8tjg dg d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}nC|tv rstjg dg dg d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d&| d'td(|d}|||d)d*\}}t|d+ t||d+d,d- d.S )/zTest 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

        )p=
ףgQ@gHzG@g{Gz?)g      gq=
ףp@gHzGr   r   gp=
ף0r  g(\+gףp=
0g333333*@g(\gHzG,gQ#rK   rH   ro   rJ   rI   r   )y
ףp=
Q@y{Gz@GzyQ?HzGy)\(??)yQQ@yq=
ףpGz@yףp=
?{Gzr   )yQ?q=
ףp@y)\(zGr   r   y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abrt   uplor   h㈵>r   r   N)r   r3   rp   r+   
ValueErrorr&   r   r   )rU   r.   r
  rt   Zx_outr  ry   r]   r0   r0   r1   test_nag_example_f07vef_f07vsf  s\   	






z(TestTbtrs.test_nag_example_f07vef_f07vsfzdtype,transc                 C   s.   g | ]}d D ]}|dkr|t v s||fqqS ))Nri   rl   rl   )r   ).0r.   rv   r0   r0   r1   
<listcomp>3  s    zTestTbtrs.<listcomp>r  Ur  r   r  c                    s  t jdd\}}td d}|dk}|| }	||	 }
t|	|
 d d}fdd	|D } fd
d	|D }|dkrFt j d||	< tj||dd}t |d f }t	|D ]\}}|
|||t|dt| f< q\t|f }||||||d\}}t|d |dkrt|| |dd d S |dkrt|j| |dd d S |dkrt|j | |dd d S td)Ni  )rK   rJ   rI   r  r   r  rH   ro   c                    s   g | ]} t | qS r0   )r   r  ry   r   r0   r1   r  H      z2TestTbtrs.test_random_matrices.<locals>.<listcomp>c                    s   g | ]	}t |f qS r0   )r2   )r  widthr.   r/   r0   r1   r  I  s    Zdia)formatr   )r
  rt   r  rv   r   r  g-C6
?r   ri   rl   zInvalid trans argument)r3   r   RandomStater&   r   r   spsZdiagsr   r   Zdiagonalr   minr2   r   r   ri   rs   r  )rU   r.   rv   r  r   r   kdr  Zis_upperZkuklZband_offsetsZband_widthsZbandsrV   r
  rowkrt   ry   r]   r0   )r.   r   r/   r1   test_random_matrices2  s6   
(
zTestTbtrs.test_random_matriceszuplo,trans,diag)r  r  Invalid)r  r"  r  )r"  r  r  c                 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   rK   rI   N)r&   r3   r   r   r   r   )rU   r  rv   r   r  r
  rt   r0   r0   r1   &test_invalid_argument_raises_exceptionf  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   rK   r  r   )ro   rJ   r  r	  N)r3   r   floatr&   r   )rU   r
  rt   r  r9   r]   r0   r0   r1   test_zero_element_in_diagonals  s   z'TestTbtrs.test_zero_element_in_diagonalzldab,n,ldb,nrhs)rL   rL   r   rL   )rL   rL   rJ   rL   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r3   r   r$  r&   r   r   )rU   Zldabr   Zldbr   r
  rt   r  r0   r0   r1   test_invalid_matrix_shapes  s   z$TestTbtrs.test_invalid_matrix_shapesN)r   r   r   r;   markparametrizer   r  r!  r#  r%  r'  r0   r0   r0   r1   r    s0    
-.
	r  r   )I1Or  r  r  r   r  r   rJ   rf   c              	   C   s  t |  | | | |  tj t dd}|j ||fd|j ||fdd  }|td|dd|}||7 }t| tj	rG|j
n|}|dkrRt|nt|}|dkri|t|d d tjf  }|| }td|f}|||||d\}	}
|d	krtjj|tjd
}tjjtj|tjd
}d||  }n#t|jdd }td|f\}}||\}}}||||d\}}
d}t|	||d d S )Nr   l   a$r   r*   rf   r  trcon)r   r  r   r*  )ordrH   r~   gecongetrfr   r   )r   r   r3   default_rngr   ZpermutedZlogspaceZintegers
issubdtypefloatingr   r   r   r   r   r,   r&   linalgr   infr   r   r   r   r   )r.   r   r  r   r   r/   Aoffsetr-  r  r9   Znorm_AZ
norm_inv_Ar   anormr0  r1  luipvtr]   r   r0   r0   r1   
test_trcon  s,   $
r=  c                  C   s   dD ]M} t d| d}td| }td| }t|r|d9 }|||\}}}t|d t|d t|rJt|d	 tt|t tt|t qt|d
 qd S )Nrj   lartgr   rJ   rK   r*   333333?r   y       皙?)	r&   r3   rp   iscomplexobjr   r   
isinstancecomplexr$  )r.   r>  rY   gcsZsnrr0   r0   r1   
test_lartg  s   




rG  c            
      C   s  dD ]} d}d}t dd| }t dd| }dt | jd   }| dv r/td	| d
}d}ntd	| d
}|d9 }|d9 }d}t|||||g dg dg|d t|||||ddg ddd||gg|d t|||||dddg d||ddgg|d t|||||ddddg d||ddgg|d t|||||ddddg dd|d|gg|d t|||||dddddd	g d||d|gg|d t|||||ddddg dd|d|gg|d |||||ddd\}}	t||u  t|	|u  t|g d|d t|	g d|d qd S )Nrj   r?  r@  rK   rJ   rf   rH   fdrotr   y             r*   y              @)rL   rL   rL   rL   )r   r   r   r   r   rI   r  )rL   rL   rJ   rJ   r   )offxoffy)rJ   rJ   rL   rL   )incxrL  r   )rL   rJ   rL   rJ   )rK  incyr   )rK  rM  rL  rN  r   )rJ   rJ   rL   rJ   r   )rM  rN  r   )Zoverwrite_xZoverwrite_y)r3   fullr   	precisionr'   r&   r   r   )
r.   ru   r   ur   r   rI  rY   rV   rt   r0   r0   r1   test_rot  sX   

rR  c               	   C   s  t jd t jd} | j| } t jddt jd  }|j |}dD ]}tddg|d\}}|dv 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 q*d S )Nr   )rK   rK   r*   rj   larfglarfr   ZFDr   rH   rH   r   rI   r|   r   Rsider  rJ  )r3   r   r   ri   rr   conjr&   copyr-   r   rs   r   r   )Za0Za0jr.   rS  rT  rV   alphary   rd   expectedr   r0   r0   r1   test_larfg_larf  s,   
,>>r]  c                  C   sB   t dtjdd} d}t| ||ddd}|dks|dksJ d S d S )	NZgesdd_lwork	preferredr.   Zilp64iA%  T)r   r   i`DiD)r&   r3   float32r!   )Zsgesdd_lworkr   r   r0   r0   r1    test_sgesdd_lwork_bug_workaround#  s   ra  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   *   t jd|d}td|f}tt|| d S )Nr|   r   sytrdr3   r   r&   r   r  )rU   r.   r8  rd  r0   r0   r1   test_sytrd_with_zero_dim_array@     z(TestSytrd.test_sytrd_with_zero_dim_arrayr   rH   rJ   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 ]3}t j||d}|d ||d f |d |< d||< t j|||d|| t ||  }t ||}qt |d}|j| ||< t |jt ||}t||dt |j dd	 d S )Nr   )rd  sytrd_lworkrH   rI   r   r   r   rL   r   r           r   ro   )r3   r   r&   arangetriu_indices_fromr   r   r   r   r   r   r-   r
   r   outerrr   r   ri   )rU   r.   r   r8  rd  ri  r   r]   datarc   erd   ri   r   k2Qr  r   Hi_lowerZQTAQr0   r0   r1   
test_sytrdG  s@   





$ zTestSytrd.test_sytrdN)	r   r   r   r;   r(  r)  r   rf  ru  r0   r0   r0   r1   rb  ?  s    
rb  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   rc  )Nr|   r   hetrdre  )rU   rw  r8  rx  r0   r0   r1   test_hetrd_with_zero_dim_array  rg  z(TestHetrd.test_hetrd_with_zero_dim_arrayzreal_dtype,complex_dtyper   rh  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 qFt	||}
||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 ]6}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   )rx  hetrd_lworkrH   rI   r*   r   rH   r   r   rj  rL   r   r   rk  r   ro   rf   )r3   r   r&   rl  rm  Zfill_diagonalr   r   r   r!   r   r   r   r   r-   r   r
   r   rn  rY  rr   r   ri   )rU   r   Z
real_dtyperw  r8  rx  rz  ry   r9   r]   r   ro  rc   rp  rd   ri   r   rq  rr  r  r   rs  rt  ZQHAQr0   r0   r1   
test_hetrd  sR   
"





zTestHetrd.test_hetrdN)r   r   r   r;   r(  r)  r+   ry  zipr   r}  r0   r0   r0   r1   rv    s    
rv  c               
   C   s^  t tD ]\} }td|d\}}t|dddd}| dk rHtjg dg dg d	g d
g dg dg|d}tjg d|d}tjddg|d}n/tg dg dg dg dg dg dg}tdgdgdgdgdgdgg}tjd|d}tjg dg dg|d}||||||d\}	}	}	}
}	| dk rtg d}ntg d}t|
|dd  qd S )!N)ZgglseZgglse_lworkr   rM   rK   rI   )r   r   rX   )g=
ףp=g{Gzg(\ؿ      ?)zGgHzG?gףp=
ӿQ)ffffff@gQ?g?gffffffֿ)r  g{Gz?Qg{Gz?)333333?g333333?r  g
ףp=
)g{Gz{Gz?gzG      ?)g      r  gGz?gHzGgzGg=
ףp=?rk  )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   rk        rk  )rk  r   rk  r  r   )^"L?\}?r  r  )y!f?$_Kdy^gŵ翸F@y!f?}dy61ŵe_@rm   )r   r   r&   r!   r3   rp   r   r   )r   r.   func
func_lworkr   rV   ru   rc   rt   r9   resultr\  r0   r0   r1   
test_gglse  sN   


r  c                  C   s  t d ttt D ]\} }d}| dk r+t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   rf   rK   sytrf_lworkr   )ZsyconsytrfZhetrf_lwork)ZheconZhetrfr*   rI   rH   )r   r   )rV   ipivr:  r   rX   )r   r   r   r+   r&   r   r,   rY  ri   r3   r
   r   r!   r   r   r6  cond)r   r.   r   r  ZfunconZfunctrfr8  r:  r   ldur  r9   rcondr0   r0   r1   test_sycon_hecon  s"   $

*r  c                  C   s   t d ttD ]r\} }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   rf   )r   sygstsyevdsygvdr   rI   r   giUMu?r   )r   r   r   r&   r   r,   ri   r3   r
   r   r   )r   r.   r   r   r  r  r  r8  Beig_gvdr9   r]   rt   rV   eigr0   r0   r1   
test_sygst  s(    r  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   rf   )r   hegstheevdhegvdr   r*   rI   r   -C6?r   )r   r   r+   r&   r   r,   rY  ri   r3   r
   r   r   )r   r.   r   r   r  r  r  r8  r  r  r9   r]   rt   rV   r  r0   r0   r1   
test_hegst=  s(   $$$r  c               	      sv  t jd} d\}}ttD ]\}}td|d\}}t|||}|dk r0t| ||	|}n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   rf      tzrzfZtzrzf_lworkr   rI   r*   r   r   Nc              
      D   g | ]} | |gd d f j |gd d f    qS Nri   rr   rY  r  ZIdVrd   r0   r1   r  x     D ztest_tzrzf.<locals>.<listcomp>rf   r   rk  r   )r3   r   r  r   r   r&   r!   r   r   r,   r   r   ri   r   r   r   r
   r   r   rr   r   r   spacingr   )r/   r   r   r   r.   r  tzrzf_lwr   r8  rzr]   rV  r   Zr0   r  r1   
test_tzrzf\  s,   
&0(r  c               	   C   s  t jd} ttD ]\}}d}|dkr.t| ||| ||d  t| |}d}nt| ||t| |}d}t	d|d\}}}||\}	}
| |d	|}|d
|	|}t
|t| ||d	 dkrldndd |d
|	||d}t
|t| j ||d	 dkrdndd |d|t |t |f< |d
|	||dd}t
|t| j ||d	 dkrdndd | 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   rH   r*   rl   ri   )trttftfttrtfsmr   rI   ro   r   rK   rM   rm   rv   r   r  )rv   r   rJ   rV  )rv   r   rX  N)r3   r   r  r   r   r   r   r
   r,   r&   r   r   rY  ri   rl  )r/   r   r.   r   r8  rv   r  r  r  Afpr9   r  solnZB2r0   r0   r1   	test_tfsm~  s@   .r  c               	      s  t jd} d\}}}ttD ]3\}}td|d\}}t|||}|dk rCt| ||	|}	| ||	|}
td|d\}}n+t| ||| ||d  	|}	| ||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 rd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 matrix 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   )rf   r  r  r  r   rI   )ZormrzZormrz_lworkr*   )ZunmrzZunmrz_lworkr   Nc              
      r  r  r  r  r  r0   r1   r    r  z$test_ormrz_unmrz.<locals>.<listcomp>ri   rl   rf   r   r   rk  r   r   rV  )rX  r   )rX  rv   r   )r3   r   r  r   r   r&   r!   r   r   r,   r   r
   r   r   rr   r  r   r   r   r   rY  ri   )r/   ZqmqnZcnr   r.   r  r  Zlwork_rzr8  rl   Zorun_mrzZorun_mrz_lwZ	lwork_mrzr  r]   r   rr  rv   tolZcqr0   r  r1   test_ormrz_unmrz  sV   

& 
(r  c               	   C   s
  t jd} ttD ]w\}}d}|dkr)| ||| ||d  |}d}n| |||}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 Rectangular Full Packed (RFP) format
    and Standard Triangular Array (TR)
    r   r   rH   r*   rl   ri   )r  r  r   r   r  r  r  )transrr  rI   Nro   F)order)r3   r   r  r   r   r   r,   r&   r   r   r   rY  ri   r   r   reshape)r/   r   r.   r   A_fullr  r  r  ZA_tf_Ur]   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_Tr0   r0   r1   test_tfttr_trttf  sX   ",F,Br  c                  C   s|  t jd} ttD ]\}}d}|dkr&| ||| ||d  |}n	| |||}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   rH   r*   )trttptpttrr   r   r  r  rI   N)r3   r   r  r   r   r   r,   r&   r   r   r   r   ri   r   r   r   )r/   r   r.   r   r  r  r  ZA_tp_Ur]   ZA_tp_LindsZA_tp_U_mZA_tp_L_mr  r  r0   r0   r1   test_tpttr_trttp  s4   $

r  c                  C   s   t jd} ttD ]i\}}d}|dkr3| ||| ||d  |}|| j |t	|  }n| |||}||j |t	|  }t
d|d\}}}||\}}	|||\}
}	t|	dk |||
\}}t|}t|| q
dS )	zk
    Test Cholesky factorization of a positive definite Rectangular Full
    Packed (RFP) format array
    r   r   rH   r*   )pftrfr  r  r   r   N)r3   r   r  r   r   r   r,   rY  ri   r
   r&   r   r   r   )r/   r   r.   r   r8  r  r  r  r  r]   Z	Achol_rfpZA_chol_rr9   ZAcholr0   r0   r1   
test_pftrfD  s$   "r  c                  C   s  t jd} ttD ]}\}}d}|dkr3| ||| ||d  |}|| j |t	|  }n| |||}||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 Rectangular Full
    Packed (RFP) format array to find its inverse
    r   r   rH   r*   )pftrir  r  r  r   r   rI   rK   rM   rm   N)r3   r   r  r   r   r   r,   rY  ri   r
   r&   r   r   r   r   )r/   r   r.   r   r8  r  r  r  r  r  r]   
A_chol_rfpZ	A_inv_rfpZA_inv_rr9   ZAinvr0   r0   r1   
test_pftri_  s*   "
r  c                  C   sf  t jd} ttD ]\}}d}|dkr3| ||| ||d  |}|| j |t	|  }n| |||}||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rd
ndd q
dS )z
    Test Cholesky factorization of a positive definite Rectangular Full
    Packed (RFP) format array and solve a linear system
    r   r   rH   r*   rJ   r   rI   )pftrsr  r  r  r   rK   rM   rm   N)r3   r   r  r   r   r   r,   rY  ri   r
   r   r&   r   r   r   r   r   )r/   r   r.   r   r8  r  ZBf1ZBf2r  r  r  r  r  r]   r  r  r0   r0   r1   
test_pftrs  s2   "r  c                  C   s8  t jd} ttD ]\}}d}|dkr3| ||| ||d  |}|| j |t	|  }n| |||}||j |t	|  }|dk rMdnd}t
dd	| d
f|d\}}}||\}	}
| |d|}||dd|d|	}|||\}}
t|t|| j d|  |d dkrdndd q
dS )zT
    Test for performing a symmetric rank-k operation for matrix in RFP format.
    r   r   rH   r*   rI   r   hr  r  Zfrkr   ro   r   rK   rM   rm   N)r3   r   r  r   r   r   r,   rY  ri   r
   r&   r   r   rr   )r/   r   r.   r   r8  prefixr  r  Zshfrkr  r9   rl   ZAfp_outZA_outr0   r0   r1   test_sfrk_hfrk  s(   " r  c                  C   s  t jd} ttD ]\}}d}|dkr3| dd||f| dd||fd  |}|| j }n| 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   rf   rH   i   r*   r   r   )syconvr  r  r   r|  F)r   Z	hermitianrj  ro   Nrk  r   r   )r3   r   r  r   r   r   r,   rY  ri   r
   r  r   r&   r!   r   r   r   r   )r/   r   r.   r   r8  r  r  trf	trf_lworklwr  Dpermr  r  r]   rV   rp  r  r0   r0   r1   test_syconv  s6   (*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   sB  t jd}ttD ]\}}d}|dkr'||||||d  |}n	||||}dt |dj }t	d|d\}}|||\}	}
}|d	ksPJ t 
|	d
t j||d }t j||d||
 |j   }t |	}t|j | t j||d|dd t|| ||dd |dkr||||||d  |}d}n||||}d}dD ]V}d|fD ]O}||	|
|||d\}}|d	ksJ ||kr|j }n|}|dkr|| }n|| }t|||dd ||fdkr||	|
|\}}|d	ksJ t|| qqtt||	|
|dd tt||	|
|dd q
d S )Nr   r   rH   r*   r   r   )geqrtgemqrtr   r   ro   rk  r   rl   ri   r  rV  r  rX  rv   r  r  r  r8  rW  r  )r3   r   r  r   r   r   r,   r  r   r&   r   r
   ri   rY  r   r   r   r   r   )rU   r/   r   r.   r   r8  r  r  r  rV   tr]   r   rr  rV  rl   	transposerX  rv   ru   qZqC	c_defaultr0   r0   r1   test_geqrt_gemqrt  sT   $ 
"

zTestBlockedQR.test_geqrt_gemqrtc           !      C   s  t jd}ttD ]\}}d}|dkr8||||||d  |}||||||d  |}n||||}||||}dt |dj }t	d|d\}}	d	|d
 |fD ]z}
||
|||\}}}}|d	kswJ 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r%||||||d  |}||||||d  |}d}n||||}||||}d}dD ]}d|fD ]}|	|
||||||d\}}}|d	ksXJ ||krc|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r|	|
||||\}} }|d	ksJ t
|| t
| | qAq;tt|	|
||||dd tt|	|
||||dd qcq
d S )Nr   r   rH   r*   r   r   )tpqrttpmqrtr   r   rI   ro   rk  r   rl   ri   r  r  r  r  r~   r  r8  rW  r  )r3   r   r  r   r   r   r,   r  r   r&   r   r   r   r   r
   ri   rY  r   r   r   r   )!rU   r/   r   r.   r   r8  r  r  r  r  lrV   rt   r  r]   ZB_pentZb_pentr   rr  rV  rl   r  r  rX  rv   ru   rc   r  cdZCDZqCDr  Z	d_defaultr0   r0   r1   test_tpqrt_tpmqrt%  sx   "$*"$
""




zTestBlockedQR.test_tpqrt_tpmqrtN)r   r   r   r:   r  r  r0   r0   r0   r1   r    s    >r  c                  C     t jd} ttD ]\}}d}d}td|d}|dkr<| ||| |d| ||| |  }|| j	 }n| ||| |}||j	 }||\}}}	}
t
|}d||	| d |	| d f< t|
d d	t t jj }d	t t jj }|d
v 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
v r|n|}t||d  d d |d f || j	 d|d q
d S )Nr   rf   rI   pstrfr   rH   r*   rk    r   rI   r  r|  r3   r   r  r   r   r&   r   r,   rY  ri   r   r   r   r`  r   r   r   r   )r/   r   r.   r   rF  r  r8  ru   pivr_cr]   r  single_atoldouble_atolr   r  r0   r0   r1   
test_pstrfy  6   0

2
4r  c                  C   r  )Nr   rf   rI   pstf2r   rH   r*   rk  r  r  r  r|  r  )r/   r   r.   r   rF  r  r8  ru   r  r  r]   r  r  r  r   r  r0   r0   r1   
test_pstf2  r  r  c                  C   sV  t g dg dg dg dg} t g dg dg dg}ttD ]\}}|dk rBt g d	g d
g dg dg}||}n't jg dg dg dg|d}|t g dg dg dgd 7 }||}td|d}||\}}}}	}
}|dk rt| ||d d d f | | ddd q#t|||d d d f | | ddd q#d S )N)g      ?r   g1w-!?gd`TRۿ)r   gsr  r  )gs?r  g2%䃮g,eX)r  gsFg%ug??)y/nҿ&?yDioɴ?Af?y o_[ Acп)ysֿAfҿyPkw?JY8y5;NёCl?)yYڊ?1*?y=yXѿ@a+?yh oſFxrI   )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   r  r  )r3   rp   r   r   r,   r&   r   )desired_realdesired_cplxr   r.   r8  r  rF  ru   ZrowcndZcolcndamaxr]   r0   r0   r1   
test_geequ  sP   





  r  c            
         s   t g d} ttD ]I\}}t jd|d}||dk rdnd t j fddtd	d
D |d}|t t |7 }td|d}||\}}}}	t	t 
|t|  qd S )N)
r   r   r   r   r   r   ro   ro   r   r  rf   r   rI   r   r*   c                    s   g | ]} d |  qS )r   r0   r  r[  r0   r1   r    r  ztest_syequb.<locals>.<listcomp>rL   syequb)r3   rp   r   r   r
   r   Zrot90r   r&   r   log2r,   r   )
Zdesired_log2sr   r.   r8  rc   r   r   scondr  r]   r0   r  r1   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 |g d d S )NrI   rL   i  rP   rH   )r   r*   r   rk  r  r  rM                   i   rL   rL   y              0@)rL   r   r|  )r   ro   ro   r   r   r  r   ro   ro   r   r   )r3   r   r   r   Zzheequbr   r   r  r   rl  Zcheequbr,   	complex64)r8  r   r  r  r]   r0   r0   r1   test_heequb  s   2
( 
r	  c                  C   s.  t jd} d}| |}| || |d  }ttD ]w\}}|dk r:| ||}||}|| }||}n| ||| ||d  }||}|| }||}td|d}td|d}	||dd	\}
}}}|	|
|||dd
\}}|dk rt|||| dd qt|||| dd qd S )Nr   rf   r*   rI   getc2r   gesc2r   r   )Zoverwrite_rhsrK   rm   )	r3   r   r  r   r   r   r,   r&   r   )r/   r   r  r  r   r.   r8  rt   r
  r  r;  r  Zjpivr]   ry   rQ   r0   r0   r1   test_getc2_gesc2  s4   





r  r   )rM   rL   r  jobarM   joburK   jobvjobrrH   jobpc              
   C   s  t jd}| \}	}
dt |j }t| ||}td|d}|dk }|dk }|dko-|	|
k}t |}|dko<| o<| }|dkoG|oD| oG|}|dkoR|oO| oR|}|rXd}n	|s\|r_d}nd	}|dkrw|dkrwtt	||||||||	 dS ||||||||d
\}}}}}}t
|| |s|d	 |d  |d|
  }t|t|dd|d |dkr|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 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   rI   rH   r   r  r   )r  r  r  r  jobtr  NF)r   rJ  )r3   r   r  r   r   r2   r&   rA  r   r   r   r   r   r   rY  ri   identityr6  Zmatrix_rankZcount_nonzero)r   r.   r  r  r  r  r  r  r/   r   r   r   r8  r  ZlsvecZrsvecZl2tranZ
is_complexZinvalid_real_jobvZinvalid_cplx_jobuZinvalid_cplx_jobvZexit_statussvarQ  r   r   r   r]   sigmar0   r0   r1   test_gejsv_general8  sV   !

	"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   rH   rH   rH   rU  r   rf   r8  N)r&   r   r-   r3   rp   r   sinrl  r  r,   Zasfortranarrayri   rZ  r   )r.   r  r  rQ  r   r   r   r]   r8  ZAcr9   r0   r0   r1   test_gejsv_edge_arguments  s.   



r  kwargsrP   r  c                 C   s2   t jdtd}tdtd}tt||fi |  dS )z-Test invalid job arguments raise an Exception)rI   rI   r   r  Nr&  )r  r8  r  r0   r0   r1    test_gejsv_invalid_job_arguments  s   
r  zA,sva_expect,u_expect,v_expect)g)\(@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  )ף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?fc]F)g؁sFڿgZB>?g0L
F%?gq=
ףp)g ?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.
    r  r  r   rJ  N)r&   r.   r   )r8  Z
sva_expectZu_expectZv_expectr   r  r  rQ  r   r   r   r]   r0   r0   r1   test_gejsv_NAG  s   r!  c           "   	   C   s  t j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 ]2\}}|| d }|d d ||gf |d d ||gf< |d d |f  |d d |d f | 7  < qd|d d }}|d d ||gf |d d ||gf< t||| |d |
 }|||||||
\}}t
|
| t|	||d | tv rd}|j|	 }n	d}| j|	 }||||||||d\}}t|	||d tt ||d d || W d    n	1 sNw   Y  tt |||d d | W d    n	1 smw   Y  tt ||||d d  W d    n	1 sw   Y  tt ||d	 |d d |d	  W d    n	1 sw   Y  d	|d	< d	|d	< ||||\}}}}} }!t j||d  d	kd||d   d d S )Nr   rf   r   rH   r  ro   gttrfgttrsr   r   rI   rJ  ri   rl   r  z?gttrf: _d[info-1] is , not the illegal value :0.)r3   r   r  r   r   r2   rZ  r   r   r&   r   r
   r   r   r   ri   rY  r   r  Ztestingr   )"r.   r/   r   r   durc   dldiag_cpyr8  ry   rt   r#  r$  _dl_d_dudu2r  r]   r  r  r  r   r  Zb_cpyx_gttrsrv   Zb_transZ__dlZ__dZ__duZ_du2Z_ipiv_infor0   r0   r1   test_gttrf_gttrs  sf   "$$.$





.r/  z1du, d, dl, du_exp, d_exp, du2_exp, ipiv_exp, b, x)g @r  ffffff?r   )r   r        ffffff@)333333@@r         )r  r  r2  r3  )r4  r5  rN   gC>)ro   r0  rO   )rI   rJ   rK   rL   rL   g@gffffff@      g%@g@g	r?  gffffff&g3@r  rL   rN   r  r   )       @             @      ?            ?      ?      )?r=  ffffff
@333333ӿ333333@ffffff
?)      ?             ?      ?       @      rB  )r=  r>  r?  r@  )rA  rB  rC  rB  y ~:pffffff?)r:  r;  r<  y333333@      y@@y333333@3333332@y333333yffffff-ffffff#@y      333333yfffff?@y333333"@y      𿚙?y      ffffff(@rB  r9  y      @      y      ?       @y      @      @r;  y             r:  r<  y       @       c	                 C   s   t d| d | d f\}	}
|	||| \}}}}}}t|| t|| t||dd t|| |
||||||\}}t|| d S )Nr"  r   r  rJ  )r&   r   )r&  rc   r'  Zdu_expZd_expZdu2_expZipiv_exprt   ry   r#  r$  r)  r*  r+  r,  r  r]   r-  r0   r0   r1   0test_gttrf_gttrs_NAG_f07cdf_f07cef_f07crf_f07csfU  s   2


rD  )r+  r*  r,  c              	   C   s  t jd}||||d  }||d ||d d  }||d ||d d  }t |t |d t |d }t | t jrX|j|j|j|jf\}}}}|| || || || f\}}}}t |j	dd
 }td|f\}	}
|	|||\}}}}}}|
|||||||d\}}td	|f\}}||\}}}||||d\}}t | jd
 }t|||d d S )NiTfr*   rH   ro   r   r~   )r#  gtconr2  r/  g      ?r   )r3   r   r3  r   r4  r5  r   r,   r   r   r   r&   r   r   r   )r.   r   r   r/   rc   r'  r&  r8  r:  r#  rE  r,  r  r]   r  r9   r0  r1  r;  r<  r   r   r0   r0   r1   
test_gtcon  s"     ",rF  ))rJ   rN   )rN   rJ   r   c                 C   r   )Ngeqrfp_lworkr   r   r   r   )r.   r-   rG  r   r   r   r]   r0   r0   r1   test_geqrfp_lwork  r   rH  zddtype,dtypec                 C   sj  t j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d t |dt t | }t |
}t||| | j |d t|f||}|| }t	d|d}||
| |\}}t|d	d| dd t|||d d S )Nr   r   rf   rK   rH   ro   pttrfr   r   zpttrf: info = z, should be 0)err_msgrJ  pttrszpttrs: info = )r3   r   r  r   r   r2   r   rY  rZ  r&   r   r   r   r   rs   ri   )ddtyper.   r/   r   r   rc   rp  r8  r(  rI  r*  _er]   r  r  ry   rt   rK  _xr0   r0   r1   test_pttrf_pttrs  s*   (
rO  c                 C   sp   d}t jd}td|d}t|f| |d }t|d f||}tt||d d | tt|||d d  d S )Nrf   r   rI  r   rI   rH   ro   )r3   r   r  r&   r2   r   r  )rL  r.   r   r/   rI  rc   rp  r0   r0   r1   *test_pttrf_pttrs_errors_incompatible_shape  s   rP  c           
      C   s   d}t jd}td|d}t|f| |d }t|d f||}d|d< d|d< |||\}}}	t||	d  dd||	d   d	 t|f| |}|||\}}}	t|	dkd
 d S )Nrf   r   rI  r   rI   rH   r   z?pttrf: _d[info-1] is r%  z2?pttrf should fail with non-spd matrix, but didn't)r3   r   r  r&   r2   r   r   )
rL  r.   r   r/   rI  rc   rp  r*  rM  r]   r0   r0   r1   'test_pttrf_pttrs_errors_singular_nonSPD  s   rQ  z%d, e, d_expect, e_expect, b, x_expect)rK   rf      r   rL   )r   r7  r  rO   )rK   rP   r      rH   )r8  gK=Ur?  r  rI      A      g      @ro   r  )rS  )   .      )y      0@      0@y      2@      "      ?      )rS  rP   rH   rK   )rB  r9  rZ  y      P@      0@y      0      @y     @W@      O@y     N@     Py     S@      Ty     Q@     Ry      ,@      ;y     A@      .@y             rA  c                 C   s   d}t d|d d}|| |\}}	}
t|||d t|	||d t d|d d}|||	 |\}}
t|||d |jtv rQ|||	|dd\}}
t|||d d S d S )	Nr  rI  r   r   rJ  rK  rH   r|  )r&   r   rY  r.   r+   )rc   rp  d_expectZe_expectrt   Zx_expectr   rI  r*  rM  r]   rK  rN  r0   r0   r1   test_pttrf_pttrs_NAG	  s   
r\  c                 C   s4  t jd}|dkr^t||f| |}|t t |d|   }|| j d }t|d }t|f||d }t|d f||}t |t |d t |d }	||	 | j }
|}n6t|f||}t|d f||}|d }t |t |d t |d }
t |t |d t |d }|||
|fS )Nr   rH   rK   rI   ro   )	r3   r   r  r2   r   r   rY  ri   r   )r.   realtyper   	compute_zr/   ZA_eigZvrrc   rp  Ztrir8  zr0   r0   r1   pteqr_get_d_e_A_z6	  s"   """r`  zdtype,realtyper^  c                 C   s   t d dt| j }td| d}d}t| |||\}}}}	||||	|d\}
}}}t|dd| d	 ttt	|d t|
|d
 |rlt|t
|j t||d
 t|t|
 t
|j ||d
 dS 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   rf   rc   rp  r_  r^  r   zinfo = z, should be 0.rJ  N)r   r3   r   r   r&   r`  r   r   sortr   rY  ri   r  r   )r.   r]  r^  r   ra  r   rc   rp  r8  r_  d_pteqre_pteqrz_pteqrr]   r0   r0   r1   
test_pteqrV	  s    
"
rg  c                 C   sZ   t d td| d}d}t| |||\}}}}||d |||d\}	}
}}|dks+J d S )Nr   ra  r   rf   rK   r_  r^  r   r   r&   r`  r.   r]  r^  ra  r   rc   rp  r8  r_  rd  re  rf  r]   r0   r0   r1   test_pteqr_error_non_spdw	  s   rk  c           	      C   s   t d td| d}d}t| |||\}}}}tt||d d |||d tt|||d d ||d |rEtt||||d d |d d S d S )Nr   ra  r   rf   ro   rh  )r   r&   r`  r   r  )	r.   r]  r^  ra  r   rc   rp  r8  r_  r0   r0   r1   "test_pteqr_raise_error_wrong_shape	  s    rl  c                 C   sf   t d td| d}d}t| |||\}}}}d|d< d|d< |||||d\}	}
}}|dks1J d S )Nr   ra  r   rf   r   rh  ri  rj  r0   r0   r1   test_pteqr_error_singular	  s   rm  zcompute_z,d,e,d_expect,z_expect)gp=
ף@r  gq=
ףp?r  )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%u)gǘ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.
    r  ra  r   rH   ro   rb  rJ  N)r&   r.   r3   r   r   r   )r^  rc   rp  r[  Zz_expectr   ra  r_  r*  rM  Z_zr]   r0   r0   r1   test_pteqr_NAG_f08jgf	  s   "rn  matrix_size)r   )rN   rM   rM   rM   c              
   C   s  t jd}dt | j }dt | j }td| d}td| d}|\}}t||f| |d}	||	\}
}}t |
}||kr\t 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orgqrr  )rd   r   r   r   r  ro   )r3   r   r  r   r   r&   r2   r   r   r   r
   r-   rY  ri   r   allr   rT   r   r   )r.   ro  r/   r   r   rr  Zgqrr   r   r8  Zqr_Ard   r]   rF  Zqqrr  Z
A_negativeZr_rq_negZq_rq_negZrq_A_negZtau_negZinfo_negr0   r0   r1   test_geqrfp	  s6   
"(rt  c                  C   s(   t g } td| jd}tt||  d S )Nrr  r   )r3   rp   r&   r.   r   r   )ZA_emptyrr  r0   r0   r1   #test_geqrfp_errors_with_empty_array	  s   
ru  driver)Z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 d S  tyR } zt| |  d|  W Y d }~d S d }~ww )	N  rx  _lworkr   r   rH   r|  $_lwork raised unexpected exception: r   r+   r&   r!   r   r;   Zfailrw  rv  r   r.   Zsc_dlwZdz_dlwrp  r0   r0   r1   test_standard_eigh_lworks
  s   &r  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 d S  tyR } zt| |  d	|  W Y d }~d S d }~ww )
Nrz  rx  r{  r   r   rH   r  r  r|  r}  r~  r0   r0   r1   test_generalized_eigh_lworks
  s   &r  dtype_r   )rH   rf   r   r  c                 C   sx   t d td|}|| }| tv rdnd}|d }t|| d}t||||}|dkr,|n|f}tdd |D s:J d S )	Nr   r   orun	csd_lworkr   c                 S   s   g | ]}|d kqS r   r0   r  r0   r0   r1   r  .
  s    z*test_orcsd_uncsd_lwork.<locals>.<listcomp>)r   r   r   r&   r!   rs  )r  r   rX   r  rw  dlwr  lwvalr0   r0   r1   test_orcsd_uncsd_lwork#
  s   
r  c              
   C   s  d\}}}| t v rdnd}|dkrt|nt|}t|d |d f| d\}}t||||}|dkr8d|inttddg|}	||d |d |f |d ||d f ||d d |f ||d |d f fi |	\
}
}}}}}}}}}|d	ks|J t||}t||}t	t	||t	|| || }t	||| }t	||| | }t	|| || }t	|| || | }t
j||f| d}| d
}t|D ]}||||f< qt|D ]}|||| || f< qt|D ]}| ||| | || | | | | f< qt|D ]}|||| | | || | f< qt|D ]N}t
|| ||| || f< t
|| ||| | || | | f< t
||  ||| || | | | f< t
|| ||| | || f< q|| | }t||ddt
| j d d S )N)rq  P      r  r  csdr  r   r   Zlrworkr   r   rk  g     @r  )r   r"   Zrvsr#   r&   r!   dictr~  r   r  r3   r   r   cosr  r   r   r   )r  r   rX   r  rw  Xdrvr  r  ZlwvalsZcs11Zcs12Zcs21Zcs22thetau1u2Zv1tZv2tr]   r  ZVHrF  Zn11Zn12Zn21Zn22Soner  ZXcr0   r0   r1   test_orcsd_uncsd1
  sJ   
T

,$*,& r  
trans_boolFfactr  c           !      C   s$  t j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}|rX| tv rVd
ndnd}|ra|	 j
n|| }| |	 |
 | g}|dkr}|||	|
ndgd \}}}}}}|||	|
||||||||d}|\
}}}}}}}}}} t| dkd|  d t||d  t|	|d  t|
|d	  t||d  t|||d tt|ddud|  t|jd |jd kd|jd  d|jd   t|jd |jd kd|jd  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   rf   rH   r  ro   rI   ri   rl   r  r  NrM   r  rv   dlfdfdufr,  r  r   z?gtsvx info = z, should be zerorJ   rJ  __len__Trcond should be scalar but is ferr.shape is z but should be berr.shape is )r3   r   r  r   r   r&   r2   r   r   rY  ri   rZ  r   r   r   r   r-   )!r.   r  r  r/   r   r  r#  r   r'  rc   r&  r8  ry   rv   rt   Z
inputs_cpydlf_df_duf_du2f_ipiv_info_	gtsvx_outr  r  r  du2fr  x_solnr  ferrberrr]   r0   r0   r1   
test_gtsvx`
  sB   """r  c                 C   s  t j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v rLd	nd
}|rU|
 jn|
| }|dkrc||||	nd gd \}}}}}}||||	||||||||d}|\
}}}}}}}}}}|dkrd|d< d|d< ||||	|}|\
}}}}}}}}}}|dksJ dd S |dkrd|d< d|d< d|d< ||||	|||||||d
}|\
}}}}}}}}}}|dksJ dd S d S )Nr   r  r   rf   rH   r  ro   rI   ri   rl   r  rM   r  r  r   z&info should be > 0 for singular matrix)r  r  r  r  r,  r  )	r3   r   r  r&   r2   r   r   rY  ri   )r.   r  r  r/   r  r#  r   r'  rc   r&  r8  ry   rv   rt   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r]   r0   r0   r1   test_gtsvx_error_singular
  sB   "
r  c                 C   s<  t j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v rLd	nd
}|rU|
 jn|
| }|dkrc||||	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 d S t	t
||||	||||d d ||||d t	t
||||	|||||d d |||d t	t
||||	||||||d d ||d t	t
||||	|||||||d d |d d S )Nr   r  r   rf   rH   r  ro   rI   ri   rl   r  rM   r  r  )r3   r   r  r&   r2   r   r   rY  ri   r   r  r   )r.   r  r  r/   r  r#  r   r'  rc   r&  r8  ry   rv   rt   r  r  r  r  r  r  r0   r0   r1   "test_gtsvx_error_incompatible_size
  sZ   "

r  zdu,d,dl,b,xc              
   C   sB   t d|jd}|||| |}|\
}}}	}
}}}}}}t|| d S )Nr  r   r&   r.   r   )r&  rc   r'  rt   ry   r  r  r  r  r  r  r  r  r  r  r  r]   r0   r0   r1   test_gtsvx_NAG  s   r  zfact,df_de_lambdac                 C      t d|jd| |S NrI  r   r&   r.   rc   rp  r0   r0   r1   <lambda>&  
    r  c                 C      dS N)NNNr0   r  r0   r0   r1   r  (      c                 C   s  t j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| d t|| t |dt t | }t |}t|
|| t |j |d t|drJ d| t|jdkd|j d t|jdkd|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   rL   rK   rH   ro   rI   r  r  r  efr   zinfo should be 0 but is .rJ  r  r  )rI   r  z# but should be ({x_soln.shape[1]},)r  N)r3   r   r  r   r   r&   r2   r   rY  rZ  r   r   r   r   r   ri   r   r-   )r.   r]  r  df_de_lambdar/   r   r  r   rc   rp  r8  r  rt   r  r  r]   r(  ry   r  r  r  r  r  r0   r0   r1   
test_ptsvx"  s6   (


r  c                 C   r  r  r  r  r0   r0   r1   r  a  r  c                 C   r  r  r0   r  r0   r0   r1   r  c  r  c              
   C   s   t j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   r  r   rL   rK   rH   ro   rI   r  r  )
r3   r   r  r&   r2   r   rY  r   r  r   )r.   r]  r  r  r/   r  r   rc   rp  r8  r  rt   r  r  r]   r0   r0   r1   test_ptsvx_error_raise_errors]  s   (  $r  c                 C   r  r  r  r  r0   r0   r1   r  |  r  c                 C   r  r  r0   r  r0   r0   r1   r  ~  r  c                 C   sr  t jd}td| d}d}t|f||d }t|d f| |}t |t |d t t |d }	t|df| |d	}
|	|
 }|||\}}}|d
krd|d< |||\}}}||||\}}}}}}}|dkrn||kspJ t|f||}||||\}}}}}}}|dkr||ksJ d S |||\}}}d|d< d|d< |||||||d\}}}}}}}|dksJ d S )Nr   r  r   rL   rK   rH   ro   rI   r  r  r   rJ   r  )r3   r   r  r&   r2   r   rY  )r.   r]  r  r  r/   r  r   rc   rp  r8  r  rt   r  r  r]   ry   r  r  r  r0   r0   r1   test_ptsvx_non_SPD_singularx  s0   (
r  zd,e,b,xc                 C   s6   t d|jd}|| ||\}}}}}	}
}t|| d S )Nr  r   r  )rc   rp  rt   ry   r  r  r  Zx_ptsvxr  r  r  r]   r0   r0   r1   test_ptsvx_NAG  s   r  r   c                    s   t jd}t | jd }d\ }t  g| |d}t |g| |d}| j| t j | d| d  }|rO fddt	 D  fd	dt	 D f}nd
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   )rf   rK   r  r   r   c                    s    g | ]}t | D ]}|q	qS r0   r   r  yry   r  r0   r1   r         z5test_pptrs_pptri_pptrf_ppsv_ppcon.<locals>.<listcomp>c                    s    g | ]}t | D ]}|q	qS r0   r  r  r  r0   r1   r    r  c                 S   s   g | ]}t |D ]}|qqS r0   r  r  r0   r0   r1   r    s    rH   c                 S   s"   g | ]}t |D ]}|d  qqS r  r  r  r0   r0   r1   r    s   " )ppsvpptrfpptrspptrippconr^  r_  r|  r   r  )r:  r   r  )r3   r   r  r   r   r2   rY  ri   r
   r   r&   r   r   r   r   r   r6  r   r   r   r  )r.   r   r/   r   r   rV   rt   r  Zapr  r  r  r  r  Zulr]   ZaulZuliZauliry   bxZxvr:  r  r0   r  r1   !test_pptrs_pptri_pptrf_ppsv_ppcon  sL   $





,r  c                 C   s6  t jd}t | jd }d}t||g| |d}td| d\}}|dd |d	d
}t|d d |d }|d }	|d }
| tv rLt	|t 
|d|d t	|	| |	 j |d|d |||	dd}t|d d |d }|d }	| tv rt	|t 
|d|d t	|	| |	 j |d|d t	|d |
d|d d S )Nr   r   rf   r  )geestrexcr   c                 S      d S r  r0   ry   r0   r0   r1   r    r  z!test_gees_trexc.<locals>.<lambda>Fr  ro   r   r  rp  r  rN   rH   r   r|   r3   r   r  r   r   r2   r&   r   r+   r   r   rY  ri   )r.   r/   r   r   rV   r  r  r  r  r_  d2r0   r0   r1   test_gees_trexc  s*   r  zt, expect, ifst, ilst)r@  g)\({Gz?gQ?)rk  皙r  ffffff?)rk  gr  g?)rk  rk  rk  r  )r  lV}gV_?g|?5^?)g?r  gV/?g;On?)rk  rk  r@  ggj+)            y
ףp=
?
ףp=
׿yRQȿQ?y)\(?      п)r               @yQ
ףp=
yq=
ףpͿp=
ף?)r  r         @      yGz?(\?)r  r  r        @      )r  y1%Ŀq?ys??ܵ|ȿyHzG??ܵ?)r  r  yV/?ݓ?yjt?vտ)r  r  r  yB>٬?=U?)r  r  r  r  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.
    r  r  r   r   )Zwantqro   rJ  N)r&   r.   r   r   )r  ZifstZilstexpectr   r  r  r0   r0   r1   test_trexc_NAG  s   r  c                 C   s  t j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v rvt	|	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v 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   rf   r  )ggestgexcr   c                 S   r  r  r0   r  r0   r0   r1   r  J  r  z!test_gges_tgexc.<locals>.<lambda>Fr   Zoverwrite_bro   r   rH   r  r  r|   rp  r  rN   rI   rJ   r  r  )r.   r/   r   r   rV   rt   r  r  r  r   r  r  r_  d1r  r0   r0   r1   test_gges_tgexc?  s@    r  c                 C   sx  t jd}t | jd }d}t||g| |d}td| d\}}}|dd |d	d
}t|d d |d }	|d }
|	d }| tv rMt	|	t 
|	d|d t	|
|	 |
 j |d|d t |}d|d< t|||	}| tv rx|||	|
|d}n|||	|
||d d}t|d d |d }	|d }
| tv rt	|	t 
|	d|d t	|
|	 |
 j |d|d t	|	d |d|d d S )Nr   r   rf   r  )r  trsentrsen_lworkr   c                 S   r  r  r0   r  r0   r0   r1   r  z  r  z!test_gees_trsen.<locals>.<lambda>Fr  ro   r   r  rp  r  rH   rM   r   r   Zliworkr|   r3   r   r  r   r   r2   r&   r   r+   r   r   rY  ri   r   r!   )r.   r/   r   r   rV   r  r  r  r  r  r_  r  selectr   r0   r0   r1   test_gees_trseno  s8   
r  z*t, q, expect, select, expect_s, expect_sep)g/$?gQIg~jtx?gJ4?)rk  58EGrgGr?gyX5;?)rk  g?߾r  gt?)rk  rk  rk  gyǹ)g؁sF?g_L?gGz?gUN@?)goT?g0*g'gz6>W)g(g&䃞ͪӿgbX9ҿg-!lV?)gb=y?gۊe?r  g8EGr?)r  g?gQg(\ſ)g
ףp=
?gQ?r   r  )g)\(ܿgQտgQg(\?)r  g{GzԿgp=
ףg)\(?)rH   r   r   rH   g      ?g(\	@)yqh yfc]F?ڊe׿yMbȿ&S?y&1??п)r  y      ?5^I @yo0*yZd;OͿ~:p?)r  r  yx$(@4@y[ A?&?)r  r  r  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v r!||| ||
d}n||| ||
|
d d}t|d d	 |d	 } |d }| jtv rI|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.
    r  r  )r  r  r   r   rH   r  ro   r   rK   rL   rM   rJ  N)r&   r.   r!   r+   r   r   rY  ri   )r  r  r  r  Zexpect_sZ
expect_sepr   Zatol2r  r  r   r  r   sepr0   r0   r1   test_trsen_NAG  s(   0



r  c                 C   sL  t j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v rwt	|
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v 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   rf   r  )r  tgsentgsen_lworkr   c                 S   r  r  r0   r  r0   r0   r1   r    r  z!test_gges_tgsen.<locals>.<lambda>Fr  ro   r   rH   r  r  r|   rp  r  rM   r   ir7  r  r  )r.   r/   r   r   rV   rt   r  r  r  r  r   r  r  r_  r  r  r  r   r0   r0   r1   test_gges_tgsen  sL   
 r  za, b, c, d, e, f, rans, lans)r   r   r   r   )rk  r   r   r   )rk  r   r   r   )rk  rk  rk  g      @)r   r   r   r   )rk  rk  rk  r   )      r   r   g      (@)g      "r          r  )r  r   r  r   )      r   r6  g      3@)r   r   r   r   )rk  r   r   r   )rk  rk  r   r   )rk  rk  rk  r   )r   r   r   r   )rk  r   r   r   )rk  rk  rk  r   )r  r   rk  r   )r1  r   g       rk  )r  r         r   )r  r   rk  r   )r  r   r  r  )r  r   r   r   )r  r   r  r   )r   r  r   r  )r   r   r  r   )r  r   r   r  )r   r  r   r   c	                 C   s   d}	t d|d}
|
| |||||\}}}}}t|d t|ddt|jd dd t|d	dt|jd d
d t|||	dd t|||	dd d S )Nr  tgsylr   r   r   r   zSCALE must be 1.0r   r   rJ  rk  zDIF must be nearly 0zSolution for R is incorrect)r   rJ  zSolution for L is incorrect)r&   r   r   r3   r   r   )rV   rt   ru   rc   rp  rY   ZransZlansr.   r   r  routloutrQ   difr]   r0   r0   r1   test_tgsyl_NAG!  s    $

r  rv   )r  ri   ijob)r   rH   rI   rJ   rK   c              
   C   s  | t jkrdnd}t jd}d\}}t|dd||g| |dd||g| dd^}}}	t|dd||g| |dd||g| dd^}
}}	|d	d
||g| }|d	d
||g| }td| d}|||
||||||d\}}}}}|dksJ d|dksJ d|dkrt|ddt 	| j
d dd n|dksJ d|d
kr
|dkr|| ||
  }|| }|| ||  }|| }n*|dkrt || t ||  }|| }|t |
 |t |  }d| | }t|||ddd t|||ddd d S d S )NgMbP?g|=l   OElt/ r  irf   r   )outputr   rI   r  r   )rv   r  r   zINFO is non-zerork  zSCALE must be non-negativer   zDIF must be 0 for ijob =0r  zDIF must be non-negativer  ri   r  zlhs1 and rhs1 do not match)r   r   rJ  zlhs2 and rhs2 do not match)r3   r`  r   r3  r    uniformr,   r&   r   r   r   r  )r.   rv   r  r   r/   r   r   rV   rc   r9   rt   rp  ru   rY   r  r  r  rQ   r  r]   Zlhs1Zrhs1Zlhs2Zrhs2r0   r0   r1   
test_tgsylU  sT   




r  mtyper{  c                 C   sN  | dkr|t v rtd tjd}d\}}|tv r1|j||fd|j||fdd  |}n|j||fd|}| dkrE||j	 n||
 j	 }|j||fd|}|  d|  d	|  d
f}t||d\}	}
}|
||d}|	||d\}}}|dksJ ||||d\}}|dksJ t|j}t|| |d| | d d S )Nry  zhetrs not for real dtypes.l   *M/t|0 )r   rL   r   r*   rx  r  r  trsr   r|  r   r   )rV   r  rt   r   rJ  )r   r;   r<   r3   r   r3  r+   r  r,   ri   rY  r&   r   r   r   )r  r.   r   r/   r   r   r8  rt   rC   r  r  r   r   r  r  r]   ry   r   r0   r0   r1   test_sy_hetrs  s$   
, r  r{   z
uplo, m, n))r  rL   rf   )r  rf   rf   )r  rf   rL   )r  rf   rf   c                 C   s   t jd}|j||fd|}td|f\}}	|| |||d}
|dkr*t |nt |}|dkrAt t||}d|||f< |	| |}t	|
|dd d S )	Nl   8#q9
r   )lantrr}   )r  r   r  rH   g>r   )
r3   r   r3  r,   r&   r   r   rl  r  r   )r   r  r   r   r   r.   r/   r8  r  r}   r  r  r   r0   r0   r1   
test_lantr  s   
r  r   )	functoolsr   r   Znumpy.testingr   r   r   r   r   r   r;   r	   r   numpyr3   r
   r   r   r   r   r   r   r   Znumpy.randomr   r   r   Zscipy.linalgr   r6   r   r   r   r   r   r   r   r   r   r   r    Zscipy.linalg.lapackr!   Zscipy.statsr"   r#   Zscipy.sparsesparser  Zscipy.__config__r$   ImportErrorr%   r4   r&   Zscipy.linalg.blasr'   r`  r   r   r  Z
complex128r+   r   Zblas_providerZblas_versionr2   rE   rG   r   r   r(  r)  r   r   r   r   r  r=  rG  rR  r]  ra  rb  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Zskipifr	  r  r   r  r  r  rp   r!  r/  rD  rF  rH  r~  rO  rP  rQ  r\  r`  rg  rk  rl  rm  rn  rt  ru  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r?   r  r0   r0   r0   r1   <module>   s   (8` t  #**DO1")::) %# ((-
e
#





[




+
/

	
 
@.:0
0


4




%

.$	/-*!8"0