B
    `                @   s`  d dl Z d dlZ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  d dlm!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d d	lm)Z) d d
l*m+Z+ d dl,m-Z-m.Z. d dl/m0Z1 yd dlm2Z3 W n e4k
r2   dZ3Y nX d dl*m5Z5 d dl6m7Z7 ej8ej9gZ:ej;ej<gZ=e:e= Z>dd Z?dd Z@G dd deAZBG dd deAZCG dd deAZDejEFde>ejEFddddgdd ZGG d d! d!eAZHG d"d# d#eAZIG d$d% d%eAZJG d&d' d'eAZKd(d) ZLd*d+ ZMd,d- ZNejEjOd.d/ ZPG d0d1 d1eAZQG d2d3 d3eAZRd4d5 ZSd6d7 ZTd8d9 ZUd:d; ZVd<d= ZWd>d? ZXd@dA ZYdBdC ZZdDdE Z[dFdG Z\dHdI Z]dJdK Z^dLdM Z_dNdO Z`G dPdQ dQeAZadRdS ZbdTdU ZcdVdW ZddXdY ZeejEjfdZd[d\d]d^ Zgd_d` ZhejEFdadbdcgejEFde:ejEFddeideejEFdfeidgejEFdheidgejEFdid djgejEFdkd djgddldmZjejEFde:dndo ZkejEFdpdddqidfdqidhdqididqidrdqidkdqifdsdt ZlejEFduemdvdwdxdygdzd{d|d}gd~dddgddddgddddgddddggemddddgemddddgddddgddddgddddgddddgddddggemddddgddddgddddgddddggfgdd ZnejEFde>dd ZoejEFdemddddgemdddddgemddddgemddddgemdddddgemdddgemdddgddgemddgddgddgddgddggemddgddgddgddgddjggf	emddddgemdddddgemddddgemddddgemdddddgemdddgemdddgddgemddgddgddgddgddggemddgddgddgddgddggf	gdd ZpejEFde>ejEFddddgdd  ZqejEFdere:e: e>dd ZsejEFdere:e: e>dd ZtejEFdere:e: e>dd ZuejEFdemdgd	d
ddgemdd͐ddgemdgdqdddjgemd֐dddgemded	gdqdggddqgddgd̐dggemddgddgdjdgddegddggfemddddgemdddgemddqdjdggemdddgemddgddgddgdd ggemdd!gddgddgddggfgd"d# Zvd$d% ZwejEFd&ere>e:e: ejEFd'eid҃d(d) ZxejEFd&ere>e:e: ejEFd'eid҃d*d+ ZyejEFd&ere>e:e: ejEFd'eid҃d,d- ZzejEFd&ere>e:e: ejEFd'eid҃d.d/ Z{ejEFd0demd1d2d3dgemd4d5d6gemd7d8d9d:gemd;d<d=d>gd?d@dAdBgdCdDdEdFgdGdHdIdJggfgdKdL Z|ejEFde>ejEFdMddNdOgdPdQ Z}dRdS Z~ejEFdTdUdVdWdXgejEFdYdZd[gd\d] ZejEFdTd^d_gejEFdYdZd[gd`da ZejEFdbe>ejEFdcdjd	dddegdfdg ZejEFdbe>dhdi ZejEFde>ejEFdjdkdZgejEFdldmdngdodp ZejEFde>ejEFdjd djgejEFdldmdngdqdr ZejEFde>d ejEFdjdkdZgejEFdldmdngdsdt ZejEFduemddddgemdddddgemddddgemddgddgddgddgddggemddgddgddgddgddjggfemddddgemdddddgemddddgemddgddgddgddgddggemddgddgddgddgddggfgdvdw ZejEFd&ere>e:e: ejEFdxdmdydz fdnd{dz fgd|d} ZejEFd&ere>e:e: ejEFdxdmd~dz fdnddz fgdd ZejEFd&ere>e:e: ejEFdxdmddz fdnddz fgdd ZejEFdemdgd	d
ddgemdd͐ddgemded	gdqdggddqgddgd̐dggemddgddgdjdgddegddggfemddddgemdddgemddgddgddgdd ggemdd!gddgddgddggfg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 )Ny              ?)COMPLEX_DTYPESnprandomr   astype)shapedtype r,   M/home/dcms/DCMS/lib/python3.7/site-packages/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g}t }x4tt D ](}|d	sF||krF|| krF|	| qFW |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_function_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_documented3   s    


