U
    Hvf                     @   s  d Z ddlZddlZddlZddlmZmZmZm	Z	m
Z
 ddl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mZmZmZ ddlmZmZ ddlm Z!m"Z"m#Z#m$Z$ zddlm%Z& W n e'k
r   dZ&Y nX eegZ(eegZ)e(e) Z*d	d
 Z+dd Z,G dd dZ-G dd dZ.G dd dZ/G dd dZ0d$ddZ1G dd dZ2G dd dZ3G dd dZ4G dd dZ5G d d! d!Z6d"d# Z7dS )%zw
Build linalg:
  python setup.py build
Run tests if scipy is installed:
  python -c 'import scipy;scipy.linalg.test()'
    N)assert_equalassert_almost_equalassert_assert_array_almost_equalassert_allclose)raises)float32float64	complex64
complex128arangetriutrilzerostril_indicesonesmoddiagappendeyenonzero)randseed)_fblasget_blas_funcstoeplitzsolve)_cblasc                  C   s   t dtjdtjddtjdtjddf\} }}t| jd t|jd td k	rht| jd t|jd t d} t| jd	 t d
tjd} t| jd t d
dd} t| jd t d
tj	d} t| jd t dtjdtj
dtjdtjdf} t| jd d S )N)axpyr   r      r    F)dtypeorderCzcblasZrotgdgemmr"   cr   )r   npemptyr
   r   r   typecoder&   module_nameZlongcomplexr	   )f1f2Zf3 r1   @/tmp/pip-unpacked-wheel-96ln3f52/scipy/linalg/tests/test_blas.pytest_get_blas_funcs$   s2    
r3   c                  C   s^   t dtjd\} }| jdks t|jdks.tt dtjd\} }}| |ksNt| |ksZtd S )N)nrm2dotr)   r*   )r5   dotcdotu)r   r+   r
   r-   AssertionErrorr	   )fghr1   r1   r2   test_get_blas_funcs_aliasK   s    r<   c                   @   s   e Zd Zdd ZdS )TestCBLAS1Simplec                 C   s   dD ]D}t t|d d }|d kr"qt|dddgdddgddd	d
dg qdD ]D}t t|d d }|d krlqNt|dddgdddgddd	ddg qNd S Nsdr      r          a   	      cz               @y            $@)getattrr&   r   selfpr9   r1   r1   r2   	test_axpyX   s    zTestCBLAS1Simple.test_axpyN)__name__
__module____qualname__rO   r1   r1   r1   r2   r=   V   s   r=   c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )TestFBLAS1Simplec                 C   s   dD ]D}t t|d d }|d kr"qt|dddgdddgddd	d
dg qdD ]D}t t|d d }|d krlqNt|dddgdddgddd	ddg qNd S r>   rK   fblasr   rL   r1   r1   r2   rO   i   s    zTestFBLAS1Simple.test_axpyc                 C   s   dD ]@}t t|d d }|d kr"qt|dddgdgd dddg qdD ]@}t t|d d }|d krhqJt|ddd	gdgd ddd	g qJd S )
Nr?   copyrA      rC      rI                 @y      @      @rT   rL   r1   r1   r2   	test_copyw   s    $zTestFBLAS1Simple.test_copyc                 C   st   dD ]2}t t|d d }|d kr"qt|dddgd qdD ]2}t t|d d }|d krZq<t|ddd	gd
 q<d S )Nr?   ZasumrA   rC      )scdz              @      @         rK   rU   r   rL   r1   r1   r2   	test_asum   s    zTestFBLAS1Simple.test_asumc                 C   sD   dD ]:}t t|d d }|d kr"qt|dddgdddgd qd S )	Nr?   r5   rA   r[   rC   r    r@   rb   rL   r1   r1   r2   test_dot   s
    zTestFBLAS1Simple.test_dotc                 C   sD   dD ]:}t t|d d }|d kr"qt|dddgdddgd	 qd S )
