U
    /df(                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZ d dlmZ d dlmZ eddgd	d
gddggZedddgZG dd dZG dd dZG dd deeZG dd deZG dd dZdS )    N)lstsq)assert_allcloseassert_equalassert_)rand
coo_matrix)aslinearoperator)
lsq_lineargS?gv/gJ+gX9vϿgsh|?ſgS㥫?gl?gMbX9?gPnؿc                   @   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S )	BaseMixinc                 C   s   t jd| _d S )Nr   )nprandomZRandomStaternd)self r   H/tmp/pip-unpacked-wheel-9gxwnfpp/scipy/optimize/tests/test_lsq_linear.pysetup_method   s    zBaseMixin.setup_methodc                 C   sN   | j D ]B}ttt| j|d}t|jtttddd  t|j|jd  qd S )Nmethod
lsq_solverZrcondr   )	lsq_solversr	   Abr   r   xr   unbounded_sol)r   r   resr   r   r   test_dense_no_bounds   s    
zBaseMixin.test_dense_no_boundsc                 C   sh  t ddg}t ddg}tttddd }| jD ]F}ttt||f| j|d}t|j	tttddd  t|j
d | q4t dt j g}| jD ]H}ttt|t jf| j|d}t|j	t ddgd	d
 t|j
d | qt ddg}| jD ]H}ttt|t jf| j|d}t|j	t ddgdd
 t|j
d | qt t jdg}| jD ]H}tttt j |f| j|d}t|j	t ddg t|j
d | qRt dt jg}| jD ]H}tttt j |f| j|d}t|j	t ddg t|j
d | qt ddg}t ddg}| jD ]D}ttt||f| j|d}t|j	t ddg t|j
d | qd S )Nr   i   r   r   r           g1Vư>Zatolgԡw?gV瞯<ggUw-r 
su?)r   arrayr   r   r   r   r	   r   r   r   r   inf)r   lbubr   r   r   r   r   r   test_dense_bounds   sb    





zBaseMixin.test_dense_boundsc              	   C   s^   t j 2}|t t dddddgddddd	gg}W 5 Q R X t dd
g}t||}d S )N   r#   r         
   r   r      )r   ZtestingZsuppress_warningsfilterPendingDeprecationWarningZmatrixr%   r	   )r   supr   kZs_tr   r   r   test_np_matrixO   s
    
,zBaseMixin.test_np_matrixc                 C   s  t ddgg}t dg}ddg}ddg}| jD ]J}t||||f| j|d}t|jddg t|jd t||dd	d  q2t d
dgddgddgg}t dddg}ddg}ddg}| jD ]J}t||||f| j|d}t|j	ddd t|jd t||dd	d  qd S )NgSӿgZd;Oǿg#~j?皙g?r   r   r   r   gK7A`?gK7A`?gPngPng~jt?g~jt?g`"gHzG?gJ+?r   g      gdy=r!   )
r   r%   r   r	   r   r   r   r   r   
optimality)r   r   r   r'   r(   r   r   r   r   r   test_dense_rank_deficientW   s0    
 
