o
    5ήcW]                     @   s  d Z ddlZddlZddlZddlmZmZmZ ddl	m
Z ddl	Z	ddlmZmZmZ ddlmZmZ ddlmZmZmZmZ ddlmZmZ dd	lmZmZmZmZ dd
lm Z m!Z! dddddZ"dLddZ#		dMddZ$dNddZ%dd Z&dd Z'	dLddZ(ddej)ddfddZ*G dd de+Z,G d d! d!Z-G d"d# d#Z.d$d% Z/d&d' Z0d(d) Z1d*d+ Z2d,d- Z3d.d/ Z4d0d1 Z5d2d3 Z6d4d5 Z7d6d7 Z8d8d9 Z9d:d; Z:e	j;j<e!d<d=d>d? Z=d@dA Z>dBdC Z?dDdE Z@dFdG ZAdHdI ZBdJdK ZCdS )OzJ
To run tests locally:
  python tests/test_arpack.py [-l<int>] [-v<int>]

    N)assert_allcloseassert_equalsuppress_warnings)raises)dotconjrandom)eigeigh)
csc_matrix
csr_matrixdiagsrand)LinearOperatoraslinearoperator)eigseigsharpackArpackNoConvergence)assert_deallocatedIS_PYPY      )fdFDc                 C   s   dt t jj dt t jj dt t jj dt t jj d|  }|}d}|tu r>| dv r>dt t jj }|d9 }|tu rJ| dv rJ|d9 }|dv rc|jd	krc| d
kr[|d9 }| dkrc|d9 }|||fS )a  
    Return tolerance values suitable for a given test:

    Parameters
    ----------
    type_char : {'f', 'd', 'F', 'D'}
        Data type in ARPACK eigenvalue problem
    mattype : {csr_matrix, aslinearoperator, asarray}, optional
        Linear operator type

    Returns
    -------
    tol
        Tolerance to pass to the ARPACK routine
    rtol
        Relative tolerance for outputs
    atol
        Absolute tolerance for outputs

    i  i  )r   r   r   r   r   )r   r         )LMSMLAgen-hermitian-Mcr   r      )npfinfofloat32epsfloat64r   r   name)	type_charmattypeD_typewhichrtolatoltol r1   Z/tmp/pip-target-vg8gfxp4/lib/python/scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py_get_test_tolerance   s.   
r3   Fc           	      C   sP  t j| | f}|r|dt j| | f  }|r|rD|r9t | }t jj| | d d}t ||\}}d|||f< t | |j}|S t | |j}|rt jj| | |  d d}t jj| | |  d d}t ||k}|| d |  ||< d|||f< d|||f< |S |rt jj| | |  d d}t jj| | |  d d}d|||f< |S )Ny              ?   )sizer         )	r$   r   arangerandintmeshgridr   r   Tnonzero)	Ncomplex_	hermitianpos_definitesparseMijindr1   r1   r2   generate_matrixU   s4   
rF   c                 C   sX   t j| | f}d||j  }|r$| t |  }|rt|}||7 }|S |r*t|}|S N      ?)r$   r   r;   eyer   )r=   r@   rA   rB   Idr1   r1   r2   generate_matrix_symmetrict   s   rK   c                 C   s2   t | } t| dst| jd }| | j| _| S )Ndtyper7   )r   hasattrr$   zerosshaperL   )mxr1   r1   r2   _aslinearoperator_with_dtype   s
   
rR   c                 K   sD   zt | |fi | W dS  ty!   t | t|fi | Y dS w )z/Almost equal or complex conjugates almost equalN)r   AssertionErrorr   )actualdesiredkwr1   r1   r2   assert_allclose_cc   s
   rW   c           	      C   s  |du rt j| t| d}nf|du s|dkrM|du r!d| |  }nJ|dkr7dd| |  d| t |    }n4|dkrLdd| |  d| t |    }n|d	krZ| | | |  }n|d
