U
    Gvf@                     @   s   d Z ddlmZ ddlm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mZ ddlm  m  mZ ddlmZ G dd	 d	ZG d
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 )"z7Test functions for the sparse.linalg._interface module
    )partial)productN)raiseswarns)assert_assert_equal)matrixc                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestLinearOperatorc                 C   sV   t dddgdddgg| _t ddgddgddgg| _t ddgddgg| _d S N                  )nparrayABCself r   L/tmp/pip-unpacked-wheel-96ln3f52/scipy/sparse/linalg/tests/test_interface.pysetup_method   s    

zTestLinearOperator.setup_methodc           
   
      s
  dd }|| j D ]}tjf | t jdk t tdddgddg t tdgdgdggdgdgg t tdddg ddg t tdgdgdgg dgdgg t 	tdddgddg t 	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 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d  dddg d	d
g td  ddgdddg td  jddgdddg td  dgdgdgg d	gd
g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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   ddgdddg t   jddgdddg t   dgdgdgg d	gd
g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   dddg ddg t   dgdgdgg dgdgg tddgddgg}td  |t	d| j  j| t d |t	| j d j| td  |t	d| j  j | t d |t	| j d j | t   |t	| j | j  j| t d   |t	| j d| j   j | t  |t	| j  j| t   |t	| j | j  j| td  d| t	d| j  j d|     }tt|jdkob|jd  kob|jd  k d  }tt|jdko|jd  ko|jd dk tt dddgtj tt tdgdgdggtj tt tdddg tj tt tdgdgdgg tj tt 	tdddgtj tt 	tdgdgdggtj tt t
dgdgdggtj tt t
dgdgdgg tj tt 	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ddg tt jtddddg tt jtdgdgg tt jtdgdgdgdgg tt fdd tt fdd qt|| j || jD ]\}}tjf | tjf || j 	| j}tddgddgg}t  |t	|j| td   |t	d| j | t  ddg ddg t  dgdgg dgdgg t  dgdggdgdgg t  ddgddg t  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
|| jD ]}tjf |}	tddgddgg}t|	|t	| jj| t|	d |t	t	| j| jj| t|	d ddg ddg t|	d ddgddg t|	d jddgddg t|	d dgdggdgdgg tt|	d tj 	qd 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d S Nr   )r   dotreshapeshapexr   r   r   <lambda>       zETestLinearOperator.test_matvec.<locals>.get_matvecs.<locals>.<lambda>c                    s   t  j |  jd S Nr   )r   r   Tconjr   r   r   r!   r   r   r"       s   )r   matvecrmatvecc                    s   t  | S Nr   r   r   r!   r   r   r"   %   r#   c                    s   t  j | S r)   r   r   r%   r&   r   r!   r   r   r"   &   r#   c                    s   t  j | S r)   r+   r   r!   r   r   r"   '   r#   c                    s   t  | S r)   r*   r   r!   r   r   r"   (   r#   r   r'   r(   rmatmatmatmat)r   r!   r   r!   r   get_matvecs   s    





z3TestLinearOperator.test_matvec.<locals>.get_matvecsr   r   r   r                
                     @y              (@y              >@iir   r   c                      s      S r)   r   r   r!   r   r   r"   |   r#   z0TestLinearOperator.test_matvec.<locals>.<lambda>c                      s    d S Nr   r   r   r!   r   r   r"   }   r#   2   q   G   \   c                      s     S r)   r   r   r   r   r   r   r"      r#   c                      s    d S r7   r   r   r!   r   r   r"      r#      %      )r   	interface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   test_matvec   s     *( *(&( &(& &($&$$ 22( &"(&$&$
"$6$zTestLinearOperator.test_matvecc                    s    j j fdd fdd fdd fddd}tjf |}tddd	gd
ddgdddgg}|d }tt||||  tt||||  t	t
tj|d t	t
tjd| d S )Nc                    s   t  j|  jjd S r   )r   r   r   r   r   r   r   r   r   r"      r#   z0TestLinearOperator.test_matmul.<locals>.<lambda>c                    s"   t  jj |  jjd S r$   )r   r   r   r%   r&   r   r   r   r   r   r   r"      s   
c                    s   t  jj | S r)   )r   r   r   r%   r&   r   r   r   r   r"      r#   c                    s   t  j| S r)   )r   r   r   r   r   r   r   r"      r#   r,   r   r   r   r   r   r         	   r   )r   r   r@   rA   r   r   r   operatormatmulrH   rI   )r   Dr   r   br   r   r   test_matmul   s     



