o
    5ήc                     @   s   d Z ddlmZmZmZmZmZmZmZm	Z	 ddl
mZ ddlmZ ddlZddlmZ ddlmZ ddlmZ d	d
lmZmZ G dd dZG dd dZdd Zdd Zedkrbeddd dS dS )a  
Copyright (C) 2010 David Fong and Michael Saunders
Distributed under the same license as SciPy

Testing Code for LSMR.

03 Jun 2010: First version release with lsmr.py

David Chin-lung Fong            clfong@stanford.edu
Institute for Computational and Mathematical Engineering
Stanford University

Michael Saunders                saunders@stanford.edu
Systems Optimization Laboratory
Dept of MS&E, Stanford University.

    )arrayarangeeyezerosonessqrt	transposehstack)norm)assert_allcloseN)
coo_matrix)aslinearoperator)lsmr   )Gbc                   @   st   e Z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d ZdS )TestLSMRc                 C   s   d| _ d| _d S )N
   )nmself r   R/tmp/pip-target-vg8gfxp4/lib/python/scipy/sparse/linalg/_isolve/tests/test_lsmr.pysetup_method   s   
zTestLSMR.setup_methodc                 C   sB   t |}||}t||d }t|| tjdddksJ d S )Nr   h㈵>abs)r   matvecr   r
   pytestapprox)r   AxtrueAfunr   xr   r   r   assertCompatibleSystem"   s   
"zTestLSMR.assertCompatibleSystemc                 C   (   t | j}t| jdf}| || d S Nr   )r   r   r   r%   r   r!   r"   r   r   r   testIdentityACase1(      
zTestLSMR.testIdentityACase1c                 C   r&   r'   )r   r   r   r%   r(   r   r   r   testIdentityACase2-   r*   zTestLSMR.testIdentityACase2c                 C   s,   t | j}tt| jdd}| || d S )Nr   r   r   r   r   r%   r(   r   r   r   testIdentityACase32   s   
zTestLSMR.testIdentityACase3c                 C   s.   t d| j}tt| jdd}| || d S )N   r   r,   )lowerBidiagonalMatrixr   r   r   r%   r(   r   r   r   testBidiagonalA7   s   zTestLSMR.testBidiagonalAc                 C   sD   t ddgg}d}t||d }t||| tdks J d S )Ng      ?g       @g      @r   )r   r   r
   dotr   r    r   r!   r   r$   r   r   r   testScalarB<   s   $zTestLSMR.testScalarBc                 C   s0   t | j}tt| jddd }| || d S )Nr   r,         ?      ?r-   r(   r   r   r   testComplexXB   s   
zTestLSMR.testComplexXc                 C   s   dt | j t| j| jf }tt| jdd}t||}t| jtd}t	|||dd }t
|| tjdddks>J d S )N   r   r,   dtypex0r   r   )r   r   r   r   r   r   r   r   complexr   r
   r   r    )r   r!   r"   r   r;   r$   r   r   r   testComplexX0G   s   "zTestLSMR.testComplexX0c                 C   sJ   dt | j dt| j| jf  }tt| jddt}| || d S )Nr7   y              ?r   r,   )r   r   r   r   r   astyper<   r%   r(   r   r   r   testComplexAO   s   "zTestLSMR.testComplexAc                 C   sr   dt | j t| j| jf }tt| jddd }t||}t||d }t|| t	j
dddks7J d S )Nr7   r   r,   r5   r   r   )r   r   r   r   r   r   r   r   r
   r   r    )r   r!   r"   r   r$   r   r   r   testComplexBT   s
   "zTestLSMR.testComplexBc                 C   sN   t | j}t| jdf}t||d }t|||  tdks%J d S )Nr   r   )	r   r   r   r   r
   r2   ravelr   r    r3   r   r   r   testColumnB[   s   
(zTestLSMR.testColumnBc           	      C   s   t tt^}}}}}tttt|  |dd ttj}t tt|dd }t|| t ttddd }t tt|d^}}}}}tttt|  |dd || dv sTJ ||d k s\J d S )	Ngư>)atolr:   r   r   )maxiter)r   r   gzo ?)r   r   r   r   r
   r   shape)	r   x_ref_itn_ref	normr_refr;   r$   itnnormrr   r   r   testInitializationa   s   


zTestLSMR.testInitializationN)__name__
__module____qualname__r   r%   r)   r+   r.   r1   r4   r6   r=   r?   r@   rB   rL   r   r   r   r   r      s    r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestLSMRReturnsc                 C   s   d| _ td| j | _tt| j dd| _t| j| _| j| j| _	t
| j | _| j | _t| j| j	| _t| j| j	| jd| _d S )Nr   r/   r   r,   r:   )r   r0   r!   r   r   r"   r   r#   r   r   r   r;   copyx00r   returnValuesreturnValuesX0r   r   r   r   r      s   zTestLSMRReturns.setup_methodc           	      C   s(   | j \}}}}}}}}t| j| j d S N)rT   r   rR   r;   	r   r$   istoprJ   rK   normarnormAcondAnormxr   r   r   test_unchanged_x0   s   z!TestLSMRReturns.test_unchanged_x0c           	      C   s>   | j \}}}}}}}}t| j| j| t|ksJ d S rU   )rS   r
   r   r#   r   r   r    rV   r   r   r   	testNormr   s   (zTestLSMRReturns.testNormrc           	      C   sF   | j \}}}}}}}}t| j| j| j| t|ks!J d S rU   )rS   r
   r#   rmatvecr   r   r   r    rV   r   r   r   
testNormar   s   zTestLSMRReturns.testNormarc           	      C   s0   | j \}}}}}}}}t|t|ksJ d S rU   )rS   r
   r   r    rV   r   r   r   	testNormx   s   zTestLSMRReturns.testNormxN)rM   rN   rO   r   r\   r]   r_   r`   r   r   r   r   rP      s    rP   c                 C   s   | |krAt t| tdtd| tdf}t t| tdt| d tdf}t td| d tdtd| tdf}t|||ff| |fdS t t|tdtd|d tdf}t t|tdt|tdf}t td|d tdtd|d tdf}t|||ff| |fdS )Nr8   r   )rE   )r	   r   intfloatr   )r   r   rowcoldatar   r   r   r0      s*   
r0   c              	   C   sP  t | |}t|ddtd}t|}||}d}d}d}	d| }
d}t||||||	|
|\}}}}}}}}t|d}t|d	 d}td
 td dd |d| D }td	| td
 td dd ||d d D }td	| ||| }t
t|d |t| d  }td
 d| }d| }t| t| td
 dS )zVerbose testing of lsmrr   r,   r8   gHz>g    _Br   r      r7    zFirst elements of x:c                 S      g | ]}d | qS z%10.4fr   .0xir   r   r   
<listcomp>       zlsmrtest.<locals>.<listcomp> zLast  elements of x:c                 S   rh   ri   r   rj   r   r   r   rm      rn   N   znormr (est.)  %17.10eznormr (true)  %17.10e)r0   r   rb   r   r   r   minmaxprintjoinr   r
   )r   r   dampr!   r"   r#   r   rC   btolconlimitnlimshowr$   rW   rJ   rK   rX   normacondar[   j1j2strrr2str2r   r   r   lsmrtest   s:   


 r   __main__r/   r   )__doc__numpyr   r   r   r   r   r   r   r	   numpy.linalgr
   numpy.testingr   r   scipy.sparser   scipy.sparse.linalg._interfacer   scipy.sparse.linalgr   	test_lsqrr   r   r   rP   r0   r   rM   r   r   r   r   <module>   s     (c'