U
    »mœd5B  ã                   @   s8  d Z ddlmZ ddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlZddlmZ ejejejejejejejd	œZejejejejd
œZdd„ Zdddddge_i e_i e_i e_dd„ Zddddddge_ejejdœe_i e_i e_dd„ Zddddddge_i e_i e_i e_dd„ Z dddge _i e _i e _i e _dd„ Z!ddge!_ejejejdœe!_dhe!_dd d!dd"he!_d#d$„ Z"d%dddge"_ejejejd&œe"_d!dhe"_dhe"_d'd(„ Z#d)d*ge#_ejejejd&œe#_i e#_i e#_G d+d,„ d,ƒZ$G d-d.„ d.ƒZ%G d/d0„ d0ƒZ&G d1d2„ d2ƒZ'G d3d4„ d4ƒZ(dS )5zA Unit tests for nonlinear solvers
Author: Ondrej Certik
May 2007
é    )Úassert_N)Ú_nonlinÚroot)ÚdiagÚdot)Úinvé   )Úpressure_network)ÚandersonÚdiagbroydenÚlinearmixingÚexcitingmixingÚbroyden1Úbroyden2Úkrylov)r
   r   r   r   c                 C   sF   t  | ¡j} tdddddgƒ}d}| |  |t| j|  ƒ |   }|S )Né   é   g      ø?r   ç      à?ç{®Gáz„?)ÚnpZasarrayÚTr   Úfloat)ÚxÚdÚcÚf© r   úY/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/optimize/tests/test_nonlin.pyÚF   s
     r   c                 C   s   | S ©Nr   ©r   r   r   r   ÚF2)   s    r!   r   r   é   é   é   )r   r   c                 C   s   | S r   r   r    r   r   r   ÚF2_lucky4   s    r%   c                 C   s>   t  dddgdddgdddgg¡}t  dddg¡}||  | S )Néþÿÿÿr   g        r   r   g      @)r   Úarray)r   ÚAÚbr   r   r   ÚF3>   s    "r*   c                 C   sH   d}|| d  | d  d t  | d  ¡t  | d  ¡ dd|   gS )Ng     ˆÃ@r   r   )r   Úexp)r   r(   r   r   r   Ú	F4_powellJ   s    r,   éÿÿÿÿr&   )r   r   r   ÚminresÚgmresÚbicgstabÚcgsÚtfqmrc              	   C   s   t | dt ddddg¡ƒS )Nr"   r   )r	   r   r'   r    r   r   r   ÚF5Z   s    r3   g       @)r   r   r   c              	   C   sd   | \}}t  ddgddgg¡}t  |d |d d  d t  |t  |¡ d	 ¡g¡}t j ||¡ S )
Ng /Ý$Àgffffff-@g+åÌ,Ýê?gr•þ�D0ã?r   r#   é   é   r   )r   r'   Úsinr+   ÚlinalgÚsolve)r   Úx1Zx2ZJ0Úvr   r   r   ÚF6i   s    
ÿÿr;   g      à¿gffffffö?c                	   @   sf   e Zd ZdZddd„Zddd„Zejjdd„ ƒZ	d	d
„ Z
ej dddddddg¡dd„ ƒZdd„ ZdS )Ú
TestNonlinzÈ
    Check the Broyden methods for a few test problems.

    broyden1, broyden2, and newton_krylov must succeed for
    all functions. Some of the others don't -- tests in KNOWN_BAD are skipped.

    r   c              
   C   s†   |t d krTdD ]B}||jkr q|||j|d |ddd�}tt ||ƒ¡ ¡ |k ƒ q|||j|ddd�}tt ||ƒ¡ ¡ |k ƒ d S )Nr   ©r/   r0   r1   r.   r2   éÈ   r   )ÚmethodÚline_searchÚf_tolÚmaxiterÚverbose)rA   rB   rC   )ÚSOLVERSÚJAC_KSP_BADÚxinr   r   ÚabsoluteÚmax)Úselfr   ÚfuncrA   r?   r   r   r   r   Ú_check_nonlin_funcˆ   s    
  ÿzTestNonlin._check_nonlin_funcc              
   C   sŒ   |dkrVdD ]H}||j krqt||j||ddd|idœd�}tt |j¡ ¡ |k ƒ qt||j||dddœd�}tt |j¡ ¡ |k ƒ d S )	Nr   r=   r>   r   r?   )ÚftolrB   ÚdispÚjac_options©r?   Úoptions)rL   rB   rM   )ÚROOT_JAC_KSP_BADr   rF   r   r   rG   ÚfunrH   )rI   r   r?   rA   Z