zTestLinearOperator.test_matmulN)__name__
__module____qualname__r   rL   rT   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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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 }| t|df | tj|df | 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|}| ||f | ||f | ||f |S )NrF   c                    s(     | }t| jdkr$|dd}|S )Nr   r   )r   rD   r   r   )r    rF   yoriginalr   r   mv   s    
zATestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.mvc                    s    j  | S r)   r%   r&   r   )r    rF   r\   r   r   rmv   s    zBTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.rmvc                       s(   e Zd ZdZfddZ fddZdS )zJTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatliker   c                    s   t || _ j| _d S r)   )r   rF   r   )r   rF   r\   r   r   __init__   s    zSTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatlike.__init__c                    s    || j S r)   rY   r   r    )r^   r   r   _matvec   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatlike._matvecN)rU   rV   rW   rB   ra   rc   r   )r^   r]   r   r   BaseMatlike   s   rd   c                       s   e Zd ZdZ fddZdS )zITestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatvecr   c                    s    || j S r)   rY   rb   r`   r   r   _rmatvec   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatvec._rmatvecN)rU   rV   rW   rB   rf   r   re   r   r   
HasRmatvec   s   rg   c                       s   e Zd ZdZ fddZdS )zITestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasAdjointr   c                    sD   | j d | j d f}t| jd}t | jd}tj||| j|dS )Nr   r   rY   )r'   r(   rF   r   )r   r   rF   r@   rA   )r   r   r'   r(   r^   r`   r   r   _adjoint   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasAdjoint._adjointN)rU   rV   rW   rB   ri   r   rh   r   r   
HasAdjoint   s   rj   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
     |S r)   )r   rb   r\   r   r   _matmat   s    zQTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatmat._matmatc                    s    j  |S r)   r_   rb   r\   r   r   _rmatmat   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatmat._rmatmatN)rU   rV   rW   rk   rl   r   r\   r   r   
