o
    Ö­jœ1  ã                   @   sN   d Z ddlZddlmZmZ ddlZddlmZ ddl	m
Z
 G dd„ dƒZdS )z5
Unit tests for TNC optimization routine from tnc.py
é    N)Úassert_allcloseÚassert_equal©Úpow)Úoptimizec                   @   sN  e Zd ZdZdd„ ZdRdd„ZdRdd„ZdRd	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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQS )SÚTestTnczÝTNC non-linear optimization.

    These tests are taken from Prof. K. Schittkowski's test examples
    for constrained non-linear programming.

    http://www.uni-bayreuth.de/departments/math/~kschittkowski/home.htm

    c                 C   s   dddœ| _ d S )NFéÈ   )ÚdispÚmaxfun)Úopts)Úself© r   úZ/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/optimize/tests/test_tnc.pyÚsetup_method   s   zTestTnc.setup_methodç      Y@c                 C   s2   |t |d t |d dƒ dƒ t d|d  dƒ S )Né   r   é   ç      ð?r   ©r   ÚxÚar   r   r   Úf1   s   2z
TestTnc.f1c                 C   sN   ddg}d| |d t |d dƒ  |d< d|d |d d  d  |d< |S )Nr   r   r   ç       Àr   r   )r   r   r   Údifr   r   r   Úg1   s   " z
TestTnc.g1c                 C   s   |   ||¡|  ||¡fS ©N)r   r   r   r   r   r   Úfg1$   s   zTestTnc.fg1c                 C   s"   |d t |d |d  dƒd  S )Nr   r   r   çñhãˆµøä>r   ©r   r   r   r   r   Úf3'   s   "z
TestTnc.f3c                 C   s8   ddg}d|d |d   d |d< d|d  |d< |S )Nr   r   r   r   r   r   ©r   r   r   r   r   r   Úg3*   s   z
TestTnc.g3c                 C   ó   |   |¡|  |¡fS r   )r   r!   r   r   r   r   Úfg30   ó   zTestTnc.fg3c                 C   s   t |d d dƒd |d  S )Nr   r   é   g      @r   r   r   r   r   r   Úf43   s   z
TestTnc.f4c                 C   s*   ddg}t |d d dƒ|d< d|d< |S )Nr   r   r   r   r   r    r   r   r   Úg46   s   z
TestTnc.g4c                 C   r"   r   )r&   r'   r   r   r   r   Úfg4<   r$   zTestTnc.fg4c                 C   sH   t  |d |d  ¡t|d |d  dƒ d|d   d|d   d S )Nr   r   r   ç      ø?ç      @r   )ÚnpÚsinr   r   r   r   r   Úf5?   s   *
ÿ
ÿÿz
TestTnc.f5c                 C   sV   ddg}t  |d |d  ¡}d|d |d   }|| d |d< || d |d< |S )Nr   r   ç       @r)   r*   )r+   Úcos)r   r   r   Úv1Úv2r   r   r   Úg5C   s   z
TestTnc.g5c                 C   r"   r   )r-   r2   r   r   r   r   Úfg5L   r$   zTestTnc.fg5c                 C   s¬   dt |d t |d dƒ dƒ t d|d  dƒ dt |d t |d dƒ dƒ  t d|d  dƒ dt |d d dƒt |d d dƒ   d	|d d  |d d   d
 S )Nr   r   r   r   r   g     €V@r%   g333333$@çÍÌÌÌÌÌ3@r   r   r   r   r   r   Úf38O   s   ÿÿþÿþüüzTestTnc.f38c                 C   s  g d¢}d|d  |d t |d dƒ  dd|d    d |d< d	|d t |d dƒ  d
