o
    Eb                     @   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'yk   dZ&Y nw 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 ur4t| 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&   Zmodule_nameZlongcomplexr	   )f1f2Zf3 r0   >/usr/lib/python3/dist-packages/scipy/linalg/tests/test_blas.pytest_get_blas_funcs$   s2   
r2   c                  C   s^   t dtjd\} }| jdksJ |jdksJ t dtjd\} }}| |u s'J | |u s-J d S )N)nrm2dotr)   r*   )r4   dotcdotu)r   r+   r
   r-   r	   )fghr0   r0   r1   test_get_blas_funcs_aliasK   s   r:   c                   @      e Zd Zdd ZdS )TestCBLAS1Simplec                 C      dD ]}t t|d d }|d u rqt|g dg dddg d qdD ]}t t|d d }|d u r3q$t|g d	g dddg d
 q$d S Nsdr      r       )r    rB      a)   	      cz)rA                  @rB   )rG   y            $@rI   )getattrr&   r   selfpr7   r0   r0   r1   	test_axpyX      zTestCBLAS1Simple.test_axpyN)__name__
__module____qualname__rP   r0   r0   r0   r1   r<   V       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   r=   r>   rL   fblasr   rM   r0   r0   r1   rP   i   rQ   zTestFBLAS1Simple.test_axpyc                 C   s   dD ]}t t|d d }|d u rqt|g ddgd g d qdD ]}t t|d d }|d u r2q#t|g ddgd g d q#d S )Nr?   copy)rB      rD      rB   rJ   )rB                 @y      @      @rW   rM   r0   r0   r1   	test_copyw   s     zTestFBLAS1Simple.test_copyc                 C   sp   dD ]}t t|d d }|d u rqt|g dd qdD ]}t t|d d }|d u r,qt|g dd qd S )Nr?   ZasumrB   rD      )scdz              @r_         @         rL   rX   r   rM   r0   r0   r1   	test_asum   s   zTestFBLAS1Simple.test_asumc                 C   @   dD ]}t t|d d }|d u rqt|g dg dd qd S )Nr?   r4   r^   )r    rD   rA   rg   rM   r0   r0   r1   test_dot      zTestFBLAS1Simple.test_dotc                 C   ri   )NrJ   r6   rc   r    rB   rA   y      "       @rg   rM   r0   r0   r1   test_complex_dotu   rl   z"TestFBLAS1Simple.test_complex_dotuc                 C   ri   )NrJ   r5   rc   r    rd   rA   y      @      ,rg   rM   r0   r0   r1   test_complex_dotc   rl   z"TestFBLAS1Simple.test_complex_dotcc                 C   s|   dD ]}t t|d d }|d u rqt|g dtd qdD ]}t t|d d }|d u r/q t|g dtd q d S )Nr?   r3   r^   2   )r*   r%   ra   rb   rc   )rL   rX   r   mathZsqrtrM   r0   r0   r1   	test_nrm2   s   zTestFBLAS1Simple.test_nrm2c                 C   s   dD ]}t t|d d }|d u rqt|dg dg d qdD ]}t t|d d }|d u r/q t|dg dg d	 q d
D ]}t t|d d }|d u rMq>t|dg dg d q>d S )Nr?   Zscalr    r^   )   i
   rJ   rd   rc   )rj   y             (y      (@      "@)csZzdrB   )y              "@iy      "@      (rW   rM   r0   r0   r1   	test_scal   s    zTestFBLAS1Simple.test_scalc                 C   s   dD ])}t t|d d }|d u rqg dg d}}|||\}}t|| t|| qdD ])}t t|d d }|d u r=q.g dg d}}|||\}}t|| t|| q.d S )Nr?   Zswaprm   )rB   rG   rJ   ro   )rx   rB   y      @      rW   )rN   rO   r7   xyx1y1r0   r0   r1   	test_swap   s"   

zTestFBLAS1Simple.test_swapc                 C   s`   dD ]}t td| d }t|g dd qdD ]}t td| d }t|g dd qd S )Nr?   iZamax)rx   rZ   rB   rA   rJ   )y      @      @rt   )rL   rX   r   rM   r0   r0   r1   	test_amax   s   zTestFBLAS1Simple.test_amaxN)rR   rS   rT   rP   r]   rh   rk   rn   rp   rs   rw   r}   r   r0   r0   r0   r1   rV   g   s    rV   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 ],}t t|d d }|d u 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 ],}t t|d d }|d u r@q1t|d	d
ggdgdg t|d	d
ggdgddgdg q1d S )Nr?   ZgemvrB   r_   rD   rJ   rd   re         H      B              @      H      5rW   rM   r0   r0   r1   	test_gemv   s   "zTestFBLAS2Simple.test_gemvc              	   C   s  dD ]S}t t|d d }|d u rqt|dddgddgddgddgg t|dg d	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 ]8}t t|d d }|d u rgqXt|dddgddgddgddgg t|dg dddgddgd
dgddgg qXdD ]=}dD ]8}t t|| d }|d u rqt|dddgddgddgddgg t|dg dddgddgd
dgddgg qqd S )Nr?   gerrA   r    rB   rZ   rt   r[   r@   r`      rI      rE   rH   rJ   Zgeru              ?rd   r\   rx   )r   rK   rd   )r   ZgercrW   )rN   rO   r7   namer0   r0   r1   test_ger   sH   &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 u rqt|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||u 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 u rr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||u 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 u r8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rwdndd}|d||dd}t|||d |d||d}t||u 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%d S ))NrA   rD   r'   r)   rC   r         !@   FZendpointrH   DrZ   r?   Hz>+=Zsyr      ?rtolTlowerr    )incxoffxnrx   rZ   rZ   sr7   r!   rF   Zoverwrite_a       @rE   rB   r   r   r   r   rJ   r*   Zher)r+   r   r   newaxislinspaceviewconjc_r   ravelziprL   rX   r   Tr   assert_raises	Exception)rN   ry   ZresxZresx_reverserz   r%   ZreszZresz_reverseZrehzZrehz_reversewrO   r   r7   rF   br0   r0   r1   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 u rpq^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rdndd}	|d|||	dd}
t|	||d |d |||	d!}
t|	|
u 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 )'NrA   rD   r'   r)   rH   rC   r   r   r   Fr   r?   r   r   Zsyr2r   r   rB   r   Tr   r    ru   r   r   incyoffyr   r   r   r   r   rx   r   r   r7   r!   r   r   rE   r   r   r   r   r   )r+   r   r   r   r   r   rL   rX   r   r   r   r   r   r   )rN   ry   rz   resxyresxy_reverseqrO   r   r7   rF   r   r0   r0   r1   	test_syr2n  sT   2$ *zTestFBLAS2Simple.test_syr2c                 C   sJ  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 ]\}}t
t|d d }	|	d u 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rdndd}
|	d|||
dd}t|
||d |	d|||
d}t|
|u 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 )%NrA   rH   r'   r)   r   r   rC   rZ   rJ   r   r   Zher2r   r   rB   r   Tr   r   r   r   r   r*   r!   r   r   rE   r   r   rD   r   rx   r   r   r    r   )r+   r   r   r   r   r   r   r   r   r   rL   rX   r   r   r   r   r   )rN   ry   rz   r   r   uvrO   r   r7   rF   r   r0   r0   r1   	test_her2  s\   4
&*
  *zTestFBLAS2Simple.test_her2c                 C   sT  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  rG   rD   rA   r    r)   )r   r   )r   rA   rt   )r   r    r   )rA   r   rB   rZ   r   )Zgbmv)	mr   kuklalpharF   ry   rz   beta)r   	enumerateDTYPESr   r   r   r   astyper   r4   r   )rN   indr"   r   r   r   r   AAbry   rz   r   r   funcr|   y2r0   r0   r1   	test_gbmv  s2   