NrI   r7   r_   r[   r`   r    rA   r@   y      "       @rb   rL   r1   r1   r2   test_complex_dotu   s
    z"TestFBLAS1Simple.test_complex_dotuc                 C   sD   dD ]:}t t|d d }|d kr"qt|dddgdddgd qd S )	NrI   r6   r_   r[   r`   r    r@   y      @      ,rb   rL   r1   r1   r2   test_complex_dotc   s
    z"TestFBLAS1Simple.test_complex_dotcc                 C   s   dD ]8}t t|d d }|d kr"qt|dddgtd qdD ]8}t t|d d }|d kr`qBt|ddd	gtd qBd S )
Nr?   r4   rA   r[   rC   2   )r*   r%   r]   r^   r_   r`   )rK   rU   r   mathsqrtrL   r1   r1   r2   	test_nrm2   s    zTestFBLAS1Simple.test_nrm2c                 C   s   dD ]:}t t|d d }|d kr"qt|ddddgddd	g qd
D ]:}t t|d d }|d krbqDt|ddddgdddg qDdD ]:}t t|d d }|d krqt|ddddgdddg qd S )Nr?   Zscalr    rA   r[   rC      i
   rI   r_   r`   rd   y             (y      (@      "@)csZzdy              "@iy      "@      (rT   rL   r1   r1   r2   	test_scal   s    zTestFBLAS1Simple.test_scalc                 C   s   dD ]V}t t|d d }|d kr"qdddgdddg }}|||\}}t|| t|| qdD ]V}t t|d d }|d kr~q`dd	dgddd
g }}|||\}}t|| t|| q`d S )Nr?   Zswapr    rA   r@   rF   rI   r_   y      @      rT   )rM   rN   r9   xyx1y1r1   r1   r2   	test_swap   s     

zTestFBLAS1Simple.test_swapc                 C   sd   dD ]*}t td| d }t|dddgd qdD ]*}t td| d }t|d	d
dgd q4d S )Nr?   iZamaxrp   rW   rA   r@   rI   y      @      @rl   )rK   rU   r   rL   r1   r1   r2   	test_amax   s    zTestFBLAS1Simple.test_amaxN)rP   rQ   rR   rO   rZ   rc   re   rf   rg   rk   ro   ru   rx   r1   r1   r1   r2   rS   g   s   rS   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!S )"TestFBLAS2Simplec                 C   s   dD ]X}t t|d d }|d kr"qt|ddggdgdg t|ddggdgddgdg qdD ]X}t t|d d }|d krqbt|d	d
ggdgdg t|d	d
ggdgddgdg qbd S )Nr?   ZgemvrA   r[   rC   rI   r_   r`         H      B              @      H      5rT   rL   r1   r1   r2   	test_gemv   s    "zTestFBLAS2Simple.test_gemvc              	   C   s  dD ]}t t|d d }|d kr"qt|dddgddgddgddgg t|ddddgddgddgd	d
gddgg t|dddgddgddgddggdddgdd	gg qdD ]r}t t|d d }|d krqt|dddgddgddgddgg t|ddddgddgddgd	d
gddgg qdD ]}dD ]x}t t|| d }|d krTq2t|dddgddgddgddgg t|ddddgddgddgd	d
gddgg q2q*d S )Nr?   gerr@   r    rA   rW   rl   rX   r\      rH      rD   rG   rI   Zgeru              ?r_   rY   rp   rJ   )r   ZgercrT   )rM   rN   r9   namer1   r1   r2   test_ger   sD    &
zTestFBLAS2Simple.test_gerc                 C   s  t jdddd}t |d d t jf | }t |d d dt jf |d d d  }t jdddd	d
}t jddddd}t |d d t jf | }t |d d dt jf |d d d  }t |d d t jf |  }t |d d dt jf |d d d   }	t jt d|t df 	 }
t
dddgD ]|\}}tt|d d }|d krbq:t|d|||d t|d|dd|j|d t|d|dddd||d t|d|dddd||d t d|dkrdndd}|d||dd}t|||d |d||d}t||k	 t|d | |d tt|d|dd! tt|d|dd" tt|d|dd" tt|d|dd# tt|d|dd# tt|d|dd tt|d|t d$ddd q:t
d%ddgD ]|\}}tt|d d }|d krqt|d|||d t|d|dd|j|d t|d|
d ddd||d t|d|
d&ddd||d t d|d'krjdndd}|d||dd}t|||d |d||d}t||k	 t|d | |d tt|d|dd! tt|d|dd" tt|d|dd" tt|d|dd# tt|d|dd# tt|d|dd tt|d|t d$ddd qt
d%ddgD ]\}}tt|d( d }|d kr~qVt|d|||d t|d|dd|j |d t|d|
d ddd||d t|d|
d&ddd|	|d t d|d'krdndd}|d||dd}t|||d |d||d}t||k	 t|d | |d tt|d|dd! tt|d|dd" tt|d|dd" tt|d|dd# tt|d|dd# tt|d|dd tt|d|t d$ddd qVd S ))Nr@   rC   r'   r)   rB   r         !@   FZendpointrG   DrW   r?   Hz>+=Zsyr      ?rtolTlowerr    )incxoffxnrp   rW   rW   sr9   r!   rE   Zoverwrite_a       @rD   rA   r   r   r   r   rI   r*   Zher)r+   r   r   newaxislinspaceviewconjc_r   ravelziprK   rU   r   Tr   assert_raises	Exception)rM   rq   ZresxZresx_reverserr   r%   ZreszZresz_reverseZrehzZrehz_reversewrN   r   r9   rE   br1   r1   r2   test_syr_her  s    (( , 
  
  
 zTestFBLAS2Simple.test_syr_herc                 C   s  t jdddd}t jdddd}t |d d t jf | |d d t jf |  }t |d d dt jf |d d d  |d d dt jf |d d d   }t jddd	d
