o
    Ö­jH  ã                   @   s6  d Z ddlmZ ddl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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 d0d1„ d1ƒZ,G d2d3„ d3ƒZ-dS )4zA Unit tests for nonlinear solvers
Author: Ondrej Certik
May 2007
é    )Úassert_N)Úpartial)Ú_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„?)ÚnpÚasarrayÚTr   Úfloat)ÚxÚdÚcÚf© r   ú]/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/optimize/tests/test_nonlin.pyÚF!   s
    r!   )r
   r
   r
   r
   r
   c                 C   ó   | S ©Nr   ©r   r   r   r    ÚF2/   ó   r%   )r
   r   r   é   é   é   )r   r   c                 C   r"   r#   r   r$   r   r   r    ÚF2_lucky:   r&   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    ÚF3D   s   r1   )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_powellP   s   Dr3   éÿÿÿÿr+   )r   r   r   Úminres>   ÚcgsÚgmresÚtfqmrr5   Úbicgstabc                 C   s   t | dt g d¢¡ƒS )Nr'   )r   r   r   r   )r   r   r.   r$   r   r   r    ÚF5`   s   r:   )ç       @r   r   r   )r   r   r   r6   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.   Úsinr2   ÚlinalgÚsolve)r   Úx1Úx2ÚJ0Úvr   r   r    ÚF6o   s   
ÿÿrE   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r*dD ]!}||jv rq|||j|d |ddd�}tt ||ƒ¡ ¡ |k ƒ q|||j|ddd�}tt ||ƒ¡ ¡ |k ƒ d S )Nr   ©r7   r9   r6   r5   r8   éÈ   r   )ÚmethodÚline_searchÚf_tolÚmaxiterÚverbose)rK   rL   rM   )ÚSOLVERSÚJAC_KSP_BADÚxinr   r   ÚabsoluteÚmax)Úselfr   ÚfuncrK   rI   r   r   r   r    Ú_check_nonlin_funcŽ   s   
ÿzTestNonlin._check_nonlin_funcc              
   C   sŒ   |dkr+dD ]$}||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   rG   rH   r   rI   )ÚftolrL   ÚdispÚjac_options©rI   Úoptions)rV   rL   rW   )ÚROOT_JAC_KSP_BADr   rP   r   r   rQ   ÚfunrR   )rS   r   rI   rK   Ú
jac_methodÚresr   r   r    Ú_check_rootœ   s   

þÿ

ÿzTestNonlin._check_rootc                 O   s   d S r#   r   )rS   Ú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 ]#}t ¡ D ]}||j	 ¡ v r%|t
 ¡ v r$|  ||¡ q|  ||¡ qq	d S r#   )r!   r%   r*   r1   r3   r:   rE   rN   ÚvaluesÚ	KNOWN_BADÚ	MUST_WORKrb   rU   )rS   r   rT   r   r   r    Útest_problem_nonlin±   s   ûÿzTestNonlin.test_problem_nonlinrI   )Úlgmresr7   r9   r6   r5   r8   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   rQ   rR   r$   ©rS   r   r    Úlocal_norm_funcÂ   s   z8TestNonlin.test_tol_norm_called.<locals>.local_norm_funcr   rH   r   )rI   rK   rL   rM   Útol_norm)rh   ÚnonlinÚnewton_krylovr!   rP   r   )rS   rI   rj   r   ri   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 ]}||jv r|t	v r|  
||¡ q|  ||¡ qq	d S r#   )r!   r%   r*   r1   r3   r:   rE   rN   rd   re   rb   r_   )rS   r   Úmethr   r   r    Útest_problem_rootË   s   
ûÿzTestNonlin.test_problem_rootc                 C   sN   dd„ }t  tjj¡� tj|dgdd� W d   ƒ d S 1 s w   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
   )rP   rL   )ÚpytestÚraisesÚscipyÚoptimizeÚNoConvergencerl   rm   )rS   rq   r   r   r    Útest_no_convergenceÕ   s   "ÿzTestNonlin.test_no_convergenceN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rU   r_   rr   ÚmarkÚxfailrb   Úfilterwarningsrf   Úparametrizern   rp   rw   r   r   r   r    rF   …   s    





	

	rF   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)ç      ð?r;   r-   ç      @ç      @)r;   r-   r‚   rƒ   r�   )r-   r‚   rƒ   r�   r;   )r‚   rƒ   r�   r;   r-   )ç      "@r�   r„   r�   r-   )r,   r�   r„   r�   r-   )rƒ   rƒ   ç      @r�   r�   )r�   r;   r…   rƒ   r�   c                 C   s   g | ]}|d  d ‘qS )r   r
   r   )Ú.0r   r   r   r    Ú
