U
    »mœd|  ã                   @   s¸  d dl mZ d dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZ d>dd„Zd?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 d!„Z%d"d#„ Z&G d$d%„ d%ƒZ'G d&d'„ d'ƒZ(d(d)„ Z)e*e +¡ ƒe)g Z,G d*d+„ d+ƒZ-G d,d-„ d-ƒZ.G d.d/„ d/ƒZ/G d0d1„ d1ƒZ0G d2d3„ d3e-e.e/e0ƒZ1G d4d5„ d5e-e.e/e0ƒZ2G d6d7„ d7e-ƒZ3d8d9„ Z4d:d;„ Z5d<d=„ Z6dS )Aé    )ÚproductN)Únorm)Úassert_Úassert_allcloseÚassert_equalÚsuppress_warnings)Úraises)ÚissparseÚ
lil_matrix)Úaslinearoperator)Úleast_squaresÚBounds)ÚIMPLEMENTED_LOSSES)ÚEPSÚmake_strictly_feasiblec                 C   s   | | d d S )Né   g      @© ©ÚxÚar   r   ú`/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/optimize/tests/test_least_squares.pyÚfun_trivial   s    r   ç        c                 C   s   d| |  S ©Nr   r   r   r   r   r   Újac_trivial   s    r   c                 C   s   t  | d | d g¡S ©Nr   é   ©ÚnpÚarray©r   r   r   r   Úfun_2d_trivial   s    r!   c                 C   s
   t  d¡S r   )r   Úidentityr    r   r   r   Újac_2d_trivial   s    r#   c                 C   s*   t  d| d | d d   d| d  g¡S )Né
   r   r   r   r   r    r   r   r   Úfun_rosenbrock    s    r%   c                 C   s   t  d| d  dgddgg¡S )Néìÿÿÿr   r$   éÿÿÿÿr   r    r   r   r   Újac_rosenbrock$   s    þr(   c                 C   s$   t  d| d  dgddgddgg¡S )Nr&   r   r$   r'   r   r   r    r   r   r   Újac_rosenbrock_bad_dim+   s
    ýr)   c                 C   s   t | ƒd S ©Nr   )r%   r    r   r   r   Úfun_rosenbrock_cropped3   s    r+   c                 C   s   t | ƒd S r*   )r(   r    r   r   r   Újac_rosenbrock_cropped7   s    r,   c                 C   s   t  | | d | d g¡S )Nr   é   r   r    r   r   r   Úfun_wrong_dimensions<   s    r.   c                 C   s   t  t| |d�¡S )N)r   )r   Z
atleast_3dr   r   r   r   r   Újac_wrong_dimensions@   s    r/   c                 C   s´   t t | jd ¡ƒ}t |d |d f¡}|  ||f¡} | |dd…dd…f< |d d…dd…f |dd …dd…f  |dd…d d…f  |dd…dd …f  d|   | d  }| ¡ S )Nr   r   r   r'   éþÿÿÿé   r-   )Úintr   ÚsqrtÚshapeÚzerosÚreshapeZravel)r   ÚnÚuÚyr   r   r   Úfun_bvpD   s    `r:   c                   @   s&   e Zd Zd
dd„Zdd„ Zdd„ Zd	S )ÚBroydenTridiagonaléd   Úsparsec                    sd  t j d¡ |ˆ _t  |¡ ˆ _t  dd|¡ˆ _t  dd|¡ˆ _ˆ  jdt j 	|¡ 7  _ˆ  jdt j 	|¡ 7  _ˆ  jdt j 	|¡ 7  _t
ˆ jˆ jˆ jƒˆ _|dk�rt||ftd�ˆ _t  |¡}d	ˆ j||f< t  d	|¡}d	ˆ j||d	 f< t  |d	 ¡}d	ˆ j||d	 f< ˆ jˆ _nB|d
k�r8‡ fdd„ˆ _n(|dk�rXd ˆ _‡ fdd„ˆ _ntdƒ d S )Nr   r0   ç      ø¿gš™™™™™é¿r   çš™™™™™¹?r=   )Zdtyper   Úoperatorc                    s   t ˆ  | ¡ƒS ©N)r   Ú_jacr    ©Úselfr   r   Ú<lambda>h   ó    z-BroydenTridiagonal.__init__.<locals>.<lambda>Údensec                    s   ˆ   | ¡ ¡ S rA   )rB   Ztoarrayr    rC   r   r   rE   k   rF   F)r   ÚrandomÚseedr7   ÚonesÚx0ÚlinspaceÚlbÚubÚrandnr   r
   r2   ÚsparsityÚarangerB   Újacr   )rD   r7   ÚmodeÚir   rC   r   Ú__init__N   s0    