rB   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}xdD ]}t t|d d }|d krlqN||\}}}}}	t|	 t|	 t|| t||fd
t|d
 d f t|tt| ||ddd\}}}}}	t|	 t|	 qNW d S )N                        	   r   ga2U0*3?gMb`?ZsdzcZgebal)Zpermutescale)	getattrr2   r   reprr   r   lenr'   r   )
selfaa1pfbalohiZpivscaleinfor,   r,   r-   
test_gebalF   s     




zTestFlapackSimple.test_gebalc             C   sf   dddgdddgddd	gg}xDd
D ]<}t t|d d }|d kr@q"||\}}}t| t| q"W d S )Nikiifi     i"  iiidZgehrd)rN   r2   r   rO   )rQ   rR   rT   rU   ZhttaurY   r,   r,   r-   
test_gehrd[   s    
zTestFlapackSimple.test_gehrdc             C   sb  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}x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 qNW d S )NrD   rE   r   rG   rH   rI   rK   rL   
         TfdFD)trsyly              ?C)ZtranaZtranb)decimal)Zisgn)	r'   arrayr)   r$   isupperr   dot	conjugaterb   )rQ   rR   bctransr+   rS   b1Zc1rd   xrM   rY   r,   r,   r-   
test_trsylf   s(    "
"zTestFlapackSimple.test_trsylc       	      C   s.  t dddgdddgddd	gg}xd
D ]}xdD ]}||}| rZ|d  d7  < td|f\}|||}|dkr|dkrd}nd}t t t t |}t	||| q4|dkrt 
t |}nH|dkrt 
t jt |dd}n$|dkrt 
t jt |dd}t|| q4W q*W d S )Nikiifi  r[   i"  iiirc   ZMm1OoIiFfEe)r   r   y              ?)langeZFfEeZFfrF   rJ   ZMmZ1Oor   )axisZIirD   )r'   rh   r)   ri   r$   sqrtsumZsquareabsr   maxr   )	rQ   rR   r+   Znorm_strrS   rr   valuerf   refr,   r,   r-   
test_lange   s0    



zTestFlapackSimple.test_langeN)__name__
__module____qualname__rZ   r^   rq   rz   r,   r,   r,   r-   rC   D   s   rC   c               @   s   e Zd Zdd Zdd ZdS )
TestLapackc             C   s   t tdr
d S )Nempty_module)hasattrr2   )rQ   r,   r,   r-   test_flapack   s    
zTestLapack.test_flapackc             C   s   t tdr
d S )Nr   )r   r0   )rQ   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 xttD ]\}}d}d}d}t|||}t||}td|d\}}	t|	|||}
||||
d\}}}t|dk |||d	| |
d
\}}}t|dk qW xt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|| qW xt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|| qW d S )$Ni  r_      rD   )gels
gels_lwork)r+   )lworkr   ZTTCC)rn   r   g      ?g       @g      @g      @g      @g       @g      0@g      1@g      4@)r   r   geqrfrE   rg   g,g-@   )rtoly      ?      @y      @      ?y      @      y      @       y       @ffffff?y      1@       @y      4@      yR ?\jy,? W?)r   	enumerateDTYPESr   r)   r$   r    r   REAL_DTYPESr'   rh   r*   rP   r   finfoepsr   r&   )rQ   indr+   mnnrhsrS   ro   ZglsZglslwr   r4   rY   r   r   r   Zlqrrp   Z	lqr_truthr,   r,   r-   	test_gels   sf    





z!TestLeastSquaresSolvers.test_gelsc          
   C   sH  x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rx|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W x&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"W d S )!Ng      ?g       @g      @g      @g      @g       @)r+   g      0@g      1@g      4@)gelsdgelsd_lworkrE   rD   rg   Fg,g-@r   )r   gYN))1)@g*@.?y      ?      @y      @      ?y      @      y      @       y       @ffffff?y      1@       @y      4@      yR ?\jy,? W?gU.*@g_Y@)r   r'   rh   r$   r*   rP   intrealr   r   r   r&   )rQ   r+   rS   ro   r   r   r   r   r   workiworkrY   r   Z
iwork_sizerp   srankZrworkZ
rwork_sizer,   r,   r-   
test_gelsd   s^    







z"TestLeastSquaresSolvers.test_gelsdc             C   s4  x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rx|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W x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W d S )!Ng      ?g       @g      @g      @g      @g       @)r+   g      0@g      1@g      4@)gelssgelss_lworkrE   rD   rg   Fg,g-@r   )r   gYN))1)@g*@.?y      ?      @y      @      ?y      @      y      @       y       @ffffff?y      1@       @y      4@      yR ?\jy,? W?gU.*@g_Y@)r   r'   rh   r$   r*   rP   r   r   r   r   r   r&   )rQ   r+   rS   ro   r   r   r   r   r   r   rY   r   vrp   r   r   r,   r,   r-   
test_gelss3  sV    







z"TestLeastSquaresSolvers.test_gelssc          	   C   s@  x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rx|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W x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$W d S )Ng      ?g       @g      @g      @g      @g       @)r+   g      0@g      1@g      4@)gelsyr   rE   rD   r_   Frg   g,g-@r   )r   y      ?      @y      @      ?y      @      y      @       y       @ffffff?y      1@       @y      4@      yR ?\jy,? W?)r   r'   rh   r$   r*   rP   r   r   r   r   r   int32r   r&   )rQ   r+   rS   ro   r   Zgelsy_lworkr   r   r   r   rY   r   Zjptvr   rp   jr   r,   r,   r-   
test_gelsyl  sR    



z"TestLeastSquaresSolvers.test_gelsyN)r{   r|   r}   r   r   r   r   r,   r,   r,   r-   r      s   D<9r   r+   r*   )rF   rG   )rH   rE   )i   i   c             C   s2   t d| d}|\}}|||d\}}t|d d S )Ngeqrf_lwork)r+   )r   r   r   )r$   r   )r+   r*   r   r   r   r   rY   r,   r,   r-   test_geqrf_lwork  s    r   c               @   s   e Zd Zdd ZdS )TestRegressionc       
      C   s   xt 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W d S )
N)i,  rE   )r+   gerqfrE   )r   orgrqrD   ungrq)r   r'   r   r$   assert_raises	Exceptionr   r&   )
rQ   r+   rR   r   Zrqr]   r   rY   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   xdD ]}xd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W qW d S )N)TF*   )rF   rF   )size)potrfZpotri)cleanr   )r'   r(   r   normalrj   rb   r$   r   r   r   r   )
rQ   lowerr   rp   rR   ZdpotrfZdpotrirm   rY   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   sx  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 }	xBtd|D ]4}
||
||}|	|d
  t|d dkd|
  qW t |	d d d	 }	tt t |	 df t||	dt t jj dt t jj d d S )Ng      @g      @g       @r   g(\@g@g333333grg   rD   F)Zfull_matrices
compute_uvoverwrite_aZcheck_finite)r   lasd4rF   zcLAPACK root finding dlasd4 failed to find                                     the singular value %izThere are NaN rootsd   )atolr   )r'   rh   hstackZvstackdiagr   rP   Znewaxisr   concatenater   r$   ranger=   r   anyisnanr   r   float64r   )rQ   ZsigmasZm_vecMZSMZit_lenZsgmZmvcr   rootsiresr,   r,   r-   test_sing_val_update  s*    
*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#rG   rD   rg   rF   rE   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)abrl   uplogh㈵>)r   r   N)r   r'   rh   r&   
ValueErrorr$   r   r   )rQ   r+   r   rl   Zx_outr   rp   rY   r,   r,   r-   test_nag_example_f07vef_f07vsf  sD    	







z(TestTbtrs.test_nag_example_f07vef_f07vsfzdtype,transc             C   s.   g | ]&}d D ]}|dkr |t ks||fqqS ))Nrb   re   re   )r   ).0r+   rn   r,   r,   r-   
<listcomp>'  s   
zTestTbtrs.<listcomp>r   Ur   r   r   c                s~  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 }x:t|D ].\}}|	|||t
|dt| f< qW t|f }||||||d\}}t|d |dkr2t|| |dd nH|dkrRt|j| |dd n(|dkrrt|j| |dd ntdd S )Ni  )rG   rF   rE   r   )r+   r   rD   rg   c                s   g | ]} t | qS r,   )rv   )r   rp   )r   r,   r-   r   ;  s    z2TestTbtrs.test_random_matrices.<locals>.<listcomp>c                s   g | ]}t |f qS r,   )r.   )r   width)r+   r,   r-   r   <  s   Zdia)formatr   )r   rl   r   rn   r   r   g-C6
?)r   rb   re   zInvalid trans argument)r   r$   r   r'   r   spsZdiagsr   r   Zdiagonalrw   minr.   r   r   rb   Hr   )rQ   r+   rn   r   r   r   Zkdr   Zis_upperZkuklZband_offsetsZband_widthsZbandsrR   r   rowkrl   rp   rY   r,   )r+   r   r-   test_random_matrices&  s4    

*



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+   rG   rE   N)r$   r'   r   r   r   r   )rQ   r   rn   r   r   r   rl   r,   r,   r-   &test_invalid_argument_raises_exceptionY  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.)rF   rG   )r+   rG   r   r   )rg   rF   r   )r   rl   r   N)r'   r   floatr$   r   )rQ   r   rl   r   r4   rY   r,   r,   r-   test_zero_element_in_diagonalf  s    z'TestTbtrs.test_zero_element_in_diagonalzldab,n,ldb,nrhs)rH   rH   r   rH   )rH   rH   rF   rH   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   )rQ   Zldabr   Zldbr   r   rl   r   r,   r,   r-   test_invalid_matrix_shapesv  s    z$TestTbtrs.test_invalid_matrix_shapesN)r{   r|   r}   r6   markparametrizer   r   r   r   r   r   r,   r,   r,   r-   r     s   ..
r   c              C   s   xd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W d S )Nrc   lartg)r+   rF   rG   y              ?g333333?g      @y       g?)	r$   r'   rh   iscomplexobjr   r   typecomplexr   )r+   r   rU   gcsZsnrr,   r,   r-   
test_lartg  s    





r   c        
      C   sH  x@dD ]6} d}d}t dd| }t dd| }dt | jd   }| dkrbt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W d S )Nrc   g333333?g?rG   rF   r_   rD   fdrot)r+   y             y              ?y              @rH   r   )r   rE   )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+   rm   r   ur   r   r   rU   rR   rl   r,   r,   r-   test_rot  s@    r   c           	   C   s  t jd t jd} | j| } t jddt jd  }|j |}xld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 qXW d S )Ni  )rG   rG   y              ?rc   larfglarf)r+   ZFDr   rD   )rD   r   rE   )r   r   g      ?R)sidegh㈵>)r   )r'   r(   r   rb   rj   conjr$   copyr*   r   rk   r   r   )Za0Za0jr+   r   r   rR   alpharp   r]   expectedr   r,   r,   r-   test_larfg_larf  s*    
,>>r   c              C   sr   t jtjddgt jt jd} x:tdD ]"}td | 	 d k	r&| j
}P q&W d}|   t|dd| j   d S )Nz-czfimport numpy as np; from scipy.linalg import svd; a = np.zeros([9537, 9537], dtype=np.float32); svd(a))stdoutstderr2   g?r   zCode apparently failed: )
subprocessPopensys
executablePIPESTDOUTr   timesleeppoll
returncode	terminater   r   read)rT   r   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 )N)r   r   )r+   sytrd)r'   r   r$   r   r   )rQ   r+   Ar  r,   r,   r-   test_sytrd_with_zero_dim_array  s    z(TestSytrd.test_sytrd_with_zero_dim_arrayr   )rD   rF   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}xxt|d D ]h}t j||d}|d ||d f |d |< d||< t j|||d|| t ||  }t ||}q`W t |d}|j| ||< t |jt ||}t||dt |j dd	 d S )N)r+   )r  sytrd_lworkrD   rE   r   )r   r   rH   g      ?)r   r   g        )r   rg   )r'   r   r$   arangetriu_indices_fromr   r   r   r   r   r   r*   r
   r   outerrj   r   rb   )rQ   r+   r   r  r  r  r   rY   datar\   er]   rb   r   k2Qr   r   r   i_lowerZQTAQr,   r,   r-   