|d d   d|d d   d |d< d|d  |d t |d dƒ  dd|d    d |d< d|d t |d dƒ  d
|d d   d|d d   d |d< |S )N)r   r   r   r   g      yÀr   r   r   r.   r   r   g      i@g3333334@r4   r%   g     €vÀg     €f@r   r    r   r   r   Úg38V   s,    ÿÿ(ÿÿ ÿÿ(ÿÿzTestTnc.g38c                 C   r"   r   )r5   r6   r   r   r   r   Úfg38b   r$   zTestTnc.fg38c                 C   s0   d|d |d  |d  |d  |d  d  S )Nr.   r   r   r   r%   é   ç      ^@r   r   r   r   r   Úf45e   s   0zTestTnc.f45c                 C   sà   dgd }|d  |d  |d  |d  d |d< |d  |d  |d  |d  d |d< |d  |d  |d  |d  d |d< |d  |d  |d  |d  d |d< |d  |d  |d  |d  d |d< |S )Nr   é   r   r   r%   r8   r9   r   r    r   r   r   Úg45h   s   
*****zTestTnc.g45c                 C   r"   r   )r:   r<   r   r   r   r   Úfg45q   r$   zTestTnc.fg45c              	   C   st   ddgt j d gdd gf}}ddg}g }tj| j|d| j|| j|jd�}t|j	|  |¡dd� t
t|ƒ|jƒ d S )Néþÿÿÿr   ç      ø¿ÚTNC)ÚmethodÚjacÚboundsÚoptionsÚcallbackç:Œ0âŽyE>©Úatol)r+   Úinfr   Úminimizer   r   r   Úappendr   Úfunr   ÚlenÚnit)r   Úx0ÚbndsÚxoptÚiterxÚresr   r   r   Útest_minimize_tnc1v   s   þzTestTnc.test_minimize_tnc1c                 C   sd   t  ddg¡t j d gdd gf}}ddg}tj| j|d|| jd�j}t|  |¡|  |¡dd� d S )Nr>   r   r?   r@   )rA   rC   rD   ç-Cëâ6?rG   )	r+   ÚarrayrI   r   rJ   r   r   r   r   ©r   rO   rP   rQ   r   r   r   r   Útest_minimize_tnc1b�   s   $ÿÿzTestTnc.test_minimize_tnc1bc                 C   s`   ddgt j d gdd gf}}ddg}tj| j|dd|| jd�j}t|  |¡|  |¡dd� d S )	Nr>   r   r?   r@   T©rA   rB   rC   rD   rF   rG   )	r+   rI   r   rJ   r   r   r   r   r   rW   r   r   r   Útest_minimize_tnc1cˆ   s   þþzTestTnc.test_minimize_tnc1cc                 C   sb   ddgt j d gdd gf}}ddg}tj| j|d| j|| jd�j}t|  |¡|  |¡dd� d S )	Nr>   r   r)   çA‡ÐR‰ó¿r@   rY   rF   rG   )	r+   rI   r   rJ   r   r   r   r   r   rW   r   r   r   Útest_minimize_tnc2�   ó   þþzTestTnc.test_minimize_tnc2c                 C   sb   ddgt j d gdd gf}}ddg}tj| j|d| j|| jd�j}t|  |¡|  |¡dd� d S )	Né
   r   ç        r   r@   rY   rF   rG   )	r+   rI   r   rJ   r   r!   r   r   r   rW   r   r   r   Útest_minimize_tnc3˜   r]   zTestTnc.test_minimize_tnc3c                 C   sV   ddgddg}}ddg}t j| j|d| j|| jd�j}t|  |¡|  |¡d	d
� d S )Nç      ò?ç      À?©r   N©r   Nr   r   r@   rY   rF   rG   )r   rJ   r&   r'   r   r   r   rW   r   r   r   Útest_minimize_tnc4    ó   þþzTestTnc.test_minimize_tnc4c                 C   sV   ddgddg}}ddg}t j| j|d| j|| jd�j}t|  |¡|  |¡dd	� d S )
Nr   ©r?   r8   ©éýÿÿÿr%   çÊæZp¤‚á¿çes-8RÁø¿r@   rY   rF   rG   )r   rJ   r-   r2   r   r   r   rW   r   r   r   Útest_minimize_tnc5¨   rf   zTestTnc.test_minimize_tnc5c                 C   s`   t  g d¢¡dgd }}dgd }tj| j|d| j|| jd�j}t|  |¡|  |¡dd� d S )	N©ri   éÿÿÿÿri   rn   ©iöÿÿÿr^   r8   r   r@   rY   rF   rG   )	r+   rV   r   rJ   r5   r6   r   r   r   rW   r   r   r   Útest_minimize_tnc38°   s   
þþzTestTnc.test_minimize_tnc38c                 C   sX   dgd g d¢}}g d¢}t j| j|d| j|| jd�j}t|  |¡|  |¡dd� d S )	Nr   r;   ©)r   r   )r   r   )r   r%   )r   r8   )r   r;   ©r   r   r%   r8   r;   r@   rY   rF   rG   )r   rJ   r:   r<   r   r   r   rW   r   r   r   Útest_minimize_tnc45¸   s   þþzTestTnc.test_minimize_tnc45c                 C   sz   | j ddgtj d gdd gf}}}ddg}tj|||dtjjdd�\}}}t|  |¡|  |¡ddtjj	|  d	� d S )
Nr>   r   r?   ©r   r   )rC   ÚargsÚmessagesr
   rF   úTNC failed with status: ©rH   Úerr_msg©
r   r+   rI   r   Úfmin_tncÚ_tncÚMSG_NONEr   r   Ú	RCSTRINGS©r   Úfgr   rC   rQ   ÚnfÚrcr   r   r   Ú	test_tnc1Á   s   &þ
ÿ
ÿzTestTnc.test_tnc1c                 C   st   ddgt j d gdd gf}}ddg}tj| j|d|tjjdd�\}}}t|  |¡|  |¡ddtjj|  d	� d S )
Nr>   r   r?   Tr   )Úapprox_gradrC   rv   r
   rU   rw   rx   )	r+   rI   r   r{   r   r|   r}   r   r~   ©r   r   rC   rQ   r�   r‚   r   r   r   Ú
test_tnc1bÍ   s   ý
ÿ
ÿzTestTnc.test_tnc1bc                 C   sv   ddgt j d gdd gf}}ddg}tj| j|| j|tjjdd�\}}}t|  |¡|  |¡ddtjj	|  d� d S )	Nr>   r   r?   r   )ÚfprimerC   rv   r
   rF   rw   rx   )
