o
    5ήc@                     @   s  d Z ddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZ ddlZddlmZmZmZ ddlmZmZ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 ejd	k Z d
d Z!dd Z"dd Z#dd Z$dd Z%dd Z&ej'(ddd Z)dd Z*ej'(dej'+dddgdd  Z,dCd#d$Z-d%d& Z.d'd( Z/d)d* Z0d+d, Z1ej'(dd-d. Z2ej'(dej'+d/d0d1gd2d3 Z3d4d5 Z4ej'j5e oejd6kd7d8ej'j5e6 d9kd:d8d;d< Z7d=d> Z8d?d@ Z9ej'j:dAdB Z;dS )Dz; Test functions for the sparse.linalg._eigen.lobpcg module
    N)assert_almost_equalassert_equalassert_allcloseassert_array_lesssuppress_warnings)onesr_diag)eigeightoeplitzorth)spdiagsdiagseye
csr_matrix)eigsLinearOperator)lobpcgl        c           
      C   s   d}||  }d}d}d}|| | d }|| | }|t tdt| d  df t t| d d t t| d d  }|t td	t| d  d
f t t| d d t t| d d  }	||	fS )zqBuild the matrices for the generalized eigenvalue problem of the
    fixed-free elastic rod vibration model.
          ?g     @-C6?g   |rHBg      @g       @   g      @   )r	   r   r   )
nLlerhoSEmasskAB r$   Z/tmp/pip-target-vg8gfxp4/lib/python/scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py
ElasticRod   s   DDr&   c                 C   sh   t d| d }td| }t | d dd}t d|  d dd}t|t|d t|d }||fS )zBuild a pair of full diagonal matrices for the generalized eigenvalue
    problem. The Mikota pair acts as a nice test since the eigenvalues are the
    squares of the integers n, n=1,2,...
    r   r   r   r   r   )nparanger	   )r   xr#   yzr"   r$   r$   r%   
MikotaPair'   s   r-   c           
      C   s   | j d }tjd}|||f}t|}t| ||dddd\}}|  t| |d\}	}|	  t|	dt	|d  |dt	|d  dd	 dS )
z&Check eig vs. lobpcg consistency.
    r   {Gz?2   F)r#   tolmaxiterlargest)bNr   )decimal)
shaper(   randomRandomStater   r   sortr
   r   int)
r"   r#   mr   rndVXeigvals_wr$   r$   r%   compare_solutions4   s   
2rA   c                  C   s   t d\} }tjtdd t| |d W d    n1 sw   Y  td\} }tjtdd t| |d W d    d S 1 sBw   Y  d S )N
   The problem sizematch)r&   pytestwarnsUserWarningrA   r-   r"   r#   r$   r$   r%   
test_SmallB   s   "rJ   c                  C   sL   t d\} }tjtdd t| |d W d    d S 1 sw   Y  d S )N   Exited at iterationrD   r   )r&   rF   rG   rH   rA   rI   r$   r$   r%   test_ElasticRodK   s   "rM   c                  C   s   t d\} }t| |d d S )NrK   r   )r-   rA   rI   r$   r$   r%   test_MikotaPairQ   s   rN   zignore:Exited at iteration 0c                 C   s   d}t |d |dt j}t || ||t j}tjtdd t||ddd\}}W d   n1 s<w   Y  | 	 \}}|
d	sNJ |d
ksTJ ||j7 }t||ddd\}}| 	 \}}|
d	spJ |d
ksvJ dS )zCheck the warning of a Ritz matrix being not Hermitian
    by feeding a non-Hermitian input matrix.
    Also check stdout since verbosityLevel=1 and lack of stderr.
    rB   r   zMatrix gramArD   r   r   )verbosityLevelr1   NzSolving standard eigenvalue )r(   r)   reshapeastypefloat32rF   rG   rH   r   
readouterr
startswithT)capsysr   r=   r"   r?   outerrr$   r$   r%   test_nonhermitian_warningV   s   
rZ   c                  C   s:   d} t | df}t | }t||\}}t|dg dS )z8Check the eigenvalue of the identity matrix is one.
    rB   r   N)r(   r   identityr   r   )r   r=   r"   r@   r?   r$   r$   r%   test_regressionl   s
   