zBroydenTridiagonal.__init__c                 C   sP   d| | d }|dd …  |d d… 8  < |d d…  d|dd …  8  < |S )Nr-   r   r'   r   r   )rD   r   Úfr   r   r   Úfuno   s     zBroydenTridiagonal.func                 C   sr   t | j| jfƒ}t | j¡}dd|  |||f< t d| j¡}d|||d f< t | jd ¡}d|||d f< |S )Nr-   r   r   r'   r0   )r
   r7   r   rQ   )rD   r   ÚJrT   r   r   r   rB   u   s    zBroydenTridiagonal._jacN)r<   r=   )Ú__name__Ú
__module__Ú__qualname__rU   rW   rB   r   r   r   r   r;   M   s   
!r;   c                   @   s*   e Zd ZdZddd„Zdd	„ Zd
d„ ZdS )ÚExponentialFittingProblemz]Provide data and function for exponential fitting in the form
    y = a + exp(b * x) + noise.r   ©r'   r   é   Nc           	      C   s¶   t j |¡ || _d| _t  d¡| _t  |d |d |¡| _|t  	|| j ¡ | _
|  j
|t j | j¡ 7  _
t j d| j|¡}| j
|  d| t j |¡ 7  < t  ||g¡| _d S )Nr   r   r   é2   )r   rH   rI   Úmr7   r5   Úp0rL   r   Úexpr9   rO   ÚrandintZrandr   Úp_opt)	rD   r   ÚbÚnoiseZ
n_outliersZx_rangeZn_pointsÚrandom_seedZoutliersr   r   r   rU   „   s    "z"ExponentialFittingProblem.__init__c                 C   s"   |d t  |d | j ¡ | j S r   )r   rb   r   r9   ©rD   Úpr   r   r   rW   •   s    zExponentialFittingProblem.func                 C   sL   t  | j| jf¡}d|d d …df< | jt  |d | j ¡ |d d …df< |S )Nr   r   )r   Úemptyr`   r7   r   rb   )rD   ri   rX   r   r   r   rR   ˜   s    &zExponentialFittingProblem.jac)r   r]   r^   N)rY   rZ   r[   Ú__doc__rU   rW   rR   r   r   r   r   r\   €   s       ÿ
r\   c                 C   sL   t  d| jf¡}d|  }d|d d  |d< |d |d< d|d  |d< |S )Nr-   r   gUUUUUUÕ?r   gUUUUUUå¿g«ªªªªªú¿r   )r   rj   Úsize)ÚzÚrhoÚtr   r   r   Úcubic_soft_l1Ÿ   s    rp   c                   @   s¬   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d„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)S )*Ú	BaseMixinc                 C   s6   t td| jd�}t|jddd� t|jt|jƒƒ d S )Nç       @©Úmethodr   ç-Cëâ6?©Zatol)r   r   rt   r   r   rW   ©rD   Úresr   r   r   Ú
test_basic®   s    zBaseMixin.test_basicc              
   C   s¶   d}dddt fD ] }tƒ �@}| td¡ ttd||f| jd�}ttd|d|i| jd	�}W 5 Q R X t|j|d
d� t|j|d
d� t	t
ttdd| jd� t	t
ttdddi| jd	� qd S )Nç      @ú2-pointú3-pointÚcsúBjac='(3-point|cs)' works equivalently to '2-point' for method='lm'rr   )Úargsrt   r   )Úkwargsrt   ru   )Zrtol)r-   r1   Zkaboomr-   )r   r   ÚfilterÚUserWarningr   r   rt   r   r   Úassert_raisesÚ	TypeError)rD   r   rR   Úsuprx   Úres1r   r   r   Útest_args_kwargs´   s,    ÿÿÿ
 ÿ
 ÿzBaseMixin.test_args_kwargsc              
   C   sl   dddt fD ]D}tƒ �$}| td¡ ttd|| jd�}W 5 Q R X t|jddd	� qt	t