kre| | |  }ntd| t j|t| d}|dv rt t|}n/|dv rt t |}n"|dv r| rt tt 	|}nt t 	|}ntd| |dv r|| d S |dv r|d| S |dkrt 
|d|d  ||d | d fS dS )zVReturn sorted indices of eigenvalues using the "which" keyword
    from eigs and eigshN)decimalsnormalg      ?rrH   rC   y             cayleybucklingzmode='%s' not recognized)r   r    )LRSRr!   SABE)LISIzwhich='%s' is unrecognized)r   r!   r]   ra   )r    r_   r^   rb   r`   r4   )r$   round_ndigitsr   
ValueErrorargsortabsrealislowerimagconcatenate)	eigenvaluestypkr-   sigmaOPpartmoderevalrE   r1   r1   r2   argsort_which   sH   *rs   rY   c
                 C   s|  d|v }
| r	t }nt}|
rd|j||||j||	f }nd|j||||j||	f }|d |}||}|
r@|d |}||}|d | }t|||||||	}|| }t|||d}|t u rg|	|d< n||d< t||||\|d	< }}d
}|dk r3|
rz||||fi |\}}W nI ty   d|j	d
  |d< ||||fi |\}}Y n,w z|||fi |\}}W n ty   d|j	d
  |d< |||fi |\}}Y nw t|||||||	}|| }|d d |f }zt
|||||d d}W n ty   d}|d7 }Y nw |r/t||}|
r!|t|| }n|| }t|||||d n|dk s~t
|||||d d S )NbmatzPerror for %s:general, typ=%s, which=%s, sigma=%s, mattype=%s, OPpart=%s, mode=%szQerror for %s:standard, typ=%s, which=%s, sigma=%s, mattype=%s, OPpart=%s, mode=%smateval)r-   v0ro   rq   rp   r0   r   r      maxiter)r.   r/   err_msgTFr7   )r   r   __name__astypeupperrs   dictr3   r   rO   rW   rS   r$   r   r   )	symmetricr   rm   rn   r-   rw   ro   r+   rp   rq   general	eigs_funcerraacbbc
exact_evalrE   kwargsr.   r/   ntriesrl   eveccheck_evecsLHSRHSr1   r1   r2   	eval_evec   s   




)r   c                   @   s   e Zd Zdd Zdd ZdS )DictWithReprc                 C   s
   || _ d S Nr)   )selfr)   r1   r1   r2   __init__"     
zDictWithRepr.__init__c                 C   s
   d| j  S )Nz<%s>r   )r   r1   r1   r2   __repr__%  r   zDictWithRepr.__repr__N)r{   
__module____qualname__r   r   r1   r1   r1   r2   r   !  s    r   c                   @      e Zd Zdd ZdS )SymmetricParamsc                 C   s  t | _g d| _tttjg| _dgg dd| _d}tj	
d t|dddd	d
}t|dddd	d
}t|dddddd}t|dddddd}tj		|}td}||d< ||d< t|d dd|d< td}||d< ||d< ||d< t|d |d dd|d< td}	||	d< ||	d< t|	d dd|	d< td}
||
d< ||
d< ||
d< t|
d |
d dd|
d< td}||d< ||d< ||d< t|d |d dd|d< ||g| _|	|
|g| _d S )N)r   r    r!   r_   r`   rY   )rY   r\   r[   rG        Tr?   r@   r   r   )r?   r@   r>   r   r   zstd-symmetricru   rw   )eigvals_onlyrv   zgen-symmetricrt   zstd-hermitianzgen-hermitianr"   )r   r   r-   r   r   r$   asarraymattypessigmas_modesr   seedrF   r|   r   r
   real_test_casescomplex_test_cases)r   r=   ArrB   AcMcrw   SSGSSHGHGHcr1   r1   r2   r   *  sl   

zSymmetricParams.__init__Nr{   r   r   r   r1   r1   r1   r2   r   )      r   c                   @   r   )NonSymmetricParamsc           
      C   s  t | _ g d| _tttjg| _d gdgddgd| _d}tj	d t
|dd}t
|d	d	d
dd}t
|d	ddd}tj|}td}||d< ||d< t|d ddd|d< td}||d< ||d< ||d< t|d |d ddd|d< td}||d< ||d< t|d ddd|d< td}	||	d< ||	d< ||	d< t|	d |	d ddd|	d< ||g| _||	g| _d S )N)r   r]   ra   rZ   rC   )Ng?y??r   r   r   r   Tr   r>   r   r   zstd-real-nonsymru   rw   F)leftrightrv   zgen-real-nonsymrt   zstd-cmplx-nonsymzgen-cmplx-nonsym)r   r-   r   r   r$   r   r   sigmas_OPpartsr   r   rF   r|   r   r	   r   r   )
r   r=   r   rB   r   rw   SNRGNRSNCGNCr1   r1   r2   r   f  sJ   

zNonSymmetricParams.__init__Nr   r1   r1   r1   r2   r   e  r   r   c            
      C   sx   t  } d}d}| jD ]/}dD ]*}| jD ]$}| jD ]}| j D ]\}}|D ]}	t|||||d ||d |	
 q%qqqqq
d S )Nr4   Tfd)r   r   r-   r   r   itemsr   )
paramsrn   r   r   rm   r-   r+   ro   modesrq   r1   r1   r2   test_symmetric_modes  s$   