HasRmatmat   s   rm   )appendr   r   r   sparseZ
csr_matrixr@   rA   )r]   rF   casesrd   rg   rj   rm   r   )r^   r]   r`   r   
make_cases   s    
z5TestAsLinearOperator.setup_method.<locals>.make_casesr   r   r   r   r   r   c                 S   s"   g | ]\}}t |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 fqS r   r@   rs   rC   r%   r&   rt   r   r   r   rw      s   r6                 @y              @y              @c                 S   s"   g | ]\}}t |j|jfqS r   rr   rt   r   r   r   rw     s   c                 S   s&   g | ]\}}t |j|j fqS r   rx   rt   r   r   r   rw     s   )rp   r   r   Zint32Zfloat32float64r%   rG   )r   rq   r]   r   r   r   r      s(    :


z!TestAsLinearOperator.setup_methodc           
      C   s<  | j D ].\}}t|}|j\}}tdddgtdgdgdggg}tddgtdgdggg}|jtjkr|tdddgtdgdgdggg7 }|tddgtdgdggg7 }tddgddgddgg}|D ].}t|	||
| t|| |
| qt|||
| t|| |
| |D ]Z}	t||	|j 
|	 t|j	|	|j
|	 t|j	|	|j 
|	 qB|D ]j}	|	jdk rqt||	|j 
|	 t|j|	|j
|	 t|j|	|j 
|	 qt|d	r(t|j|j tt|d
 qd S )Nr   r   r   r6   ry   r   r   r   rF   rB   )rp   r@   rs   r   r   r   rF   rG   r   r'   r   r.   r(   r%   r&   rC   ndimr-   hasattrr   )
r   rv   A_arrayr   NxsZysx2r    r[   r   r   r   
test_basic
  s>    

 $""zTestAsLinearOperator.test_basicc                 C   s   | j D ]\}}t|}|j\}}tdddg}tdgdgdgg}tddgddgddgg}t|||| t|||| t|||| qd S r
   )rp   r@   rs   r   r   r   r   r   )r   rv   r}   r   r~   Zx0x1r   r   r   r   test_dot3  s    

zTestAsLinearOperator.test_dotN)rU   rV   rW   r   r   r   r   r   r   r   rX      s   M)rX   c                  C   s,   t jddd d} t| }td|k| d S )N)r   r   c                 S   s   dS r$   r   r   r   r   r   r"   C  r#   ztest_repr.<locals>.<lambda>r   r'   zunspecified dtype)r@   rA   reprr   )r   Zrepr_Ar   r   r   	test_reprB  s    r   c                  C   sf   t d} t| dddg dddg t| tddd td tt	| j
ddddg d S )Nr   r   r   r   r   rO   r   )r@   ZIdentityOperatorr   r   r   aranger   ZravelrH   rI   r'   )identr   r   r   test_identityH  s    
(r   c                  C   s   t tddd} dd }t jd|d}| || | | j| |  || | d fD ].}tt|d tt|d tt|d	 qRd S )
N   r   c                 S   s,   t | } t| jdkp| jdk t dS )N)r   )r   r   r   )r   Zasarrayr   r   Zonesr   r   r   r   always_four_onesS  s    
z)test_attributes.<locals>.always_four_ones)r   r   r   rF   r   rc   )	r@   rs   r   r   r   rA   rC   r   r|   )r   r   r   opr   r   r   test_attributesP  s    (r   c                 C   s
   t dS )z> Needed for test_pickle as local functions are not pickleable r   )r   zerosr   r   r   r   r'   _  s    r'   c                  C   sf   dd l } t| jd D ]J}tdt}| j||d}| |}|jD ]}t	t
||t
|| qDqd S )Nr   r   r   )protocol)picklerangeHIGHEST_PROTOCOLr@   rA   r'   dumpsloads__dict__r   getattr)r   r   r   sr   kr   r   r   test_picklec  s    

r   c               	   C   s   G dd dt j} ttdd tt|  W 5 Q R X G dd dt j}|d}t|dd	dgdd	dg tt|j	d
ddg G dd dt j}|t
jdd}t|t
jdjd d S )Nc                   @   s   e Zd ZdS )ztest_inheritance.<locals>.EmptyN)rU   rV   rW   r   r   r   r   Emptyo  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)rF   r   )superra   )r   n	__class__r   r   ra   v  s    z+test_inheritance.<locals>.Identity.__init__c                 S   s   |S r)   r   rb   r   r   r   rc   y  s    z*test_inheritance.<locals>.Identity._matvec)rU   rV   rW   ra   rc   __classcell__r   r   r   r   Identityu  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 || _d S r)   )r   ra   rF   r   r   )r   r   r   r   r   ra     s    z-test_inheritance.<locals>.MatmatOnly.__init__c                 S   s   | j |S r)   )r   r   rb   r   r   r   rk     s    z,test_inheritance.<locals>.MatmatOnly._matmat)rU   rV   rW   ra   rk   r   r   r   r   r   
MatmatOnly  s   r   )r   )r@   rA   r   RuntimeWarningrH   	TypeErrorr   r'   NotImplementedErrorr(   r   randomZrandnr   )r   r   Zid3r   mmr   r   r   test_inheritancen  s    r   c                  C   sr   t jdddt jdd  } t jdd}t| }t|}|| }|| }t|jt j t|jt j d S )Nr                 ?)	r   r   Zrandr@   rs   r   rF   rz   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Z
call_countr   r   r'     s    z#test_no_double_init.<locals>.matvec)r   r   r'   r   )r@   rA   r   r   r   r   r   test_no_double_init  s    r   c                  C   sl   t dgg} t| }d| }d|  }t dg}t|||| t|j||j | d S Nr   r   )	r   r   r@   rs   r   r   rC   r%   r&   rJ   r   r   Yr   r   r   r   test_adjoint_conjugate  s    
r   c                  C   s(   t dgg} t| }t|jd d S )Nr   r   )r   r   r@   rs   r   r{   )rJ   r   r   r   r   	test_ndim  s    
r   c                  C   sh   t dgg} t| }d| }d|  }t dg}t|||| t|j||j| d S r   )r   r   r@   rs   r   r   r%   r   r   r   r   test_transpose_noconjugate  s    
r   )$__doc__	functoolsr   	itertoolsr   rP   Zpytestr   rH   r   Znumpy.testingr   r   Znumpyr   Zscipy.sparsero   Zscipy.sparse.linalg._interfaceZlinalgZ
_interfacer@   Zscipy.sparse._sputilsr   r	   rX   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r   <module>   s0    , 