a
    ‡ù»jSJ  ã                   @   s*  d Z ddlmZ ddl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
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g d¢e_i e_i e_i e_ dd„ Z!g d¢e!_ejejdœe!_i e!_i e!_ dd„ Z"g d¢e"_i e"_i e"_i e"_ dd„ Z#g d¢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$_h d£e$_ d d!„ Z%g d"¢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-d.„ d.ƒZ)G d/d0„ d0ƒZ*G d1d2„ d2ƒZ+dS )3zA Unit tests for nonlinear solvers
Author: Ondrej Certik
May 2007
é    )Úassert_N)Ú_nonlinÚroot)Ú	csr_array)ÚdiagÚdot)Úinvé   )Úpressure_network)ÚandersonÚdiagbroydenÚlinearmixingÚexcitingmixingÚbroyden1Úbroyden2Úkrylov)r   r   r   r   c                 C   s@   t  | ¡j} tg d¢ƒ}d}| |  |t| j|  ƒ |   }|S )N)é   é   g      ø?r	   ç      à?ç{®Gáz„?)ÚnpZasarrayÚTr   Úfloat)ÚxÚdÚcÚf© r   úFE:\soccer\ml_env\Lib\site-packages\scipy/optimize/tests/test_nonlin.pyÚF    s
     r   )r	   r	   r	   r	   r	   c                 C   s   | S ©Nr   ©r   r   r   r   ÚF2.   s    r"   )r	   r   r   é   é   é   )r   r   c                 C   s   | S r    r   r!   r   r   r   ÚF2_lucky9   s    r&   )r   r   r   r   r   r   c                 C   s6   t  g d¢g d¢g d¢g¡}t  g d¢¡}||  | S )N)éþÿÿÿr	   ç        )r	   r'   r	   )r   r	   r'   )r	   r   ç      @)r   Úarray)r   ÚAÚbr   r   r   ÚF3C   s    r-   )r	   r   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_powellO   s    r/   éÿÿÿÿr'   )r   r   r   Úminres>   ÚcgsÚtfqmrr1   ÚbicgstabÚgmresc                 C   s   t | dt g d¢¡ƒS )Nr#   )r   r   r   r   )r
   r   r*   r!   r   r   r   ÚF5_   s    r6   )ç       @r   r   r   )r   r   r   r2   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   ÚF6n   s    
ÿÿr?   g      à¿gffffffö?c                   @   sŠ   e Zd ZdZddd„Zddd„Zejjdd„ ƒZ	ej 
d	¡d
d„ ƒZej 
d	¡ej dg d¢¡dd„ ƒƒZej 
d	¡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v r q|||j|d |ddd�}tt ||ƒ¡ ¡ |k ƒ q|||j|ddd�}tt ||ƒ¡ ¡ |k ƒ d S )Nr   ©r5   r4   r2   r1   r3   éÈ   r   )ÚmethodÚline_searchÚf_tolÚmaxiterÚverbose)rE   rF   rG   )ÚSOLVERSÚJAC_KSP_BADÚxinr   r   ÚabsoluteÚmax)Úselfr   ÚfuncrE   rC   r   r   r   r   Ú_check_nonlin_func�   s    
ÿzTestNonlin._check_nonlin_funcc              
   C   sŒ   |dkrVdD ]H}||j v 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   rA   rB   r   rC   )ÚftolrF   ÚdispÚjac_options©rC   Úoptions)rP   rF   rQ   )ÚROOT_JAC_KSP_BADr   rJ   r   r   rK   ÚfunrL   )rM   r   rC   rE   Z
jac_methodÚresr   r   r   Ú_check_root›   s    

þÿ

ÿzTestNonlin._check_rootc                 O   s   d S r    r   )rM   ÚaÚkwr   r   r   Ú_check_func_fail¬   s    zTestNonlin._check_func_failzignore::DeprecationWarningc                 C   s^   t ttttttfD ]F}t ¡ D ]8}||j	 ¡ v rJ|t
 ¡ v r|  ||¡ q|  ||¡ qqd S r    )r   r"   r&   r-   r/   r6   r?   rH   ÚvaluesÚ	KNOWN_BADÚ	MUST_WORKr[   rO   )rM   r   rN   r   r   r   Útest_problem_nonlin°   s    zTestNonlin.test_problem_nonlinrC   )Zlgmresr5   r4   r2   r1   r3   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   rK   rL   r!   ©rM   r   r   Úlocal_norm_funcÁ   s    z8TestNonlin.test_tol_norm_called.<locals>.local_norm_funcr   rB   r   )rC   rE   rF   rG   Ztol_norm)r`   ÚnonlinÚnewton_krylovr   rJ   r   )rM   rC   rb   r   ra   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v r>|t	v r|  