test_sytrd  s<    *




$zTestSytrd.test_sytrdN)	r{   r|   r}   r6   r   r   r   r  r  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 )N)r   r   )r+   hetrd)r'   r   r$   r   r   )rQ   r  r  r  r,   r,   r-   test_hetrd_with_zero_dim_arrayU  s    z(TestHetrd.test_hetrd_with_zero_dim_arrayzreal_dtype,complex_dtyper   )rD   rF   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 | x&dD ]}|||d\}}	t|	d qW t	||}
||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}x~t|d D ]n}t j||d}|d ||d f |d |< d||< t j|||d|| t |t |  }t ||}qW t |d}t |j| ||< t t |jt ||}t
||dt |j dd d S )N)r+   )r  hetrd_lworkrD   rE   y              ?)r   rD   )r   r   )r   r   rH   g      ?)r   r   g        )r   rg   r_   )r'   r   r$   r  r  Zfill_diagonalr   r   r   r    r   r   r   r   r*   r   r
   r   r  r   rj   r   rb   )rQ   r   Z
real_dtyper  r  r  r!  rp   r4   rY   r   r  r\   r  r]   rb   r   r  r  r   r   r   r  ZQHAQr,   r,   r-   
test_hetrd\  sH    0





zTestHetrd.test_hetrdN)r{   r|   r}   r6   r   r   r&   r   zipr   r"  r,   r,   r,   r-   r  T  s   
r  c              C   s  xt 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W d S )KN)ZgglseZgglse_lwork)r+   rI   rG   rE   )r   r   rT   g=
ףp=g{Gzg(\ؿg      ?gzGgHzG?gףp=
ӿgQgffffff@gQ?g?gffffffֿg{Gz?gQg{Gz?g333333?g333333?g
ףp=
g{Gzg{Gz?gzGg      ?g      gGz?gHzGgzGg=
ףp=?g        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?g      ?g      )r   g^"L?g\}?y!f?$_Kdy^gŵ翸F@y!f?}dy61ŵe_@)rf   )r   r   r$   r    r'   rh   r   r   )r   r+   func
func_lworkr   rR   rm   r\   rl   r4   resultr   r,   r,   r-   
test_gglse  sL    








"

r'  c              C   s&  t d x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W d S )Ni  r_   rG   sytrf_lwork)r+   )ZsyconsytrfZhetrf_lwork)ZheconZhetrfy              ?rE   rD   )r   r   )rR   ipivanormr   )rT   )r   r   r   r&   r$   r   r)   r   rb   r'   r
   r   r    r   rv   linalgZcond)r   r+   r   r%  ZfunconZfunctrfr  r+  r   ldur*  r4   rcondr,   r,   r-   test_sycon_hecon  s     $

r/  c              C   s   t d xt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W d S )	Ni  r_   )r   sygstsyevdsygvd)r+   rE   r   g-C6?)r   )r   r   r   r$   r   r)   rb   r'   r
   r   r   )r   r+   r   r   r0  r1  r2  r  Beig_gvdr4   rY   rl   rR   eigr,   r,   r-   