z#BaseMixin.test_dense_rank_deficientc                 C   s   t ddg}t ddg}ttt||f| jd}t|jddg t|jd t	ttddd  t
|jt }t|jdt 
||  t|j| t|jd	d
d t|jddg t|jdk  t|jdkp|jdk tt|jt t|j d S )Nr   r#   r   r   r$   r   r   g      ?r   g-q=r!   r/   r,   )r   r%   r	   r   r   r   r   r   r   r   dotcostZfunr6   r   Zactive_maskr   Znitstatus
isinstancemessagestrsuccess)r   r'   r(   r   rr   r   r   test_full_resultp   s    zBaseMixin.test_full_resultc                 C   sT   t dddgdddgddd	gg}t d
ddg}t||| jd}t|jdk  d S )NgSQcU?gn-(8?g(8?gڌ?g,?gk,?g\s`?gAʨY?g Y?gt\O?v?g"He?gFH{?r8   gg5_PG>)r   r%   r	   r   r   r:   )r   r   r   resultr   r   r   test_almost_singular   s    zBaseMixin.test_almost_singularc                 C   s(  t jd t t jjdddd\}}|d9 }dt jjdd||gd }dt jjdd|gd }dt jt jjddd|fddd }|d	d d f  d7  < t j||}|d d |f }t|||d
dj}t|||ddj}t || | d }	t || | d }
t	t
|	|
 |
d k  d S )Nr   r+     )size      ?ic   )Zaxisr   bvlsboundsr   trf绽|=)r   r   seedsortrandintchoicer	   r   sumr   abs)r   nmr   r   rJ   wx_bvlsx_trf	cost_bvlscost_trfr   r   r   test_large_rank_deficient   s    $z#BaseMixin.test_large_rank_deficientc                 C   s   t dddgdddgdddgg}t d	d
dg}t dddgdddgg}t|||ddj}t|||ddj}t || | d }t || | d }tt|| |d k  d S )Ng     H@g     D@g      @g      3g       g      *g      $@g     @Q@g     Dg     Vg     G@g      ?@g      Fg      :@g      K@g      <@rH   rI   rK   r+   rL   )r   r%   r	   r   rQ   r   rR   )r   r   r   rJ   rV   rW   rX   rY   r   r   r   test_convergence_small_matrix   s    z'BaseMixin.test_convergence_small_matrixN)__name__
__module____qualname__r   r   r)   r4   r7   rA   rC   rZ   r[   r   r   r   r   r
      s   1r
   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SparseMixinc                 C   sb   d}d}t ||dd}| j|}t||}t|jddd t|}t||}t|jddd d S )N  rD   r   Zrandom_stater    r!   )r   r   randnr	   r   r6   r   )r   rT   rS   r   r   r   r   r   r   test_sparse_and_LinearOperator   s    

z*SparseMixin.test_sparse_and_LinearOperatorc                 C   s   d}d}t ||dd}| j|}| j|}|d }t||||f}t|jddd t||||fd	d
d}t|jddd t||||fdd}t|jddd d S )Nr`   rD   r   ra   r   r   r    r!   gvIh%<=i  )lsmr_tollsmr_maxiterauto)rd   )r   r   rb   r	   r   r6   )r   rT   rS   r   r   r'   r(   r   r   r   r   test_sparse_bounds   s    zSparseMixin.test_sparse_boundsc              	   C   s   t dddddg}t dddddg}t dddddg}t|||ffdd}t| tdd	}t|td
d	}tjtdd t	|j
|j
 W 5 Q R X t|td
dd}t	|j
|j
 d S )NrF   gzo ?r   r   r+   )r,   r,   )shapeexact)r   lsmr matchr-   r   re   )r   r%   r   r	   Ztoarrayr   pytestraisesAssertionErrorr   r   )r   datarowcolr   Z	exact_solZdefault_lsmr_solZ	conv_lsmrr   r   r   test_sparse_ill_conditioned   s    z'SparseMixin.test_sparse_ill_conditionedN)r\   r]   r^   rc   rg   ru   r   r   r   r   r_      s   r_   c                   @   s   e Zd ZdZddgZdS )TestTRFrK   ri   rj   Nr\   r]   r^   r   r   r   r   r   r   rv      s   rv   c                   @   s   e Zd ZdZdgZdS )TestBVLSrH   ri   Nrw   r   r   r   r   rx      s   rx   c                   @   s   e Zd Zdd Zdd ZdS )TestErrorCheckingc              	   C   s   t ttddd}t ttddd}t ttdd d}d}tjt|d t ttddd}W 5 Q R X tjt|d t ttddd}W 5 Q R X tjt|d t ttdd	d}W 5 Q R X d S )
Nrj   g{Gz?)r   rd   rf   z3`lsmr_tol` must be None, 'auto', or positive float.rl   r5   Zfoor   r	   r   r   ro   rp   
ValueErrorr   _Zerr_messager   r   r   test_option_lsmr_tol   s    z&TestErrorChecking.test_option_lsmr_tolc              	   C   s|   t ttddd}t ttdd d}d}tjt|d t ttddd}W 5 Q R X tjt|d t ttddd}W 5 Q R X d S )Nrj   r   rn   z0`lsmr_maxiter` must be None or positive integer.rl   r   r   rz   r|   r   r   r   test_option_lsmr_maxiter  s    z*TestErrorChecking.test_option_lsmr_maxiterN)r\   r]   r^   r~   r   r   r   r   r   ry      s   ry   )ro   Znumpyr   Znumpy.linalgr   Znumpy.testingr   r   r   Zscipy.sparser   r   Zscipy.sparse.linalgr   Zscipy.optimizer	   r%   r   r   r
   r_   rv   rx   ry   r   r   r   r   <module>   s$    #2