ttdd
| jd� d S )Nr{   r|   r}   r~   rr   rs   r   ru   rv   Zoops©rR   rt   )r   r   r�   r‚   r   r   rt   r   r   rƒ   Ú
ValueError)rD   rR   r…   rx   r   r   r   Útest_jac_optionsÈ   s    ÿÿzBaseMixin.test_jac_optionsc                 C   s0   dD ]&}t td|| jd�}t|jddd� qd S )N)Né   rr   )Úmax_nfevrt   r   ru   rv   )r   r   rt   r   r   )rD   rŒ   rx   r   r   r   Útest_nfev_optionsÓ   s
    ÿzBaseMixin.test_nfev_optionsc                 C   sŽ   dt  dg¡dfD ]}ttd|d�}t|jdƒ qttttdd| jd� ttttdd	| jd� ttttdd | jd� ttttdd
| jd� d S )Nç      ð?ç      à?rR   rr   )Úx_scaler   Úauto)r�   rt   ç      ð¿y      ð?       @)	r   r   r   r   r   r   rƒ   r‰   rt   )rD   r�   rx   r   r   r   Útest_x_scale_optionsÙ   s.      ÿ  ÿ  ÿ  ÿzBaseMixin.test_x_scale_optionsc                 C   s†   t tdd| jd�}t tdd| jd�}t tdd | jd�}t|jddd� t|jddd� t|jddd� t|j|jƒ t|j|jƒ d S )Nrr   r?   )Z	diff_steprt   gš™™™™™¹¿r   ru   rv   )r   r   rt   r   r   r   Únfev)rD   r†   Zres2Zres3r   r   r   Útest_diff_stepæ   s    ÿÿ ÿzBaseMixin.test_diff_stepc                 C   s8   t tttd| jddid� t tttd| jddid� d S )Nrr   Zno_such_optionr<   )rt   ÚoptionsrŒ   )rƒ   r„   r   r   rt   rC   r   r   r   Útest_incorrect_options_usageõ   s    
 ÿ
 ÿz&BaseMixin.test_incorrect_options_usagec                 C   sÔ   t td| jd�}t|jddd� t|jdƒ t|jdƒ t|jddd� t|jddd� t|j	ddd� t
|jdƒ | jd	krœt|jd
k ƒ t|jd kƒ nt|jdk ƒ t|jdk ƒ t|jdkƒ t|jƒ d S )Nrr   rs   r   ru   rv   g      )@é   ç{®Gáz„?Úlmé   r$   )r   r   rt   r   r   ÚcostrW   rR   ÚgradÚ
optimalityr   Úactive_maskr   r”   ÚnjevÚstatusÚsuccessrw   r   r   r   Útest_full_resultû   s    
zBaseMixin.test_full_resultc                 C   sÒ   | j dkrd S ttd| j dd�}t|jt dg¡ƒ t|jdƒ t|jt dg¡ƒ t|j	t dgg¡ƒ t|j
t d	g¡ƒ t|jd	ƒ t|jt d
g¡ƒ t|jdƒ t|jdƒ t|jd
ƒ t|jd
ƒ d S )Nrš   rr   r   )rt   rŒ   r   g     @D@é	   r1   é$   r   )rt   r   r   r   r   r   r   rœ   rW   rR   r�   rž   rŸ   r”   r    r¡   r¢   rw   r   r   r   Útest_full_result_single_fev  s     

ÿz%BaseMixin.test_full_result_single_fevc              
   C   sˆ   ddg}ddg}t dddtgdt ddg¡dgd	d
gƒD ]J\}}}tƒ �(}| td¡ tt||||| j	d�}W 5 Q R X t
|j|ƒ q8d S )Nr0   r   r{   r|   r}   rŽ   çš™™™™™É?rR   ÚexactÚlsmrr~   ©r�   Ú	tr_solverrt   )r   r(   r   r   r   r�   r‚   r   r%   rt   r   r   )rD   rK   Úx_optrR   r�   r«   r…   rx   r   r   r   Útest_rosenbrock#  s     
ýÿ
 ÿzBaseMixin.test_rosenbrockc              	   C   s„   ddg}| j dkr&tttt|dd� nZtdddtgdt dd	g¡d