test_sygst  s$     r6  c              C   s2  t d x"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W d S )
Ni  r_   )r   hegstheevdhegvd)r+   y              ?rE   r   g-C6?)r   )r   r   r&   r$   r   r)   r   rb   r'   r
   r   r   )r   r+   r   r   r7  r8  r9  r  r3  r4  r4   rY   rl   rR   r5  r,   r,   r-   
test_hegst  s$    $$$r:  c           	      st  t d d\} }x\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W 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.
    i  )r_      )tzrzftzrzf_lwork)r+   rE   y              ?)r   r   Nc          
      sD   g | ]<} | |gd d f j |gd d f    qS )N)rb   rj   r   )r   rp   )IdVr]   r,   r-   r   I  s    ztest_tzrzf.<locals>.<listcomp>r_   g      ?g        )r   r   )r   r   r   r$   r    r   r   r)   r   r   rb   r   r'   r   r   r
   r   r   rj   r   r   spacingr   )r   r   r   r+   r<  tzrzf_lwr   r  rzrY   r   ry   Zr,   )r>  r?  r]   r-   
test_tzrzf-  s&    "0(rD  c           	   C   s  t d xttD ]\} }d}| dkrZt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rldndd td||}|d
|||ddd}t|t	| |j
 j| d	 dkrdndd qW dS )z
    Test for solving a linear system with the coefficient matrix is a
    triangular array stored in Full Packed (RFP) format.
    i  r   rD   y              ?re   rb   )trttftfttrtfsm)r+   rE   rg   r   rG   rI   )rf   )rn   g      ?r   )rn   r   rF   r   )rn   r   r   N)r   r   r   r   r   r
   r)   r$   r   r   r   rb   r'   r  )r   r+   r   r  rn   rE  rF  rG  Afpr4   r3  solnZB2r,   r,   r-   	test_tfsmO  s4    *rJ  c           	      s  t d d\} }}xlttD ]^\}}td|d\}}t|| |}|dk rt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 rZd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W 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.
    i  )r_   r;  r;  )r<  r=  )r+   rE   )ZormrzZormrz_lworky              ?)ZunmrzZunmrz_lwork)r   Nc          
      sD   g | ]<} | |gd d f j |gd d f    qS )N)rb   rj   r   )r   rp   )r>  r?  r]   r,   r-   r     s    z$test_ormrz_unmrz.<locals>.<listcomp>rb   re   r_   g      ?r   g        )r   r   )rn   r   r   )r   r   )r   rn   r   )r   r   r   r$   r    r   r   r)   r'   r   r
   r   r   rj   r@  r   r   r   r   r   rb   )ZqmqnZcnr   r+   r<  rA  Zlwork_rzr  re   Zorun_mrzZorun_mrz_lwZ	lwork_mrzrB  rY   ry   r  rn   tolZcqr,   )r>  r?  r]   r-   test_ormrz_unmrzx  sJ    