r   c                  C   sl   t  } d}d}| jD ])}dD ]$}| jD ]}|dkrq| jD ]}| jD ]}t|||||d || q"qqqq
d S )Nr4   TFDr`   )r   r   r-   r   r   r   r   rn   r   r   rm   r-   r+   ro   r1   r1   r2   test_hermitian_modes  s$   



r   c               
   C   sX   t  } d}dD ]"}| jD ]}dD ]}tt|d |}t||||d| qqqd S )NT)r7   r4   r   r6   r   r   rw   r   )r   r   r   r   lenr|   r   )r   r   rn   r   rm   rw   r1   r1   r2   test_symmetric_starting_vector  s   
r   c               
   C   s   t jd tdddd} td\}}}zt| dd| d d df d	|d
d\}}td ty` } z)t|j	}|dkrAtd||j	|j
}}tt| ||| ||d W Y d }~d S d }~ww )N  r   Tr   r   r6   r   r   r   	   )r-   rw   ry   r0   ncvSpurious no-error exit"Spurious no-eigenvalues-found caser.   r/   )r$   r   r   rF   r3   r   rS   r   r   rl   eigenvectorsr   r   )rP   r0   r.   r/   wvr   rn   r1   r1   r2   test_symmetric_no_convergence  s   &

(r   c            
      C   sv   t  } d}d}| jD ].}dD ])}| jD ]#}| jD ]}| j D ]\}}|D ]}	t|||||d |||		 q%qqqqq
d S )Nr4   Fr   )r   r   r-   r   r   r   r   )
r   rn   r   r   rm   r-   r+   ro   OPpartsrp   r1   r1   r2   test_real_nonsymmetric_modes  s$   


r   c                  C   sb   t  } d}d}| jD ]$}dD ]}| jD ]}| jD ]}| jD ]}t|||||d || qqqqq
d S )Nr4   FDF)r   r   r-   r   r   r   r   r1   r1   r2   test_complex_nonsymmetric_modes  s    



r   c            	      C   h   t  } d }d}dD ](}| jD ]"}dD ]}|d }|jd }t||}t||||d|| qqq	d S NF)r7   r4   r   r6   r   ru   r   r   r   r   rO   r   r   r|   r   	r   ro   r   rn   r   rm   Anrw   r1   r1   r2   *test_standard_nonsymmetric_starting_vector     

r   c            	      C   r   r   r   r   r1   r1   r2   )test_general_nonsymmetric_starting_vector  r   r   c            
   
   C   s   t jd tddd} td\}}}zt| dd| d d df d	|d
\}}td tyi } z4t|j	}|dkr?td||j	|j
}}t||jD ]\}}	tt| |	||	 ||d qLW Y d }~d S d }~ww )Nr   r   Tr   r   r6   r   r   r   )r-   rw   ry   r0   r   r   r   )r$   r   r   rF   r3   r   rS   r   r   rl   r   zipr;   r   r   )
rP   r0   r.   r/   r   r   r   rn   wwvvr1   r1   r2   )test_standard_nonsymmetric_no_convergence  s    $

r   c                  C   s   t td} ttt|  d S )N)r4   r   r   r$   rN   assert_raisesre   r   r   r1   r1   r2   test_eigen_bad_shapes  s   r   c                  C   s"   t td} ttt| dd d S )N)   r   XX)r-   r   r   r1   r1   r2   test_eigen_bad_kwargs  s   r   c                  C   sd   t jt jfD ])} d}d}t jd t j||f| }t jg d| d}t|||d\}}qd S )Nr   r4   i  )g@g@X<gbտguF?g@Ixg ➊-/rL   )rw   )r$   r&   r(   r   r   r|   arrayr   )rL   r=   rn   r   rw   evalsevecsr1   r1   r2   test_ticket_1459_arpack_crash  s   
r   zTest not meaningful on PyPy)reasonc                      s  t d t t tfdd W d    n1 s w   Y  t fdd W d    n1 s8w   Y  tfdd W d    n1 sPw   Y  tfdd W d    n1 shw   Y  tfdd	 W d    d S 1 sw   Y  d S )N
   c                      
   t  S r   )r   SpLuInvr1   M_sr1   r2   <lambda><     
 z2test_linearoperator_deallocation.<locals>.<lambda>c                      r   r   )r   LuInvr1   )M_dr1   r2   r   >  r   c                      r   r   )r   IterInvr1   r   r1   r2   r   @  r   c                      s   t  d dS Ng333333?r   	IterOpInvr1   M_or1   r2   r   B      c                      s   t   dS r   r   r1   r   r1   r2   r   D  r   )r$   rI   r   r   r   r1   r1   )r   r   r   r2    test_linearoperator_deallocation1  s$   