zTestFBLAS2Simple.test_gbmvc              	   C   sv  t d ttD ]\}}d}d}t||f|d}t|d |f|d}t||t|t|f< td|d D ]}t|| }||t|| t||f< ||d| |d f< q5||}|dk rc||j n||	 j }t
||dd d f< t||}	t||}
|d|d}}|dkrtd	|d\}ntd
|d\}|||||	|
|d}|||	 ||
  }t|| qd S )Nr   rt   r    r)   rA   rC         ?rB   )Zhbmv)Zsbmv)kr   rF   ry   rz   r   )r   r   r   r   r   r   ranger   r   r   r   r   r4   r   )rN   r   r"   r   r   r   r   Zind2Ztempry   rz   r   r   r   r|   r   r0   r0   r1   test_sbmv_hbmv  s0   
 zTestFBLAS2Simple.test_sbmv_hbmvc                 C   s  t d ttt D ]\}}d}t|||}|dkr%|t||d 7 }||}|dk r3||j n|| j }t|\}}|||f }t||}t||}	t	d| |}
t
d| |}|d|d}}|dkr{t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   rB   rA   r   rZ   r    r   )Zhpmvr)   )Zspmv)r   r   apry   rz   r   )
r   r   r   ry   rz   r   r   r   r   r   rC   )r   r   r   COMPLEX_DTYPESr   r   r   r   r   r   r   r   r4   r   r   )rN   r   r"   r   r   r*   rApry   rz   ZxlongZylongr   r   r   r|   r   r0   r0   r1   test_spmv_hpmv  s8   
 