r\   zignore:The problem sizezn, m, m_excluded)d         )r^   r   r   c                    st  t jd}t jd| d td}t|gdg| | f   } fdd}t||| | ftd}t| t	}fdd}	t|	|	| | ftd}
td	| gdg| | f }fd
d}t||| | ftd}|j
| |fd}|dkryt | |}nd}| |fD ]7}||
fD ]/}||fD ]'}t|||||ddd\}}t|t d| d| |  t|||ddd qqqdS )a  Test ``m - m_excluded`` eigenvalues and eigenvectors of
    diagonal matrices of the size ``n`` varying matrix formats:
    dense array, spare matrix, and ``LinearOperator`` for both
    matrixes in the generalized eigenvalue problem ``Av = cBv``
    and for the preconditioner.
    r   r   dtypec                        |  S Nr$   r*   )A_sr$   r%   A_f      ztest_diagonal.<locals>.A_fmatvecmatmatr5   ra   c                    rb   rc   r$   rd   )B_ar$   r%   B_f   rg   ztest_diagonal.<locals>.B_fr   c                    rb   rc   r$   rd   )M_sr$   r%   M_f   rg   ztest_diagonal.<locals>.M_f)sizeN(   F)MYr1   r2   MbP?rtolatol)r(   r6   r7   r)   floatr   toarrayr   r   r   normalr   r   _check_eigen)r   r:   
m_excludedr;   valsA_arf   A_loB_srl   B_loM_arn   M_lor=   rr   r"   r#   rq   r>   vecsr$   )re   rk   rm   r%   test_diagonalw   sP   	

r   :0yE>+=c                 C   s*   t ||}| |}t||||d dS )z/Check if the eigenvalue residual is small.
    rt   N)r(   multiplydotr   )rq   r@   r<   ru   rv   mult_wVdot_MVr$   r$   r%   rz      s   
rz   c                 C   s6  t | }d|d< t|}t |jdd}|| }t jt |  |  }ddt |  }t t t | d |}t	||| t
|\}	}
t	||	|
 tt |	d |d gd t|	dd |dd  |ddd|f }t||dd	\}}t|j|f t|j| |f t	||| tt t |d tt |dd |d|  |dd| df }t||d
d	\}}t|j|f t|j| |f t	||| tt ||| d  t t | d t | | d   f}t t | |fj}t||dd	\}}t |}t||dd dd dS )z*Check the Fiedler vector computation.
    r   )axisr   g      ?r   r   NF)r2   Trv   )r(   zerosr   r	   sumpir)   cosouterrz   r   r   absr   r   r   r5   minr8   concatenater   vstackrV   )r   pcolr"   Dr   tmp
analytic_w
analytic_Veigh_weigh_Vr=   lobpcg_wlobpcg_Vfiedler_guessr?   r$   r$   r%   _check_fiedler   s>   
 (
r   c                   C   s>   t jtdd tdd W d   dS 1 sw   Y  dS )z8Check the dense workaround path for small matrices.
    rC   rD      r   N)rF   rG   rH   r   r$   r$   r$   r%   test_fiedler_small_8   s   "r   c                   C   s   t dd dS )zDCheck the dense workaround path avoided for non-small matrices.
       r   N)r   r$   r$   r$   r%   test_fiedler_large_12   s   r   c                  C   s   t jd} | d}||j }| |jd df}tjtdd t	||dd\}}W d   n1 s5w   Y  t 
|dksCJ dS )	zJCheck that the code exists gracefully without breaking. Issue #10974.
    r   )r]   rB   r^   rL   rD   rK   r1   N)r(   r6   r7   standard_normalrV   r5   rF   rG   rH   r   max)r;   r=   r"   Qeigenvaluesr?   r$   r$   r%   test_failure_to_run_iterations  s   

r   c               	   C   s  t jd} g d}g d}ddg}t|||D ]\}}}||kr#q| ||fd| ||f  }dt | | |j  }| ||f}|s_t |}	t||dd	\}
}t	|\}}n1| ||fd| ||f  }	dt | |	
|	j  }	t|||	ddd
\}
}t	||	\}}t|
|jD ]5\}}tt j|
||	
||  t j|
| dddd t t|| }t||| dd qqdS )z)Check complex-value Hermitian cases.
    r   )r_   rB   r/   )r   r_   rB   r/   TFy              ?rB   i  r   )r1   r2   gMb@?rv   ru   r   )ru   N)r(   r6   r7   	itertoolsproductr   rV   conjr   r   r   zipr   linalgnormargminr   )r;   sizesksgenssr!   genHr=   r#   r@   vw0r?   wxvxjr$   r$   r%   test_hermitian  s8    
  r   zn, atol)rK   rs   )   r   c           	      C   s   t jd| d t jd}t|d| | }t jd}|| df}t||ddd\}}t|dd\}}t||||dd	 t	t 
