a
    Re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"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   sR   t g dg dg| _t ddgddgddgg| _t ddgddgg| _d S )	N                  r   r   r   r   r   r   )nparrayABCself r   \/var/www/sunrise/env/lib/python3.9/site-packages/scipy/sparse/linalg/tests/test_interface.pysetup_method   s    


zTestLinearOperator.setup_methodc              
      s`  dd }|| j D ]~}tjf i | t jdk t tg dddg t tdgdgd	ggdgdgg t tg d ddg t tdgdgd	gg dgdgg t 	tg d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  g d
 ddg td  ddgg d td  jddgg d 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 g d
 ddg t d dgdgdgg dgdgg td  g d
 ddg t   g d
 ddg t   ddgg d t   jddgg d 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  g d
 ddg t  dgdgdgg dgdgg t   g d
 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oL|jd  u oL|jd  u  d  }tt|jdko|jd  u o|jd dk tt g dtj tt tdgdgd	ggtj tt tg d tj tt tdgdgd	gg tj tt 	tg d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t d tj tt d tj t d	 d	 jd  u   tg d } d	  d }t tg d | td  jtjk d}tt|d"  tddg  W d    n1 s0    Y  tt jtddg tt jtg d 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 i | tjf i |	| 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
oJ|jd  u 
oJ|jd u  q|| jD ]}tjf i |}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   r   )r   r   r         )
   r1                     @y              (@y              >@iir   r   r   z.Can only divide a linear operator by a scalar.matchr   r   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 r;   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   r0   ZmatvecsXzresultr   msgZmatvecsAZmatvecsBZAtimesBZmatvecsCr   r@   r   test_matvec   s    *(*(&(&(&&($&$$ 2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 i |}tg dg dg d	g}|d
 }tt||||  tt||	dd||	dd  tt||||  tt||j
||j
  tt|	dd|j
|	dd|j
  tt||j
||j
  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-   )y      ?      ?r   r   r   )      	   r   r   r   )r   r   rD   rE   r   r   r   operatormatmulr   rG   rL   rM   )r   Dr   r   br   r   r   test_matmul   s(    




&*zTestLinearOperator.test_matmulN)__name__
__module____qualname__r   rR   r[   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g dg d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g dg d	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rJ   c                    s(     | }t| jdkr$|dd}|S )Nr   rV   r   )r   rH   r   r   )r!   rJ   yoriginalr   r   mv   s    
zATestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.mvc                    s    j  | S r*   r&   r'   r   )r!   rJ   rb   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   rJ   r   )r   rJ   rb   r   r   __init__   s    zSTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatlike.__init__c                    s    || j S r*   r`   r   r!   )rd   r   r   _matvec   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatlike._matvecN)r\   r]   r^   rF   rg   ri   r   )rd   rc   r   r   BaseMatlike   s   rj   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*   r`   rh   rf   r   r   _rmatvec   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatvec._rmatvecN)r\   r]   r^   rF   rl   r   rk   r   r   
HasRmatvec   s   rm   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   r`   )r(   r)   rJ   r   )r   r   rJ   rD   rE   )r   r   r(   r)   rd   rf   r   r   _adjoint   s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasAdjoint._adjointN)r\   r]   r^   rF   ro   r   rn   r   r   
HasAdjoint   s   rp   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   rh   rb   r   r   _matmat  s    zQTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatmat._matmatc                    s    j  |S r*   re   rh   rb   r   r   _rmatmat  s    zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatmat._rmatmatN)r\   r]   r^   rq   rr   r   rb   r   r   
HasRmatmat  s   rs   )appendr   r   r   sparseZ
csr_matrixrD   rE   )rc   rJ   casesrj   rm   rp   rs   r   )rd   rc   rf   r   
make_cases   s    
z5TestAsLinearOperator.setup_method.<locals>.make_casesr
   r   c                 S   s"   g | ]\}}t |j|jfqS r   rD   aslinearoperatorr&   .0Mr   r   r   r   
<listcomp>  s   z5TestAsLinearOperator.setup_method.<locals>.<listcomp>c                 S   s&   g | ]\}}t |j|j fqS r   rD   ry   rG   r&   r'   rz   r   r   r   r}     s   r   r7                 @)y              @y              @r   c                 S   s"   g | ]\}}t |j|jfqS r   rx   rz   r   r   r   r}     s   c                 S   s&   g | ]\}}t |j|j fqS r   r~   rz   r   r   r   r}     s   )rv   r   r   int32float32float64r&   rK   )r   rw   rc   r   r   r   r      s(    :


