U
    »mœdp3  ã                   @   sZ   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
 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)Úoptimize)Úmatrixc                   @   sV  e Zd ZdZdd„ ZdTdd„ZdUdd„ZdVd	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*dQdR„ Z+dSS )WÚ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   úV/home/sam/Atlas/atlas_env/lib/python3.8/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   Úfg31   s    zTestTnc.fg3c                 C   s   t |d d dƒd |d  S )Nr   r   é   g      @r   r   r   r   r   r   Úf44   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   Úg47   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   Úg5D   s    z
TestTnc.g5c                 C   s   |   |¡|  |¡fS r   )r+   r.   r   r   r   r   Úfg5M   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   Úf38P   s    ÿÿþÿþüüzTestTnc.f38c                 C   s  ddddg}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 )Nr   g      yÀr   r   r,   r   r   g      i@g3333334@r0   r#   g     €vÀg     €f@r   r    r   r   r   Úg38W   s,     ÿÿ(ÿÿ ÿÿ(ÿÿzTestTnc.g38c                 C   s   |   |¡|  |¡fS r   )r1   r2   r   r   r   r   Úfg38c   s    zTestTnc.fg38c                 C   s0   d|d |d  |d  |d  |d  d  S )Nr,   r   r   r   r#   é   ç      ^@r   r   r   r   r   Úf45f   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#   r4   r5   r   r    r   r   r   Úg45i   s    
*****zTestTnc.g45c                 C   s   |   |¡|  |¡fS r   )r6   r8   r   r   r   r   Úfg45r   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_tnc1w   s     þzTestTnc.test_minimize_tnc1c              	   C   s€   t ddgƒtj d gdd gf }}ddg}d}tjt|d��: tj| j|d|| j	d�j
}t|  |¡|  |¡dd	� W 5 Q R X d S )
Nr:   r   r;   z4Use of `minimize` with `x0.ndim != 1` is deprecated.©Úmatchr<   )r=   r?   r@   ç-Cëâ6?rC   )r   r)   rE   ÚpytestÚwarnsÚDeprecationWarningr   rF   r   r   r   r   )r   rK   rL   rM   Úmessager   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©r=   r>   r?   r@   rB   rC   )	r)   rE   r   rF   r   r   r   r   r   ©r   rK   rL   rM   r   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<   rX   rB   rC   )	r)   rE   r   rF   r   r   r   r   r   rY   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<   rX   rB   rC   )	r)   rE   r   rF   r   r!   r   r   r   rY   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<   rX   rB   rC   )r   rF   r$   r%   r   r   r   rY   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;   r4   ©éýÿÿÿr#   çÊæZp¤‚á¿çes-8RÁø¿r<   rX   rB   rC   )r   rF   r+   r.   r   r   r   rY   r   r   r   Útest_minimize_tnc5«   s     þzTestTnc.test_minimize_tnc5c                 C   sd   t  ddddg¡dgd  }}dgd }tj| j|d| j|| jd�j}t|  |¡|  |¡dd	� d S )
Nrg   éÿÿÿÿ©iöÿÿÿr]   r4   r   r<   rX   rB   rC   )	r)   Úarrayr   rF   r1   r2   r   r   r   rY   r   r   r   Útest_minimize_tnc38³   s    
 þzTestTnc.test_minimize_tnc38c                 C   sd   dgd dddddg }}ddd	d
dg}t j| j|d| j|| jd�j}t|  |¡|  |¡dd� d S )Nr   r7   ©r   r   ©r   r   ©r   r#   ©r   r4   ©r   r7   r   r#   r4   r<   rX   rB   rC   )r   rF   r6   r8   r   r   r   rY   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	   )r?   ÚargsÚmessagesr
   rB   úTNC failed with status: ©rD   Úerr_msg©
r   r)   rE   r   Úfmin_tncÚ_tncÚMSG_NONEr   r   Ú	RCSTRINGS©r   Zfgr   r?   rM   Ú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	   )Zapprox_gradr?   rv   r
   rR   rw   rx   )	r)   rE   r   r{   r   r|   r}   r   r~   ©r   r   r?   rM   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	   )Zfprimer?   rv   r
   rB   rw   rx   )