|t 
|d
d dS )z'Check eigs vs. lobpcg consistency.
    r   r`   r   r   Tr]   )r2   r1   )r!   r   r   r   N)r(   r)   float64r   r6   r7   r   r   rz   r   r8   )	r   rv   r|   r"   r;   r=   lvalslvecsr?   r$   r$   r%   test_eigs_consistency8  s   r   c                 C   s|   t jd}|d}||j }||jd df}tjtdd t	||ddd\}}W d	   d	S 1 s7w   Y  d	S )
z2Check that nonzero verbosity level code runs.
    r   )rB   rB   r   rL   rD   r_   	   )r1   rO   N)
r(   r6   r7   r   rV   r5   rF   rG   rH   r   )tmpdirr;   r=   r"   r   r?   r$   r$   r%   test_verbosityH  s   

"r   win32ztolerance violation on windows)reasonppc64lezfails on ppc64lec                  C   s   t jd} d}d}t d|d  }t|gdg||f}|t j}| ||f}|t j}t||dddd\}}t	|t dd|  ddd	 d
S )z6Check lobpcg for attainable tolerance in float32.
    r   r/   r_   r   g-C6>r0   r1   rO   gh㈵>gh㈵>r   N)
r(   r6   r7   r)   r   rR   rS   r   r   r   r;   r   r:   r|   r"   r=   r>   r?   r$   r$   r%   test_tolerance_float32S  s   "r   c                  C   s   t jd} d}d}t d|d  }t|gdg||f}|t j}| ||f}|t j}t||dddd\}}t|t dd|  dd d	S )
z2Check lobpcg in float32 for specific initial.
    r   r/   r^   r   rs   r   r.   r   N)	r(   r6   r7   r)   r   rR   rS   r   r   r   r$   r$   r%   test_random_initial_float32f  s    r   c                  C   s  t jd} d}d}t d|d  }t|gdg||f}|t j}| ||f}|t j}tj	t
dd t||ddd	d
\}}}W d   n1 sNw   Y  tt |d d tj	t
dd t||dd	d\}}}W d   n1 szw   Y  tt |d d dS )zCheck lobpcg if maxit=10 runs 10 iterations
    if maxit=None runs 20 iterations (the default)
    by checking the size of the iteration history output, which should
    be the number of iterations plus 2 (initial and final values).
    r   r/   r^   r   rL   rD   r   rB   T)r0   r1   retLambdaHistoryNr   )r0   r      )r(   r6   r7   r)   r   rR   rS   r   rF   rG   rH   r   r   r5   )r;   r   r:   r|   r"   r=   r?   l_hr$   r$   r%   
test_maxitu  s    r   c            (         s\  t jd} d}d}t d|d }g d}t|}t|D ]\}}t|| gdg||f|d}|t j}	|	 }
|
t j}|
|||	g}t|gdg||f|d}|	 }||g}td| gdg||f|dfdd	}t
||||ftd
}	 fdd}t
||||ftd
}t jfdd}t
||||ft jd
}	   fdd}t
||||ft jd
}d||||g}| ||f}|t j}||g}d}t j||td}t j||t jd}||g}tt|||||} |dkr| |d d|d  } | D ]%\}!}"}#}$}%t|!|$|"|#|%dddd\}&}'t|&t d| d| |  qqdS )z=Check lobpcg for diagonal matrices for all matrix types.
    r   rp   r^   r   )bsrcoocsccsrdiadoklil)formatr   c                    rb   rc   r$   rd   )Ms64r$   r%   Ms64precond  rg   z-test_diagonal_data_types.<locals>.Ms64precondrh   c                    rb   rc   r$   rd   )Mf64r$   r%   Mf64precond  rg   z-test_diagonal_data_types.<locals>.Mf64precondc                    rb   rc   r$   rd   )Ms32r$   r%   Ms32precond  rg   z-test_diagonal_data_types.<locals>.Ms32precondc                    rb   rc   r$   rd   )Mf32r$   r%   Mf32precond  rg   z-test_diagonal_data_types.<locals>.Mf32precondNr_   r`   r   r]   F)r#   rq   rr   r0   r1   r2   )r(   r6   r7   r)   len	enumerater   rR   rS   rx   r   rw   r   listr   r   r   r   )(r;   r   r:   r|   list_sparse_formatsparse_formatss_f_is_fAs64As32Af64Af32listABs64Bf64listBr   Ms64precondLOr   Mf64precondLOr   Ms32precondLOr   Mf32precondLOlistMXf64Xf32listXr{   Yf64Yf32listYtestsr"   r#   rq   r=   rr   r>   r?   r$   )r   r   r   r   r%   test_diagonal_data_types  s   

r   )r   r   )<__doc__r   platformsysnumpyr(   numpy.testingr   r   r   r   r   rF   r   r   r	   scipy.linalgr
   r   r   r   scipy.sparser   r   r   r   scipy.sparse.linalgr   r   !scipy.sparse.linalg._eigen.lobpcgr   maxsize	_IS_32BITr&   r-   rA   rJ   rM   rN   markfilterwarningsrZ   r\   parametrizer   rz   r   r   r   r   r   r   r   xfailmachiner   r   r   slowr   r$   r$   r$   r%   <module>   s^    
	



B1


(