3
Oéd¸@  ã               @   sò   d Z ddlmZ ddlmZ ddlZddlZddlmZm	Z	 ddl
mZmZ ddlZddljZddlmZ ddlmZ G d	d
„ d
eƒZG dd„ deƒ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 )#z6Test functions for the sparse.linalg.interface module
é    )Úpartial)ÚproductN)ÚraisesÚwarns)Úassert_Úassert_equal)Ú	interface)Úmatrixc               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestLinearOperatorc             C   sV   t jdddgdddggƒ| _t jddgddgddggƒ| _t jddgddggƒ| _d S )Né   é   é   é   é   é   )ÚnpÚarrayÚAÚBÚC)Úself© r   ú\/var/www/html/virt/lib64/python3.6/site-packages/scipy/sparse/linalg/tests/test_interface.pyÚsetup_method   s    

zTestLinearOperator.setup_methodc       
   	      sÆ
  dd„ }xî|| j ƒD ]Þ}tjf |Ž‰ tˆ jf kƒ tˆ jtjdddgƒƒddgƒ tˆ jtjdgdgdggƒƒdgdggƒ tˆ tjdddgƒ ddgƒ tˆ tjdgdgdggƒ dgdggƒ tˆ j	tjdddgƒƒddgƒ tˆ j	tjdgdgdggƒƒdgdggƒ tˆ jt
dgdgdggƒƒdgdggƒ tˆ t
dgdgdggƒ dgdggƒ tˆ j	t
dgdgdggƒƒdgdggƒ tdˆ  dddg dd	gƒ tdˆ  jddgƒd
ddgƒ tdˆ  jjddgƒd
ddgƒ tdˆ  dgdgdgg dgd	ggƒ tdˆ  jdgdgdggƒdgd	ggƒ tˆ d dddg dd	gƒ tˆ d dgdgdgg dgd	ggƒ tdˆ  dddg ddgƒ tˆ ˆ  dddg dd	gƒ tˆ ˆ  jddgƒd
ddgƒ tˆ ˆ  jjddgƒd
ddgƒ tˆ ˆ  dgdgdgg dgd	ggƒ tˆ ˆ  jdgdgdggƒdgd	ggƒ tˆ  dddg dd gƒ tˆ  dgdgdgg d!gd"ggƒ tˆ ˆ  dddg ddgƒ tˆ ˆ  dgdgdgg dgdggƒ tjddgddggƒ}tdˆ  j|ƒtj	d| j  j|ƒƒ tˆ d j|ƒtj	| j d j|ƒƒ tdˆ  j|ƒtj	d| j  jjƒ |ƒƒ tˆ d j|ƒtj	| j d jjƒ |ƒƒ tˆ ˆ  j|ƒtj	| j | j  j|ƒƒ tˆ dˆ   j|ƒtj	| j d| j   jjƒ |ƒƒ tˆ  j|ƒtj	| j  j|ƒƒ tˆ ˆ  j|ƒtj	| j | j  j|ƒƒ tdˆ  jd| ƒtj	d| j  jjƒ d| ƒƒ ˆ ˆ  }tt|jƒdkof|jd ˆ kof|jd ˆ kƒ dˆ  }tt|jƒdko |jd ˆ ko |jd dkƒ ttˆ jdddgƒtjƒƒ ttˆ jtjdgdgdggƒƒtjƒƒ ttˆ tjdddgƒ tjƒƒ ttˆ tjdgdgdggƒ tjƒƒ ttˆ j	tjdddgƒƒtjƒƒ ttˆ j	tjdgdgdggƒƒtjƒƒ ttˆ jt
dgdgdggƒƒtjƒƒ ttˆ t
dgdgdggƒ tjƒƒ ttˆ j	t
dgdgdggƒƒtjƒƒ ttdˆ  tjƒƒ ttdˆ  tjƒƒ ttˆ ˆ  tjƒƒ ttˆ  tjƒƒ ttˆ ˆ  tjƒƒ tdˆ  jtjkƒ ttˆ jtjddgƒƒ ttˆ jtjddddgƒƒ ttˆ jtjdgdggƒƒ ttˆ jtjdgdgdgdggƒƒ tt‡ fdd„ƒ tt‡ fdd„ƒ qW x¸t|| j ƒ|| jƒƒD ]œ\}}tjf |Ž‰ tjf |Ž‰| j j	| jƒ}tjddgddggƒ}tˆ ˆ j|ƒtj	|j|ƒƒ tdˆ  ˆ j|ƒtj	d| jjƒ |ƒƒ tˆ ˆ ddg ddgƒ tˆ ˆ dgdgg dgdggƒ tˆ ˆ jdgdggƒdgdggƒ tˆ ˆ jddgƒddgƒ tˆ ˆ jjddgƒddgƒ ttˆ ˆ tjƒƒ tt‡ ‡fdd„ƒ tt‡ fdd„ƒ ˆ ˆ }tt|jƒdk	o¬|jd ˆ k	o¬|jd ˆkƒ qW x|| jƒD ]ú}tjf |Ž}	tjddgddggƒ}t|	j|ƒtj	| jj|ƒƒ t|	d j|ƒtj	tj	| j| jƒj|ƒƒ t|	d ddg ddgƒ t|	d jddgƒddgƒ t|	d jjddgƒddgƒ t|	d jdgdggƒdgdggƒ tt|	d tjƒƒ 	qÄW d S )#Nc                sP   ˆ j ‡ fdd„‡ fdd„dœˆ j ‡ fdd„‡ fdd„‡ fdd„‡ fdd„d	œgS )
Nc                s   t jˆ | ƒjˆ jd ƒS )Nr   )r   ÚdotÚreshapeÚshape)Úx)r   r   r   Ú<lambda>    s    zETestLinearOperator.test_matvec.<locals>.get_matvecs.<locals>.<lambda>c                s   t jˆ jjƒ | ƒjˆ jd ƒS )Nr   )r   r   ÚTÚconjr   r   )r   )r   r   r   r   !   s   )r   ÚmatvecÚrmatvecc                s   t jˆ | ƒS )N)r   r   )r   )r   r   r   r   &   s    c                s   t jˆ jjƒ | ƒS )N)r   r   r   r    )r   )r   r   r   r   '   s    c                s   t jˆ jjƒ | ƒS )N)r   r   r   r    )r   )r   r   r   r   (   s    c                s   t jˆ | ƒS )N)r   r   )r   )r   r   r   r   )   s    )r   r!   r"   ÚrmatmatÚmatmat)r   )r   r   )r   r   Úget_matvecs   s    