r)   rE   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	   ©r?   rv   r
   rB   rw   rx   rz   r   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 )
Nr]   r   r^   r   r	   r†   rB   rw   rx   )
r"   r)   rE   r   r{   r|   r}   r   r   r~   r   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 )Nr`   ra   rb   rc   r   r   r	   r†   rB   rw   rx   )r&   r   r{   r|   r}   r   r$   r~   r   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   re   rf   rh   ri   r	   r†   rB   rw   rx   )r/   r   r{   r|   r}   r   r+   r~   r   r   r   r   Ú	test_tnc5  s    
þ
ÿÿzTestTnc.test_tnc5c                 C   sz   | j t ddddg¡dgd   }}}dgd }tj|||tjjdd�\}}}t|  |¡|  |¡dd	tjj	|  d
� d S )Nrg   rk   rl   r4   r   r	   r†   rB   rw   rx   )
r3   r)   rm   r   r{   r|   r}   r   r1   r~   r   r   r   r   Ú
test_tnc38  s    &

þ
ÿÿzTestTnc.test_tnc38c                 C   sz   | j dgd dddddg  }}}ddd	d
dg}tj|||tjjdd�\}}}t|  |¡|  |¡ddtjj|  d� d S )Nr   r7   ro   rp   rq   rr   rs   r   r#   r4   r	   r†   rB   rw   rx   )r9   r   r{   r|   r}   r   r6   r~   r   r   r   r   Ú
test_tnc45&  s     ÿ
þ
ÿÿzTestTnc.test_tnc45c              	   C   sr   dd„ }dd„ }dd„ }t  t¡� tj|ddgd	d
� W 5 Q R X t  t¡� tj|ddgd	|d� W 5 Q R X d S )Nc                 S   s   t dƒ‚d S )NÚmyfunc)ÚRuntimeError©r   r   r   r   r�   6  s    z/TestTnc.test_raising_exceptions.<locals>.myfuncc                 S   s
   t  | ¡S r   )r   Úrosenr�   r   r   r   Úmyfunc19  s    z0TestTnc.test_raising_exceptions.<locals>.myfunc1c                 S   s   t dƒ‚d S )NrA   )Ú
ValueErrorr�   r   r   r   rA   <  s    z1TestTnc.test_raising_exceptions.<locals>.callbackr   r   r<   )r=   )r=   rA   )rS   ZraisesrŽ   r   rF   r’   )r   r�   r‘   rA   r   r   r   Útest_raising_exceptions3  s       ÿzTestTnc.test_raising_exceptionsc                 C   s„   dd„ }t j}dgd }ddddg}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   rA   M  s    zDTestTnc.test_callback_shouldnt_affect_minimization.<locals>.callback)r   r]   r4   r   r   r#   g      @r<   r
   iè  )r?   r=   r@   )r?   r=   r@   rA   )r   r�   rF   r   r   rH   r   Znfev)r   rA   rH   r?   rK   rN   Zres2r   r   r   Ú*test_callback_shouldnt_affect_minimizationG  s,    
    ÿ    þz2TestTnc.test_callback_shouldnt_affect_minimizationc              	   C   s>   d}t jt|d��" tj| jddgdddid� W 5 Q R X d S )Nz2'maxiter' has been deprecated in favor of 'maxfun'rP   r   r#   r<   Úmaxiter)r=   r@   )rS   rT   rU   r   rF   r   )r   Úmsgr   r   r   Útest_maxiter_depreciations^  s       ÿz"TestTnc.test_maxiter_depreciationsN)r   )r   )r   ),Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r!   r"   r$   r%   r&   r+   r.   r/   r1   r2   r3   r6   r8   r9   rO   rW   rZ   r\   r_   rd   rj   rn   rt   r‚   r„   r…   r‡   rˆ   r‰   rŠ   r‹   rŒ   r“   r”   r—   r   r   r   r   r      sR   


				r   )r›   rS   Znumpy.testingr   r   Únumpyr)   Úmathr   Zscipyr   Zscipy.sparse._sputilsr   r   r   r   r   r   Ú<module>   s   