:zTestFBLAS2Simple.test_spmv_hpmvc                 C   s  t d ttt D ]\}}d}t|||}|dkr%|t||d 7 }||}|dk r3||j n|| j }t|\}}|||f }t||}tt t	|d d}	|dkr{t
d|d\}
|	|d d d f |d d d f   | }nt
d	|d\}
|	|d d d f |d d d f  | }|
||	||d
}td|d}||||f< |dkr| n||||f< t|| q
d S )Nr   rB   rA   r   rZ   g      @)Zhprr)   )Zspr)r   r   r   ry   rB   rB   )r   r   r   r   r   r   r   r   r   r   r   r4   r   r   )rN   r   r"   r   r   r*   r   r   ry   r   r   r   r|   y1fr0   r0   r1   test_spr_hpr'  s.   
 0*zTestFBLAS2Simple.test_spr_hprc                 C   sl  t d ttD ]\}}d}t|||}|dkr#|t||d 7 }||}|dk r1||j n|| j }t|\}}|||f }t||}t||}	|d}
|dkrbtd|d\}ntd|d\}|
 |d d d f 	|	d d d f   }|| | j }|||
||	|d	}t
d
|d}||||f< |g d  |g dg df< t|| qd S )Nr   rB   rA   r   r    )Zhpr2r)   )Zspr2)r   r   ry   rz   r   r   )rA   rB   rZ   )rA   r    r    )r   r   rA   )r   r   r   r   r   r   r   r   r   r4   r   r   )rN   r   r"   r   r   r*   r   r   ry   rz   r   r   r   r   r|   r   r0   r0   r1   test_spr2_hpr2B  s0   
 . 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< q%|dkrZ|t|  dt|d | ||d  d  | 7  < t|d |f|d}t|d D ]}	t	||	d||	 d |	d f< qjt
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   ru   rB   r)   rA   r   r    r   )Ztbmvr   rF   ry   r   rF   ry   r   r   rF   ry   r   trans)r   r   r   r   r   r   r   r   r   r   r   r4   r   r   r   rN   r   r"   r   r   ry   r   supr   rowr   r|   r   r0   r0   r1   	test_tbmv^  8   $: 




zTestFBLAS2Simple.test_tbmvc              
   C   s  t d ttD ]\}}d}d}t||}t||f|d}t|d D ]}t|| |t|| t||f< q%|dkrZ|t|  dt|d | ||d  d  | 7  < t|d |f|d}t|d D ]}	t	||	d||	 d |	d f< qjt
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   rt   rB   r)   rA   r   r    r   )Ztbsvr   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r0   r1   	test_tbsv  r   zTestFBLAS2Simple.test_tbsvc                 C   s:  t d ttD ]\}}d}t||}|dk r t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   ru   r    r   )Ztpmvr)   r   r   ry   rA   r   r   ry   r   r   r   ry   r   r   )r   r   r   r   r   r   r   r   r4   r   r   r   r   rN   r   r"   r   ry   r   r*   r   r   r   r|   r   r0   r0   r1   	test_tpmv  s,   2




zTestFBLAS2Simple.test_tpmvc                 C   sF  t d ttD ]\}}d}t||}|dk r t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   ru   r    r   )Ztpsvr)   r   rA   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r0   r1   	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   rB   )Ztrmvr)   rF   ry   rA   rF   ry   r   rF   ry   r   r   r    )r   r   r   r   r   r   r   r   r4   r   r   r   r   	rN   r   r"   r   r   ry   r   r|   r   r0   r0   r1   	test_trmv  s(   