z3TestLinearOperator.test_matvec.<locals>.get_matvecsr   r   r   é   é    é   é   é
   é   y               @y              (@y              >@r   é   r   r   c                  s   ˆ ˆ  S )Nr   r   )r   r   r   r   }   s    z0TestLinearOperator.test_matvec.<locals>.<lambda>c                  s   ˆ d S )Nr   r   r   )r   r   r   r   ~   s    é2   éq   éG   é\   c                  s   ˆ ˆ S )Nr   r   )r   r   r   r   r   •   s    c                  s   ˆ d S )Nr   r   r   )r   r   r   r   –   s    é   é%   é   iúÿÿÿiñÿÿÿiúÿÿÿiñÿÿÿ)r   r   ÚLinearOperatorr   Úargsr   r!   r   r   r   r	   r"   ÚHr$   r#   r   r    ÚlenÚ
isinstanceZndarrayZ_ScaledLinearOperatorZ_SumLinearOperatorÚdtypeÚcomplex_Úassert_raisesÚ
ValueErrorr   r   Z_ProductLinearOperatorr   Z_PowerLinearOperator)
r   r%   ZmatvecsÚXÚzZmatvecsAZmatvecsBZAtimesBZmatvecsCr   r   )r   r   r   Útest_matvec   sÊ     *( *(&( &(& &($&$$  22( &"(&$&$"$8$zTestLinearOperator.test_matvecc                sº   ˆ j j‡ fdd„‡ fdd„‡ fdd„‡ fdd„dœ}tjf |Ž}tjddd	gd
ddgdddggƒ}|d }ttj||ƒ|| ƒ ttj||ƒ|| ƒ t	t
tj|dƒ t	t
tjd|ƒ d S )Nc                s   t jˆ j| ƒjˆ jjd ƒS )Nr   )r   r   r   r   r   )r   )r   r   r   r   ¬   s    z0TestLinearOperator.test_matmul.<locals>.<lambda>c                s"   t jˆ jjjƒ | ƒjˆ jjd ƒS )Nr   )r   r   r   r   r    r   r   )r   )r   r   r   r   ­   s   c                s   t jˆ jjjƒ | ƒS )N)r   r   r   r   r    )r   )r   r   r   r   ¯   s    c                s   t jˆ j| ƒS )N)r   r   r   )r   )r   r   r   r   °   s    )r   r!   r"   r#   r$   r   r   r   r   r   r   é   é   é	   r   )r   r   r   r4   r   r   r   ÚoperatorÚmatmulr;   r<   )r   ÚDr   r   Úbr   )r   r   Útest_matmulª   s    