||¡ q|  ||¡ qqd S r    )r   r"   r&   r-   r/   r6   r?   rH   r]   r^   r[   rX   )rM   r   Úmethr   r   r   Útest_problem_rootÊ   s    
zTestNonlin.test_problem_rootc                 C   sL   dd„ }t  tjj¡�" tj|dgdd� W d   ƒ n1 s>0    Y  d S )Nc                 S   s   d|  S )Ng     @�@r   r!   r   r   r   Úwont_convergeÕ   s    z5TestNonlin.test_no_convergence.<locals>.wont_converger   r	   )rJ   rF   )ÚpytestZraisesÚscipyÚoptimizeZNoConvergencerc   rd   )rM   rh   r   r   r   Útest_no_convergenceÔ   s    zTestNonlin.test_no_convergenceN)r   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rO   rX   ri   ÚmarkZxfailr[   Úfilterwarningsr_   Zparametrizere   rg   rl   r   r   r   r   r@   „   s   




	


	r@   c                   @   s´   e Zd ZdZe g d¢¡e g d¢¡e g d¢¡e g d¢¡e g d¢¡e g d¢¡e g d¢¡e g d	¢¡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 condition)ç      ð?r7   r)   ç      @ç      @)r7   r)   ru   rv   rt   )r)   ru   rv   rt   r7   )ru   rv   rt   r7   r)   )ç      "@rt   rw   rt   r)   )r(   rt   rw   rt   r)   )rv   rv   ç      @rt   rt   )rt   r7   rx   rv   rt   c                 C   s   g | ]}|d  d ‘qS )r   r	   r   )Ú.0r   r   r   r   Ú
<listcomp>ç   ó    zTestSecant.<listcomp>r	   c              	   K   s6  |f i |¤Ž}|  | 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	 
|	| |
¡¡ƒ qt||krJ| j|| d  | j||   }	| j|| d  | j||   }
tt	 
|	| |
¡¡ ƒ qJd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   Úallcloser<   )rM   Újac_clsÚnpointsrZ   ÚjacÚjr   r   ÚkÚdxÚdfr   r   r   Ú_check_secanté   s    .    zTestSecant._check_secantc                 C   s   |   tj¡ d S r    )rŒ   rc   ÚBroydenFirstra   r   r   r   Útest_broyden1þ   s    zTestSecant.test_broyden1c                 C   s   |   tj¡ d S r    )rŒ   rc   ÚBroydenSecondra   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)rc   r�   r|   r}   r~   r   Úidentityr   r€   r   r�   r   r„   Útodense)rM   r‡   Ú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–   )rc   r�   r|   r}   r~   r   r˜   r   r€   r   r�   r   r„   r™   r   )rM   r‡   Ú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w0r†   )rŒ   rc   ÚAndersonra   r   r   r   Útest_anderson   s    zTestSecant.test_andersonN)r	   )rm   rn   ro   rp   r   r*   r}   r~   rŒ   rŽ   r�   rœ   rž   r¡   r   r   r   r   rs   Ü   s"   ù
rs   c                   @   sR   e Zd Z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 )Ú
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   rN   6  s    zTestLinear._check.<locals>.funcç�íµ ÷Æ°>r   ©rF   rE   rD   rG   ©r—   )
r   ÚrandomÚseedZrandnrc   Únonlin_solveÚzerosr   r„   r   )rM   r‡   ÚNrF   ÚcomplexrZ   rN   Ú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 ©Nrt   r’   é   é)   FT)r±   rc   r�   ra   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±   rc   r�   ra   r   r   r   r�   B  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   rt   )rŸ   r“   r³   é   FT)r±   rc   r    ra   r   r   r   r¡   G  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±   rc   ÚKrylovJacobianra   r   r   r   Útest_krylovL  s    zTestLinear.test_krylovc              	      s’   ‡ ‡fdd„}‡ fdd„}t j|t ˆjd ¡|ddd dd�}tjjˆ | ˆdd	� t j|t ˆjd ¡ˆ ddd dd�}tjjˆ | ˆdd	� d S )
Nc                    s   ˆ   | ¡ˆ S r    r¥   r!   r¦   r   r   rN   R  s    z'TestLinear._check_autojac.<locals>.funcc                    s   ˆ S r    r   )r>   )r+   r   r   r‡   U  s    z&TestLinear._check_autojac.<locals>.jacr   r   r§   r¨   r©   )rc   r¬   r   r­   ÚshapeZtestingZassert_allclose)rM   r+   r,   rN   r‡   r°   r   r¦   r   Ú_check_autojacQ  s    ÿÿzTestLinear._check_autojacc                 C   sF   t ddgddggƒ}t ddg¡}|  ||¡ |  d| d| ¡ d S ©Nr	   r   r0   y      ð?       @y       @       @)r   r   r*   r»   ©rM   r+   r,   r   r   r   Útest_jac_sparse`  s    zTestLinear.test_jac_sparsec                 C   sH   t  ddgddgg¡}t  ddg¡}|  ||¡ |  d| d| ¡ d S r¼   )r   r*   r»   r½   r   r   r   Útest_jac_ndarrayf  s    zTestLinear.test_jac_ndarrayN)F)rm   rn   ro   rp   r±   rŽ   r�   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 )ÚTestJacobianDotSolvezP
    Check that solve/dot methods in Jacobian approximations are consistent
    c                 C   s   |d d t  | j|¡ S )Nr   r	   )r   r   r+   ©rM   r   r   r   r   Ú_funcr  s    zTestJacobianDotSolve._funcFr§   c                    sô  t j d¡ d}‡ fdd„}‡fdd„}|||ƒ| _t j |¡}|f i |¤Ž}	|	 ||  |¡| j¡ td| ƒD �]|}