d}tdddgD ],\}}tt|d d }|d krqt|d||||d t|d||dd|d dd df |d t|d||dd|j	|d t|d||ddddd||d t|d||dddddd|d dd df |d t|d||ddddd||d t 
d|dkrdndd}	|d|||	dd}
t|	||d |d |||	d!}
t|	|
k	 t|
d| |d tt|d||dd" tt|d||dd# tt|d||dd# tt|d||dd$ tt|d||dd% tt|d||dd% tt|d||dd tt|d||dd tt|d||dd tt|d||t 
d&ddd! qd S )'Nr@   rC   r'   r)   rG   rB   r   r   r   Fr   r?   r   r   Zsyr2r   r   rA   r   Tr   r    rm   r   r   incyoffyr   r   r   r   r   rp   r   r   r9   r!   r   r   rD   r   r   r   r   r   )r+   r   r   r   r   r   rK   rU   r   r   r   r   r   r   )rM   rq   rr   resxyresxy_reverseqrN   r   r9   rE   r   r1   r1   r2   	test_syr2n  sX    2$ *   zTestFBLAS2Simple.test_syr2c                 C   sP  t jddddd}t jddddd}|d d t jf |  |d d t jf |   }t |}|d d dt jf |d d d   }||d d dt jf |d d d   7 }t |}t jt d|t df  }t jt d|t df  }t	d	d
dgD ]6\}}t
t|d d }	|	d kr:qt|	d||||d t|	d||dd|d dd df |d t|	d||dd|j |d t|	d||ddddd||d t|	d||dddddd|d dd df |d t|	d||ddddd||d t d|dkr dndd}
|	d|||
dd}t|
||d |	d|||
d}t|
|k	 t|d| |d tt|	d||dd tt|	d||dd tt|	d||d d tt|	d||dd! tt|	d||dd" tt|	d||d d" tt|	d||d d tt|	d||dd tt|	d||d#d tt|	d||t d$ddd qd S )%Nr@   rG   r'   r)   r   r   rB   rW   rI   r   r   Zher2r   r   rA   r   Tr   r   r   r   r   r*   r!   r   r   rD   r   r   rC   r   rp   r   r   r    r   )r+   r   r   r   r   r   r   r   r   r   rK   rU   r   r   r   r   r   )rM   rq   rr   r   r   uvrN   r   r9   rE   r   r1   r1   r2   	test_her2  s`    4
&*
  
*   zTestFBLAS2Simple.test_her2c                 C   sV  t d ttD ]>\}}d}d}d}d}ttt|d t|| d tt|d t|| d }||}t|| d |f|d}|d |dd df< |d |ddd	f< |d
 |dddf< |d |dd df< t||}	t||}
|d|d }}td|d\}||||||||	|
|d	}||	|	 ||
  }t
|| qd S )N  rF   rC   r@   r    r)   )r   r   )r   r@   rl   )r   r    r   )r@   r   rA   rW   rw   )Zgbmv)	mr   kuklalpharE   rq   rr   beta)r   	enumerateDTYPESr   r   r   r   astyper   r5   r   )rM   indr"   r   r   r   r   AAbrq   rr   r   r   funcrt   y2r1   r1   r2   	test_gbmv  s4    
  zTestFBLAS2Simple.test_gbmvc              	   C   sz  t d ttD ]b\}}d}d}t||f|d}t|d |f|d}t||t|t|f< td|d D ]>}t|| }||t|| t||f< ||d| |d f< ql||}|dk r||j n||	 j }t
