o
    g@                     @   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                   @   $   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   f/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/scipy/sparse/linalg/tests/test_interface.pysetup_method   s   


zTestLinearOperator.setup_methodc           
   
      s
  dd }|| j D ]}tjd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o|jd  u o|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d  jtjk 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di | tjd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o|jd  u o|jd u  q|| jD ]}tjd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 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>   s    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                       t  | S Nr   r   r!   r#   r   r   r$   %       c                       t  j | S r+   r   r   r&   r'   r!   r#   r   r   r$   &       c                    r.   r+   r/   r!   r#   r   r   r$   '   r0   c                    r*   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         )
   r5                     @y              (@y              >@iir   r   r   r   r   r   c                      s      S r+   r   r   r#   r   r   r$   |       z0TestLinearOperator.test_matvec.<locals>.<lambda>c                          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                      r>   r?   r   r   r#   r   r   r$      r=      %      )r   	interfaceLinearOperatorr   argsr   r(   r   r   r   r   r)   Hr3   r2   r&   r'   len
isinstancendarray_ScaledLinearOperator_SumLinearOperatordtypecomplex_assert_raises
ValueErrorr   r   _ProductLinearOperatorr   _PowerLinearOperator)
r   r4   matvecsXzmatvecsAmatvecsBAtimesBmatvecsCr   r   rD   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di |}tg dg dg d	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$      s    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$      s    c                    s   t  j| S r+   )r   r   r   r!   r   r   r   r$      s    r1   r   r   )      	   r   r   r   )r   r    rH   rI   r   r   r   operatormatmulrS   rT   )r   Dr   r   br   r   r   test_matmul   s    




zTestLinearOperator.test_matmulN)__name__
__module____qualname__r   r^   rf   r   r   r   r   r
      s
    	 r
   c                   @   r	   )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rQ   c                    s(     | }t| jdkr|dd}|S )Nr   r   )r   rL   r    r   )r"   rQ   yoriginalr   r   mv   s   
zATestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.mvc                    s    j  | S r+   r&   r'   r   )r"   rQ   rn   r   r   rmv      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   rQ   r    )r   rQ   rn   r   r   __init__   s   zSTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatlike.__init__c                        || j S r+   rk   r   r"   )rp   r   r   _matvec      zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.BaseMatlike._matvecN)rg   rh   ri   rJ   rt   rw   r   )rp   ro   r   r   BaseMatlike   s    ry   c                       s   e Zd ZdZ fddZdS )zITestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatvecr   c                    ru   r+   rk   rv   rr   r   r   _rmatvec   rx   zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatvec._rmatvecN)rg   rh   ri   rJ   r{   r   rz   r   r   
HasRmatvec   s    r|   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   rk   )r(   r)   rQ   r    )r    r   rQ   rH   rI   )r   r    r(   r)   rp   rr   r   r   _adjoint   s   zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasAdjoint._adjointN)rg   rh   ri   rJ   r~   r   r}   r   r   
HasAdjoint   s    r   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   rv   rn   r   r   _matmat   s   
zQTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatmat._matmatc                    s    j  |S r+   rq   rv   rn   r   r   _rmatmat   rs   zRTestAsLinearOperator.setup_method.<locals>.make_cases.<locals>.HasRmatmat._rmatmatN)rg   rh   ri   r   r   r   rn   r   r   
HasRmatmat       r   )appendr   r   r   sparse
csr_matrixrH   rI   )ro   rQ   casesry   r|   r   r   r   )rp   ro   rr   r   
make_cases   s   
z5TestAsLinearOperator.setup_method.<locals>.make_casesr   r   c                 S   "   g | ]\}}t |j|jfqS r   rH   aslinearoperatorr&   .0Mr   r   r   r   
<listcomp>       z5TestAsLinearOperator.setup_method.<locals>.<listcomp>c                 S   &   g | ]\}}t |j|j fqS r   rH   r   rK   r&   r'   r   r   r   r   r          r   r;                 @)y              @y              @r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   )r   r   r   int32float32float64r&   rR   )r   r   ro   r   r   r   r      s(   :