gddgƒD ]0\}}}tt||||| j d�}t	|j
ddd� qNd S )Nr0   r   rš   rs   r{   r|   r}   rŽ   r§   rR   r¨   r©   rª   r   g›+¡†›„=rv   )rt   rƒ   r‰   r   r+   r   r,   r   r   r   rœ   )rD   rK   rR   r�   r«   rx   r   r   r   Útest_rosenbrock_cropped1  s(    
 ÿ
ý    þz!BaseMixin.test_rosenbrock_croppedc                 C   s   t tttd| jd� d S ©Nrr   rs   )rƒ   r‰   r   r.   rt   rC   r   r   r   Útest_fun_wrong_dimensions@  s     ÿz#BaseMixin.test_fun_wrong_dimensionsc                 C   s   t tttdt| jd� d S r¯   )rƒ   r‰   r   r   r/   rt   rC   r   r   r   Útest_jac_wrong_dimensionsD  s
      ÿz#BaseMixin.test_jac_wrong_dimensionsc                 C   s"   ddg}t ttt|t| jd� d S )Nr   r   rs   )rƒ   r‰   r   r%   r)   rt   ©rD   rK   r   r   r   Ú(test_fun_and_jac_inconsistent_dimensionsH  s
    
 ÿz2BaseMixin.test_fun_and_jac_inconsistent_dimensionsc                 C   s*   t  d¡ dd¡}tttt|| jd� d S )Nr1   r   rs   )r   rJ   r6   rƒ   r‰   r   r   rt   r²   r   r   r   Útest_x0_multidimensionalM  s    
ÿz"BaseMixin.test_x0_multidimensionalc                 C   s   d}t ttt|| jd� d S )Nù       @        rs   ©rƒ   r‰   r   r   rt   r²   r   r   r   Útest_x0_complex_scalarR  s    
ÿz BaseMixin.test_x0_complex_scalarc                 C   s    ddg}t ttt|| jd� d S )NrŽ   rµ   rs   r¶   r²   r   r   r   Útest_x0_complex_arrayW  s    
ÿzBaseMixin.test_x0_complex_arrayc                 C   sZ   d}t  |d ¡}| jdkr"d}nd}tt|d| j|d�}t|j|k ƒ t|jdk ƒ d S )	Nr$   r   rš   iˆ  r<   r™   )Úftolrt   rŒ   r�   )r   rJ   rt   r   r:   r   r”   rœ   )rD   r7   rK   rŒ   rx   r   r   r   Útest_bvp\  s    
ÿzBaseMixin.test_bvpc              
   C   s   t tttd| jd d d d� d S )Nrr   )rt   r¹   ÚxtolÚgtolr¶   rC   r   r   r   Ú/test_error_raised_when_all_tolerances_below_epsm  s    
   ÿz9BaseMixin.test_error_raised_when_all_tolerances_below_epsc              
   C   sV   | j dkrd S ddg}ddg}dD ].\}}}tt|t|||| j d�}t|j|ƒ q"d S )Nrš   r0   r   ))ç:Œ0âŽyE>NN)Nr¾   N)NNr¾   )rR   r¹   r¼   r»   rt   )rt   r   r%   r(   r   r   )rD   rK   r¬   r¹   r»   r¼   rx   r   r   r   Ú0test_convergence_with_only_one_tolerance_enabledr  s    
  þz:BaseMixin.test_convergence_with_only_one_tolerance_enabledN)rY   rZ   r[   ry   r‡   rŠ   r�   r“   r•   r—   r£   r¦   r­   r®   r°   r±   r³   r´   r·   r¸   rº   r½   r¿   r   r   r   r   rq   ­   s(   rq   c                   @   sL   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S )ÚBoundsMixinc                 C   s   t tttdd| jd� d S )Nrr   )g      $@r   ©Úboundsrt   r¶   rC   r   r   r   Útest_inconsistent�  s    
 ÿzBoundsMixin.test_inconsistentc                 C   s   t tttdd| jd� d S )Nrr   )rz   r1   rÁ   r¶   rC   r   r   r   Útest_infeasible…  s    
 ÿzBoundsMixin.test_infeasiblec                 C   s   t tttdd| jd� d S )Nrr   )rŽ   r   r-   rÁ   r¶   rC   r   r   r   Útest_wrong_number‰  s    
 ÿzBoundsMixin.test_wrong_numberc                 C   sF   t tttddddgf| jd� t tttddgdgddgf| jd� d S )Nrr   rŽ   rz   rÁ   r   g      @)rƒ   r‰   r   r   rt   r%   rC   r   r   r   Útest_inconsistent_shape�  s    

 ÿ ÿz#BoundsMixin.test_inconsistent_shapec                 C   s¶   dddt fD ]¤}ttd|d| jd�}t|jddd	� t|jd