||dd d f< t||}	t||}
|d|d }}|dkr2td	|d\}ntd
|d\}|||||	|
|d}|||	 ||
  }t|| qd S )Nr   rl   r    r)   r@   rB         ?rA   )Zhbmv)Zsbmv)kr   rE   rq   rr   r   )r   r   r   r   r   r   ranger   r   r   r   r   r5   r   )rM   r   r"   r   r   r   r   Zind2temprq   rr   r   r   r   rt   r   r1   r1   r2   test_sbmv_hbmv  s.    
 
zTestFBLAS2Simple.test_sbmv_hbmvc                 C   s  t d ttt D ]\}}d}t|||}|dkrL|t||d 7 }||}|dk rh||j n|| j }t|\}}|||f }t||}t||}	t	d| |}
t
d| |}|d|d }}|dkrtd|d	\}ntd
|d	\}||||||	|d}||| ||	  }t|| ||d |||
||dd||d
}||d dd df  |
dd d ||dd d   }t|dd d | t|d |d  qd S )Nr   rA   r@   r   rW   r    r   )Zhpmvr)   )Zspmv)r   r   aprq   rr   r   )
r   r   r   rq   rr   r   r   r   r   r   rB   )r   r   r   COMPLEX_DTYPESr   r   r   r   r   r   r   r   r5   r   r   )rM   r   r"   r   r   r*   rAprq   rr   ZxlongZylongr   r   r   rt   r   r1   r1   r2   test_spmv_hpmv  s<    
 
   :zTestFBLAS2Simple.test_spmv_hpmvc                 C   s  t d ttt D ]j\}}d}t|||}|dkrL|t||d 7 }||}|dk rh||j n|| j }t|\}}|||f }t||}tt t	|d d}	|dkrt
d|d\}
|	|d d d f |d d d f   | }n8t
d	|d\}
|	|d d d f |d d d f  | }|
||	||d
}td|d}||||f< |dkrj| n||||f< t|| qd S )Nr   rA   r@   r   rW   g      @)Zhprr)   )Zspr)r   r   r   rq   rA   rA   )r   r   r   r   r   r   r   r   r   r   r   r5   r   r   )rM   r   r"   r   r   r*   r   r   rq   r   r   r   rt   y1fr1   r1   r2   test_spr_hpr'  s,    
 0*zTestFBLAS2Simple.test_spr_hprc                 C   st  t d ttD ]\\}}d}t|||}|dkrH|t||d 7 }||}|dk rd||j n|| j }t|\}}|||f }t||}t||}	|d}
|dkrtd|d\}ntd|d\}|
 |d d d f 	|	d d d f   }|| | j }|||
||	|d	}t
d
|d}||||f< |dddg  |dddgdddgf< t|| qd S )Nr   rA   r@   r   r    )Zhpr2r)   )Zspr2)r   r   rq   rr   r   r   rW   r   )r   r   r   r   r   r   r   r   r   r5   r   r   )rM   r   r"   r   r   r*   r   r   rq   rr   r   r   r   r   rt   r   r1   r1   r2   test_spr2_hpr2B  s.    
 .&zTestFBLAS2Simple.test_spr2_hpr2c              
   C   s  t d ttD ]\}}d}d}t||}t||f|d}t|d D ]&}t|| |t|| t||f< qL|dkr|t|  dt|d | ||d  d  | 7  < t|d |f|d}t|d D ]"}	t	||	d||	 d |	d f< qt
d	|d\}
|
|||d
}||}t|| |
|||dd}|d|t|t|f< ||}t|| |
|||ddd}|j|}t|| |
|||ddd}| j|}t|| qd S )Nr   rm   rA   r)   r@   r   r    r   )Ztbmvr   rE   rq   r   rE   rq   r   r   rE   rq   r   trans)r   r   r   r   r   r   r   r   r   r   r   r5   r   r   r   rM   r   r"   r   r   rq   r   supr   rowr   rt   r   r1   r1   r2   	test_tbmv^  s6    $: 




zTestFBLAS2Simple.test_tbmvc              
   C   s  t d ttD ]\}}d}d}t||}t||f|d}t|d D ]&}t|| |t|| t||f< qL|dkr|t|  dt|d | ||d  d  | 7  < t|d |f|d}t|d D ]"}	t	||	d||	 d |	d f< qt