jac_methodÚresr   r   r   Ú_check_root–   s    

þÿ

ÿzTestNonlin._check_rootc                 O   s   d S r   r   )rI   ÚaÚkwr   r   r   Ú_check_func_fail§   s    zTestNonlin._check_func_failc                 C   s^   t ttttttfD ]F}t ¡ D ]8}||j	 ¡ krJ|t
 ¡ kr|  ||¡ q|  ||¡ qqd S r   )r   r!   r%   r*   r,   r3   r;   rD   ÚvaluesÚ	KNOWN_BADÚ	MUST_WORKrW   rK   )rI   r   rJ   r   r   r   Útest_problem_nonlin«   s    zTestNonlin.test_problem_nonlinr?   Zlgmresr/   r0   r1   r.   r2   c              	      s:   dˆ _ ‡ fdd„}tjttj|ddd|d� tˆ j ƒ d S )NFc                    s   dˆ _ t | ¡ ¡ S )NT)Ú_tol_norm_usedr   rG   rH   r    ©rI   r   r   Úlocal_norm_funcº   s    z8TestNonlin.test_tol_norm_called.<locals>.local_norm_funcr   r>   r   )r?   rA   rB   rC   Ztol_norm)r\   ÚnonlinÚnewton_krylovr   rF   r   )rI   r?   r^   r   r]   r   Útest_tol_norm_called´   s     þzTestNonlin.test_tol_norm_calledc                 C   sR   t ttttttfD ]:}tD ]0}||jkr>|t	kr|  
||¡ q|  ||¡ qqd S r   )r   r!   r%   r*   r,   r3   r;   rD   rY   rZ   rW   rT   )rI   r   Úmethr   r   r   Útest_problem_rootÃ   s    
zTestNonlin.test_problem_rootN)r   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rK   rT   ÚpytestÚmarkZxfailrW   r[   Zparametrizera   rc   r   r   r   r   r<      s   


	 ÿ
r<   c                   @   sô   e Zd ZdZe dddddge¡e dddddge¡e dddddge¡e dddddge¡e dddddge¡e dddddge¡e ddd	ddge¡e ddd	ddge¡gZd
d„ eD ƒZddd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )Ú
TestSecantzDCheck that some Jacobian approximations satisfy the secant conditionr   r   r   r"   r#   é	   r   r4   c                 C   s   g | ]}|d  d ‘qS )r   r   r   )Ú.0r   r   r   r   Ú
<listcomp>Ø   s     zTestSecant.<listcomp>c              	   K   s2  |f |Ž}|  | jd | jd d¡ tt| jdd… | jdd… ƒƒD ]æ\}\}}| ||¡ tt||d ƒƒD ]Z}| j|| d  | j||   }	| j|| d  | j||   }
tt	 
|	| |
¡¡ƒ qp||krF| j|| d  | j||   }	| j|| d  | j||   }
tt	 
|	| |
¡¡ ƒ qFdS )z|
        Check that the given Jacobian approximation satisfies secant
        conditions for last `npoints` points.
        r   Nr   )ÚsetupÚxsÚfsÚ	enumerateÚzipÚupdateÚrangeÚminr   r   Úallcloser8   )rI   Újac_clsÚnpointsrV   ÚjacÚjr   r   ÚkÚdxÚdfr   r   r   Ú_check_secantÚ   s    