z!TestAsLinearOperator.setup_methodc           
      C   s0  | 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|| |
| qpt|||
| t|| |
| |D ],}	t||	|j 
|	 t|j	|	|j
|	 t|j	|	|j 
|	 q|D ]2}	|	jdk rqt||	|j 
|	 t|j|	|j
|	 t|j|	|j 
|	 qt|drt|j|j tt|d qd S )Nr   r   r   r   r   r;   r   r   r   r   rQ   rJ   )r   rH   r   r    r   r   rQ   rR   r   r(   r   r3   r)   r&   r'   rK   ndimr2   hasattrr   )
r   r   A_arrayr   Nxsysx2r"   rm   r   r   r   
test_basic
  s@   

 $ 
 zTestAsLinearOperator.test_basicc                 C   s   | j D ]O\}}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   )r   rH   r   r    r   r   r   r   )r   r   r   r   r   x0x1r   r   r   r   test_dot3  s   

zTestAsLinearOperator.test_dotN)rg   rh   ri   r   r   r   r   r   r   r   rj      s    M)rj   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$   C  s    ztest_repr.<locals>.<lambda>r    r(   zunspecified dtype)rH   rI   reprr   )r   repr_Ar   r   r   	test_reprB  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   ra   r   r<   )rH   IdentityOperatorr   r   r   aranger   ravelrS   rT   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	 q)d S )
N   r   c                 S   s,   t | } t| jdkp| jdk t dS )N)r   )r   r   r   )r   asarrayr   r    onesr!   r   r   r   always_four_onesS  s   

z)test_attributes.<locals>.always_four_ones)r   r   r   rQ   r    rw   )	rH   r   r   r   r   rI   rK   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 ]%}tdt}| j||d}| |}|jD ]}t	t
||t
|| q"qd S )Nr   r   r   )protocol)picklerangeHIGHEST_PROTOCOLrH   rI   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 d    n1 sw   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)rg   rh   ri   r   r   r   r   Emptyo  s    r   zshould implement at least)matchc                       $   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)rQ   r    )superrt   )r   n	__class__r   r   rt   v  s   z+test_inheritance.<locals>.Identity.__init__c                 S   s   |S r+   r   rv   r   r   r   rw   y  s   z*test_inheritance.<locals>.Identity._matvec)rg   rh   ri   rt   rw   __classcell__r   r   r   r   Identityu  r   r   r   r   r   c                       r   )z$test_inheritance.<locals>.MatmatOnlyc                    s   t  |j|j || _d S r+   )r   rt   rQ   r    r   )r   r   r   r   r   rt     s   
z-test_inheritance.<locals>.MatmatOnly.__init__c                 S   s   | j |S r+   )r   r   rv   r   r   r   r     rx   z,test_inheritance.<locals>.MatmatOnly._matmat)rg   rh   ri   rt   r   r   r   r   r   r   
MatmatOnly  s    r   r   )r   )rH   rI   r   RuntimeWarningrS   	TypeErrorr   r(   NotImplementedErrorr)   r   randomrandnr    )r   r   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   randrH   r   r   rQ   r   
complex128)mat_complexmat_realcomplex_operatorreal_operatorsum_complex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>.matvec)r   r   r(   r   )rH   rI   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   rH   r   r   r   rK   r&   r'   rX   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   rH   r   r   r   )rX   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   rH   r   r   r   r&   r   r   r   r   test_transpose_noconjugate  s   
r   )$__doc__	functoolsr   	itertoolsr   rb   pytestr   rS   r   numpy.testingr   r   numpyr   scipy.sparser   scipy.sparse.linalg._interfacelinalg
_interfacerH   scipy.sparse._sputilsr   r
   rj   r   r   r   r(   r   r   r   r   r   r   r   r   r   r   r   <module>   s2     , 