zTestFBLAS2Simple.test_trmvc           	      C   s6  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   rA   )rF   ry   r   r   r   r    )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r0   r1   	test_trsv  s.   



zTestFBLAS2Simple.test_trsvN)rR   rS   rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   r      s"     `-2 &&r   c                   @   r;   )TestFBLAS3Simplec                 C   s   dD ]+}t t|d d }|d u 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 ]+}t t|d d }|d u r?q0t|d	d
gdgdgg t|d	d
gdgddgdg q0d S )Nr?   r(   rB   r_   r   rD   r   rJ   rd   re   r   r   r   rW   rM   r0   r0   r1   	test_gemm  s     zTestFBLAS3Simple.test_gemmN)rR   rS   rT   r   r0   r0   r0   r1   r     rU   r   sdzcc                 c   s0    |D ]}t t||  d}|du rq|V  qdS )z;Just a helper: return a specified BLAS function w/typecode.N)rL   rX   )r   ZpsrO   r7   r0   r0   r1   	_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   sX   t ddgddgg| _t g dg dg| _t d| _t g dg dg| _d S )	Nr   r           )r   r         @)r         r   )r    rB   )r   r   g       @)r   r   g      "@)r+   arrayrF   r   r   r*   trN   r0   r0   r1   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   rF   r   r*   r   r   rA   rF   r   r   r*   r   r   )rF   r   sider*   r   r   )r   rF   r   r*   r   r   r   rN   r7   resr0   r0   r1   	test_symmA  s   zTestBLAS3Symm.test_symmc                 C   s<   t tdd }|d urtt|fi | j| jddd d S d S )NdsymmrA   )rF   r   r   r  )rL   rX   r   r   rF   r   rN   r7   r0   r0   r1   test_summ_wrong_sideM  s   z"TestBLAS3Symm.test_summ_wrong_sidec                 C   sr   t tdd}|dur5|| j| j| jddd}t|| jsJ || j| jd| jddd}t|| jr7J dS 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   rA   r   )rL   rX   rF   r   r*   r+   Zallcloser   r  r0   r0   r1   test_symm_wrong_uploU  s   z"TestBLAS3Symm.test_symm_wrong_uploN)rR   rS   rT   r   r  r  r  r0   r0   r0   r1   r   6  s
    	r   c                   @   $   e Zd Zdd Zdd Zdd ZdS )TestBLAS3Syrkc                 C   sX   t ddgddgddgg| _t g dg dg dg| _t d	d
gd
dgg| _d S )Nr   r          r   r   )r   r   r   )r         @      )r   r        *@      @      @r  )r+   r   rF   r   ttr   r0   r0   r1   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   rF   r   rA   )rF   r   r   )rF   r   r   r*   )rF   r   r   )
r   rF   r   r+   r   r   r   r   shaper  rN   r7   r*   Zc0r0   r0   r1   	test_syrkn  s   zTestBLAS3Syrk.test_syrkc                 C   s>   t tdd }|d urtt|fi | jdtdd d S d S )NZdsyrkr   )rD   r[   )rF   r   r*   )rL   rX   r   r   rF   r+   r   r  r0   r0   r1   test_syrk_wrong_c  s   zTestBLAS3Syrk.test_syrk_wrong_cN)rR   rS   rT   r   r  r  r0   r0   r0   r1   r
  c  s    
r
  c                   @   r	  )TestBLAS3Syr2kc                 C   sv   t ddgddgddgg| _t ddgddgddgg| _t g dg dg d	g| _t ddgdd
gg| _d S )Nr   r   r  r   r   r   )r   r   r   )r   r   r   )r   r   r  rt   )r+   r   rF   r   r   r  r   r0   r0   r1   r     s   