gƒ td|j  koXdkn  ƒ ttd|d| jd�}t|jddd	� t|jdgƒ td|j  ko¨dkn  ƒ qd S )Nr{   r|   r}   rr   )r’   rz   ©rR   rÂ   rt   r   ru   rv   r   r'   r-   )r�   rz   r�   )	r   r   r   rt   r   r   r   rŸ   r   )rD   rR   rx   r   r   r   Útest_in_bounds”  s     ÿ ÿzBoundsMixin.test_in_boundsc              
   C   sì   dd„ }dd„ }dddt fD ]Ê}||fD ]¼}ddg}tt||d	�}t|jd
d
gƒ tt|||dddgƒ| jd�}t|jddgƒ tt|||ddgdƒ| jd�}t|jddgƒ tt|||ddgddgƒ| jd�}t|jd
dgdd� q(qd S )Nc                 S   s   | |fS rA   r   ©rM   rN   r   r   r   Úget_bounds_direct¢  s    z8BoundsMixin.test_bounds_shape.<locals>.get_bounds_directc                 S   s
   t | |ƒS rA   )r   rÉ   r   r   r   Úget_bounds_instances¥  s    z;BoundsMixin.test_bounds_shape.<locals>.get_bounds_instancesr{   r|   r}   rŽ   )rR   r   r�   rr   rÇ   g333333Ó?r§   rz   r'   çñhãˆµøä>rv   )r#   r   r!   r   r   rt   )rD   rÊ   rË   rR   Zbounds_funcrK   rx   r   r   r   Útest_bounds_shape¡  s2    þþ  ýzBoundsMixin.test_bounds_shapec                 C   sô   t tdtƒ d�}t|jddd� t tdtdd�d�}t|jddd� t tdtd	dd
�d�}t|jddd� t tdtd	d�d�}t|jd	dd� t tddgtd	d	gdd
�d�}t|jddgdd� t tddgtddgd�d�}t|jddgdd� d S )Nr�   )rÂ   r   ru   rv   rz   rŽ   )rM   r’   rÉ   ç      À)rN   rÌ   r?   )r   r   r   r   r   r!   rw   r   r   r   Útest_bounds_instances»  s     
ÿ
ÿz!BoundsMixin.test_bounds_instancesc                 C   s*  t  ddg¡}t  ddg¡}t  ddg¡}t  ddg¡}t  ddg¡}|t j dgt jff|t j dgt jff|t j dgt jff|t j dgdt jgff|ddgddgff|d	dgd
dgffg}|D ]^\}}tdddtgddd
gdgddgƒD ]2\}	}
}tt||	||
|| jd�}t|j	ddd� qðqÆd S )Ng       ÀrŽ   rr   r   g333333ó¿r>   g      ø?rz   g      IÀr�   r<   r{   r|   r}   rR   r¨   r©   rª   rÌ   rv   )
r   r   Úinfr   r(   r   r%   rt   r   rž   )rD   Zx0_1Zx0_2Zx0_3Zx0_4Zx0_5ÚproblemsrK   rÂ   rR   r�   r«   rx   r   r   r   Útest_rosenbrock_boundsÐ  s0    ú
ý
 þz"BoundsMixin.test_rosenbrock_boundsN)rY   rZ   r[   rÃ   rÄ   rÅ   rÆ   rÈ   rÍ   rÏ   rÒ   r   r   r   r   rÀ   €  s   rÀ   c                   @   s\   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S )ÚSparseMixinc              	   C   sF   t ƒ }ttt|j|j|jd| jd� ttt|j|jd|j| jd� d S )Nr¨   ©r«   rt   )r«   Újac_sparsityrt   )	r;   rƒ   r‰   r   rW   rK   rR   rt   rP   rh   r   r   r   Útest_exact_tr_solverê  s     ÿ þz SparseMixin.test_exact_tr_solverc                 C   sˆ   t dd�}t dd�}t|j|j|j| jd�}t|j|j|j| jd�}t|j|jƒ t|j	|j	dd� t|j