.    zTestSecant._check_secantc                 C   s   |   tj¡ d S r   )r~   r_   ÚBroydenFirstr]   r   r   r   Útest_broyden1ï   s    zTestSecant.test_broyden1c                 C   s   |   tj¡ d S r   )r~   r_   ÚBroydenSecondr]   r   r   r   Útest_broyden2ò   s    zTestSecant.test_broyden2c                 C   sâ   t jdd�}| | jd | jd d ¡ t d¡d }tt| jdd … | jdd … ƒƒD ]†\}\}}|| j|  }|| j|  }||t	||ƒ d d …d f |d d d …f  t	||ƒ 7 }| 
||¡ ttj| ¡ |ddd	�ƒ qVd S )
Nçš™™™™™¹?©Úalphar   r#   g      $Àr   ç»½×Ùß|Û=ç‚vIhÂ%<=©ZrtolÚatol)r_   r   rn   ro   rp   r   Úidentityrq   rr   r   rs   r   rv   Útodense)rI   ry   ÚBÚlast_jr   r   r}   r|   r   r   r   Útest_broyden1_updateõ   s    .8zTestSecant.test_broyden1_updatec                 C   sæ   t jdd�}| | jd | jd d ¡ t d¡d }tt| jdd … | jdd … ƒƒD ]Š\}\}}|| j|  }|| j|  }||t	||ƒ d d …d f |d d d …f  t	||ƒ 7 }| 
||¡ ttj| ¡ t|ƒddd	�ƒ qVd S )
Nrƒ   r„   r   r#   gš™™™™™¹¿r   r†   r‡   rˆ   )r_   r�   rn   ro   rp   r   rŠ   rq   rr   r   rs   r   rv   r‹   r   )rI   ry   ÚHr�   r   r   r}   r|   r   r   r   Útest_broyden2_update  s    .8zTestSecant.test_broyden2_updatec                 C   s   | j tjdddd� d S )Nr   r   )ÚMZw0rx   )r~   r_   ÚAndersonr]   r   r   r   Útest_anderson  s    zTestSecant.test_andersonN)r   )rd   re   rf   rg   r   r'   r   ro   rp   r~   r€   r‚   rŽ   r�   r“   r   r   r   r   rj   Í   s"   ù
rj   c                   @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú
TestLinearz]Solve a linear equation;
    some methods find the exact solution in a finite number of stepsFc              	      s¢   t j d¡ t j ||¡‰ |r4ˆ dt j ||¡  ‰ t j |¡‰|rXˆdt j |¡  ‰‡ ‡fdd„}tj|t  |¡||dd dd�}tt jt	ˆ |ƒˆdd�ƒ d S )	Né{   ù              ð?c                    s   t ˆ | ƒˆ S r   )r   r    ©r(   r)   r   r   rJ   '  s    zTestLinear._check.<locals>.funcç�íµ ÷Æ°>r   )rB   rA   r@   rC   )r‰   )
r   ÚrandomÚseedZrandnr_   Znonlin_solveZzerosr   rv   r   )rI   ry   ÚNrB   ÚcomplexrV   rJ   Zsolr   r—   r   Ú_check  s      ÿzTestLinear._checkc                 C   s4   |   tjdd�ddd¡ |   tjdd�ddd¡ d S ©Nç      ð?r„   é   é)   FT)r�   r_   r   r]   r   r   r   r€   .  s    zTestLinear.test_broyden1c                 C   s4   |   tjdd�ddd¡ |   tjdd�ddd¡ d S rž   )r�   r_   r�   r]   r   r   r   r‚   3  s    zTestLinear.test_broyden2c                 C   s8   |   tjddd�ddd¡ |   tjddd�ddd¡ d S )Né2   rŸ   )r‘   r…   r    é   FT)r�   r_   r’   r]   r   r   r   r“   8  s    zTestLinear.test_andersonc                 C   s0   | j tjddddd� | j tjddddd� d S )Nr    r   Fé
   )Zinner_mT)r�   r_   ÚKrylovJacobianr]   r   r   r   Útest_krylov=  s    zTestLinear.test_krylovN)F)	rd   re   rf   rg   r�   r€   r‚   r“   r¦   r   r   r   r   r”     s   