r+   rI   r   r{   r   r   r|   r}   r   r~   r…   r   r   r   Ú
test_tnc1cÚ   s   ý
ÿ
ÿzTestTnc.test_tnc1cc                 C   sx   | j ddgtj d gdd gf}}}ddg}tj|||tjjdd�\}}}t|  |¡|  |¡ddtjj	|  d	� d S )
Nr>   r   r)   r[   r   ©rC   rv   r
   rF   rw   rx   rz   r   r   r   r   Ú	test_tnc2ç   ó   &
þ
ÿ
ÿzTestTnc.test_tnc2c                 C   sx   | j ddgtj d gdd gf}}}ddg}tj|||tjjdd�\}}}t|  |¡|  |¡ddtjj	|  d	� d S )
Nr^   r   r_   r   r   r‰   rF   rw   rx   )
r#   r+   rI   r   r{   r|   r}   r   r   r~   r   r   r   r   Ú	test_tnc3ó   r‹   zTestTnc.test_tnc3c                 C   sl   | j ddgddg}}}ddg}tj|||tjjdd�\}}}t|  |¡|  |¡d	d
tjj|  d� d S )Nra   rb   rc   rd   r   r   r   r‰   rF   rw   rx   )r(   r   r{   r|   r}   r   r&   r~   r   r   r   r   Ú	test_tnc4ÿ   ó   
þ
ÿ
ÿzTestTnc.test_tnc4c                 C   sl   | j ddgddg}}}ddg}tj|||tjjdd�\}}}t|  |¡|  |¡dd	tjj|  d
� d S )Nr   rg   rh   rj   rk   r   r‰   rF   rw   rx   )r3   r   r{   r|   r}   r   r-   r~   r   r   r   r   Ú	test_tnc5  rŽ   zTestTnc.test_tnc5c                 C   sv   | j t g d¢¡dgd }}}dgd }tj|||tjjdd�\}}}t|  |¡|  |¡ddtjj	|  d	� d S )
Nrm   ro   r8   r   r   r‰   rF   rw   rx   )
r7   r+   rV   r   r{   r|   r}   r   r5   r~   r   r   r   r   Ú
test_tnc38  s   "

þ
ÿ
ÿzTestTnc.test_tnc38c                 C   sn   | j dgd g d¢}}}g d¢}tj|||tjjdd�\}}}t|  |¡|  |¡ddtjj|  d	� d S )
Nr   r;   rq   rr   r   r‰   rF   rw   rx   )r=   r   r{   r|   r}   r   r:   r~   r   r   r   r   Ú
test_tnc45#  s   
þ
ÿ
ÿzTestTnc.test_tnc45c                 C   sœ   dd„ }dd„ }dd„ }t  t¡� tj|ddgd	d
� W d   ƒ n1 s&w   Y  t  t¡� tj|ddgd	|d� W d   ƒ d S 1 sGw   Y  d S )Nc                 S   ó   t dƒ‚)NÚmyfunc)ÚRuntimeError©r   r   r   r   r“   3  ó   z/TestTnc.test_raising_exceptions.<locals>.myfuncc                 S   s
   t  | ¡S r   )r   Úrosenr•   r   r   r   Úmyfunc16  s   
z0TestTnc.test_raising_exceptions.<locals>.myfunc1c                 S   r’   )NrE   )Ú
ValueErrorr•   r   r   r   rE   9  r–   z1TestTnc.test_raising_exceptions.<locals>.callbackr   r   r@   )rA   )rA   rE   )ÚpytestÚraisesr”   r   rJ   r™   )r   r“   r˜   rE   r   r   r   Útest_raising_exceptions0  s   ÿÿ"ÿzTestTnc.test_raising_exceptionsc                 C   s€   dd„ }t j}dgd }g d¢}t j|||dddid	�}t j|||dddi|d
�}t|j|jƒ t|j|jƒ t|j|jƒ d S )Nc                 S   s   d S r   r   r•   r   r   r   rE   J  s   zDTestTnc.test_callback_shouldnt_affect_minimization.<locals>.callback)r   r^   r8   )r   r   r%   g      @r@   r
   iè  )rC   rA   rD   )rC   rA   rD   rE   )r   r—   rJ   r   r   rL   r   Únfev)r   rE   rL   rC   rO   rS   Úres2r   r   r   Ú*test_callback_shouldnt_affect_minimizationD  s   
ÿþz2TestTnc.test_callback_shouldnt_affect_minimizationNrt   )+Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r!   r#   r&   r'   r(   r-   r2   r3   r5   r6   r7   r:   r<   r=   rT   rX   rZ   r\   r`   re   rl   rp   rs   rƒ   r†   rˆ   rŠ   rŒ   r�   r�   r�   r‘   rœ   rŸ   r   r   r   r   r      sR    


			r   )r£   rš   Únumpy.testingr   r   Únumpyr+   Úmathr   Úscipyr   r   r   r   r   r   Ú<module>   s    