"(rM  c           	   C   s  t d xttD ]\} }d}| dkrNt||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W dS )zz
    Test conversion routines between the Rectengular Full Packed (RFP) format
    and Standard Triangular Array (TR)
    i  r   rD   y              ?re   rb   )rE  rF  )r+   r   r   )r   r   )transrr   rE   Nrg   F)order)r   r   r   r   r)   r$   r   r   r   r   rb   r   r   Zreshape)r   r+   r   A_fullrN  rE  rF  ZA_tf_UrY   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  sR    ,F,BrT  c              C   sz  t d xjttD ]\\} }d}| dkrJt||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W dS )zz
    Test conversion routines between the Rectengular Full Packed (RFP) format
    and Standard Triangular Array (TR)
    i  r   rD   y              ?)trttptpttr)r+   r   r   )r   rE   N)r   r   r   r   r)   r$   r   r   r   r   rb   r   r   r   )r   r+   r   rQ  rU  rV  ZA_tp_UrY   ZA_tp_LZindsZA_tp_U_mZA_tp_L_mrR  rS  r,   r,   r-   test_tpttr_trttp  s2     

rW  c              C   s   t d xttD ]\} }d}| dkr`t||t||d  |}|| j |t|  }n&t|||}||j |t|  }td|d\}}}||\}}|||\}	}t	|dk |||	\}
}t
|}t|
| qW dS )	zk
    Test Cholesky factorization of a positive definite Rectengular Full
    Packed (RFP) format array
    i  r   rD   y              ?)pftrfrE  rF  )r+   r   N)r   r   r   r   r)   r   rb   r
   r$   r   r   r   )r   r+   r   r  rX  rE  rF  rH  rY   Z	Achol_rfpZA_chol_rr4   ZAcholr,   r,   r-   
test_pftrf  s     rY  c              C   s  t d xttD ]\} }d}| dkrbt||t||d  |}|| j |t|  }n&t|||}||j |t|  }td|d\}}}}||\}}	|||\}
}	|||
\}}	t	|	dk |||\}}t
|}t|t|| d dkrd	nd
d qW dS )z
    Test Cholesky factorization of a positive definite Rectengular Full
    Packed (RFP) format array to find its inverse
    i  r   rD   y              ?)pftrirX  rE  rF  )r+   r   rE   rG   rI   )rf   N)r   r   r   r   r)   r   rb   r
   r$   r   r   r   r   )r   r+   r   r  rZ  rX  rE  rF  rH  rY   
A_chol_rfpZ	A_inv_rfpZA_inv_rr4   ZAinvr,   r,   r-   
test_pftri0  s$    
r\  c              C   sf  t d xVttD ]H\} }d}| dkrdt||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rVd
ndd qW dS )z
    Test Cholesky factorization of a positive definite Rectengular Full
    Packed (RFP) format array and solve a linear system
    i  r   rD   y              ?rF   )r+   rE   )pftrsrX  rE  rF  r   rG   rI   )rf   N)r   r   r   r   r)   r   rb   r
   r   r$   r   r   r   r   r   )r   r+   r   r  r3  ZBf1ZBf2r]  rX  rE  rF  rH  rY   r[  rI  r,   r,   r-   
test_pftrsP  s,    r^  c              C   s:  t d x*ttD ]\} }d}| dkrdt||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W dS )zT
    Test for performing a symmetric rank-k operation for matrix in RFP format.
    i  r   rD   y              ?rE   r   hrE  rF  z{}frk)r+   rg   r   rG   rI   )rf   N)r   r   r   r   r)   r   rb   r
   r$   r   r'   r(   r   r   rj   )r   r+   r   r  prefixrE  rF  ZshfrkrH  r4   re   ZAfp_outZA_outr,   r,   r-   test_sfrk_hfrku  s$    
 ra  c              C   s  t d xttD ]\} }d}| dkrdt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W dS )zt
    Test for going back and forth between the returned format of he/sytrf to
    L and D factors/permutations.
    i  r_   rD   i   y              ?r   g      ?)syconvr)  r(  )r+   )r   F)r   Z	hermitian)r   r   rg   Ng        )r   r   r   )r   r   r   r   r)   r   rb   r
   r'   r@  r   r$   r    r   r   r   r   )r   r+   r   r  rL  rc  ZtrfZ	trf_lworklwr   DZpermr-  r*  rY   rR   r  r   r,   r,   r-   test_syconv  s,    (rf  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   sL  t d x<ttD ].\}}d}|dkrJt||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rDt||t||d  |}d}nt|||}d}xdD ]}xd|fD ]}|||	|||d\}}
|
d	kst	||kr|j }n|}|dkr|| }n|| }t|||dd ||fdkrl|||	|\}}
|
d	kst	t|| qlW q^W tt|||	|dd tt|||	|dd qW d S )Ni  r   rD   y              ?r   g      ?)geqrtgemqrt)r+   r   rg   g        )r   r   re   rb   )r   r   r   )r   rn   r   )r   r   r  )r   )rn   )r   r   r   r   r)   r'   r@  r   r$   r>   r   r
   rb   r   r   r   r   r   r   )rQ   r   r+   r   r  rL  rh  ri  rR   trY   r   r  r   re   	transposer   rn   rm   qZqC	c_defaultr,   r,   r-   test_geqrt_gemqrt  sL      





zTestBlockedQR.test_geqrt_gemqrtc              C   s  t d xttD ]\}}d}|dkrht||t||d  |}t||t||d  |}n t|||}t|||}dt|dj }td|d\}}x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r:t||t||d  |}t||t||d  |}d}n$t|||}t|||}d}x&dD ]}x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rx||	||||\}}}|d	ksht	t
|| t
|| qxW qfW tt||	||||dd tt||	||||dd qW qW d S )Ni  r   rD   y              ?r   g      ?)tpqrttpmqrt)r+   r   rE   rg   g        )r   r   re   rb   )r   r   r   )r   rn   r   )rs   )r   r   r  )r   )rn   )r   r   r   r   r)   r'   r@  r   r$   r>   r   r   r   r   r
   rb   r   r   r   r   r   ) rQ   r   r+   r   r  r3  rL  ro  rp  lrR   rl   rj  rY   ZB_pentZb_pentr   r  r   re   re  rk  r   rn   rm   r\   rl  ZcdZCDZqCDrm  Z	d_defaultr,   r,   r-   test_tpqrt_tpmqrt  sj     *"$






zTestBlockedQR.test_tpqrt_tpmqrtN)r{   r|   r}   r5   rn  rr  r,   r,   r,   r-   rg    s   >rg  c              C   s  t d xttD ]\} }d}d}td|d}| dkrvt||| |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W d S )Ni  r_   rE   pstrf)r+   rD   y              ?g        i  )r   rE   )r   r   )r   )r   r   r   r$   r   r)   r   rb   r   r   r'   r   float32r   r   r   r   )r   r+   r   r   rs  r  rm   pivr_crY   r   single_atoldouble_atolr   r   r,   r,   r-   
test_pstrfK  s4    ,

2
ry  c              C   s  t d xttD ]\} }d}d}td|d}| dkrvt||| |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W d S )Ni  r_   rE   pstf2)r+   rD   y              ?g        i  )r   rE   )r   r   )r   )r   r   r   r$   r   r)   r   rb   r   r   r'   r   rt  r   r   r   r   )r   r+   r   r   rz  r  rm   ru  rv  rY   r   rw  rx  r   r   r,   r,   r-   
test_pstf2s  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}x6t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`W d S )?Ng      ?g      ?g1w-!?gd`TRۿgsg      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ſFxrE   g   ЈBg   tBgffffff @g   ٓ g      @gg#fDgffffffgHzG?gQg'Vgp=
ףg(\gQgS7нg?gq=
ףpg   Ag(\g333333g   Bg333333ÿgZ9=gQgֽ)r+   gffffff@g   tޅBgg(\g   Zgq=
ףp?gEop=gQ?gZEqҽy              ?geequr   g-C6?)r   r   )r'   rh   r   r   r)   r$   r   )desired_realdesired_cplxr   r+   r  r|  r   rm   ZrowcndZcolcndamaxrY   r,   r,   r-   
test_geequ  sD    






  r  c        
         s   t ddddddddddg
} xttD ]\}}t jd|d}||dk rLdnd	 t j fd
dtddD |d}|t t |7 }td|d}||\}}}}	t	t 
|t|  q(W d S )Nr   rg   r   r   r_   )r+   rE   g      ?y              ?c                s   g | ]} d |  qS )g       @r,   )r   rp   )r   r,   r-   r     s    ztest_syequb.<locals>.<listcomp>rH   syequb)r'   rh   r   r   r
   r   Zrot90r   r$   r   log2r)   r   )
Zdesired_log2sr   r+   r  r\   r  r   scondr  rY   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 )NrE   rH   i  rL   rD   )r   y              ?r   g        g      r  rI   y                i   )rH   rH   y              0@)rH   r   )r   r   rg   )r'   r   r   r   Zzheequbr   r   r  rv   r  Zcheequbr)   	complex64)r  r   r  r  rY   r,   r,   r-   test_heequb  s    2
( 
r  c              C   sB  t jd d} t j| }t j| t j| d  }xttD ]\}}|dk rt j| | }||}|| }||}n<t j| | t j| | d  }||}|| }||}td|d}td|d}||dd	\}	}
}}||	||
|dd
\}}|dk r"t|||| dd qDt|||| dd qDW d S )Nr   r_   y              ?rE   getc2)r+   gesc2r   )r   )Zoverwrite_rhsrG   )rf   )	r'   r(   r   r   r   r   r)   r$   r   )r   r}  r~  r   r+   r  rl   r  r  Zlur*  ZjpivrY   rp   rM   r,   r,   r-   test_getc2_gesc2  s.    
 




r  r   )rI   rH   )rH   rH   jobarI   joburG   jobvjobrrD   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   gejsv)r+   rE   rD   r   r   r   )r  r  r  r  jobtr  NF)r   )r   )r   r'   r   r   r.   r$   r   r   r   r   r   r   r   r   rb   identityr,  Zmatrix_rankZcount_nonzero)r   r+   r  r  r  r  r  r  r   r   r   r  r  ZlsvecZrsvecZl2tranZ
is_complexZinvalid_real_jobvZinvalid_cplx_jobuZinvalid_cplx_jobvexit_statussvar   r   r   r   rY   sigmar,   r,   r-   test_gejsv_general	  sR    !



"r  c       	      C   s  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 dS )	z*Test edge arguments return expected statusr  )r+   g      ?r   )rD   rD   )rD   )rD   r   N)r$   r   r*   r'   rh   r   )	r+   r  r  r   r   r   r   rY   r  r,   r,   r-   test_gejsv_edge_argumentsu  s$    


r  kwargsrL   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)rE   rE   )r+   r  N)r'   r   r   r$   r   r   )r  r  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@g333333gffffff@gףp=
?g(\g{Gz?g(\g cZB#@gI.!v@g?ܵ?g      ?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.
    g-C6?r  )r+   )r   N)r$   r+   r   )r  Z
sva_expectZu_expectZv_expectr   r  r  r   r   r   r   rY   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}xrt|D ]f\}}|| d }|d d ||gf |d d ||gf< |d d |f  |d d |d f | 7  < q(W 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 d Q R X tt |
||d d | W d Q R X tt |
|||d d  W d Q R X tt" |
|d |d d |d  W d Q R X d|d< d|d< |
|||\}}}}}} tj||d  dkd||d   d S )Nr   r_   r   rD   )r+   rg   )gttrfgttrsr   rE   )r   rb   re   )rn   z3?gttrf: _d[info-1] is {}, not the illegal value :0.)r   r'   r   r   r.   r   r   r(   r   r$   r   r
   r   r   r   rb   r   r   r   r   Ztestingr   r   )!r+   r   r   dur\   dldiag_cpyr  rp   rl   r  r  _dl_d_dudu2r*  rY   r   r   r   r   ru  Zb_cpyx_gttrsrn   Zb_transZ__dlZ__dZ__duZ_du2Z_ipiv_infor,   r,   r-   test_gttrf_gttrs  sb    "$$2$





&r  z1du, d, dl, du_exp, d_exp, du2_exp, ipiv_exp, b, xg @g      gffffff?g       @g      @g      ggffffff@g333333@g@g      @g      r  rJ   igC>rg   rK   rE   rF   rH   g@gffffff@g      g%@g@g	g333333?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 )N)r  r  r   g-C6?)r   )r$   r   )r  r\   r  Zdu_expZd_expZdu2_expZipiv_exprl   rp   r  r  r  r  r  r  r*  rY   r  r,   r,   r-   0test_gttrf_gttrs_NAG_f07cdf_f07cef_f07crf_f07csf   s    2


r  )rF   rJ   )rJ   rF   c             C   s2   t d| d}|\}}|||d\}}t|d d S )Ngeqrfp_lwork)r+   )r   r   r   )r$   r   )r+   r*   r  r   r   r   rY   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   r_   rG   rD   rg   pttrf)r+   r   zpttrf: info = {}, should be 0)err_msg)r   pttrszpttrs: info = {}, should be 0)r   r'   r   r   r.   r   r   r   r$   r   r   r   r   r   rk   rb   )ddtyper+   r   r   r\   r  r  r  r  r  _erY   r   re  rp   rl   r  _xr,   r,   r-   test_pttrf_pttrsh  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 )Nr_   r  )r+   rE   rD   rg   )r$   r.   r   r   )r  r+   r   r  r\   r  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 )	Nr_   r  )r+   rE   rD   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  r\   r  r  r  rY   r,   r,   r-   'test_pttrf_pttrs_errors_singular_nonSPD  s    r  z%d, e, d_expect, e_expect, b, x_expectr_      r   r;     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 )	Ng-C6?r  r   )r+   )r   r  rD   )r   )r$   r   r   r+   r&   )r\   r  d_expectZe_expectrl   Zx_expectr   r  r  r  rY   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 )NrD   rG   rE   rg   )r.   r'   r   r   r   rb   r   )r+   realtyper   	compute_zZA_eigZvrr\   r  Ztrir  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   i  pteqr)r+   r_   )r\   r  r  r  r   zinfo = {}, should be 0.)r   N)r   r'   r   r   r$   r  r   r   r   sortr   r   rb   r  r   )r+   r  r  r   r  r   r\   r  r  r  d_pteqre_pteqrz_pteqrrY   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+   r_   rG   )r  r  r   )r   r$   r  r>   )r+   r  r  r  r   r\   r  r  r  r  r  r  rY   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+   r_   rg   )r  r  )r   r$   r  r   r   )	r+   r  r  r  r   r\   r  r  r  r,   r,   r-   "test_pteqr_raise_error_wrong_shape3	  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+   r_   r   )r  r  )r   r$   r  r>   )r+   r  r  r  r   r\   r  r  r  r  r  r  rY   r,   r,   r-   test_pteqr_error_singularB	  s    r  zcompute_z,d,e,d_expect,z_expectgp=
ף@g      @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.
    g-C6?r  )r+   rD   rg   )r\   r  r  r  )r   N)r$   r+   r'   r   r   rv   )r  r\   r  r  Zz_expectr   r  r  r  r  Z_zrY   r,   r,   r-   test_pteqr_NAG_f08jgfQ	  s    "r  matrix_size)rJ   rI   )rI   rI   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   geqrfp)r+   Zorgqr)r]   r   r   )r   )r   r   rg   )r'   r(   r   r   r   r$   r.   r   r   r   r
   r*   r   rb   r   allr   rP   r   r   )r+   r  r   r   r  Zgqrr   r   r  Zqr_Ar]   rY   r   Zqqrrl  Z
A_negativeZr_rq_negZq_rq_negZrq_A_negZtau_negZinfo_negr,   r,   r-   test_geqrfpj	  s2    
"(r  c              C   s(   t g } td| jd}tt||  d S )Nr  )r+   )r'   rh   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}y t||dd t||dd W n8 tk
r } ztd| | | W d d }~X Y nX d S )	Ni  r  _lworkr   )r+   rD   )r   z({}_lwork raised unexpected exception: {})r   r&   r$   r    r   r6   failr   )r  r  r   r+   sc_dlwdz_dlwr  r,   r,   r-   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}y t||dd t||dd W n8 tk
r } ztd	| | | W d d }~X Y nX d S )
Ni  r  r  r   )r+   rD   r   )r   z({}_lwork raised unexpected exception: {})r   r&   r$   r    r   r6   r  r   )r  r  r   r+   r  r  r  r,   r,   r-   test_generalized_eigh_lworks	  s    r  dtype_r   r   i  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 )	Ni  r   orun	csd_lwork)r+   c             S   s   g | ]}|d kqS )r   r,   )r   rp   r,   r,   r-   r   	  s    z*test_orcsd_uncsd_lwork.<locals>.<listcomp>)r   r   r   r$   r    r  r>   )r  r   rT   rl  r  dlwrd  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
}xt|D ]}||||f< qW x&t|D ]}|||| || f< qW x<t|D ]0}| ||| | || | | | | f< qW x2t|D ]&}|||| | | || | f< qW xt|D ]}t|| ||| || f< t|| ||| | || | | f< t||  ||| || | | | f< t|| ||| | || f< qLW || | }t||ddt| j d d S )N)r  P      r  r  csdr  )r+   r   Zlrworkr   g      ?g        g     @)r   r   )r   r!   Zrvsr"   r$   r    dictr#  r>   r   r   r'   r   r   cossinr   r   r   )r  r   rT   rl  r  Xdrvr  r  ZlwvalsZcs11Zcs12Zcs21Zcs22thetau1u2Zv1tZv2trY   r   ZVHr   Zn11Zn12Zn21Zn22SZoner   ZXcr,   r,   r-   test_orcsd_uncsd	  sB    
f

0&*,(r  
trans_boolFfactrO  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+   r_   rD   rg   rE   rb   re   r   rO  NrI   )r  rn   dlfdfdufr  r*  r   z ?gtsvx info = {}, should be zerorF   )r   __len__Tz 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   r   rb   r   r   r   r   r   r   r*   ) r+   r  r  r   r  r  r   r  r\   r  r  rp   rn   rl   Z
inputs_cpydlf_df_duf_du2f_ipiv_info_	gtsvx_outr  r  r  du2fr*  x_solnr.  ferrberrrY   r,   r,   r-   
test_gtsvx
  s8    "*r  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   )r  r  )r+   r_   rD   rg   rE   rb   re   rO  rI   )r  rn   r  r  r  r  r*  r   r   z&info should be > 0 for singular matrix)r  r  r  r  r  r*  )	r   r$   r.   r'   r   r   r   rb   r>   )r+   r  r  r  r  r   r  r\   r  r  rp   rn   rl   r  r  r  r  r  r  r  r  r  r  r   r*  r  r.  r  r  rY   r,   r,   r-   test_gtsvx_error_singularL
  s8    "*


r  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   )r  r  )r+   r_   rD   rg   rE   rb   re   rO  rI   r   )r  rn   r  r  r  r  r*  )r   r$   r.   r'   r   r   r   rb   r   r   r   )r+   r  r  r  r  r   r  r\   r  r  rp   rn   rl   r  r  r  r  r  r  r,   r,   r-   "test_gtsvx_error_incompatible_size
  sH    "*
r  zdu,d,dl,b,xc          
   C   sB   t d|jd}|||| |}|\
}}}	}
}}}}}}t|| d S )Nr  )r+   )r$   r+   r   )r  r\   r  rl   rp   r  r  r  r  r  r   r*  r  r.  r  r  rY   r,   r,   r-   test_gtsvx_NAG
  s    r  zfact,df_de_lambdac             C   s   t d|jd| |S )Nr  )r+   )r$   r+   )r\   r  r,   r,   r-   <lambda>
  s   r  c             C   s   dS )N)NNNr,   )r\   r  r,   r,   r-   r  
      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   ptsvx)r+   rH   rG   rD   rg   rE   )r  r  efr   zinfo should be 0 but is {}.)r   r  z rcond should be scalar but is {})rE   z#ferr.shape is {} but shoud be ({},)z#berr.shape is {} but shoud be ({},)N)r   r'   r   r   r$   r.   r   r   r   r   r   r   r   r   r   rb   r   r>   r*   )r+   r  r  df_de_lambdar   r
  r   r\   r  r  r  rl   r  r  rY   r  rp   r.  r  r  r   re  r,   r,   r-   
test_ptsvx
  s6    (


r  c             C   s   t d|jd| |S )Nr  )r+   )r$   r+   )r\   r  r,   r,   r-   r    s   c             C   s   dS )N)NNNr,   )r\   r  r,   r,   r-   r    r	  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   r
  )r+   rH   rG   rD   rg   rE   )r  r  r  )	r   r$   r.   r'   r   r   r   r   r   )r+   r  r  r  r
  r   r\   r  r  r  rl   r  r  rY   r,   r,   r-   test_ptsvx_error_raise_errors  s    (  r  c             C   s   t d|jd| |S )Nr  )r+   )r$   r+   )r\   r  r,   r,   r-   r  *  s   c             C   s   dS )N)NNNr,   )r\   r  r,   r,   r-   r  ,  r	  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   r
  )r+   rH   rG   rD   rg   rE   r   r   rF   )r  r  r  )r   r$   r.   r'   r   r   r>   )r+   r  r  r  r
  r   r\   r  r  r  rl   r  r  rY   rp   r.  r  r  r,   r,   r-   test_ptsvx_non_SPD_singular&  s.    (

r  zd,e,b,xc             C   s6   t d|jd}|| ||\}}}}}	}
}t|| d S )Nr
  )r+   )r$   r+   r   )r\   r  rl   rp   r
  r  r  Zx_ptsvxr.  r  r  rY   r,   r,   r-   test_ptsvx_NAGR  s    r  )r   )r  r  r  	functoolsr   Znumpy.testingr   r   r   r   r   r   r6   r	   r   numpyr'   r
   r   r   r   r   r   r   r   Znumpy.randomr   r   r   Zscipy.linalgr   r2   r   r   r   r   r   r   r   r   r   r   Zscipy.linalg.lapackr    Zscipy.statsr!   r"   Zscipy.sparsesparser   r#   r0   ImportErrorr$   Zscipy.linalg.blasr%   rt  r   r   r  Z
complex128r&   r   r.   rB   objectrC   r~   r   r   r   r   r   r   r   r   r   r   r   Zxslowr  r  r  r'  r/  r6  r:  rD  rJ  rM  rT  rW  rY  r\  r^  ra  rf  rg  ry  r{  r  r  Zskipifr  r  r   r  r  r  rh   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  r,   r,   r,   r-   <module>   s   ((
` t  **#DO1")::) %# ((-e	









]





 
0


"
"
"
"
"
*(A&&,/(;(1(1




$4
$
$&
"