r”   c                   @   sZ   e Zd ZdZ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S )ÚTestJacobianDotSolvezFCheck that solve/dot methods in Jacobian approximations are consistentc                 C   s   |d d t  | j|¡ S )Nr   r   )r   r   r(   ©rI   r   r   r   r   Ú_funcF  s    zTestJacobianDotSolve._funcFr˜   c                    sð  t j d¡ d}‡ fdd„}‡fdd„}|||ƒ| _t j |¡}|f |Ž}	|	 ||  |¡| j¡ td| ƒD �]|}
||ƒ}t|	dƒ�rTt  	|	¡}t|	d	ƒr¾|	 
|¡}t j 
||¡}|||d
ƒ t|	dƒrò|	 |¡}t j 
|j ¡ |¡}|||dƒ t|	dƒ�r |	 |¡}t  ||¡}|||dƒ t|	dƒ�rT|	 |¡}t  |j ¡ |¡}|||dƒ t|	dƒ�r’t|	d	ƒ�r’|	 |¡}|	 
|	 |¡¡}|||dƒ t|	dƒ�rÐt|	dƒ�rÐ|	 |¡}|	 |	 |¡¡}|||dƒ ||ƒ}|	 ||  |¡¡ qld S )Nr•   r4   c                     s(   t jj| Ž }ˆ r$|dt jj| Ž   }|S )Nr–   )r   r™   Úrand)rU   Úq©rœ   r   r   rª   N  s    z-TestJacobianDotSolve._check_dot.<locals>.randc                    s@   t | | ƒ ¡ }ˆ t |ƒ ¡ ˆ   }||kr<td||f ƒ‚d S )Nz
%s: err %g)ÚabsrH   ÚAssertionError)rU   r)   Úmsgr   r   )Útolr   r   Úassert_closeT  s    z5TestJacobianDotSolve._check_dot.<locals>.assert_closer   Z	__array__r8   zsolve vs arrayÚrsolvezrsolve vs arrayÚmatveczdot vs arrayÚrmatveczrmatvec vs arrayzdot vs solvezrmatvec vs rsolve)r   r™   rš   r(   rª   rn   r©   rt   Úhasattrr'   r8   r7   r²   r   Zconjr³   r   r´   rs   )rI   rw   rœ   r°   rV   r›   rª   r±   Zx0ry   r{   r:   ZJdZGvZGv2ZJvZJv2r   r   ©rœ   r°   r   Ú
_check_dotI  sL    









zTestJacobianDotSolve._check_dotc                 C   s$   | j tjdd� | j tjdd� d S ©NFr¬   T)r·   r_   r   r]   r   r   r   r€   …  s    z"TestJacobianDotSolve.test_broyden1c                 C   s$   | j tjdd� | j tjdd� d S r¸   )r·   r_   r�   r]   r   r   r   r‚   ‰  s    z"TestJacobianDotSolve.test_broyden2c                 C   s$   | j tjdd� | j tjdd� d S r¸   )r·   r_   r’   r]   r   r   r   r“   �  s    z"TestJacobianDotSolve.test_andersonc                 C   s$   | j tjdd� | j tjdd� d S r¸   )r·   r_   ZDiagBroydenr]   r   r   r   Útest_diagbroyden‘  s    z%TestJacobianDotSolve.test_diagbroydenc                 C   s$   | j tjdd� | j tjdd� d S r¸   )r·   r_   ZLinearMixingr]   r   r   r   Útest_linearmixing•  s    z&TestJacobianDotSolve.test_linearmixingc                 C   s$   | j tjdd� | j tjdd� d S r¸   )r·   r_   ZExcitingMixingr]   r   r   r   Útest_excitingmixing™  s    z(TestJacobianDotSolve.test_excitingmixingc                 C   s(   | j tjddd� | j tjddd� d S )NFgü©ñÒMbP?r¶   T)r·   r_   r¥   r]   r   r   r   r¦   �  s    z TestJacobianDotSolve.test_krylovN)Fr˜   )rd   re   rf   rg   r©   r·   r€   r‚   r“   r¹   rº   r»   r¦   r   r   r   r   r§   C  s   
<r§   c                   @   sp   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d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestNonlinOldTestsz½ Test case for a simple constrained entropy maximization problem
    (the machine translation example of Berger et al in
    Computational Linguistics, vol 22, num 1, pp 39--72, 1996.)
    c                 C   s@   t jttjddd�}tt  |¡dk ƒ tt  t|ƒ¡dk ƒ d S ©Né   r   ©Úiterr…   ç•Ö&è.>)r_   r   r   rF   r   Únormr¨   r   r   r   r€   ¨  s    z TestNonlinOldTests.test_broyden1c                 C   s@   t jttjddd�}tt  |¡dk ƒ tt  t|ƒ¡dk ƒ d S r½   )r_   r   r   rF   r   rÂ   r¨   r   r   r   r‚   ­  s    z TestNonlinOldTests.test_broyden2c                 C   s,   t jttjdddd�}tt  |¡dk ƒ d S )Nr¾   ç¸…ëQ¸ž?r#   )rÀ   r…   r‘   ç…ëQ¸Õ?)r_   r
   r   rF   r   rÂ   r¨   r   r   r   r“   ²  s    z TestNonlinOldTests.test_andersonc                 C   s@   t jttjddd�}tt  |¡dk ƒ tt  t|ƒ¡dk ƒ d S )Né<   r   r¿   çH¯¼šò×z>)r_   r   r   rF   r   rÂ   r¨   r   r   r   rº   ¶  s    z$TestNonlinOldTests.test_linearmixingc                 C   s@   t jttjddd�}tt  |¡dk ƒ tt  t|ƒ¡dk ƒ d S )Nr    r   r¿   çñhãˆµøä>)r_   r   r   rF   r   rÂ   r¨   r   r   r   Útest_exciting»  s    z TestNonlinOldTests.test_excitingc                 C   s@   t jttjddd�}tt  |¡dk ƒ tt  t|ƒ¡dk ƒ d S )Né   r   r¿   ç:Œ0âŽyE>)r_   r   r   rF   r   rÂ   r¨   r   r   r   r¹   À  s    z#TestNonlinOldTests.test_diagbroydenc                 C   sH   t ttjddddidœd�}tt |j¡dk ƒ tt |j¡dk ƒ d S )Nr   r¾   r…   r   ©ÚnitrN   rO   rÁ   ©r   r   rF   r   r_   rÂ   r   rR   ©rI   rS   r   r   r   Útest_root_broyden1Å  s
    