ddd� t|j
ddd� d S )Nr=   ©rS   rG   rˆ   ç#B’¡œÇ;rv   r   )r;   r   rW   rK   rR   rt   r   r”   r   r   rœ   ©rD   r=   rG   Ú
res_sparseÚ	res_denser   r   r   Útest_equivalenceò  s$    

  þ  þzSparseMixin.test_equivalencec                 C   s8   t ƒ }t|j|j|j| jddid�}t|jddd� d S )NZbtolç»½×Ùß|Û=©rt   Ú
tr_optionsr   rØ   rv   )r;   r   rW   rK   rR   rt   r   rœ   ©rD   ri   rx   r   r   r   Útest_tr_options   s
    ÿzSparseMixin.test_tr_optionsc              	   C   sH   t ƒ }ttt|j|j|jd| jd� ttt|j|j|jdddid� d S )NÚbestrÔ   r©   ZtolrÝ   )r«   rß   )	r;   rƒ   r‰   r   rW   rK   rR   rt   r„   rh   r   r   r   Útest_wrong_parameters  s     ÿ ÿz!SparseMixin.test_wrong_parametersc                 C   sˆ   t dd�}t dd�}t|j|j|j| jd�}t|j|j|j| jd�}t|jddd� t|jddd� tt	|jƒƒ tt
|jtjƒƒ d S )Nr=   r×   rG   rˆ   r   rØ   rv   )r;   r   rW   rK   rR   rt   r   rœ   r   r	   Ú
isinstancer   ZndarrayrÙ   r   r   r   Útest_solver_selection  s    

ÿÿz!SparseMixin.test_solver_selectionc                 C   s„   t ƒ }dD ]t}t|j|j|| jd�}t|j|j|| j|jd�}t|j|jƒ t|j	|j	dd� t|j
ddd� t|j
ddd� q
d S )N)r{   r|   r}   rs   )rt   rÕ   rØ   rv   r   )r;   r   rW   rK   rt   rP   r   r”   r   r   rœ   )rD   ri   rR   rÛ   rÚ   r   r   r   Útest_numerical_jac  s       þzSparseMixin.test_numerical_jacc              	   C   sÆ   t ƒ }t|jdddgd |jgƒD ] \}}t|j|j||jtj	f| j
|d�}t|j|j|tj	 |jf| j
|d�}t|j|j||j|jf| j
|d�}t|jddd� t|jddd� t|jddd� q d S )Nr{   r|   r}   )rÂ   rt   rÕ   r   rÝ   rv   )r;   r   rR   rP   r   rW   rK   rM   r   rÐ   rt   rN   r   rž   )rD   ri   rR   rÕ   Zres_1Zres_2Zres_3r   r   r   Útest_with_bounds%  s@     ÿ   
 þ    þ   
 þzSparseMixin.test_with_boundsc                 C   s2   t ƒ }|jd d… }ttt|j|j|| jd� d S )Nr'   ©rÕ   rt   )r;   rP   rƒ   r‰   r   rW   rK   rt   )rD   ri   rP   r   r   r   Útest_wrong_jac_sparsity6  s     ÿz#SparseMixin.test_wrong_jac_sparsityc              	   C   sT   t dd�}t|j|j|j| jd�}t|jddd� tt	t|j|j|j| jdd� d S )	Nr@   r×   rs   r   rØ   rv   r¨   )rt   r«   ©
