a
    ‡ù»jõ2  ã                   @   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dSdd„ZdTd	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 )UÚ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éÈ   )ZdispÚmaxfun)Úopts)Úself© r   úCE:\soccer\ml_env\Lib\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    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   s   |   |¡|  |¡fS r   )r   r    r   r   r   r   Úfg30   s    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   s   |   |¡|  |¡fS r   )r#   r$   r   r   r   r   Úfg4<   s    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   Zv1Zv2r   r   r   Úg5C   s    z
TestTnc.g5c                 C   s   |   |¡|  |¡fS r   )r*   r-   r   r   r   r   Úfg5L   s    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@r/   r"   g     €vÀg     €f@r   r   r   r   r   Úg38V   s,     ÿÿ(ÿÿ ÿÿ(ÿÿzTestTnc.g38c                 C   s   |   |¡|  |¡fS r   )r0   r1   r   r   r   r   Úfg38b   s    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    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"   r3   r4   r   r   r   r   r   Úg45h   s    
*****zTestTnc.g45c                 C   s   |   |¡|  |¡fS r   )r5   r7   r   r   r   r   Úfg45q   s    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ÚxoptZ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 )Nr9   r   r:   r;   )r<   r>   r?   ç-Cëâ6?rB   )	r(   ÚarrayrD   r   rE   r   r
   r   r   ©r   rJ   rK   rL   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 )	Nr9   r   r:   r;   T©r<   r=   r>   r?   rA   rB   )	r(   rD   r   rE   r   r
   r   r   r   rQ   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 )	Nr9   r   r&   çA‡ÐR‰ó¿r;   rS   rA   rB   )	r(   rD   r   rE   r   r   r
   r   r   rQ   r   r   r   Útest_minimize_tnc2�   s    þ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;   rS   rA   rB   )	r(   rD   r   rE   r   r    r
   r   r   rQ   r   r   r   Útest_minimize_tnc3˜   s    þ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;   rS   rA   rB   )r   rE   r#   r$   r
   r   r   rQ   r   r   r   Útest_minimize_tnc4    s    þ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:   r3   ©éýÿÿÿr"   çÊæZp¤‚á¿çes-8RÁø¿r;   rS   rA   rB   )r   rE   r*   r-   r
   r   r   rQ   r   r   r   Útest_minimize_tnc5¨   s    þ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©ra   éÿÿÿÿra   rf   ©iöÿÿÿrW   r3   r   r;   rS   rA   rB   )	r(   rP   r   rE   r0   r1   r
   r   r   rQ   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   r6   ©)r   r   )r   r   )r   r"   )r   r3   )r   r6   ©r   r   r"   r3   r6   r;   rS   rA   rB   )r   rE   r5   r7   r
   r   r   rQ   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 )
Nr9   r   r:   )r   r   )r>   ÚargsÚmessagesr	   rA   úTNC failed with status: ©rC   Úerr_msg©
r   r(   rD   r   Úfmin_tncÚ_tncÚMSG_NONEr   r   Ú	RCSTRINGS©r   Zfgr   r>   rL   Ú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 )
Nr9   r   r:   Tr   )Zapprox_gradr>   rm   r	   rO   rn   ro   )	r(   rD   r   rr   r   rs   rt   r   ru   ©r   r   r>   rL   rw   rx   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 )	Nr9   r   r:   r   )Zfprimer>   rm   r	   rA   rn   ro   )
r(   rD   r   rr   r   r   rs   rt   r   ru   rz   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 )
Nr9   r   r&   rU   r   ©r>   rm   r	   rA   rn   ro   rq   rv   r   r   r   Ú	test_tnc2ç   s    &
þ
ÿÿ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 )
NrW   r   rX   r   r   r}   rA   rn   ro   )
r!   r(   rD   r   rr   rs   rt   r   r   ru   rv   r   r   r   Ú	test_tnc3ó   s    &
þ
ÿÿ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 )NrZ   r[   r\   r]   r   r   r   r}   rA   rn   ro   )r%   r   rr   rs   rt   r   r#   ru   rv   r   r   r   Ú	test_tnc4ÿ   s    
þ
ÿÿ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   r_   r`   rb   rc   r   r}   rA   rn   ro   )r.   r   rr   rs   rt   r   r*   ru   rv   r   r   r   Ú	test_tnc5  s    
þ
ÿÿ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 )
Nre   rg   r3   r   r   r}   rA   rn   ro   )
r2   r(   rP   r   rr   rs   rt   r   r0   ru   rv   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   r6   ri   rj   r   r}   rA   rn   ro   )r8   r   rr   rs   rt   r   r5   ru   rv   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 sL0    Y  t  t¡�& tj|ddgd	|d� W d   ƒ n1 sŒ0    Y  d S )Nc                 S   s   t dƒ‚d S )NÚmyfunc)ÚRuntimeError©r   r   r   r   r„   3  s    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   s   t dƒ‚d S )Nr@   )Ú
ValueErrorr†   r   r   r   r@   9  s    z1TestTnc.test_raising_exceptions.<locals>.callbackr   r   r;   )r<   )r<   r@   )ÚpytestZraisesr…   r   rE   r‰   )r   r„   rˆ   r@   r   r   r   Útest_raising_exceptions0  s    2ÿ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   r@   J  s    zDTestTnc.test_callback_shouldnt_affect_minimization.<locals>.callback)r   rW   r3   )r   r   r"   g      @r;   r	   iè  )r>   r<   r?   )r>   r<   r?   r@   )r   r‡   rE   r   r   rG   r   Znfev)r   r@   rG   r>   rJ   rM   Zres2r   r   r   Ú*test_callback_shouldnt_affect_minimizationD  s    
ÿþz2TestTnc.test_callback_shouldnt_affect_minimizationN)r   )r   )r   )+Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r    r!   r#   r$   r%   r*   r-   r.   r0   r1   r2   r5   r7   r8   rN   rR   rT   rV   rY   r^   rd   rh   rk   ry   r{   r|   r~   r   r€   r�   r‚   rƒ   r‹   rŒ   r   r   r   r   r      sP   


			r   )r�   rŠ   Znumpy.testingr   r   Únumpyr(   Úmathr   Zscipyr   r   r   r   r   r   Ú<module>   s   