o
    Yi                     @   s   d Z ddl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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	transposehstack)norm)assert_allcloseN)	coo_array)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-1s0edx8b/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 )Nr6   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 )Nr6   r   r+   r4   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	   r1   ravelr   r   r2   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ư>)atolr9   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-   r0   r3   r5   r<   r>   r?   rA   rK   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+   r9   )r   r/   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)rS   r
   rQ   r:   	r   r#   istoprI   rJ   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 rT   )rR   r	   r   r"   r   r   r   rU   r   r   r   	testNormr   s   (zTestLSMRReturns.testNormrc           	      C   sF   | j \}}}}}}}}t| j| j| j| t|ks!J d S rT   )rR   r	   r"   rmatvecr   r   r   r   rU   r   r   r   
testNormar   s   zTestLSMRReturns.testNormarc           	      C   s0   | j \}}}}}}}}t|t|ksJ d S rT   )rR   r	   r   r   rU   r   r   r   	testNormx   s   zTestLSMRReturns.testNormxN)rL   rM   rN   r   r[   r\   r^   r_   r   r   r   r   rO      s    rO   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 )Nr7   r   )rD   )r   r   intfloatr   )r   r   rowcoldatar   r   r   r/      s*   
r/   )__doc__numpyr   r   r   r   r   r   r   numpy.linalgr	   numpy.testingr
   r   scipy.sparser   scipy.sparse.linalg._interfacer   scipy.sparse.linalgr   	test_lsqrr   r   r   rO   r/   r   r   r   r   <module>   s    $c