d	|d\}
|
|||d
}t||}t|| |
|||dd}|d|t|t|f< t||}t|| |
|||ddd}t|j|}t|| |
|||ddd}t| j|}t|| qd S )Nr   rl   rA   r)   r@   r   r    r   )Ztbsvr   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r2   	test_tbsv  s6    $: 




zTestFBLAS2Simple.test_tbsvc                 C   s<  t d ttD ]$\}}d}t||}|dk rBtt||ntt||t||d  }t|\}}|||f }td|d\}	|	|||d}
||}t	|
| |	|||dd	}
|d|t
|t
|f< ||}t	|
| |	|||ddd
}
|j|}t	|
| |	|||ddd
}
| j|}t	|
| qd S )Nr   rm   r    r   )Ztpmvr)   r   r   rq   r@   r   r   rq   r   r   r   rq   r   r   )r   r   r   r   r   r   r   r   r5   r   r   r   r   rM   r   r"   r   rq   r   r*   r   r   r   rt   r   r1   r1   r2   	test_tpmv  s*    2




zTestFBLAS2Simple.test_tpmvc                 C   sH  t d ttD ]0\}}d}t||}|dk rBtt||ntt||t||d  }|t|7 }t|\}}|||f }td|d\}	|	|||d}
t	||}t
|
| |	|||dd	}
|d|t|t|f< t	||}t
|
| |	|||ddd
}
t	|j|}t
|
| |	|||ddd
}
t	| j|}t
|
| qd S )Nr   rm   r    r   )Ztpsvr)   r   r@   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r2   	test_tpsv  s,    2




zTestFBLAS2Simple.test_tpsvc           	      C   s  t d ttD ]\}}d}t||t| |}td|}td|d\}|||d}t||}t	|| |||dd}|d|t
|t
|f< t||}t	|| |||ddd}t|j|}t	|| |||dd	d}t| j|}t	|| qd S )
Nr   rA   )Ztrmvr)   rE   rq   r@   rE   rq   r   rE   rq   r   r   r    )r   r   r   r   r   r   r   r   r5   r   r   r   r   	rM   r   r"   r   r   rq   r   rt   r   r1   r1   r2   	test_trmv  s&    


zTestFBLAS2Simple.test_trmvc           	      C   s8  t d ttD ] \}}d}t||t| |}t||}td|d\}|||d}tt||}t	|| |||dd}tt
||}t	|| |||dd}|d|t|t|f< tt||}t	|| |||ddd	}tt|j|}t	|| |||dd
d	}tt| j|}t	|| qd S )Nr      )Ztrsvr)   r   r@   )rE   rq   r   r   r   r    )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r2   	test_trsv  s,    