r;   r   rW   rK   rR   rt   r   rœ   rƒ   r‰   rà   r   r   r   Útest_linear_operator<  s    
 ÿz SparseMixin.test_linear_operatorc              	   C   s\   t ƒ }t|j|j|j| jdd�}t|jddd� t dd�}tt	t|j|j|j| jdd� d S )NrR   )rt   r�   r   rØ   rv   r@   r×   rê   rà   r   r   r   Útest_x_scale_jac_scaleC  s    ÿ
 ÿz"SparseMixin.test_x_scale_jac_scaleN)rY   rZ   r[   rÖ   rÜ   rá   rã   rå   ræ   rç   ré   rë   rì   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 )ÚLossFunctionMixinc                 C   sF   t D ]&}ttd|| jd�}t|jddd� qttttdd| jd� d S )Nrr   ©Úlossrt   r   gVçž¯Ò<rv   Zhinge)ÚLOSSESr   r   rt   r   r   rƒ   r‰   ©rD   rï   rx   r   r   r   Útest_optionsO  s    ÿ
 ÿzLossFunctionMixin.test_optionsc                 C   s2   t D ](}ttd|| jd�}t|jt|jƒƒ qd S )Nrr   rî   )rð   r   r   rt   r   rW   r   rñ   r   r   r   Útest_funX  s
    ÿzLossFunctionMixin.test_func                 C   sˆ  t  dg¡}tt|tdd| jd�}t|jd| |d d  ƒ tt|tdd| jd�}t|jd| ƒ tt|tdd| jd�}t|jd| |d d  d|d d d  d	  ƒ tt|td