<listcomp>è   s    zTestSecant.<listcomp>r
   c              	   K   s6  |di |¤Ž}|  | jd | jd d¡ tt| jdd… | jdd… ƒƒD ]s\}\}}| ||¡ tt||d ƒƒD ]-}| j|| d  | j||   }	| j|| d  | j||   }
tt	 
|	| |
¡¡ƒ q:||kr˜| j|| d  | j||   }	| j|| d  | j||   }
tt	 
|	| |
¡¡ ƒ q%dS )z|
        Check that the given Jacobian approximation satisfies secant
        conditions for last `npoints` points.
        r   Nr
   r   )ÚsetupÚxsÚfsÚ	enumerateÚzipÚupdateÚrangeÚminr   r   Úallcloser@   )rS   Újac_clsÚnpointsra   ÚjacÚjr   r   ÚkÚdxÚdfr   r   r    Ú_check_secantê   s   .    €ôzTestSecant._check_secantc                 C   ó   |   tj¡ d S r#   )r˜   rl   ÚBroydenFirstri   r   r   r    Útest_broyden1ÿ   ó   zTestSecant.test_broyden1c                 C   r™   r#   )r˜   rl   ÚBroydenSecondri   r   r   r    Útest_broyden2  rœ   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 ]C\}\}}|| j|  }|| j|  }||t	||ƒ d d …d f |d d d …f  t	||ƒ 7 }| 
||¡ ttj| ¡ |ddd	�ƒ q+d S )
Nçš™™™™™¹?©Úalphar   r(   g      $Àr
   ç»½×Ùß|Û=ç‚vIhÂ%<=©ÚrtolÚatol)rl   rš   rˆ   r‰   rŠ   r   Úidentityr‹   rŒ   r   r�   r   r�   Útodense)rS   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 ]E\}\}}|| j|  }|| j|  }||t	||ƒ d d …d f |d d d …f  t	||ƒ 7 }| 
||¡ ttj| ¡ t|ƒddd	�ƒ q+d S )
NrŸ   r    r   r(   gš™™™™™¹¿r
   r¢   r£   r¤   )rl   r�   rˆ   r‰   rŠ   r   r§   r‹   rŒ   r   r�   r   r�   r¨   r	   )rS   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   )ÚMÚw0r’   )r˜   rl   ÚAndersonri   r   r   r    Útest_anderson!  s   zTestSecant.test_andersonN)r
   )rx   ry   rz   r{   r   r.   r‰   rŠ   r˜   r›   rž   r«   r­   r±   r   r   r   r    r€   Ý   s$    ù
r€   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 ||¡‰ |rˆ dt j ||¡  ‰ t j |¡‰|r,ˆ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/   r0   r   r    rT   7  ó   zTestLinear._check.<locals>.funcç�íµ ÷Æ°>r   ©rL   rK   rJ   rM   ©r¦   )
r   ÚrandomÚseedÚrandnrl   Únonlin_solveÚzerosr   r�   r   )rS   r“   ÚNrL   Úcomplexra   rT   Úsolr   r¶   r    Ú_check-  s   ÿzTestLinear._checkc                 C   ó4   |   tjdd�ddd¡ |   tjdd�ddd¡ d S ©Nr�   r    é   é)   FT)rÃ   rl   rš   ri   r   r   r    r›   >  ó   zTestLinear.test_broyden1c                 C   rÄ   rÅ   )rÃ   rl   r�   ri   r   r   r    rž   C  rÈ   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Ã   rl   r°   ri   r   r   r    r±   H  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é
   )Úinner_mT)rÃ   rl   ÚKrylovJacobianri   r   r   r    Útest_krylovM  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    rT   S  r·   z'TestLinear._check_autojac.<locals>.funcc                    s   ˆ S r#   r   )rD   ©r/   r   r    r“   V  r&   z&TestLinear._check_autojac.<locals>.jacr   r   r¸   r¹   rº   )rl   r¾   r   r¿   ÚshapeÚtestingÚassert_allclose)rS   r/   r0   rT   r“   rÂ   r   r¶   r    Ú_check_autojacR  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   r4   y      ð?       @y       @       @)r   r   r.   rÓ   ©rS   r/   r0   r   r   r    Útest_jac_sparsea  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_ndarrayg  s   zTestLinear.test_jac_ndarrayN)F)rx   ry   rz   r{   rÃ   r›   rž   r±   rÎ   rÓ   rÖ   r×   r   r   r   r    r²   )  s    