zTestBLAS3Syr2k.setup_methodc                 C   s   t dD ]c}|| 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   rF   r   r   rA   )rF   r   r   r   )rF   r   r   r   r*   )rF   r   r   r   )r   rF   r   r   r+   r   r   r   r   r  r  r  r0   r0   r1   
test_syr2k  s   zTestBLAS3Syr2k.test_syr2kc              	   C   sB   t tdd }|d urtt|fi | j| jdtdd d S d S )NZdsyr2kr   )r   r[   )rF   r   r   r*   )rL   rX   r   r   rF   r   r+   r   r  r0   r0   r1   test_syr2k_wrong_c  s   z!TestBLAS3Syr2k.test_syr2k_wrong_cN)rR   rS   rT   r   r  r  r0   r0   r0   r1   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   r0   r0   r1   r     s   
zTestSyHe.setup_methodc                 C   s@   t ddD ]}|| j| jdd}tt|tddg qd S )Nr   zcr   r  rA   rC   r   r  r   r+   r   r   r  r0   r0   r1   test_symm_zc     zTestSyHe.test_symm_zcc                 C   s@   t ddD ]}|| j| jdd}tt|tddg qd S )NZhemmr  r   r  rA   r   r  r0   r0   r1   test_hemm_zc  r"  zTestSyHe.test_hemm_zcc                 C   <   t ddD ]}|| jdd}tt|tddg qd S )Nr  r  r   r  rC   r   r  r0   r0   r1   test_syrk_zr     zTestSyHe.test_syrk_zrc                 C   r$  )NZherkr  r   r  rA   r   r  r0   r0   r1   test_herk_zr  r&  zTestSyHe.test_herk_zrc                 C   D   t ddD ]}|| j| jdd}tt|dtddg  qd S )Nr  r  r   r  r   rC   r   r  r0   r0   r1   test_syr2k_zr      zTestSyHe.test_syr2k_zrc                 C   r(  )NZher2kr  r   r  r   rA   r   r  r0   r0   r1   test_her2k_zr  r*  zTestSyHe.test_her2k_zrN)rR   rS   rT   __doc__r   r!  r#  r%  r'  r)  r+  r0   r0   r0   r1   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 g dg dg| _t jg dg dg dg d	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  )rA   rA   r    rB   )r   rA   rZ   rD   )r   r   rA   rt   )r   r   r   rA   r7   )r#   rA   rZ   r    rD   rB   rt   rG   r[   rH   ru   )r+   r   rF   r   a2b2r   r0   r0   r1   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   rA   )r  r   d   )r   atol)r   r   r   r0  r1  r   r  r   r+   finfoeps)rN   r2  r3  r  r   r0   r0   r1   	test_side  s    
zTestTRMM.test_sidec                 C   sL   t tdd }|d ur$|d| j| j}tg dg dg}t|| d S d S )Ndtrmmr   )r  g      0@g      r/  rL   rX   rF   r   r+   r   r   rN   r7   resultZexpectedr0   r0   r1   test_ab  s   
zTestTRMM.test_abc                 C   sP   t tdd }|d ur&|d| j| jdd}tg dg dg}t|| d S d S )Nr9  r   Tr   r.  )r   r  r   r:  r;  r0   r0   r1   test_ab_lower  s   
zTestTRMM.test_ab_lowerc                 C   s   t tdd }|d ur[dD ]&}| j }|d| j||d}t|jjdu o*t	||du  t
|| j qt| j }|d| j|dd}t|jjdu oRt	||du  t|| d S d S )Nr9  )TFr   )Zoverwrite_bFT)rL   rX   r   rY   rF   r   flagsf_contiguousr+   Zmay_share_memoryr   Zasfortranarrayr   )rN   r7   ZoverwrZbcopyr<  r0   r0   r1   test_b_overwrites  s    
zTestTRMM.test_b_overwritesN)rR   rS   rT   r,  r   pytestZmarkZparametrizer   r8  r=  r>  rA  r0   r0   r0   r1   r-    s    

	r-  c               	   C   sz  t d ttD ]1\} }t|jd }td|d\}tdd|}tdd|}|d}t	t
|||| t	t
|||j| d}d	}|d
}| dk rRt||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)   rZ   rD   rA   r[   rG   g      r    r   )r   rF   r   )r5  )r   rF   r   Ztrans_a)r   rF   r   r   )r   rF   r   r   r  )r   rF   r   r   r  r   )r   r   r   r+   r6  r7  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B2r{   Zx2r0   r0   r1   	test_trsm  sP   2
rD  )r   )8Z	__usage__rr   rB  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   rX   r   r   r   r   r&   ImportErrorZREAL_DTYPESr   r   r2   r:   r<   rV   r   r   r   r   r
  r  r  r-  rD  r0   r0   r0   r1   <module>   sD   D'v    C
	-%((@