d| jd�}t|jd| |d d  d|d d d   ƒ tt|tdd| jd�}t|jd| |d d  d|d d d   ƒ tt|tt	d| jd�}t|jd| |d d  d|d d d  d  ƒ d S )Nrr   Úlinearr   ©rï   rŒ   rt   r   r˜   ÚhuberÚsoft_l1r�   ÚcauchyÚarctanr1   gUUUUUUå?)
r   r   r   r   r   rt   r   r�   r   rp   )rD   r   rx   r   r   r   Ú	test_grad`  sF    
 ÿ
 ÿ
 ÿ*ÿ
 ÿ0
 ÿ0
 ÿ*ÿzLossFunctionMixin.test_gradc              	   C   s4  d}|d d }t t|tdd| jd�}t|jd| ƒ t t|tdd| jd�}t|jd| td  ƒ t t|tdd	dd
�}t|jd| ƒ t t|tdd| jd�}t|jd| d|d  d  ƒ t t|tdd| jd�}t|jd| td  ƒ t t|tdd	d| jd�}|d	 }t|jd| d|d  d  d|d   ƒ t t|tdd| jd�}t|jd| td  ƒ t t|tddd| jd�}|d }t|jd| dd|d   d  d|d   ƒ t t|ttdd�}t|jd| td  ƒ t t|ttddd
�}|d }t|jd| d|d d  d  d|d  d  ƒ d S )Nrr   r   r˜   rô   r   rõ   rö   r�   r$   )rï   Úf_scalerŒ   r÷   g      è¿rø   )rï   rû   rŒ   rt   rù   g      4@r‹   r-   r1   )rï   rŒ   é   g«ªªªªªê¿)	r   r   r   rt   r   rR   r   r   rp   )rD   r   rV   rx   Úfsr   r   r   Útest_jac  sv    	
 ÿ
 ÿ
 ÿ
 ÿ 
 ÿ
  ÿ,
 ÿ
  ÿ0
ÿ  ÿ*ÿzLossFunctionMixin.test_jacc                 C   sº   dD ]°}t dd|dd�}ddd|jfD ]Œ}t|j|j|| jd	�}t|jdd
d� tD ]\}|dkrbqTt|j|j|||| jd�}t|jdd
d� t	t
|j|j ƒt
|j|j ƒk ƒ qTq&qd S )N)r?   rŽ   r   r?   r   )rg   r{   r|   r}   rˆ   r™   rv   rô   )rR   rï   rû   rt   )r\   rR   r   rW   ra   rt   r   rž   rð   r   r   r   rd   )rD   rf   ri   rR   Zres_lsqrï   Z
res_robustr   r   r   Útest_robustnessÃ  s,    ÿ    þÿz!LossFunctionMixin.test_robustnessN)rY   rZ   r[   rò   ró   rú   rþ   rÿ   r   r   r   r   rí   N  s
   	Drí   c                   @   s   e Zd ZdZdS )Ú
TestDogboxZdogboxN)rY   rZ   r[   rt   r   r   r   r   r   Ö  s   r   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestTRFÚtrfc                 C   s@   t ƒ }dD ]0}t|j|j|jdd|id�}t|jddd� q
d S )N)TFr  Ú
regularizerÞ   r   rØ   rv   )r;   r   rW   rK   rR   r   rœ   )rD   ri   r  rx   r   r   r   Útest_lsmr_regularizationÝ  s    ÿz TestTRF.test_lsmr_regularizationN)rY   rZ   r[   rt   r  r   r   r   r   r  Ú  s   r  c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚTestLMrš   c                 C   s   t tttdddd� d S )Nrr   )rÎ   rz   rš   rÁ   ©rƒ   r‰   r   r   rC   r   r   r   Útest_bounds_not_supportedè  s
      ÿz TestLM.test_bounds_not_supportedc                 C   s   ddg}t ttt|dd� d S )Nr0   r   rš   rs   )rƒ   r‰   r   r+   r²   r   r   r   Útest_m_less_n_not_supportedì  s    
ÿz"TestLM.test_m_less_n_not_supportedc                 C   s$   t ƒ }ttt|j|j|jdd� d S )Nrš   rs   ©r;   rƒ   r‰   r   rW   rK   rR   rh   r   r   r   Útest_sparse_not_supportedñ  s    ÿz TestLM.test_sparse_not_supportedc                 C   s   t tttddgdd� d S )Nrr   r   rš   rè   r  rC   r   r   r   Útest_jac_sparsity_not_supportedö  s    
 ÿz&TestLM.test_jac_sparsity_not_supportedc                 C   s(   t dd�}ttt|j|j|jdd� d S )Nr@   r×   rš   rs   r	  rh   r   r   r   Ú!test_LinearOperator_not_supportedú  s    
ÿz(TestLM.test_LinearOperator_not_supportedc                 C   s8   t tdddd�}t|jddd� ttt tdddd	� d S )
Nrr   rô   rš   rî   r   ru   rv   rö   )rt   rï   )r   r   r   r   rƒ   r‰   rw   r   r   r   Ú	test_lossÿ  s    
 ÿzTestLM.test_lossN)
rY   rZ   r[   rt   r  r  r
  r  r  r  r   r   r   r   r  å  s   r  c                  C   s   t tdƒ} t| jddd� d S )Nrr   r   rÝ   rv   )r   r   r   r   )rx   r   r   r   ry     s    
ry   c                  C   s,   dD ]"\} }}t tttd|| |dd� qd S )N))Nç‚vIhÂ%<=r  )r  Nr  )r  r  Nrr   rš   )r»   r¹   r¼   rt   r  )r¹   r»   r¼   r   r   r   Útest_small_tolerances_for_lm  s      ÿr  c                     sˆ   t j d¡ t  ddd¡ d¡} t j d¡ d¡}dd„ ‰ ‡ fdd„}t|d	d	g| |fd
�}|jdksjt‚t|j	t  
ddg¡dd� d S )Nr   r   r<   Zfloat32c                 S   s   | d | d |  S r   r   )ri   r   r   r   r   Úfunc  s    ztest_fp32_gh12991.<locals>.funcc                    s   ˆ | |ƒ| S rA   r   )ri   r   r9   ©r  r   r   Úerr   s    ztest_fp32_gh12991.<locals>.errr’   )r   r   g ¼ùW Ú?gá	ÞáÃ?g-Cëâ6
?rv   )r   rH   rI   rL   Zastyper   r”   ÚAssertionErrorr   r   r   )r   r9   r  rx   r   r  r   Útest_fp32_gh12991  s    r  )r   )r   )r   )7Ú	itertoolsr   Únumpyr   Znumpy.linalgr   Znumpy.testingr   r   r   r   Zpytestr   rƒ   Zscipy.sparser	   r
   Zscipy.sparse.linalgr   Zscipy.optimizer   r   Z!scipy.optimize._lsq.least_squaresr   Zscipy.optimize._lsq.commonr   r   r   r   r!   r#   r%   r(   r)   r+   r,   r.   r/   r:   r;   r\   rp   ÚlistÚkeysrð   rq   rÀ   rÓ   rí   r   r  r  ry   r  r  r   r   r   r   Ú<module>   sJ   


	3 Tie 	"