"r   c                     sz   g  t jd fddfddtdD } | D ]}|  q| D ]}|  q%   D ]	}t| d  q1d S )N2   c                     sR   t g dg ddd} t| dd\}} | t| dd\}} | d S )Nr7   r7   r   r7   r   r   rO   r   )rn   rw   )r   r   appendr   rQ   r   r   )resultsrw   r1   r2   workerK  s
   
z%test_parallel_threads.<locals>.workerc                    s   g | ]}t j d qS ))target)	threadingThread).0rn   )r  r1   r2   
<listcomp>S  s    z)test_parallel_threads.<locals>.<listcomp>r   r   )r$   r   r   rangestartjoinr   )threadstrZ   r1   )r  rw   r  r2   test_parallel_threadsG  s   

r  c                  C   s:   dd } t | tdd}ttt|dd ttt|dd d S )Nc                 S   s2   t g dg ddd} t| dd\}}||d  S )Nr   r   r   r   r7   rn   r   )r   r   r  r1   r1   r2   A_matveca  s   z!test_reentering.<locals>.A_matvecr   )matvecrL   rO   r7   r  )r   floatr   RuntimeErrorr   r   )r  r   r1   r1   r2   test_reentering_  s   r  c                  C   s   t jt jfD ]?} t jd t dd| }t|gdgdd}t jd| }t	|dd	d
|d\}}t
t |t |dd  dd qd S )Nr   r7   i  r   )  r  r   r  r      r   )rn   r   r-   rw   ig-C6?)r.   )r$   r&   r(   r   r   r8   r|   r   r   r   r   sort)rL   w0r   rw   r   r   r1   r1   r2   test_regression_arpackng_1315l  s   r  c                  C   s  t g dg ddd} tddd}tjd}tddd}t|}t||d	}t||d	}t Q}|t t	t
||d
d| t	t
||dd| t	t
||dd| t	t
||dd| ttt
||d
d ttt
t|d
d ttt
| d
d W d    d S 1 sw   Y  d S )Nr   r   r6   r6   r   r6   FrA   Tr   r   rB   rn   r   r  )r   rF   r$   r   r   r	   r   filterRuntimeWarningr   r   r   	TypeErrorA_sparser   M_denseM_sparseM_linop
eig_tuple1
eig_tuple2supr1   r1   r2   test_eigs_for_k_greater~  s"   
"r*  c                  C   s  t g dg ddd} tddd}tddd	}tdddd
}t|}t||d}t||d}t H}|t tt	||dd| tt	||dd| tt	||dd| t
tt	||dd t
tt	t|dd t
tt	| |dd W d    d S 1 s|w   Y  d S )Nr   r   r  r   r6   Fr  T)r@   )r@   rA   r  r  r   r  )r   rF   rK   r   r
   r   r  r   r   r   r   r!  r"  r1   r1   r2   test_eigsh_for_k_greater  s    
"r+  c               
   C   sh  t jd d} t| | dd}| jd9  _| jd8  _t | }g d}t jt jg}t	|g d|D ]|\}}}t j
g |d}t |j}	tdd	D ]d}
t|||
||||d
d\}}tt j||||  d
t |	d t|d d d f | jdd}t|d
t |	d |}|d u r|}nd||  }|dkrt t t|dksJ qLq5d S )Nr7   r   rH   )densityr4   )r   r    r]   r^   ra   rb   )Nr   r   r   r   r   )rn   r-   ro   rw   r0   )r/   )axisr   gư>)r$   r   r   r   dataonesr&   r(   	itertoolsproductr   r%   r'   r
  r   r|   r   linalgnormr   sqrtrg   minalldiff)r   r   rw   whichsdtypesr-   ro   rL   prev_wr'   rn   r   zdistr   r1   r1   r2   test_real_eigs_real_k_subset  s6   


* r=  )NNN)FFFF)FF)D	__usage__r  r0  numpyr$   numpy.testingr   r   r   pytestr   r   r   r   r   scipy.linalgr	   r
   scipy.sparser   r   r   r   scipy.sparse.linalgr   r   !scipy.sparse.linalg._eigen.arpackr   r   r   r   scipy._lib._gcutilsr   r   rd   r3   rF   rK   rR   rW   rs   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   markskipifr   r  r  r  r*  r+  r=  r1   r1   r1   r2   <module>   sb    
6

	
.
^<2