r²   c                   @   sd   e Zd Zd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ejjdd„ ƒZdS )ÚTestJacobianDotSolvezP
    Check that solve/dot methods in Jacobian approximations are consistent
    Nc                 C   s   |d d t  ||¡ S )Nr   r
   )r   r   )rS   r   r/   r   r   r    Ú_funcs  s   zTestJacobianDotSolve._funcFr¸   c                    sî  t j d¡‰d}‡ ‡fdd„}‡fdd„}|||ƒ}ˆ |¡}	|di |¤Ž}
|
 |	|  |	|¡t| j|d�¡ td| ƒD ]¸}||ƒ}t|
d	ƒr¬t  	|
¡}t|
d
ƒrc|
 
|¡}t j 
||¡}|||dƒ t|
dƒr}|
 |¡}t j 
|j ¡ |¡}|||dƒ t|
dƒr“|
 |¡}t  ||¡}|||dƒ t|
dƒr¬|
 |¡}t  |j ¡ |¡}|||dƒ t|
dƒrÉt|
d
ƒrÉ|
 |¡}|
 
|
 |¡¡}|||dƒ t|
dƒræt|
dƒræ|
 |¡}|
 |
 |¡¡}|||dƒ ||ƒ}|
 ||  ||¡¡ q<d S )Nr³   r<   c                     s$   ˆj | Ž }ˆ r|dˆj | Ž   }|S )Nr´   )Úrand)r`   Úq)rÁ   Úrngr   r    rÚ   {  s   
z-TestJacobianDotSolve._check_dot.<locals>.randc                    sD   t | | ƒ ¡ }ˆ t |ƒ ¡ ˆ   }||kr t|› d|d›�ƒ‚d S )Nz: err Úg)ÚabsrR   ÚAssertionError)r`   r0   Úmsgr   r   )Útolr   r    Úassert_close�  s
   ÿz5TestJacobianDotSolve._check_dot.<locals>.assert_closerÏ   r   Ú	__array__r@   zsolve vs arrayÚrsolvezrsolve vs arrayÚmatveczdot vs arrayÚrmatveczrmatvec vs arrayzdot vs solvezrmatvec vs rsolver   )r   r»   ÚRandomStaterÚ   rˆ   rÙ   r   rŽ   Úhasattrr.   r@   r?   rä   r   Úconjrå   r   ræ   r�   )rS   r‘   rÁ   rá   ra   rÀ   rÚ   râ   r/   Úx0r“   r•   rD   ÚJdÚGvÚGv2ÚJvÚJv2r   r   )rÁ   rÜ   rá   r    Ú
_check_dotv  sN   

 