ÿz%TestNonlinOldTests.test_root_broyden1c                 C   sH   t ttjddddidœd�}tt |j¡dk ƒ tt |j¡dk ƒ d S )Nr   r¾   r…   r   rË   rO   rÁ   rÍ   rÎ   r   r   r   Útest_root_broyden2Ë  s
    
ÿz%TestNonlinOldTests.test_root_broyden2c                 C   s6   t ttjdddddœdœd�}tt |j¡dk ƒ d S )	Nr
   r¾   rÃ   r#   )r…   r‘   rË   rO   rÄ   )r   r   rF   r   r_   rÂ   r   rÎ   r   r   r   Útest_root_andersonÑ  s    
ÿÿz%TestNonlinOldTests.test_root_andersonc                 C   sH   t ttjddddidœd�}tt |j¡dk ƒ tt |j¡dk ƒ d S )Nr   rÅ   r…   r   rË   rO   rÆ   rÍ   rÎ   r   r   r   Útest_root_linearmixing×  s    
ÿÿz)TestNonlinOldTests.test_root_linearmixingc                 C   sH   t ttjddddidœd�}tt |j¡dk ƒ tt |j¡dk ƒ d S )Nr   r    r…   r   rË   rO   rÇ   rÍ   rÎ   r   r   r   Útest_root_excitingmixingÞ  s    
ÿÿz+TestNonlinOldTests.test_root_excitingmixingc                 C   sH   t ttjddddidœd�}tt |j¡dk ƒ tt |j¡dk ƒ d S )Nr   rÉ   r…   r   rË   rO   rÊ   rÍ   rÎ   r   r   r   Útest_root_diagbroydenå  s    
ÿÿz(TestNonlinOldTests.test_root_diagbroydenN)rd   re   rf   rg   r€   r‚   r“   rº   rÈ   r¹   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   r   r   r   r   r¼   ¢  s   r¼   ))rg   Znumpy.testingr   rh   Zscipy.optimizer   r_   r   Únumpyr   r   Znumpy.linalgr   r   Ztest_minpackr	   r
   r   r   r   r   r   r`   rD   rZ   r   rF   rY   rE   rQ   r!   r%   r*   r,   r3   r;   r<   rj   r”   r§   r¼   r   r   r   r   Ú<module>   sŠ     ý ÿÿ
þþ
	
þNL*_