z!TestAsLinearOperator.setup_methodc           
      C   s8  | j D ]*\}}t|}|j\}}tg d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g d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 
|	 q>|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   r   r   r7   r   r   r   r   rJ   rF   )rv   rD   ry   r   r   r   rJ   rK   r   r(   r   r/   r)   r&   r'   rG   ndimr.   hasattrr   )
r   r|   A_arrayr   NxsZysx2r!   ra   r   r   r   
test_basic  s>    

 $""zTestAsLinearOperator.test_basicc                 C   s   | j D ]\}}t|}|j\}}tg d}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 )Nr
   r   r   r   r   r   r   )rv   rD   ry   r   r   r   r   r   )r   r|   r   r   r   Zx0x1r   r   r   r   test_dotF  s    

zTestAsLinearOperator.test_dotN)r\   r]   r^   r   r   r   r   r   r   r   r_      s   M)r_   c                  C   s,   t jddd d} t| }td|v| d S )N)r   r   c                 S   s   dS r%   r   r    r   r   r   r#   V  r$   ztest_repr.<locals>.<lambda>r   r(   zunspecified dtype)rD   rE   reprr   )r   Zrepr_Ar   r   r   	test_reprU  s    r   c                  C   s^   t d} t| g d g d t| tddd td tt	| j
g d d S )Nr   r   r
   rU   r   r:   )rD   ZIdentityOperatorr   r   r   aranger   ZravelrL   rM   r(   )identr   r   r   test_identity[  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_onesf  s    
z)test_attributes.<locals>.always_four_ones)r   r   r   rJ   r   ri   )	rD   ry   r   r   r   rE   rG   r   r   )r   r   r   opr   r   r   test_attributesc  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(   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_PROTOCOLrD   rE   r(   dumpsloads__dict__r   getattr)r   r   r   sr   kr   r   r   test_picklev  s    

r   c                  C   s   G dd dt j} ttdd tt|  W d    n1 s>0    Y  G dd dt j}|d}t|g dg d tt|j	g d	 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)r\   r]   r^   r   r   r   r   Empty  s   r   zshould implement at leastr8   c                       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)rJ   r   )superrg   )r   n	__class__r   r   rg     s    z+test_inheritance.<locals>.Identity.__init__c                 S   s   |S r*   r   rh   r   r   r   ri     s    z*test_inheritance.<locals>.Identity._matvec)r\   r]   r^   rg   ri   __classcell__r   r   r   r   Identity  s   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   rg   rJ   r   r   )r   r   r   r   r   rg     s    z-test_inheritance.<locals>.MatmatOnly.__init__c                 S   s   | j |S r*   )r   r   rh   r   r   r   rq     s    z,test_inheritance.<locals>.MatmatOnly._matmat)r\   r]   r^   rg   rq   r   r   r   r   r   
MatmatOnly  s   r   r   )r   )rD   rE   r   RuntimeWarningrL   	TypeErrorr   r(   NotImplementedErrorr)   r   randomZrandnr   )r   r   Zid3r   mmr   r   r   test_inheritance  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randrD   ry   r   rJ   r   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   )rD   rE   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   rD   ry   r   r   rG   r&   r'   rN   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   rD   ry   r   r   )rN   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   rD   ry   r   r   r&   r   r   r   r   test_transpose_noconjugate  s    
r   c                  C   s   t jddd d} td}d}tt|d | |  W d    n1 sJ0    Y  tt|d ||   W d    n1 s~0    Y  tt | td  W d    n1 s0    Y  tt td|   W d    n1 s0    Y  d S )	Nr   c                 S   s   | S r*   r   r    r   r   r   r#     r$   z.test_sparse_matmat_exception.<locals>.<lambda>r   r   z9Unable to multiply a LinearOperator with a sparse matrix.r8   r   )rD   rE   ru   identityrL   r   rM   r   )r   r   rQ   r   r   r   test_sparse_matmat_exception  s    
&&
,
r   )%__doc__	functoolsr   	itertoolsr   rW   Zpytestr   rL   r   Znumpy.testingr   r   numpyr   Zscipy.sparseru   Zscipy.sparse.linalg._interfaceZlinalgZ
_interfacerD   Zscipy.sparse._sputilsr   r	   r_   r   r   r   r(   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s2    ? 