zTestLinearOperator.test_matmulN)Ú__name__Ú
__module__Ú__qualname__r   r?   rG   r   r   r   r   r
      s   	 r
   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestAsLinearOperatorc             C   s&  g | _ dd„ }tjdddgdddggƒ}|  j ||tjƒ7  _ |  j ||tjƒ7  _ |  j ||tjƒ7  _ |  j d	d
„ ||jtjƒD ƒ7  _ |  j dd
„ ||jtjƒD ƒ7  _ tjdddgdddggƒ}|  j ||tjƒ7  _ |  j dd
„ ||jtjƒD ƒ7  _ |  j dd
„ ||jtjƒD ƒ7  _ d S )Nc                sò   g }|j tˆ|dˆfƒ |j tjˆ|dˆfƒ |j tjˆ|dˆfƒ ‡fdd„‰ ‡fdd„‰G ‡ ‡fdd„dtjƒ}G ‡fdd	„d	|ƒ}G ‡ ‡fd
d„d|ƒ}G ‡fdd„d|ƒ}|j ||ƒˆfƒ |j ||ƒˆfƒ |j ||ƒˆfƒ |S )N)r9   c                s(   ˆ j | ƒ}t| jƒdkr$|jddƒ}|S )Nr   r   éÿÿÿÿ)r   r7   r   r   )r   r9   Úy)Úoriginalr   r   ÚmvÊ   s    
zATestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.mvc                s   ˆ j jƒ j| ƒS )N)r   r    r   )r   r9   )rN   r   r   ÚrmvÐ   s    zBTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.rmvc                   s(   e Zd Zf Z‡fdd„Z‡ fdd„ZdS )zJTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatlikec                s   t j|ƒ| _ˆ j| _d S )N)r   r9   r   )r   r9   )rN   r   r   Ú__init__Ö   s    zSTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatlike.__init__c                s   ˆ || j ƒS )N)r9   )r   r   )rO   r   r   Ú_matvecÚ   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatlike._matvecN)rH   rI   rJ   r5   rQ   rR   r   )rO   rN   r   r   ÚBaseMatlikeÓ   s   rS   c                   s   e Zd Zf Z‡ fdd„ZdS )zITestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatvecc                s   ˆ || j ƒS )N)r9   )r   r   )rP   r   r   Ú_rmatvecà   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatvec._rmatvecN)rH   rI   rJ   r5   rT   r   )rP   r   r   Ú
HasRmatvecÝ   s   rU   c                   s   e Zd Zf Z‡ ‡fdd„ZdS )zITestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasAdjointc                sD   | j d | j d f}tˆ| jd}tˆ | jd}tj||| j|dS )Nr   r   )r9   )r!   r"   r9   r   )r   r   r9   r   r4   )r   r   r!   r"   )rO   rP   r   r   Ú_adjointæ   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasAdjoint._adjointN)rH   rI   rJ   r5   rV   r   )rO   rP   r   r   Ú
HasAdjointã   s   rW   c                   s$   e Zd Z‡ fdd„Z‡ fdd„ZdS )zITestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatmatc                s
   ˆ j |ƒS )N)r   )r   r   )rN   r   r   Ú_matmatð   s    zQTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatmat._matmatc                s   ˆ j jƒ j|ƒS )N)r   r    r   )r   r   )rN   r   r   Ú_rmatmató   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatmat._rmatmatN)rH   rI   rJ   rX   rY   r   )rN   r   r   Ú