||ƒ}t|	dƒ�rXt  	|	¡}t|	d	ƒrÂ|	 
|¡}t j 
||¡}|||d
ƒ t|	dƒrö|	 |¡}t j 
|j ¡ |¡}|||dƒ t|	dƒ�r$|	 |¡}t  ||¡}|||dƒ t|	dƒ�rX|	 |¡}t  |j ¡ |¡}|||dƒ t|	dƒ�r–t|	d	ƒ�r–|	 |¡}|	 
|	 |¡¡}|||dƒ t|	dƒ�rÔt|	dƒ�rÔ|	 |¡}|	 |	 |¡¡}|||dƒ ||ƒ}|	 ||  |¡¡ qpd S )Nr£   r8   c                     s(   t jj| Ž }ˆ r$|dt jj| Ž   }|S )Nr¤   )r   rª   Úrand)rY   Úq©r¯   r   r   rÃ   z  s    z-TestJacobianDotSolve._check_dot.<locals>.randc                    sD   t | | ƒ ¡ }ˆ t |ƒ ¡ ˆ   }||kr@t|› d|d›�ƒ‚d S )Nz: err Úg)ÚabsrL   ÚAssertionError)rY   r,   Úmsgr   r   )Útolr   r   Úassert_close€  s    z5TestJacobianDotSolve._check_dot.<locals>.assert_closer   Z	__array__r<   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Ã   r|   rÂ   r‚   Úhasattrr*   r<   r;   rÌ   r   ZconjrÍ   r   rÎ   r�   )rM   r…   r¯   rÊ   rZ   r®   rÃ   rË   Zx0r‡   r‰   r>   ZJdZGvZGv2ZJvZJv2r   r   ©r¯   rÊ   r   Ú
_check_dotu  sL    








zTestJacobianDotSolve._check_dotc                 C   s$   | j tjdd� | j tjdd� d S ©NFrÅ   T)rÑ   rc   r�   ra   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Ñ   rc   r�   ra   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Ñ   rc   r    ra   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Ñ   rc   ZDiagBroydenra   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Ñ   rc   ZLinearMixingra   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Ñ   rc   ZExcitingMixingra   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Ñ   rc   r¸   ra   r   r   r   r¹   É  s    z TestJacobianDotSolve.test_krylovN)Fr§   )rm   rn   ro   rp   rÂ   rÑ   rŽ   r�   r¡   rÓ   rÔ   rÕ   r¹   r   r   r   r   rÀ   m  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“   ç•Ö&è.>)rc   r   r   rJ   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×   )rc   r   r   rJ   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¸Õ?)rc   r   r   rJ   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>)rc   r   r   rJ   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ãˆµøä>)rc   r   r   rJ   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>)rc   r   r   rJ   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	   ©ÚnitrR   rS   rÛ   ©r   r   rJ   r   rc   rÜ   r   rV   ©rM   rW   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å   rS   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å   rS   rÞ   )r   r   rJ   r   rc   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å   rS   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å   rS   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å   rS   rä   rç   rè   r   r   r   Útest_root_diagbroyden  s    
ÿÿz(TestNonlinOldTests.test_root_diagbroydenN)rm   rn   ro   rp   rŽ   r�   r¡   rÔ   râ   rÓ   ré   rê   rë   rì   rí   rî   r   r   r   r   rÖ   Î  s   rÖ   ),rp   Znumpy.testingr   ri   Zscipy.optimizer   rc   r   Zscipy.sparser   Únumpyr   r   Znumpy.linalgr   r   rj   Ztest_minpackr
   r   r   r   r   r   r   rd   rH   r^   r   rJ   r]   rI   rU   r"   r&   r-   r/   r6   r?   r@   rs   r¢   rÀ   rÖ   r   r   r   r   Ú<module>   sŽ   úÿ

ÿ


þ

þ
	
þXLEa