zTestFBLAS2Simple.test_trsvN)rP   rQ   rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   ry      s     `-2 &&ry   c                   @   s   e Zd Zdd ZdS )TestFBLAS3Simplec                 C   s   dD ]V}t t|d d }|d kr"qt|ddgdgdgg t|ddgdgddgdg qdD ]V}t t|d d }|d kr~q`t|d	d
gdgdgg t|d	d
gdgddgdg q`d S )Nr?   r(   rA   r[   rz   rC   r{   rI   r_   r`   r|   r}   r~   rT   rL   r1   r1   r2   	test_gemm  s     zTestFBLAS3Simple.test_gemmN)rP   rQ   rR   r   r1   r1   r1   r2   r     s   r   sdzcc                 c   s.   |D ]$}t t||  d}|dkr"q|V  qdS )z;Just a helper: return a specified BLAS function w/typecode.N)rK   rU   )r   ZpsrN   r9   r1   r1   r2   	_get_func-  s
    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestBLAS3Symmc                 C   s`   t ddgddgg| _t dddgdddgg| _t d| _t dddgdddgg| _d S )	Nr   r                 @      )r    rA   g       @g      "@)r+   arrayrE   r   r   r*   trM   r1   r1   r2   setup_method8  s    
zTestBLAS3Symm.setup_methodc              	   C   s   t dD ]|}|| j| j| jddd}t|| j || jj| jd| jddd}t|| j || j| jjd| jjddd}t|| jj qd S )Nsymmr   rE   r   r*   r   r   r@   rE   r   r   r*   r   r   )rE   r   sider*   r   r   )r   rE   r   r*   r   r   r   rM   r9   resr1   r1   r2   	test_symmA  s     zTestBLAS3Symm.test_symmc                 C   s4   t tdd }|d k	r0tt|f| j| jddd d S )Ndsymmr@   )rE   r   r   r   )rK   rU   r   r   rE   r   rM   r9   r1   r1   r2   test_summ_wrong_sideM  s     z"TestBLAS3Symm.test_summ_wrong_sidec                 C   sn   t tdd}|dk	rj|| j| j| jddd}t|| js>t|| j| jd| jddd}t|| jrjtdS )zSYMM only considers the upper/lower part of A. Hence setting
        wrong value for `lower` (default is lower=0, meaning upper triangle)
        gives a wrong result.
        r   Nr   r   r@   r   )	rK   rU   rE   r   r*   r+   Zallcloser   r8   r   r1   r1   r2   test_symm_wrong_uploU  s    z"TestBLAS3Symm.test_symm_wrong_uploN)rP   rQ   rR   r   r   r   r   r1   r1   r1   r2   r   6  s   	r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestBLAS3Syrkc                 C   s^   t ddgddgddgg| _t dddgdddgdddgg| _t d	d
gd
dgg| _d S )Nr   r          r   r         @g            *@      @      @)r+   r   rE   r   ttr   r1   r1   r2   r   d  s    

zTestBLAS3Syrk.setup_methodc                 C   s   t dD ]}|| jdd}tt|t| j || jddd}tt|t| j t| jj}|| jdd|d}tt|t| j|  || jddd}tt|t| j	 qd S )Nsyrkr   rE   r   r@   )rE   r   r   )rE   r   r   r*   )rE   r   r   )
r   rE   r   r+   r   r   r   r   shaper  rM   r9   r*   Zc0r1   r1   r2   	test_syrkn  s    zTestBLAS3Syrk.test_syrkc                 C   s6   t tdd }|d k	r2tt|f| jdtdd d S )NZdsyrkr   )rC   rX   )rE   r   r*   )rK   rU   r   r   rE   r+   r   r   r1   r1   r2   test_syrk_wrong_c  s
    zTestBLAS3Syrk.test_syrk_wrong_cN)rP   rQ   rR   r   r  r  r1   r1   r1   r2   r  c  s   
r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestBLAS3Syr2kc                 C   s|   t ddgddgddgg| _t ddgddgddgg| _t dddgdddgdddgg| _t ddgdd	gg| _d S )
Nr   r   r  r   r   r   r   r  rl   )r+   r   rE   r   r   r  r   r1   r1   r2   r     s    


zTestBLAS3Syr2k.setup_methodc                 C   s   t dD ]}|| j| jdd}tt|t| j || j| jddd}tt|t| j t| jj	}|| j| jdd|d}tt|t| j|  || j| jddd}tt|t| j
 qd S )Nsyr2kr   rE   r   r   r@   )rE   r   r   r   )rE   r   r   r   r*   )rE   r   r   r   )r   rE   r   r   r+   r   r   r   r   r
  r  r  r1   r1   r2   
test_syr2k  s    zTestBLAS3Syr2k.test_syr2kc                 C   s:   t tdd }|d k	r6tt|f| j| jdtdd d S )NZdsyr2kr   )r   rX   )rE   r   r   r*   )rK   rU   r   r   rE   r   r+   r   r   r1   r1   r2   test_syr2k_wrong_c  s    z!TestBLAS3Syr2k.test_syr2k_wrong_cN)rP   rQ   rR   r   r  r  r1   r1   r1   r2   r    s   r  c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )TestSyHez2Quick and simple tests for (zc)-symm, syrk, syr2k.c                 C   s   t ddgddgg| _d S )Nr   y             r   )r+   r   sigma_yr   r1   r1   r2   r     s    
zTestSyHe.setup_methodc                 C   s@   t ddD ]0}|| j| jdd}tt|tddg q
d S )Nr   zcr   r  r@   rB   r   r  r   r+   r   r   r   r1   r1   r2   test_symm_zc  s    zTestSyHe.test_symm_zcc                 C   s@   t ddD ]0}|| j| jdd}tt|tddg q
d S )NZhemmr  r   r  r@   r  r   r1   r1   r2   test_hemm_zc  s    zTestSyHe.test_hemm_zcc                 C   s<   t ddD ],}|| jdd}tt|tddg q
d S )Nr  r  r   r	  rB   r  r   r1   r1   r2   test_syrk_zr  s    zTestSyHe.test_syrk_zrc                 C   s<   t ddD ],}|| jdd}tt|tddg q
d S )NZherkr  r   r	  r@   r  r   r1   r1   r2   test_herk_zr  s    zTestSyHe.test_herk_zrc                 C   sD   t ddD ]4}|| j| jdd}tt|dtddg  q
d S )Nr  r  r   r  r   rB   r  r   r1   r1   r2   test_syr2k_zr  s    zTestSyHe.test_syr2k_zrc                 C   sD   t ddD ]4}|| j| jdd}tt|dtddg  q
d S )NZher2kr  r   r  r   r@   r  r   r1   r1   r2   test_her2k_zr  s    zTestSyHe.test_her2k_zrN)rP   rQ   rR   __doc__r   r  r  r  r  r  r  r1   r1   r1   r2   r    s   r  c                   @   sF   e Zd ZdZdd Zejdedd Z	dd Z
d	d
 Zdd ZdS )TestTRMMz!Quick and simple tests for dtrmm.c                 C   s   t ddgddgg| _t dddgdddgg| _t jd	d	d
dgdd	ddgddd	dgdddd	ggdd| _t jd	dgd
dgddgddgddggdd| _d S )Nr   r   r  r   r  r   r  r  r@   r    rA   r   rW   rC   rl   r9   )r#   rF   rX   rG   rm   )r+   r   rE   r   a2b2r   r1   r1   r2   r     s     



$zTestTRMM.setup_methoddtype_c                 C   s   t d|d}tt|d| j| j |d| j|| j|dd}| jjd }t|| j| jd |d |f  ddt	|j
 d d S )	Ntrmmr)   r   r@   )r   r   d   )r   atol)r   r   r   r  r   r   r
  r   r+   finfoeps)rM   r!  r"  r   r   r1   r1   r2   	test_side  s     zTestTRMM.test_sidec                 C   sL   t tdd }|d k	rH|d| j| j}tdddgdddgg}t|| d S )	Ndtrmmr   r  g      0@g      r  r  r  rK   rU   rE   r   r+   r   r   rM   r9   resultexpectedr1   r1   r2   test_ab  s    zTestTRMM.test_abc                 C   sP   t tdd }|d k	rL|d| j| jdd}tdddgddd	gg}t|| d S )
Nr(  r   Tr   r   r  r   r  r   r)  r*  r1   r1   r2   test_ab_lower  s    zTestTRMM.test_ab_lowerc                 C   s   t tdd }|d k	rdD ]L}| j }|d| j||d}t|jjdkoTt	||dk t
|| j qt| j }|d| j|dd}t|jjdkot	||dk t|| d S )Nr(  )TFr   )Zoverwrite_bFT)rK   rU   r   rV   rE   r   flagsf_contiguousr+   Zmay_share_memoryr   Zasfortranarrayr   )rM   r9   ZoverwrZbcopyr+  r1   r1   r2   test_b_overwrites  s    
zTestTRMM.test_b_overwritesN)rP   rQ   rR   r  r   pytestmarkZparametrizer   r'  r-  r.  r1  r1   r1   r1   r2   r    s   

	r  c               	   C   sz  t d ttD ]b\} }t|jd }td|d\}tdd|}tdd|}|d}t	t
|||| t	t
|||j| d}d	}|d
}| dk rt||nt||t||d  t| }||}t|}	t|}
t|||}t|||}||||d}t|j|j t|	|| }t|||d ||||dd}t|	j|| }t|||d ||||dd}t|	 j|| }t|||d ||||dd}|d|	t|t|f< t|	|| }t|||d ||||ddd}t|	 j|| j }t|| j|d ||||dddd}|d|
t|t|f< t|
 j|| j }t|| j|d qd S )Nr   i  )Ztrsmr)   rW   rC   r@   rX   rF   g      r    r   )r   rE   r   )r$  )r   rE   r   Ztrans_a)r   rE   r   r   )r   rE   r   r   r   )r   rE   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"   Ztolr   r   Br   r   r   ZAuZAlZB1ZB2rs   Zx2r1   r1   r2   	test_trsm  sN    2
r5  )r   )8Z	__usage__ri   r2  Znumpyr+   Znumpy.testingr   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Znumpy.randomr   r   Zscipy.linalgr   rU   r   r   r   r   r&   ImportErrorZREAL_DTYPESr   r   r3   r<   r=   rS   ry   r   r   r   r  r  r  r  r5  r1   r1   r1   r2   <module>   s@   D
'v    C
	-%((@