HasRmatmatï   s   rZ   )Úappendr	   r   r   ÚsparseZ
csr_matrixr   r4   )rN   r9   ÚcasesrS   rU   rW   rZ   r   )rO   rN   rP   r   Ú
make_casesÁ   s    
z5TestAsLinearOperator.setup_method.<locals>.make_casesr   r   r   r   r   r   c             S   s"   g | ]\}}t j|ƒj|jf‘qS r   )r   Úaslinearoperatorr   )Ú.0ÚMr   r   r   r   ú
<listcomp>ÿ   s   z5TestAsLinearOperator.setup_method.<locals>.<listcomp>c             S   s&   g | ]\}}t j|ƒj|jjƒ f‘qS r   )r   r_   r6   r   r    )r`   ra   r   r   r   r   rb     s   y               @y              @y              @y              @c             S   s"   g | ]\}}t j|ƒj|jf‘qS r   )r   r_   r   )r`   ra   r   r   r   r   rb     s   c             S   s&   g | ]\}}t j|ƒj|jjƒ f‘qS r   )r   r_   r6   r   r    )r`   ra   r   r   r   r   rb     s   )r]   r   r   Zint32Zfloat32Úfloat64r   r:   )r   r^   rN   r   r   r   r   ¾   s     :z!TestAsLinearOperator.setup_methodc       
      C   sN  xF| j D ]:\}}tj|ƒ}|j\}}tjdddgƒtjdgdgdggƒg}tjddgƒtjdgdggƒg}|jtjkrÈ|tjdddgƒtjdgdgdggƒg7 }|tjddgƒtjdgdggƒg7 }tjddgddgddggƒ}x6|D ].}t|j	|ƒ|j
|ƒƒ t|| |j
|ƒƒ qêW t|j|ƒ|j
|ƒƒ t|| |j
|ƒƒ xb|D ]Z}	t|j|	ƒ|jjƒ j
|	ƒƒ t|jj	|	ƒ|jj
|	ƒƒ t|jj	|	ƒ|jjƒ j
|	ƒƒ qLW xr|D ]j}	|	jdk rÄq°t|j|	ƒ|jjƒ j
|	ƒƒ t|jj|	ƒ|jj
|	ƒƒ t|jj|	ƒ|jjƒ j
|	ƒƒ q°W t|d	ƒr8t|j|jƒ tt|d
ƒƒ q
W d S )Nr   r   r   y               @y              @r   r   r   r9   r5   )r]   r   r_   r   r   r   r9   r:   r   r!   r   r$   r"   r   r    r6   Úndimr#   Úhasattrr   )
r   ra   ÚA_arrayr   ÚNÚxsZysÚx2r   rM   r   r   r   Ú
test_basic  s:    

 $

$
$zTestAsLinearOperator.test_basicc             C   s°   xª| j D ] \}}tj|ƒ}|j\}}tjdddgƒ}tjdgdgdggƒ}tjddgddgddggƒ}t|j|ƒ|j|ƒƒ t|j|ƒ|j|ƒƒ t|j|ƒ|j|ƒƒ qW d S )Nr   r   r   r   r   r   )r]   r   r_   r   r   r   r   r   )r   ra   rf   r   rg   Zx0Úx1ri   r   r   r   Útest_dot4  s    

zTestAsLinearOperator.test_dotN)rH   rI   rJ   r   rj   rl   r   r   r   r   rK   ½   s   M)rK   c              C   s,   t jddd„ d} t| ƒ}td|k|ƒ d S )Nr   c             S   s   dS )Nr   r   )r   r   r   r   r   D  s    ztest_repr.<locals>.<lambda>)r   r!   zunspecified dtype)r   r   )r   r4   Úreprr   )r   Zrepr_Ar   r   r   Ú	test_reprC  s    rn   c              C   sf   t jdƒ} t| dddg dddgƒ t| jtjdƒjddƒƒjƒ tjdƒƒ tt	| j
ddddgƒ d S )Nr   r   r   rB   r   )r   r   )r   ZIdentityOperatorr   r   r   Úaranger   Zravelr;   r<   r!   )Úidentr   r   r   Útest_identityI  s    
(rq   c              C   sŠ   t jtjdƒjddƒƒ} dd„ }t jd
|d}xV| || | | j| |  || | d gD ].}tt|dƒƒ tt|dƒƒ tt|d	ƒƒ qTW d S )Né   r   c             S   s,   t j| ƒ} t| jdkp| jdkƒ t jdƒS )Nr   r   r   )r   )r   r   )r   Zasarrayr   r   Zones)r   r   r   r   Úalways_four_onesT  s    
z)test_attributes.<locals>.always_four_onesr   )r   r!   r9   r   rR   )r   r   )	r   r_   r   ro   r   r4   r6   r   re   )r   rs   r   Úopr   r   r   Útest_attributesQ  s    *ru   c             C   s
   t jdƒS )z> Needed for test_pickle as local functions are not pickleable r   )r   Zzeros)r   r   r   r   r!   `  s    r!   c              C   sn   dd l } x`t| jd ƒD ]N}tjdtƒ}| j||d}| j|ƒ}x$|jD ]}t	t
||ƒt
||ƒƒ qHW qW d S )Nr   r   r   )Úprotocol)r   r   )ÚpickleÚrangeÚHIGHEST_PROTOCOLr   r4   r!   ÚdumpsÚloadsÚ__dict__r   Úgetattr)rw   rv   r   Úsr   Úkr   r   r   Útest_pickled  s    
r€   c                 sÈ   G dd„ dt jƒ} ttdd tt| ƒ W d Q R X G ‡ fdd„dt jƒ‰ ˆ dƒ}t|jdd	dgƒdd	dgƒ tt|j	d
ddgƒ G ‡fdd„dt jƒ‰ˆt
jjddƒƒ}t|jt
jjdƒƒjdƒ d S )Nc               @   s   e Zd ZdS )ztest_inheritance.<locals>.EmptyN)rH   rI   rJ   r   r   r   r   ÚEmptyp  s   r   zshould implement at least)Úmatchc                   s&   e Zd Z‡‡ fdd„Zdd„ Z‡  ZS )z"test_inheritance.<locals>.Identityc                s   t ˆ | ƒjd ||fd d S )N)r9   r   )ÚsuperrQ   )r   Ún)ÚIdentityÚ	__class__r   r   rQ   w  s    z+test_inheritance.<locals>.Identity.__init__c             S   s   |S )Nr   )r   r   r   r   r   rR   z  s    z*test_inheritance.<locals>.Identity._matvec)rH   rI   rJ   rQ   rR   Ú__classcell__r   )r…   )r†   r   r…   v  s   r…   r   r   r   r   r   r   c                   s&   e Zd Z‡‡ fdd„Zdd„ Z‡  ZS )z$test_inheritance.<locals>.MatmatOnlyc                s    t ˆ | ƒj|j|jƒ || _d S )N)rƒ   rQ   r9   r   r   )r   r   )Ú
MatmatOnlyr†   r   r   rQ   ‚  s    z-test_inheritance.<locals>.MatmatOnly.__init__c             S   s   | j j|ƒS )N)r   r   )r   r   r   r   r   rX   †  s    z,test_inheritance.<locals>.MatmatOnly._matmat)rH   rI   rJ   rQ   rX   r‡   r   )rˆ   )r†   r   rˆ     s   rˆ   )r   )r   r4   r   ÚRuntimeWarningr;   Ú	TypeErrorr   r!   ÚNotImplementedErrorr"   r   ÚrandomZrandnr   )r   Zid3Úmmr   )r…   rˆ   r   Útest_inheritanceo  s    rŽ   c              C   sr   t jjddƒdt jjddƒ  } t jjddƒ}tj| ƒ}tj|ƒ}|| }|| }t|jt jƒ t|jt jƒ d S )Nr   y              ð?)	r   rŒ   Zrandr   r_   r   r9   rc   Z
complex128)Zmat_complexZmat_realZcomplex_operatorZreal_operatorZsum_complexZsum_realr   r   r   Útest_dtypes_of_operator_sumŒ  s     

r   c                 s2   dg‰ ‡ fdd„} t jd| d tˆ d dƒ d S )Nr   c                s   ˆ d  d7  < | S )Nr   r   r   )Úv)Ú
call_countr   r   r!   ž  s    z#test_no_double_init.<locals>.matvecr   )r!   r   )r   r   )r   r4   r   )r!   r   )r‘   r   Útest_no_double_init›  s    r’   c              C   sl   t jdggƒ} tj| ƒ}d| }d|  }t jdgƒ}t|j|ƒ|j|ƒƒ t|jj|ƒ|jjƒ j|ƒƒ d S )Ny              ð?r   )	r   r   r   r_   r   r   r6   r   r    )r=   r   r   ÚYr   r   r   r   Útest_adjoint_conjugate§  s    
r”   c              C   s(   t jdggƒ} tj| ƒ}t|jdƒ d S )Nr   r   )r   r   r   r_   r   rd   )r=   r   r   r   r   Ú	test_ndim³  s    
r•   c              C   sh   t jdggƒ} tj| ƒ}d| }d|  }t jdgƒ}t|j|ƒ|j|ƒƒ t|jj|ƒ|jj|ƒƒ d S )Ny              ð?r   )r   r   r   r_   r   r   r   )r=   r   r   r“   r   r   r   r   Útest_transpose_noconjugate¸  s    
r–   )#Ú__doc__Ú	functoolsr   Ú	itertoolsr   rC   Zpytestr   r;   r   Znumpy.testingr   r   Znumpyr   Zscipy.sparser\   Zscipy.sparse.linalgr   Zscipy.sparse.sputilsr	   Úobjectr
   rK   rn   rq   ru   r!   r€   rŽ   r   r’   r”   r•   r–   r   r   r   r   Ú<module>   s2   
 , 