U
    »mœd‡@  ã                   @   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   úa/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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ƒƒ �	q´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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              >@iúÿÿÿiñÿÿÿr   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|| | 
|¡ƒ qät| |¡| 
|¡ƒ t|| | 
|¡ƒ |D ]Z}	t| |	¡|j ¡  
|	¡ƒ t|j 	|	¡|j 
|	¡ƒ t|j 	|	¡|j ¡  
|	¡ƒ �qB|D ]j}	|	jdk �r¶�q¢t| |	¡|j ¡  
|	¡ƒ t|j |	¡|j 
|	¡ƒ t|j |	¡|j ¡  
|	¡ƒ �q¢t|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   ÚNZ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   Z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   Ú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    , 