ßzTestJacobianDotSolve._check_dotc                 C   ó$   | j tjdd� | j tjdd� d S ©NF)rÁ   T)rð   rl   rš   ri   r   r   r    r›   ²  ó   z"TestJacobianDotSolve.test_broyden1c                 C   rñ   rò   )rð   rl   r�   ri   r   r   r    rž   ¶  ró   z"TestJacobianDotSolve.test_broyden2c                 C   rñ   rò   )rð   rl   r°   ri   r   r   r    r±   º  ró   z"TestJacobianDotSolve.test_andersonc                 C   rñ   rò   )rð   rl   ÚDiagBroydenri   r   r   r    Útest_diagbroyden¾  ró   z%TestJacobianDotSolve.test_diagbroydenc                 C   rñ   rò   )rð   rl   ÚLinearMixingri   r   r   r    Útest_linearmixingÂ  ró   z&TestJacobianDotSolve.test_linearmixingc                 C   rñ   rò   )rð   rl   ÚExcitingMixingri   r   r   r    Útest_excitingmixingÆ  ró   z(TestJacobianDotSolve.test_excitingmixingc                 C   s(   | j tjddd� | j tjddd� d S )NFgü©ñÒMbP?)rÁ   rá   T)rð   rl   rÍ   ri   r   r   r    rÎ   Ê  s   z TestJacobianDotSolve.test_krylovr#   )Fr¸   )rx   ry   rz   r{   rÙ   rð   r›   rž   r±   rõ   r÷   rù   rr   r|   Úthread_unsaferÎ   r   r   r   r    rØ   n  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   ó@   t jttjddd�}tt  |¡dk ƒ tt  t|ƒ¡dk ƒ d S ©Né   r
   ©Úiterr¡   ç•Ö&è.>)rl   r   r!   rP   r   Únorm©rS   r   r   r   r    r›   Ö  ó   z TestNonlinOldTests.test_broyden1c                 C   rü   rý   )rl   r   r!   rP   r   r  r  r   r   r    rž   Û  r  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¸Õ?)rl   r   r!   rP   r   r  r  r   r   r    r±   à  s   z TestNonlinOldTests.test_andersonc                 C   rü   )Né<   r   rÿ   çH¯¼šò×z>)rl   r   r!   rP   r   r  r  r   r   r    r÷   ä  r  z$TestNonlinOldTests.test_linearmixingc                 C   rü   )NrÆ   r   rÿ   çñhãˆµøä>)rl   r   r!   rP   r   r  r  r   r   r    Útest_excitingé  r  z TestNonlinOldTests.test_excitingc                 C   rü   )Né   r
   rÿ   ç:Œ0âŽyE>)rl   r   r!   rP   r   r  r  r   r   r    rõ   î  r  z#TestNonlinOldTests.test_diagbroydenc                 C   óH   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
   ©ÚnitrX   rY   r  ©r   r!   rP   r   rl   r  r   r\   ©rS   r^   r   r   r    Útest_root_broyden1ó  ó
   
ÿz%TestNonlinOldTests.test_root_broyden1c                 C   r  )Nr   rþ   r¡   r
   r  rY   r  r  r  r   r   r    Útest_root_broyden2ù  r  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  rY   r  )r   r!   rP   r   rl   r  r   r  r   r   r    Útest_root_andersonÿ  s   
ÿÿz%TestNonlinOldTests.test_root_andersonc                 C   r  )Nr   r  r¡   r   r  rY   r  r  r  r   r   r    Útest_root_linearmixing  ó   
ÿÿz)TestNonlinOldTests.test_root_linearmixingc                 C   r  )Nr   rÆ   r¡   r   r  rY   r	  r  r  r   r   r    Útest_root_excitingmixing  r  z+TestNonlinOldTests.test_root_excitingmixingc                 C   r  )Nr   r  r¡   r
   r  rY   r  r  r  r   r   r    Útest_root_diagbroyden  r  z(TestNonlinOldTests.test_root_diagbroydenN)rx   ry   rz   r{   r›   rž   r±   r÷   r
  rõ   r  r  r  r  r  r  r   r   r   r    rû   Ð  s    rû   ).r{   Únumpy.testingr   rr   Ú	functoolsr   Úscipy.optimizer   rl   r   Úscipy.sparser   Únumpyr   r   Únumpy.linalgr	   r   rt   Útest_minpackr   r   r   r   r   r   r   rm   rN   re   r!   rP   rd   rO   r[   r%   r*   r1   r3   r:   rE   rF   r€   r²   rØ   rû   r   r   r   r    Ú<module>   s’    úÿ

ÿ


þ

þ

	þXLEb