U
    »mœdL² ã                
   @   s®  d Z ddlZddlZddlZddlmZmZmZm	Z	m
Z
mZmZ ddlZddlmZ ddlmZ ddlmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlm Z m!Z! ddl"m#Z#m$Z$ dd„ Z%G dd„ dƒZ&G dd„ de&ƒ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%„ Z0G d&d'„ d'e'ƒZ1G d(d)„ d)e'ƒZ2G d*d+„ d+e'ƒZ3G d,d-„ d-e'ƒZ4G d.d/„ d/e&ƒZ5ej6 7d0d1d2d3d4g¡d5d6„ ƒZ8G d7d8„ d8ƒZ9G d9d:„ d:ƒZ:d;d<„ Z;G d=d>„ d>ƒZ<d?d@„ Z=dAdB„ Z>dCdD„ Z?dEdF„ Z@G dGdH„ dHƒZAdIdJ„ ZBdKdL„ ZCdMdN„ ZDdOdPgZEdQdRgZFdSZGdTdU„ ZHG dVdW„ dWƒZIdXdY„ ZJdZd[„ ZKd\d]„ ZLd^d_„ ZMG d`da„ daƒZNdbdc„ ZOG ddde„ deƒZPdfdg„ ZQG dhdi„ diƒZRejSdjdk„ ƒZTdldm„ ZUdndo„ ZVdpdq„ ZWdrds„ ZXdtdu„ ZYeYƒ ZZej6 [dv¡ej6 7d0eZdw ¡ej6 7dxeZdx ¡ej6 7dyeZdz ¡ej6 7d{eZd{ ¡ej6 7d|eZd} ¡d~d„ ƒƒƒƒƒƒZ\ej6 7d0eZdw ¡d€d�„ ƒZ]d‚dƒ„ Z^d„d…„ Z_d†d‡„ Z`dˆd‰„ ZaG dŠd‹„ d‹ƒZbdŒd�„ ZcdŽd�„ ZddS )�z·
Unit tests for optimization routines from optimize.py

Authors:
   Ed Schofield, Nov 2005
   Andrew Straw, April 2008

To run it in its simplest form::
  nosetests test_optimize.py

é    N)Úassert_allcloseÚassert_equalÚassert_almost_equalÚassert_no_warningsÚassert_warnsÚassert_array_lessÚsuppress_warnings)Úraises)Úoptimize)ÚBoundsÚNonlinearConstraint)ÚMINIMIZE_METHODSÚMINIMIZE_SCALAR_METHODS)ÚLINPROG_METHODS)ÚROOT_METHODS)ÚROOT_SCALAR_METHODS)ÚQUADRATIC_ASSIGNMENT_METHODS)ÚScalarFunctionÚ
FD_METHODS)Ú
MemoizeJacÚshow_optionsc               	   C   sX  dd„ } dd„ }t  dg¡}t | ||¡}t|dƒ tj| ||ddd	�}t|dƒ tj| ||d
d�}t|dƒ tj| ||d
ddd�}t|dƒ ttj| ||dd�d ƒ}|dks´t‚ttj| ||dddd�d ƒ}|dksÞt‚dd„ }dd„ }t  ddd¡}tj|||ddd	�}t|dƒ tt	tj|||ddd	� tjt
ttddd	�}|dk �sTt‚d S )Nc                 S   s   ddt  |  ¡  S ©Né   ©ÚnpÚexp©Úx© r   ú[/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/optimize/tests/test_optimize.pyÚexpit%   s    ztest_check_grad.<locals>.expitc                 S   s    t  |  ¡dt  |  ¡ d  S ©Nr   é   r   r   r   r   r   Ú	der_expit(   s    z"test_check_grad.<locals>.der_expitç      ø?r   ÚrandoméÒ  )Ú	directionÚseedç�íµ ÷Æ°>)Úepsilon)r*   r'   r(   çš™™™™™¹?çH¯¼šò×z>c                 S   s   | t  | ¡  ¡ S ©N)r   ÚsinÚsumr   r   r   r   Úx_sinx@   s    ztest_check_grad.<locals>.x_sinxc                 S   s   t  | ¡| t  | ¡  S r-   ©r   r.   Úcosr   r   r   r   Ú
der_x_sinxC   s    z#test_check_grad.<locals>.der_x_sinxr"   çš™™™™™É?Zrandom_projectionÚallg�íµ ÷Æ >)r   Úarrayr
   Z
check_gradr   ÚabsÚAssertionErrorÚarangeÚassert_raisesÚ
ValueErrorÚhimmelblau_gradÚhimmelblau_hessÚhimmelblau_x0)r    r#   Úx0Úrr0   r3   r   r   r   Útest_check_grad!   s\    

 ÿ

 ÿ
 ÿÿ
 ÿ
   þ
 ÿrA   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚCheckOptimizezÂ Base 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  dddgdddgdddgdddgdddgg¡| _t  dddg¡| _t  dt j¡| _t  ddd	g¡| _d
| _d| _	d| _
g | _d S )Nr   r   ç      ð?ç333333Ó?ç      à?é   ç        g¾š\¼ºËà¿g¢ß)ªŸ3ß?éè  )r   r6   ÚFÚKÚzerosZfloat64ÚstartparamsÚsolutionÚmaxiterÚ	funccallsÚ	gradcallsÚtrace©Úselfr   r   r   Úsetup_method\   s    üzCheckOptimize.setup_methodc                 C   sj   |  j d7  _ | j dkr tdƒ‚t | j|¡}t tt |¡ƒ¡}|t | j|¡ }| j	 
t |¡¡ |S )Nr   ip  z+too many iterations in optimization routine)rO   ÚRuntimeErrorr   ÚdotrI   Úlogr/   r   rJ   rQ   ÚappendÚcopy)rS   r   Úlog_pdotÚlogZÚfr   r   r   Úfuncj   s    
zCheckOptimize.funcc                 C   sV   |  j d7  _ t | j|¡}t tt |¡ƒ¡}t || ¡}t | j ¡ |¡| j S r   )	rP   r   rV   rI   rW   r/   r   Z	transposerJ   ©rS   r   rZ   r[   Úpr   r   r   Úgradt   s
    zCheckOptimize.gradc                 C   s`   t  | j|¡}t  tt  |¡ƒ¡}t  || ¡}t  | jjt  t  |¡| jt  | jj|¡ ¡¡S r-   )r   rV   rI   rW   r/   r   ÚTZdiagr^   r   r   r   Úhess{   s    
"ÿzCheckOptimize.hessc                 C   s   t  |  |¡|¡S r-   )r   rV   rb   ©rS   r   r_   r   r   r   Úhessp‚   s    zCheckOptimize.hesspN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__rT   r]   r`   rb   rd   r   r   r   r   rB   V   s   
rB   c                   @   s’   e Z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�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 )"ÚCheckOptimizeParameterizedc           	   
   C   s  | j r`| j| jddœ}tj| j| jdd| j|d�}|d |d |d |d	 |d
 f\}}}}}n2tj| j| j| jd| jd| jdd�}|\}}}}}t	|  |¡|  | j
¡dd� | jdksÂt| jƒ‚| jdksÖt| jƒ‚t	| jdd… dddgdddggddd� d S )NF©rN   ÚdispÚ
return_allr   ÚCG)ÚargsÚmethodÚjacÚoptionsr   ÚfunÚnfevÚnjevÚstatusT)rN   Úfull_outputrk   Úretallr)   ©Úatolé	   é   r"   é   r   ç      à¿rE   gÃ;Ó±.à¿g)`$|;¾ß?ç›+¡†›„=r,   ©ry   Úrtol)Úuse_wrapperrN   rk   r
   Úminimizer]   rL   r`   Úfmin_cgr   rM   rO   r8   rP   rQ   )	rS   ÚoptsÚresÚparamsÚfoptÚ
func_callsÚ
grad_callsÚwarnflagÚretvalr   r   r   Útest_cgˆ   s@    ÿ þ ÿ   ýÿÿ ýz"CheckOptimizeParameterized.test_cgc                 C   sN   dd„ }t  ddd¡D ]2}tj||gdd�}|js6t‚t|jdgd	d
� qd S )Nc                 S   s   ddt  d| d  ¡ d  S )Ng      @r   ç      ø¿rE   r"   r   )r@   r   r   r   r\   ¨   s    z8CheckOptimizeParameterized.test_cg_cornercase.<locals>.fg      è¿rF   éG   rm   ©ro   rE   çñhãˆµøä>©r€   )r   Zlinspacer
   r‚   Úsuccessr8   r   r   )rS   r\   r?   Úsolr   r   r   Útest_cg_cornercase§   s
    
z-CheckOptimizeParameterized.test_cg_cornercasec              
   C   s  | j rp| j| jddœ}tj| j| j| jdd|d�}|d |d |d |d	 |d
 |d |d f\}}}}}}}	n6tj| j| j| jd| jd| jdd�}
|
\}}}}}}}	t	|  |¡|  | j
¡dd� | jdksÖt| jƒ‚| jdksêt| jƒ‚t	| jdd… dddgdddggddd� d S )NFrj   ÚBFGSr   ©rp   ro   rn   rq   r   rr   rp   Zhess_invrs   rt   ru   T©rn   rN   rv   rk   rw   r)   rx   é
   é   é   r   g˜&ó/LÍà¿gB__E7ß?g$ŸÙÜËà¿gÂ
|²3ß?r~   r,   r   )r�   rN   rk   r
   r‚   r]   rL   r`   Ú	fmin_bfgsr   rM   rO   r8   rP   rQ   )rS   r„   r…   r†   r‡   ZgoptZHoptrˆ   r‰   rŠ   r‹   r   r   r   Ú	test_bfgs²   sT    ÿ  þ     þ  ýÿ
  ÿÿ ýz$CheckOptimizeParameterized.test_bfgsc              	      sˆ   dd„ ‰ ‡ fdd„}dg}t jdd��X | jrTd| ji}tjˆ ||dd	|d
�d }ntjˆ ||| jd�}t  ˆ |ƒ¡rzt‚W 5 Q R X d S )Nc                 S   s   t j|    S r-   )r   Úer   r   r   r   Ú<lambda>Ö   ó    z?CheckOptimizeParameterized.test_bfgs_infinite.<locals>.<lambda>c                    s
   ˆ | ƒ S r-   r   r   ©r]   r   r   rž   ×   rŸ   r   Úignore)Úoverrk   r•   r   r–   r   ©rk   )	r   Úerrstater�   rk   r
   r‚   r›   Úisfiniter8   )rS   Úfprimer?   r„   r   r   r    r   Útest_bfgs_infiniteÔ   s    
 ÿÿz-CheckOptimizeParameterized.test_bfgs_infinitec                 C   sR   dddddg}t jt j|dddid	�}t jt j|dd
did	�}|j|jksNt‚d S )NçÍÌÌÌÌÌô?çffffffæ?çš™™™™™é?çffffffþ?ç333333ó?ÚbfgsZxrtolçü©ñÒMbP?©ro   rq   Úgtol)r
   r‚   ÚrosenÚnitr8   )rS   r?   r…   Úrefr   r   r   Útest_bfgs_xrtolâ   s      ÿ  ÿz*CheckOptimizeParameterized.test_bfgs_xrtolc           
   	   C   sü   | j rd| j| jddœ}tj| j| jdd|d�}|d |d |d |d	 |d
 |d f\}}}}}}n0tj| j| jd| jd| jdd�}	|	\}}}}}}t|  |¡|  | j	¡dd� t|dd … | j	dd … dd� | j
dksät| j
ƒ‚| jdksøt| jƒ‚d S )NFrj   r   ÚPowell©rn   ro   rq   r   rr   Údirecr²   rs   ru   Tr—   r)   rx   r   çñhãˆµøÔ>éˆ   r   )r�   rN   rk   r
   r‚   r]   rL   Úfmin_powellr   rM   rO   r8   rP   ©
rS   r„   r…   r†   r‡   r·   Únumiterrˆ   rŠ   r‹   r   r   r   Útest_powellë   s:    ÿ ÿ    þ  ýÿ z&CheckOptimizeParameterized.test_powellzeThis part of test_powell fails on some platforms, but the solution returned by powell is still valid.©Úreasonc           
   	   C   sÚ   | j rd| j| jddœ}tj| j| jdd|d�}|d |d |d |d	 |d
 |d f\}}}}}}n0tj| j| jd| jd| jdd�}	|	\}}}}}}t| j	dd… dddgdddgdddgdddgdddggddd� d S )NFrj   r   rµ   r¶   r   rr   r·   r²   rs   ru   Tr—   é"   é'   g—…~¿ûWç?gÒf"¬BÜ¿g¼€ˆ%Þ?g:&ÃëÀÞ?g»SÏ¼ûW÷?gÒf"¬Bì¿g{žÃ¥ørî?g{žÃ¥ørÞ?gÌB¿ßý«û?r~   r,   r   )
r�   rN   rk   r
   r‚   r]   rL   rº   r   rQ   r»   r   r   r   Útest_powell_gh14014  sB    ÿ ÿ    þ  ýü úz.CheckOptimizeParameterized.test_powell_gh14014c           
      C   sÀ   dd„ | j D ƒ}| jr¼| j| jddœ}tj| j| j d|d|d�}|d |d	 |d
 |d |d |d f\}}}}}}	|| jks‚t‚t	|  |¡|  | j
¡ddd� | jdks®t‚| jdks¼t‚d S )Nc                 S   s   g | ]}t j t jf‘qS r   )r   Úpi)Ú.0Ú_r   r   r   Ú
<listcomp>3  s     zBCheckOptimizeParameterized.test_powell_bounded.<locals>.<listcomp>Frj   r   rµ   )rn   Úboundsro   rq   r   rr   r·   r²   rs   ru   r)   r�   r   é¯   r   )rL   r�   rN   rk   r
   r‚   r]   rO   r8   r   rM   rP   )
rS   rÇ   r„   r…   r†   r‡   r·   r¼   rˆ   rŠ   r   r   r   Útest_powell_bounded0  s0    ÿ þ    þ ÿ	z.CheckOptimizeParameterized.test_powell_boundedc           	   	   C   sü   | j r\| j| jddœ}tj| j| jdd|d�}|d |d |d |d	 |d
 f\}}}}}n.tj| j| jd| jd| jdd�}|\}}}}}t|  |¡|  | j	¡dd� | j
dksºt| j
ƒ‚| jdksÎt| jƒ‚t| jdd… dddgdddggddd� d S )NFrj   r   úNelder-meadr¶   r   rr   r²   rs   ru   Tr—   r)   rx   é§   r   éL   éN   g	dÀ£×°È?g÷×]fùä¿gtÛ×ä��Ö?gÓ™ �…É?gäÌ#=^ä¿gÝÃoT¸ïÖ?r~   r,   r   )r�   rN   rk   r
   r‚   r]   rL   Úfminr   rM   rO   r8   rP   rQ   )	rS   r„   r…   r†   r‡   r¼   rˆ   rŠ   r‹   r   r   r   Útest_neldermeadK  sD    ÿ ÿ   þ  ýÿÿ ýz*CheckOptimizeParameterized.test_neldermeadc              
   C   sP  t  d¡}| j|d< tdƒD ]}||d |f  d7  < q| jr¬| jdd|dœ}tj| j| jd	d
|d�}|d |d |d |d |d f\}}}}}	t	|d d |d ƒ n.tj
| j| jd	| jddd|d�}
|
\}}}}}	t	|  |¡|  | j¡dd� | jdk�st| jƒ‚| jdk�s"t| jƒ‚t	| jdd… dddgdddggdd d!� d S )"N)r|   rF   .rF   r   r+   FT©rN   rk   rl   Úinitial_simplexr   rÊ   r¶   r   rr   r²   rs   ru   Zallvecsr   ©rn   rN   rv   rk   rw   rÑ   r)   rx   éd   é2   é4   gÔItžÊÌÂ?gà?'Î›Tà¿gxÅ8 áÞ?gÓÒ¢_×†Â?gœoMçà¿gå›Ž|52ß?r~   r,   r   )r   rK   rL   Úranger�   rN   r
   r‚   r]   r   rÎ   rM   rO   r8   rP   rQ   )rS   ÚsimplexÚjr„   r…   r†   r‡   r¼   rˆ   rŠ   r‹   r   r   r   Útest_neldermead_initial_simplexj  sR    

 ÿ ÿü   ýÿÿ ýz:CheckOptimizeParameterized.test_neldermead_initial_simplexc                 C   sÊ   g }t  d¡}| jd d… |d< tdƒD ]}||d |f  d7  < q(| |¡ t  d¡}| |¡ |D ]\}| jr | jdd|dœ}ttt	j
| j| jd	d
|d� qhttt	j| j| jd	| jddd|d�
 qhd S )N)rF   r"   r"   .r   r+   )rF   rF   FrÐ   r   rÊ   r¶   TrÒ   )r   rK   rL   rÖ   rX   r�   rN   r:   r;   r
   r‚   r]   rÎ   )rS   Zbad_simplicesr×   rØ   r„   r   r   r   Ú#test_neldermead_initial_simplex_bad’  s@    



 ÿú    üz>CheckOptimizeParameterized.test_neldermead_initial_simplex_badc                 C   s6   ddi}t j| j| jd| jd|d�}|jdks2t‚d S )NrN   éÿÿÿÿú	Newton-CGr   ©ro   rp   rn   rq   r   )r
   r‚   r]   rL   r`   ru   r8   )rS   r„   Úresultr   r   r   Útest_ncg_negative_maxiter±  s      þz4CheckOptimizeParameterized.test_ncg_negative_maxiterc              
   C   sÒ   | j r8| j| jddœ}tj| j| jd| jd|d�d }n$tj| j| j| jd| jd| jdd�}|}t	|  |¡|  | j
¡dd	� | jd
ks�t| jƒ‚| jdks¤t| jƒ‚t	| jdd… dddgdddggddd� d S )NFrj   rÜ   r   rÝ   r   r—   r)   rx   r{   é   rF   é   ç(Æ6-H=�¾ç×?üºËà¿ç4 u¦3ß?ç_êþéºËà¿çþ/N±§3ß?r,   r   )r�   rN   rk   r
   r‚   r]   rL   r`   Úfmin_ncgr   rM   rO   r8   rP   rQ   ©rS   r„   r‹   r†   r   r   r   Útest_ncg¹  s@    ÿ  þþ  ýÿÿ ýz#CheckOptimizeParameterized.test_ncgc                 C   sÚ   | j r<| j| jddœ}tj| j| jd| j| jd|d�d }n(tj	| j| j| j| jd| jd| jdd�	}|}t
|  |¡|  | j¡dd	� | jd
ks˜t| jƒ‚| jdks¬t| jƒ‚t
| jdd… dddgdddggddd� d S )NFrj   rÜ   r   )ro   rp   rb   rn   rq   r   )Zfhessrn   rN   rv   rk   rw   r)   rx   r{   é   rF   rá   râ   rã   rä   rå   ræ   r,   r   )r�   rN   rk   r
   r‚   r]   rL   r`   rb   rç   r   rM   rO   r8   rP   rQ   rè   r   r   r   Útest_ncg_hessÚ  sD    ÿ  ýý  üÿÿ ýz(CheckOptimizeParameterized.test_ncg_hessc                 C   sÚ   | j r<| j| jddœ}tj| j| jd| j| jd|d�d }n(tj	| j| j| j| jd| jd| jdd�	}|}t
|  |¡|  | j¡dd	� | jd
ks˜t| jƒ‚| jdks¬t| jƒ‚t
| jdd… dddgdddggddd� d S )NFrj   rÜ   r   )ro   rp   rd   rn   rq   r   )Zfhess_prn   rN   rv   rk   rw   r)   rx   r{   rê   rF   rá   râ   rã   rä   rå   ræ   r,   r   )r�   rN   rk   r
   r‚   r]   rL   r`   rd   rç   r   rM   rO   r8   rP   rQ   rè   r   r   r   Útest_ncg_hesspü  sD    ÿ  ýý  üÿÿ ýz)CheckOptimizeParameterized.test_ncg_hesspN)re   rf   rg   rŒ   r”   rœ   r§   r´   r½   ÚpytestÚmarkÚxfailrÂ   rÉ   rÏ   rÙ   rÚ   rß   ré   rë   rì   r   r   r   r   ri   †   s    "	"
 (!"ri   c                     s\   t j d¡‰ ‡ fdd„} dD ]:}dD ]0}tj| ˆ  d¡|d|id�}|d	 |ks$t‚q$qd S )
Nl	   û<vgðRàI*q4Ì c                    s   ˆ   d¡d S ©Nr   rH   ©r%   r   ©Úrngr   r   Úcost"  s    ztest_maxfev_test.<locals>.cost)r   r˜   rÔ   )rµ   úNelder-Meadr˜   Úmaxfevr¯   rs   )r   r%   Údefault_rngr
   r‚   r8   )rô   Zimaxfevro   rÞ   r   rò   r   Útest_maxfev_test  s    þrø   c               	   C   sÌ   dd„ } t j | t d¡d¡\}}tdƒD ]&}|t |¡ƒ |d |d ks*t‚q*d}tt jj|d�� |t |¡ƒ W 5 Q R X t j | t d¡d¡\}}d}tt	|d�� |t 
ddg¡ƒ W 5 Q R X d S )	Nc                 S   s   | S r-   r   r   r   r   r   Úfunc_2  s    z8test_wrap_scalar_function_with_validation.<locals>.func_r   rá   r   zToo many function calls©Úmatchú@The user-provided objective function must return a scalar value.)r
   Ú	_optimizeZ'_wrap_scalar_function_maxfun_validationr   ZasarrayrÖ   r8   r:   Z_MaxFuncCallErrorr;   r6   )rù   Zfcallsr]   ÚiÚmsgr   r   r   Ú)test_wrap_scalar_function_with_validation0  s(      ÿ  ÿr   c               	   C   s>   d} t t| d��$ tjdd„ t ddg¡dd� W 5 Q R X d S )Nrü   rú   c                 S   s   | S r-   r   r   r   r   r   rž   M  rŸ   z.test_obj_func_returns_scalar.<locals>.<lambda>r   r•   r�   )r:   r;   r
   r‚   r   r6   rú   r   r   r   Útest_obj_func_returns_scalarH  s    r  c                  C   s:   t  dddddg¡} tjjtj| dd�}|jdks6t‚d S )	Nr¨   r©   rª   r«   r¬   ç:Œ0âŽyE>)ÚxatoliS  )r   r6   r
   Ú	_minimizeÚ_minimize_neldermeadr±   r²   r8   )r?   r…   r   r   r   Útest_neldermead_iteration_numP  s
    ÿr  c                  C   s&   dd„ } t jj| ddgdddd� d S )Nc                 S   s   | d d | d d  S ©Nr   r"   r   r   r   r   r   r   rž   Z  rŸ   z-test_neldermead_xatol_fatol.<locals>.<lambda>r   r"   r®   )rN   r  Zfatol)r
   r  r  r    r   r   r   Útest_neldermead_xatol_fatolW  s
     ÿr  c                  C   sl   dd„ } ddddddd	d
dddddddg}t j| |dd�}t|jdƒ t j| |dddid�}t|jdƒ d S )Nc                 S   s   t  | d ¡S ©Nr"   ©r   r/   r   r   r   r   rž   a  rŸ   z*test_neldermead_adaptive.<locals>.<lambda>géÍM@¸'Ä?güOÄC”ÆÞ?gµ§¢€~Ü?gê -Û?g¾ã¬€®ã?g#¹ÂÜj­Ô?gûù îï?g~ê³^gžÜ?gÜ r#—Åè?g^c¸¶Ç½é?g)þÖëi	×?g±Ùô÷'è?g‚Ž™Òýï?g1…›Òä?g[ÕVÎ¤¸?rõ   r�   FZadaptiveTr¯   )r
   r‚   r   r’   )r]   Úp0r…   r   r   r   Útest_neldermead_adaptive`  s&    
        þ
ÿr  c               	   C   sø   dd„ } d}dddg}t tjƒ� tj| ||dd�}W 5 Q R X t|jt d	gt|ƒ ¡d
d� t	|j
dƒ t	|jdƒ dddgdddgdddgg}t tjƒ� tj| ||dd|id�}W 5 Q R X t|jt dddg¡d
d� t	|j
dƒ t	|jdƒ d S )Nc                 S   s   t  | d ¡S r	  r
  r   r   r   r   rž   r  rŸ   z3test_bounded_powell_outsidebounds.<locals>.<lambda>)©rÛ   r   r  r  éüÿÿÿrE   gš™™™™™é¿rµ   ©rÇ   ro   rG   r)   rx   Tr   r   r·   )rÇ   ro   rq   g      ÀFr|   )r   r
   ÚOptimizeWarningr‚   r   r   r   r6   Úlenr   r’   ru   )r]   rÇ   r?   r…   r·   r   r   r   Ú!test_bounded_powell_outsideboundsn  s$    
  þr  c               	   C   s  dd„ } d}dddddg}d	d	d
œ}t j| |d|d�}t|jddd� t|jddd� t j| |||dd�}t dddddg¡}t|j|dd� t|j| |ƒdd� dtj dfdtjfddf}t j| |||dd�}t dddddg¡}t|j|dd� t|j| |ƒdd� dd„ } dgd }dddg}t j| |dd�}t j| ||dd�}t|jddd� t|jddd� tj tjfgd }t j| ||dd�}t|j|jdd� t|j|jdd� t|j|jdd� dd d!g}dgd }t	t j
ƒ� t j| ||dd�}W 5 Q R X t|jddd� d S )"Nc                 S   s   t  | d ¡S r	  r
  r   r   r   r   rž   ”  rŸ   z/test_bounded_powell_vs_powell.<locals>.<lambda>))éûÿÿÿrÛ   )éöÿÿÿçš™™™™™¹¿)r   gffffff"@)r  gffffff@©gÍÌÌÌÌÌ/ÀéþÿÿÿgÍÌÌÌÌÌ ÀgÍÌÌÌÌÌÀr«   r   r  ç»½×Ùß|Û=©ÚftolZxtolrµ   r¯   rG   r)   rx   )rq   rÇ   ro   rÛ   r  r   )NrÛ   )r  Nr  c                 S   sz   t  | d  ¡t  | d ¡ t  | d  | d  ¡ t  | d ¡ }|t  t  | d | d  ¡t  | d ¡ ¡8 }|d S ©Nr   r   r"   r1   ©r   Útr   r   r   r]   ±  s    D.z+test_bounded_powell_vs_powell.<locals>.func)r  rá   rF   r}   r�   r  g´£8“ç:}?gbšŽ¥4»F@gìæ†:ÀgžWÀ�¿?@)r
   r‚   r   r   rr   r   r6   Úinfrs   r   r  )r]   rÇ   r?   rq   Z
res_powellZres_bounded_powellr_   r   r   r   Útest_bounded_powell_vs_powellŒ  s`    

þ
þ

þþ

þr  c                  C   sà   dt j dfgd dddœdœ} dddg}dd	„ }tj||f| Ž}t|jd
dd� dd„ }tj||f| Ž}t|jdƒ dd„ }tj||f| Ž}t|jddd� dd„ }t j dfgd | d< tj||f| Ž}t|jddd� d S )Nrµ   g    €„.ArF   r  r  )ro   rÇ   rq   r   c                 S   s   t  | ¡ S r-   r
  r   r   r   r   rž   ã  rŸ   z8test_onesided_bounded_powell_stability.<locals>.<lambda>g    `ãFÁç-Cëâ6?rx   c                 S   s,   t  t  | ¡¡d  t  | dk¡r&dnd S )Nr+   r   r   rÛ   ©r   r7   r/   r5   r   r   r   r   r\   è  s    z1test_onesided_bounded_powell_stability.<locals>.fgw£ÖÆÀc                 S   s,   t  t  | ¡¡d  t  | dk¡r&dnd S )Nr˜   r   r   rÛ   r!  r   r   r   r   r\   ï  s    gB+¢IñaÍr,   r‘   c                 S   sX   t  t  | d d… ¡¡d  t  t  | dd … ¡¡d  }|t  | dk¡rNdnd9 }|S )Nr"   rá   r+   r   r   rÛ   r!  r  r   r   r   r\   ö  s    :g     @�@rÇ   g 4&õk\Ã)r   r  r
   r‚   r   rr   )Úkwargsr?   r\   r…   r   r   r   Ú&test_onesided_bounded_powell_stability×  s$    þ
r#  c                   @   s   e Zd ZdZdZdS )ÚTestOptimizeWrapperDispTN©re   rf   rg   r�   rk   r   r   r   r   r$     s   r$  c                   @   s   e Zd ZdZdZdS )ÚTestOptimizeWrapperNoDispTFNr%  r   r   r   r   r&    s   r&  c                   @   s   e Zd ZdZdZdS )ÚTestOptimizeNoWrapperDispFTNr%  r   r   r   r   r'  
  s   r'  c                   @   s   e Zd ZdZdZdS )ÚTestOptimizeNoWrapperNoDispFNr%  r   r   r   r   r(    s   r(  c                   @   sØ  e 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d„ Zdd„ Zdd„ Zdd „ Zejjd!d"�d#d$„ ƒZd%d&„ Zd'd(„ Zej d)d*d+d,d-d.d/d0d1ge ¡d2d3„ ƒZej d)d4d5d6d7d8d9d:d;d<g	¡d=d>„ ƒZd?d@„ Zej d)dAdBdCdDdEdFdGdHdIdJdKdLg¡dMdN„ ƒZej d)dAdBd*d+g¡dOdP„ ƒZdQdR„ Z dSdT„ Z!dUdV„ Z"dWdX„ Z#ej d)d4d5d6d7d8d9d:d;d<dHdIdJdKdLg¡dYdZ„ ƒZ$ej d)d4d6d7d9d:d;d<dHdIdJdKdLg¡d[d\„ ƒZ%d]S )^ÚTestOptimizeSimplec              	   C   sZ   dd„ }dd„ }t jg}t jddd��* tj|||dd�}t  ||ƒ¡sLt‚W 5 Q R X d S )Nc                 S   s   | S r-   r   r   r   r   r   rž     rŸ   z2TestOptimizeSimple.test_bfgs_nan.<locals>.<lambda>c                 S   s
   t  | ¡S r-   ©r   Z	ones_liker   r   r   r   rž     rŸ   r¡   )r¢   ÚinvalidFr£   )r   Únanr¤   r
   r›   Úisnanr8   )rS   r]   r¦   r?   r   r   r   r   Útest_bfgs_nan  s    z TestOptimizeSimple.test_bfgs_nanc              	   C   s¬   dd„ }t jdd�� t |d¡}W 5 Q R X t  |d ¡s>t‚|d dksNt‚d	d„ }d
d„ }t jdd�� tj|d|d�}W 5 Q R X t  |d ¡s˜t‚|d dks¨t‚d S )Nc                 S   s   t jS r-   ©r   r,  r   r   r   r   rž   #  rŸ   z9TestOptimizeSimple.test_bfgs_nan_return.<locals>.<lambda>r¡   ©r+  r   rr   r’   Fc                 S   s   | dkrdS t jS ©Nr   r/  r   r   r   r   rž   +  rŸ   c                 S   s
   t  | ¡S r-   r*  r   r   r   r   rž   ,  rŸ   )rp   )r   r¤   r
   r‚   r-  r8   )rS   r]   rÞ   r¦   r   r   r   Útest_bfgs_nan_return  s    z'TestOptimizeSimple.test_bfgs_nan_returnc                 C   s^   t  t  d¡¡t j t| jƒ¡ }tj| j	| j
|d| jdd�}t|  	|¡|  	| j¡dd� d S )NrC   r   F)r*   rn   rN   rk   r)   rx   )r   ÚsqrtÚspacingr%   Úrandr  rM   r
   r›   r]   rL   rN   r   )rS   r*   r†   r   r   r   Útest_bfgs_numerical_jacobian3  s    "  þÿz/TestOptimizeSimple.test_bfgs_numerical_jacobianc                 C   sb   dddg}ddd g}t  ||¡D ]<\}}tj| j| j||d�}t|  |j¡|  | j¡dd� q d S )	Nr•   rm   ÚTNCú2-pointú3-point)ro   rp   r)   rx   )	Ú	itertoolsÚproductr
   r‚   r]   rL   r   r   rM   )rS   ÚmethodsÚjacsro   rp   rÞ   r   r   r   Útest_finite_differences_jac?  s    

 ÿÿz.TestOptimizeSimple.test_finite_differences_jacc              
   C   s¬   ddddg}t tjf }t ||¡D ]<\}}|tjkr<|ƒ }tj| j| j|| j|d�}|j	s$t
‚q$ddddg}|D ]4}t t¡�  tj| j| j|| jd d� W 5 Q R X qrd S )Nútrust-constrrÜ   ú	trust-ncgútrust-krylov©ro   rp   rb   Údoglegútrust-exact)r   r
   r•   r:  r;  r‚   r]   rL   r`   r’   r8   rí   r	   r;   )rS   r<  Zhessesro   rb   rÞ   r   r   r   Útest_finite_differences_hessH  s&    
 þ þz/TestOptimizeSimple.test_finite_differences_hessc                 C   s.   dd„ }t j|dgdd�}t|dddd� d S )	Nc                 S   s   | dk rdS | d|   S d S )Nr   g÷BŒþÿÿïrC   r   r   r   r   r   r\   c  s    z/TestOptimizeSimple.test_bfgs_gh_2169.<locals>.fç      $@Fr£   rC   r   ©r€   ry   )r
   r›   r   )rS   r\   Zxsr   r   r   Útest_bfgs_gh_2169b  s    z$TestOptimizeSimple.test_bfgs_gh_2169c                    s*   ‡ fdd„}t ƒ ‰ tj|ddddd� d S )Nc                    s2   | d }|ˆ kst ‚ˆ  |¡ d| d  d|  fS )Nr   r˜   r"   é   )r8   Úadd)r   Zxp©Úseenr   r   r\   m  s    
z:TestOptimizeSimple.test_bfgs_double_evaluations.<locals>.féœÿÿÿr­   Tr,   )ro   rp   Útol)Úsetr
   r‚   ©rS   r\   r   rK  r   Útest_bfgs_double_evaluationsk  s    z/TestOptimizeSimple.test_bfgs_double_evaluationsc                 C   s˜   t j| j| j| jd| jd�}|\}}}t|  |¡|  | j¡dd� | jdksVt	| jƒ‚| j
dksjt	| j
ƒ‚t| jdd… dd	d
gdddggddd� d S )Nr   )rn   rN   r)   rx   r{   rá   rF   gžÈî°>Í<gwTë³¹ à¿gÓUuAXß?rG   g¿‹ŒHóËà¿g!mÊ²3ß?r~   r,   r   )r
   Úfmin_l_bfgs_br]   rL   r`   rN   r   rM   rO   r8   rP   rQ   ©rS   r‹   r†   r‡   Údr   r   r   Útest_l_bfgs_bv  s$     þ
ÿÿ ýz TestOptimizeSimple.test_l_bfgs_bc                 C   sB   t j| j| jd| jd�}|\}}}t|  |¡|  | j¡dd� d S )NT)Zapprox_gradrN   r)   rx   )r
   rR  r]   rL   rN   r   rM   rS  r   r   r   Útest_l_bfgs_b_numjac�  s    þ
ÿz'TestOptimizeSimple.test_l_bfgs_b_numjacc                    sJ   ‡ fdd„}t j|ˆ jˆ jd�}|\}}}tˆ  |¡ˆ  ˆ j¡dd� d S )Nc                    s   ˆ   | ¡ˆ  | ¡fS r-   ©r]   r`   r   rR   r   r   rr   š  s    z4TestOptimizeSimple.test_l_bfgs_b_funjac.<locals>.fun©rN   r)   rx   )r
   rR  rL   rN   r   r]   rM   )rS   rr   r‹   r†   r‡   rT  r   rR   r   Útest_l_bfgs_b_funjac˜  s    
ÿ
ÿz'TestOptimizeSimple.test_l_bfgs_b_funjacc                 C   s„   G dd„ dƒ}|ƒ }t jt jddgd|ddid�}t|jdƒ t|j|jƒ t|j|jƒ t|jdƒ |j	d	kstt
‚t|jd
ƒ d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z:TestOptimizeSimple.test_l_bfgs_b_maxiter.<locals>.Callbackc                 S   s   d| _ d | _d | _d S r1  )r²   rr   r   rR   r   r   r   Ú__init__©  s    zCTestOptimizeSimple.test_l_bfgs_b_maxiter.<locals>.Callback.__init__c                 S   s$   || _ t |¡| _|  jd7  _d S r   )r   r
   r±   rr   r²   ©rS   r   r   r   r   Ú__call__®  s    zCTestOptimizeSimple.test_l_bfgs_b_maxiter.<locals>.Callback.__call__N©re   rf   rg   rZ  r\  r   r   r   r   ÚCallback¨  s   r^  rG   úl-bfgs-brN   rá   )ro   Úcallbackrq   r   Fz+STOP: TOTAL NO. of ITERATIONS REACHED LIMIT)r
   r‚   r±   r   r²   r   r   rr   ru   r’   r8   Úmessage)rS   r^  Úcr…   r   r   r   Útest_l_bfgs_b_maxiter¥  s     ÿÿz(TestOptimizeSimple.test_l_bfgs_b_maxiterc                 C   sú   d| j dœ}tj| j| jd| j|d�}t|  |j¡|  | j¡dd� | j	|j
ksTt‚d | _| _	tj| j| jd|d�}| j|jks†t‚t|  |j¡|  | j¡dd� d | _| _	tj| j| jd	d|d
�}| j|jksØt‚t|  |j¡|  | j¡dd� d S )NF)rk   rN   úL-BFGS-B©ro   rp   rq   r)   rx   r   r¯   r9  ©rp   ro   rq   )rN   r
   r‚   r]   rL   r`   r   r   rM   rP   rt   r8   rO   rs   )rS   r„   r@   Úrar   r   r   Útest_minimize_l_bfgs_b¿  s8     þÿ ÿÿ ÿÿz)TestOptimizeSimple.test_minimize_l_bfgs_bc                 C   sv   d }dD ]h}d| j |dœ}tj| j| jd| j|d�}|  |j¡}|d krN|}n||k sZt‚t||  | j	¡|d� qd S )N)r+   r   r,   r  F)rk   rN   r  rd  re  r‘   )
rN   r
   r‚   r]   rL   r`   r   r8   r   rM   )rS   Zv0rN  r„   r“   Úvr   r   r   Útest_minimize_l_bfgs_b_ftolÛ  s     þz.TestOptimizeSimple.test_minimize_l_bfgs_b_ftolc                 C   s6   t jt jt ddg¡dt jdddœd�}|jr2t‚d S )Nç333333ó¿rC   rd  Fr   )rk   Zmaxlsre  )r
   r‚   r±   r   r6   Ú	rosen_derr’   r8   )rS   r“   r   r   r   Útest_minimize_l_bfgs_maxlsì  s     þz-TestOptimizeSimple.test_minimize_l_bfgs_maxlsc                    s¦   t j‰ t j}g ‰t dd¡}‡ ‡fdd„}d\}}}t j||||d� tdd„ tˆ|d … ƒD ƒƒ\}}|| }	tˆd |… ƒ}
t jˆ |||	d�\}}}t	||
ƒ d S )	Nr{   rH   c                    s   ˆ | ƒ}ˆ  |¡ |S r-   )rX   )r   Úvalue©r\   Úvaluesr   r   Úobjfunú  s    
zMTestOptimizeSimple.test_minimize_l_bfgs_b_maxfun_interruption.<locals>.objfun)é   rÓ   i,  )r¦   Úmaxfunc                 s   s   | ]\}}||fV  qd S r-   r   )rÄ   rþ   Úyr   r   r   Ú	<genexpr>  s     zPTestOptimizeSimple.test_minimize_l_bfgs_b_maxfun_interruption.<locals>.<genexpr>)
r
   r±   rl  r   ÚfullrR  ÚmaxÚ	enumerateÚminr   )rS   Úgr?   rq  ÚlowZmediumÚhighri  Úkrs  ÚtargetZxminrÎ   rT  r   ro  r   Ú*test_minimize_l_bfgs_b_maxfun_interruptionó  s    
"z=TestOptimizeSimple.test_minimize_l_bfgs_b_maxfun_interruptionc                 C   sH   ddd„}dddd	d
g}t jt j||tdd�d�}t|jdddd� d S )Nr   r+   rÓ   c                 [   sè   |}| |ƒ}	d}
d}d}d}|rÐ|sÐ||k rÐd}|d7 }t t |¡ƒD ]†}|| | || | fD ]@}t |¡}|||< | |f|žŽ }|
d7 }
||	k rb|}	|}d}qb|d k	r´||ƒ |d k	rF|
|krFd} qqFqtj|	|||
|dkd�S )Nr   r   TF©rr   r   r²   rs   r’   )rÖ   r   ÚsizerY   r
   ÚOptimizeResult)rr   r?   rn   rö   ÚstepsizerN   r`  rq   ÚbestxÚbestyÚfuncallsÚniterÚimprovedÚstopÚdimÚsÚtestxÚtestyr   r   r   Úcustmin  s8    

 ÿz/TestOptimizeSimple.test_custom.<locals>.custmingš™™™™™õ?çÍÌÌÌÌÌì?rª   gš™™™™™ñ?r¬   çš™™™™™©?©rƒ  r¯   rC   r   rG  )r   Nr+   rÓ   N)r
   r‚   r±   Údictr   r   )rS   rŽ  r?   r…   r   r   r   Útest_custom  s        ÿ
ÿzTestOptimizeSimple.test_customz$output not reliable on all platformsr¾   c                 C   s&  t jddgt jddœ}t jf |ddi—Ž | ¡ \}}d|krFd|ksJt‚t jf |dd	i—Ž | ¡ \}}d|krzd|ks~t‚t jf |dd
i—Ž | ¡ \}}d|kr®d|ks²t‚t jf |d
ddœ—Ž | ¡ \}}d|kräd|ksèt‚t jf |dddœ—Ž | ¡ \}}d|k�rd|k�s"t‚d S )Nr|   rF   )©rF   rá   r”  )r]   r?   r¦   rÇ   ÚiprintrÛ   rd  z
At iterater   r   F)r•  rk   T)r
   r±   rl  rR  Z
readouterrr8   )rS   Zcapfdr"  ÚoutrÅ   r   r   r   Útest_gh133213  s&    
 ÿzTestOptimizeSimple.test_gh13321c                    s<   ddg‰ d‰‡ ‡fdd„}ddg}t jt j||ˆ ˆd� d S )N)r  r"   )r   rF   Úconstraintsc                    s(   |d ˆ kst ‚|d ˆks t ‚t ¡ S )NrÇ   r˜  )r8   r
   r‚  )rr   r?   rq   ©rÇ   r˜  r   r   rŽ  [  s    z0TestOptimizeSimple.test_gh10771.<locals>.custminr   )ro   rÇ   r˜  )r
   r‚   r±   )rS   rŽ  r?   r   r™  r   Útest_gh10771U  s     ÿzTestOptimizeSimple.test_gh10771c                 C   s’   dd„ }dd„ }dD ]x}|dkr&d }n|}t j|ddg|d|d	�}t j|ddg|d
|d	�}||jƒ||jƒk std|||jƒ||jƒf ƒ‚qd S )Nc                 S   s$   | \}}|d |d  |d  d S )Nr"   r|   r   r   ©Úzr   rt  r   r   r   r]   f  s    z<TestOptimizeSimple.test_minimize_tol_parameter.<locals>.funcc                 S   s:   | \}}t  d| |d  d|d   d|d  | g¡S )Nr"   r|   rF   ©r   r6   r›  r   r   r   Údfuncj  s    z=TestOptimizeSimple.test_minimize_tol_parameter.<locals>.dfunc)	únelder-meadÚpowellÚcgr­   ú	newton-cgr_  ÚtncÚcobylaÚslsqp©rŸ  r   r¤  r   r  )rp   rN  ro   rC   z%s: %s vs. %s)r
   r‚   r   r8   )rS   r]   rž  ro   rp   Zsol1Zsol2r   r   r   Útest_minimize_tol_parameterd  s    ÿÿz.TestOptimizeSimple.test_minimize_tol_parameterro   rÎ   rº   rƒ   r›   rç   rR  Úfmin_tncÚ
fmin_slsqpc           	         sh  ˆ dkrdd„ }nt j}t j}t j}t d¡}i }ˆ  d¡r†tt ˆ ƒ}ˆ dkrXd|d< q¸ˆ d	krjd
|d< q¸ˆ dkr|d|d< q¸d|d< n2‡ fdd„}ˆ dkrªtd
d�|d< ntdd�|d< ˆ dkrÊ||d< n*ˆ dkrÜ||d< nˆ dkrô||d< ||d< g ‰‡fdd„}|||fd|i|—Ž t	ˆƒdk�s,t
‚tdd „ ˆD ƒƒ�sDt
‚td!d „ t ˆd¡D ƒƒ�rdt
‚d S )"N)r¨  rR  c                 S   s   t  | ¡t  | ¡fS r-   )r
   r±   rl  r   r   r   r   rž   …  rŸ   zHTestOptimizeSimple.test_minimize_callback_copies_array.<locals>.<lambda>r˜   rÎ   r©  rá   Úiterr¨  rÓ   rs  )rÎ   rº   i¬  rN   c                     s   ˆ |d< t j| |ŽS )Nro   ©r
   r‚   )ÚaÚkwr�   r   r   Úroutineš  s    zGTestOptimizeSimple.test_minimize_callback_copies_array.<locals>.routiner£  ©rs  rq   rX  )rç   r¦   )r¢  rp   ©rA  rD  r@  rC  r?  rb   c                    s   ˆ   | t | ¡f¡ d S r-   )rX   r   rY   )r   rn   r"  )Úresultsr   r   r`  ¯  s    zHTestOptimizeSimple.test_minimize_callback_copies_array.<locals>.callbackr`  r"   c                 s   s    | ]\}}t  ||k¡V  qd S r-   )r   r5   ©rÄ   r   rt  r   r   r   ru  ·  s     zITestOptimizeSimple.test_minimize_callback_copies_array.<locals>.<genexpr>c                 s   s&   | ]\}}t  |d  |d  ¡V  qdS )r   N)r   Zmay_share_memoryr²  r   r   r   ru  ¸  s     )r
   r±   rl  Ú
rosen_hessr   rK   Ú
startswithÚgetattrr’  r  r8   r5   Úanyr:  Úcombinations)	rS   ro   r]   rp   rb   r?   r"  r®  r`  r   )ro   r±  r   Ú#test_minimize_callback_copies_array|  sB    









z6TestOptimizeSimple.test_minimize_callback_copies_arrayrŸ  r   r¡  r­   r¢  r_  r£  r¤  r¥  c           	      C   sž   dd„ }dd„ }t  dg¡}||ƒ}|}|dkr:tdd�ntdd	�}|d
krPd }tj|||||d�}t||jƒ|jƒ |dkrˆt 	d¡ ||jƒ|ksšt
‚d S )Nc                 S   s   | d d S r!   r   r   r   r   r   r]   Á  s    z1TestOptimizeSimple.test_no_increase.<locals>.funcc                 S   s   d| d  d d S )Nr"   r   rÛ   r   r   r   r   r   Úbad_gradÄ  s    z5TestOptimizeSimple.test_no_increase.<locals>.bad_gradç       @r£  rI  r¯  rX  r¦  rf  r¥  zSLSQP returns slightly worse)r   r6   r’  r
   r‚   r   r   rr   rí   rï   r8   )	rS   ro   r]   r¹  r?   Zf0rp   rq   r“   r   r   r   Útest_no_increaseº  s    ÿ
z#TestOptimizeSimple.test_no_increasec                 C   s`   dd„ }dd„ }t  ddddg¡}tj||d	d
|dœd�}t|jt  ddddg¡d dd� d S )Nc                 S   s   t | t ddddg¡ d ƒS )NrC   rº  ç      @g      @r"   )r/   r   r6   r   r   r   r   r\   Ù  s    z7TestOptimizeSimple.test_slsqp_respect_bounds.<locals>.fc                 S   sB   t  ddddgddddgg¡}t  t  || ¡t  ddg¡ | g¡S )NrÛ   éýÿÿÿr  rá   r˜   )r   r6   ZconcatenaterV   ©r   r¬  r   r   r   ÚconsÜ  s    z:TestOptimizeSimple.test_slsqp_respect_bounds.<locals>.consrE   rC   r$   rº  r¥  Úineq©Útyperr   ©ro   r˜  rG   r"   rá   r™   rF   gê-�™—q=rx   )r   r6   r
   r‚   r   r   )rS   r\   r¿  r?   r…   r   r   r   Útest_slsqp_respect_bounds×  s    
ÿz,TestOptimizeSimple.test_slsqp_respect_boundsrõ   rµ   rm   r•   rÜ   rd  ÚSLSQPr?  rC  r@  rD  rA  c                 C   sÌ   d}t  d¡}ttj|dtjtjd d ƒ}|t|d�dœ}|dkrL|j|d< n|dkrh|j|d< |j	|d	< tj
|j|f|Ž}|j|ksˆt‚|j|jks˜t‚t|d
ƒr²|j|jks²t‚|dkrÈ|jdksÈt‚d S )Nr|   r˜   r   rX  r¯   )rÜ   rp   r°  rb   rt   rÅ  rz   )r   rK   r   r
   r±   rl  r³  r’  r`   rb   r‚   rr   r²   r8   rs   Úhasattrrt   Zngevru   )rS   ro   ÚMAXITERr?   Úsfr"  r“   r   r   r   Útest_respect_maxiterå  s(    
  ÿ


z'TestOptimizeSimple.test_respect_maxiterc              	   C   s†   t  d¡}ttj|dtjtjd d ƒ}dddœ}tjt	dd��@ | 
d¡rdtt|ƒ}||j|f|Ž ntj|j|||d	� W 5 Q R X d S )
Nr˜   r   r   T)rN   rk   zMaximum number of iterationsrú   rÎ   r¯   )r   rK   r   r
   r±   rl  r³  rí   ÚwarnsÚRuntimeWarningr´  rµ  rr   r‚   )rS   ro   r?   rÈ  rq   r®  r   r   r   Útest_runtime_warning  s    
  ÿ
ÿ

z'TestOptimizeSimple.test_runtime_warningc           	   
   C   sd   d}t j}t j}t j}dd„ }d|dœf}t d¡}t j|||||dt|d�d	�}|j|ks`t	‚d S )
Nr|   c                 S   s,   t  d| d  d| d   d| d   g¡S )Nr4   r   çš™™™™™Ù?r   ç…ëQ¸Õ?r"   r�  r   r   r   r   rž     rŸ   zWTestOptimizeSimple.test_respect_maxiter_trust_constr_ineq_constraints.<locals>.<lambda>rÀ  rÁ  r˜   r?  rX  )r˜  rp   rb   ro   rq   )
r
   r±   rl  r³  r   rK   r‚   r’  r²   r8   )	rS   rÇ  r\   rp   rb   rr   r¿  r?   r“   r   r   r   Ú2test_respect_maxiter_trust_constr_ineq_constraints  s    ÿ
þzETestOptimizeSimple.test_respect_maxiter_trust_constr_ineq_constraintsc           
      C   sü   dd„ }dd„ }t  dg¡}t ||¡}tj||d|dœgd�}tj||d	gd
�}tj||d|dœgd	gd�}tj||d|dœgdgd�}|||||fD ]}	|	js˜t‚q˜t|jddd� t|jddd� t|jddd� t|jddd� t|jddd� d S )Nc                 S   s   | d S r	  r   r   r   r   r   r\   *  s    z6TestOptimizeSimple.test_minimize_automethod.<locals>.fc                 S   s   | d S r	  r   r   r   r   r   r¿  -  s    z9TestOptimizeSimple.test_minimize_automethod.<locals>.consrF  rÀ  rÁ  )r˜  )rá   r˜   ©rÇ   )r˜  rÇ   ©r   r˜   r   r,   rx   r"   rá   )r   r6   r
   r‚   r’   r8   r   r   )
rS   r\   r¿  r?   Zsol_0Zsol_1Zsol_2Zsol_3Zsol_4r“   r   r   r   Útest_minimize_automethod)  s.    
ÿ
þ
þz+TestOptimizeSimple.test_minimize_automethodc                 C   sZ   dd„ }ddd„}t  dddddd	d
ddddg¡}t j t|ƒ¡}tj||||dd� d S )Nc                 S   s   t  | | d ¡S r	  r
  ©r   rb  r   r   r   ÚYE  s    z=TestOptimizeSimple.test_minimize_coerce_args_param.<locals>.Yc                 S   s   d| |  S r	  r   rÓ  r   r   r   ÚdY_dxH  s    zATestOptimizeSimple.test_minimize_coerce_args_param.<locals>.dY_dxrF   r   r|   rá   rz   r"   rš   r•   )rp   rn   ro   )N)r   r6   r%   Zrandnr  r
   r‚   )rS   rÔ  rÕ  rb  Zxinitr   r   r   Útest_minimize_coerce_args_paramC  s
    
 z2TestOptimizeSimple.test_minimize_coerce_args_paramc           	         s(  dddg}ddddg}‡ ‡‡fdd	„}‡fd
d„}t  ||¡D ]ä\‰}|dkr^tˆd d�}ntƒ }ˆdk rv|dkrvq>dg‰d g‰ tj|ˆ|||d�}d |ˆˆ |¡}|js´t|ƒ‚t|j	dg|d� |j
dksØt|ƒ‚ˆdkr>|dkrütˆ d d|d� n$ˆ d dk�rˆ d dk �s"t|ƒ‚q>q>d S )Ng¸ÔJzî�5r   gšd~ÅQJrm   r•   rd  rÜ   c                    s`   ˆ d d kr4| d ˆd kr4t | d ˆd  ƒˆ d< t | ƒ ¡ dkrLtdƒ‚ˆ| d d d  S )Nr   g     ˆÃ@zOptimization stepped far away!r   r"   )r7   rw  r8   r   ©Zfirst_step_sizeÚscaler?   r   r   r\   V  s
    z7TestOptimizeSimple.test_initial_step_scaling.<locals>.fc                    s   t  ˆ | d d  g¡S ©Nr   r   r�  r   )rØ  r   r   rz  ]  s    z7TestOptimizeSimple.test_initial_step_scaling.<locals>.g)rm   r•   r  )r°   r  )rd  rÜ   ç      ð¿rf  z{0} {1}: {2}: {3}rC   ©Úerr_msgrF   r   g)\�Âõ(ð?rE   )r:  r;  r’  r
   r‚   Úformatr’   r8   r   r   r²   )	rS   Úscalesr<  r\   rz  ro   rq   r…   rÜ  r   r×  r   Útest_initial_step_scalingO  s6    
ÿþ&z,TestOptimizeSimple.test_initial_step_scalingc                    s.  t j d¡ dg‰ dd„ }‡ fdd„}dd„ }d	d
„ }t  dg¡}|dk}|dk}||g}	|rd|gn|d g}
|rv|gn|d g}|dkr�tdd�ntdd�}t jdd��~ tƒ �l}| td¡ | t	d¡ | t	d¡ t
 |	|
|¡D ]2\}}}dg‰ tj||||||d�}t|jdƒ qâW 5 Q R X W 5 Q R X d S )Nr&   r   c                 S   s   t jS r-   r/  r   r   r   r   r]   Ž  s    z0TestOptimizeSimple.test_nan_values.<locals>.funcc                    s0   ˆ d  d7  < ˆ d dkr"t jS t j ¡ S d S r  )r   r,  r%   r5  r   ©Úcountr   r   Úfunc2‘  s    z1TestOptimizeSimple.test_nan_values.<locals>.func2c                 S   s   t  dg¡S ©NrC   r�  r   r   r   r   r`   ˜  s    z0TestOptimizeSimple.test_nan_values.<locals>.gradc                 S   s   t  dgg¡S rã  r�  r   r   r   r   rb   ›  s    z0TestOptimizeSimple.test_nan_values.<locals>.hessrC   ©r¢  rA  rD  r@  rC  ©rA  rD  r@  rC  r£  rI  r¯  rX  r¡   r0  údelta_grad == 0.*ú.*does not use Hessian.*ú.*does not use gradient.*)rp   rb   ro   rq   F)r   r%   r(   r6   r’  r¤   r   ÚfilterÚUserWarningrË  r:  r;  r
   r‚   r   r’   )rS   ro   r]   râ  r`   rb   r?   Z
needs_gradZ
needs_hessÚfuncsZgradsZhesssrq   Úsupr\   rz  Úhr“   r   rà  r   Útest_nan_valuesƒ  s.    ÿz"TestOptimizeSimple.test_nan_valuesc              
   C   s¶   d  }}|dkr| j }|dkr$| j}tjdd��< tƒ �*}| td¡ tj| j	| j
|||d� W 5 Q R X W 5 Q R X tdt| jƒƒD ].}t | j|d  | j| ¡r‚td |¡ƒ‚q‚d S )	Nrä  rå  r¡   r0  ræ  rB  r   z Duplicate evaluations made by {})r`   rb   r   r¤   r   ré  rê  r
   r‚   r]   rL   rÖ   r  rQ   Zarray_equalrU   rÝ  )rS   ro   rp   rb   rì  rþ   r   r   r   Útest_duplicate_evaluationsµ  s"      ÿÿz-TestOptimizeSimple.test_duplicate_evaluationsN)&re   rf   rg   r.  r2  r6  r>  rE  rH  rQ  rU  rV  rY  rc  rh  rj  rm  r  r“  rí   rî   rï   r—  rš  r§  Úparametrizer   r¸  r»  rÄ  rÉ  rÌ  rÏ  rÒ  rÖ  rß  rî  rï  r   r   r   r   r)    s¬   			&
!  þþÿ
:    þ
     ý
 ÿ
4      ü
-     ür)  ro   r_  r£  rµ   rõ   c                 C   s<   dd„ }t j|ddg| d�}|js&t‚t|jdgdd� d S )	Nc                 S   s   t  | d ¡S r	  r
  r   r   r   r   r\   Ö  s    z$test_minimize_with_scalar.<locals>.fé   )rM  rÓ   r  rG   r�   rx   )r
   r‚   r’   r8   r   r   )ro   r\   r…   r   r   r   Útest_minimize_with_scalarÐ  s    
rò  c                   @   sz   e Zd Zdd„ Zddd„Zddd„Zddd	„Zd
d„ Zdd„ Zdd„ Z	e
j dddgddgddgg¡dd„ ƒZdd„ ZdS )ÚTestLBFGSBBoundsc                 C   s   d| _ d| _d S )N))r   N©NN)r   r   )rÇ   rM   rR   r   r   r   rT   ß  s    zTestLBFGSBBounds.setup_methodrº  c                 C   s    d| |d | |d |   S )NrC   r   r   r   rc   r   r   r   rr   ã  s    zTestLBFGSBBounds.func                 C   s   ||d  S r   r   rc   r   r   r   rp   æ  s    zTestLBFGSBBounds.jacc                 C   s   |   ||¡|  ||¡fS r-   ©rr   rp   rc   r   r   r   Úfjé  s    zTestLBFGSBBounds.fjc                 C   sN   t j| jddg| j| jd�\}}}|d dks:t|d ƒ‚t|| jdd� d S )Nr   rÛ   )r¦   rÇ   rŠ   Útaskr)   rx   )r
   rR  rr   rp   rÇ   r8   r   rM   ©rS   r   r\   rT  r   r   r   Útest_l_bfgs_b_boundsì  s    þz%TestLBFGSBBounds.test_l_bfgs_b_boundsc                 C   sL   t j| jddgd| jd�\}}}|d dks8t|d ƒ‚t|| jdd� d S )	Nr   rÛ   ©rº  )rn   rÇ   rŠ   r÷  r)   rx   )r
   rR  rö  rÇ   r8   r   rM   rø  r   r   r   rY  ó  s
    ÿz%TestLBFGSBBounds.test_l_bfgs_b_funjacc                 C   sH   t j| jddgd| j| jd�}|d s2t|d ƒ‚t|j| jdd� d S )	Nr   rÛ   rd  ©ro   rp   rÇ   r’   ra  r)   rx   )	r
   r‚   rr   rp   rÇ   r8   r   r   rM   )rS   r…   r   r   r   Útest_minimize_l_bfgs_b_boundsú  s     ÿz.TestLBFGSBBounds.test_minimize_l_bfgs_b_boundsrÇ   )r˜   r   rÑ  c              	   C   s:   t jtdd��" tj| jddgd| j|d� W 5 Q R X d S )Nz
.*bounds.*rú   r   rÛ   rd  rû  )rí   r	   r;   r
   r‚   rr   rp   )rS   rÇ   r   r   r   Ú'test_minimize_l_bfgs_b_incorrect_bounds  s
     ÿz8TestLBFGSBBounds.test_minimize_l_bfgs_b_incorrect_boundsc              
   C   sv   ddd g}ddg}t  ||¡D ]R\}}tj| jddg|d|| jdd id	�}|d
 s^t|d ƒ‚t|j| j	dd� qd S )Nr8  r9  rú  r   r   rÛ   rd  Zfinite_diff_rel_step)rn   ro   rp   rÇ   rq   r’   ra  r)   rx   )
r:  r;  r
   r‚   rr   rÇ   r8   r   r   rM   )rS   r=  Zargssrp   rn   r…   r   r   r   Ú test_minimize_l_bfgs_b_bounds_FD  s    
 ýz1TestLBFGSBBounds.test_minimize_l_bfgs_b_bounds_FDN)rº  )rº  )rº  )re   rf   rg   rT   rr   rp   rö  rù  rY  rü  rí   rî   rð  rý  rþ  r   r   r   r   ró  Þ  s   


ý
ró  c                   @   sÜ   e 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d„ Zej ddddg¡dd„ ƒZej ddddg¡dd„ ƒZej ddddg¡dd„ ƒZd d!„ Zd"d#„ Zej dddg¡d$d%„ ƒZd&S )(ÚTestOptimizeScalarc                 C   s
   d| _ d S )Nr$   )rM   rR   r   r   r   rT     s    zTestOptimizeScalar.setup_methodr$   c                 C   s   || d d S )zObjective functionr"   rª   r   )rS   r   r¬  r   r   r   rr     s    zTestOptimizeScalar.func              	   C   sà   t  | j¡}t|| jdd� t j| jdd�}t|| jdd� t j| jdd�}t|d | jdd� t j| jdd�}t|| jdd� d	}tjt|d
�� t j| jdd� W 5 Q R X d}tjt|d
�� t j| jdd� W 5 Q R X d S )Nr)   rx   ©r½  r  ©ZbrackT©rv   r   ©iñÿÿÿrÛ   é   ú/\(f\(xb\) < f\(xa\)\) and \(f\(xb\) < f\(xc\)\)rú   ©rÛ   r   r   ú\(xa < xb\) and \(xb < xc\)©r   rÛ   r   )r
   Úbrentrr   r   rM   rí   r	   r;   )rS   r   ra  r   r   r   Ú
test_brent#  s    zTestOptimizeScalar.test_brentc              	   C   sT  t  | j¡}t|| jdd� t j| jdd�}t|| jdd� t j| jdd�}t|d | jdd� t j| jdd�}t|| jdd� t j| jdd	�}t|| jƒ dd
dg}|D ]H}t j| jddd�}t j| j|dd�}|d |d  }}t|| |ƒ qªd}tjt|d�� t j| jdd� W 5 Q R X d}tjt|d�� t j| jdd� W 5 Q R X d S )Nr)   rx   r   r  Tr  r   r  ©rN  r   rá   )rN   rv   r"   r  rú   r  r  r  )	r
   Úgoldenrr   r   rM   r   rí   r	   r;   )rS   r   Zmaxiter_test_casesrN   r?   Znfev0rs   ra  r   r   r   Útest_golden8  s,    
zTestOptimizeScalar.test_goldenc                 C   s†   t  | jdd¡}t|ddd� t  | jdd¡}t|| jdd� t  | jt dg¡t dg¡¡}t|| jdd� ttt j| jddƒ d S )Nr   r   r   rx   rá   r)   )	r
   Ú	fminboundrr   r   rM   r   r6   r:   r;   r[  r   r   r   Útest_fminboundW  s     z!TestOptimizeScalar.test_fminboundc              	   C   sZ   t jtdd�� t | jt d¡d¡ W 5 Q R X t | jdt d¡¡}t	|| j
dd� d S )Nz.*must be finite scalars.*rú   ©r   r"   r   rá   r)   rx   )rí   r	   r;   r
   r  rr   r   rK   r6   r   rM   r[  r   r   r   Útest_fminbound_scalarb  s     z(TestOptimizeScalar.test_fminbound_scalarc                 C   s   dd„ }t  |dd¡ d S )Nc                 S   s   | d S r	  r   r   r   r   r   rr   j  s    z,TestOptimizeScalar.test_gh11207.<locals>.funr   )r
   r  )rS   rr   r   r   r   Útest_gh11207i  s    zTestOptimizeScalar.test_gh11207c                 C   s4  t  | j¡j}t|| jdd� t j| jdd�}|js8t‚t j| jdtdd�d�}|jrZt‚t j| jdd	dd
�j}t|| jdd� t j| jdd	d�j}t|| jdd� t j| jdd	dd
�j}t|| jdd� t j| jdd	dd
�j}t|| jdd� t j| jdd	d�j}t|| jdd� t j| jdd	dd
�j}t|| jdd� t j| jdd	dd�j}t|ddd� t j| jdd	dd�j}t|| jdd� t j| jt	 
dg¡t	 
dg¡ft	 
dg¡fdd�j}t|| jdd� ttt j| jddd	d� ttt j| jt	 d¡dfdd	d� t j| jdt	 
d¡fdd�j}t|| jdd� d S )Nr)   rx   ZBrentr�   rF   rX  r¯   r   )r$   )Úbracketrn   ro   )ro   rn   r  r  )r   r   ZBounded)rÇ   rn   ro   r   r   )r   rá   Úboundedrá   r$   )rá   r   ©rÇ   ro   rn   r"   r  )r
   Úminimize_scalarrr   r   r   rM   r’   r8   r’  r   r6   r:   r;   rK   r[  r   r   r   Útest_minimize_scalarn  s‚    

ÿ

 ÿ
ÿ
 ÿ
 ÿ
ÿ
 ÿÿÿ
ÿý  ÿ  ÿÿz'TestOptimizeScalar.test_minimize_scalarc                 C   s:   ddd„}t j| jd|tdd�d	�}t|j| jd
d� d S )Nr   r+   rÓ   c                 [   sÈ   |d |d  d }| |ƒ}	d}
d}d}d}|r°|s°||k r°d}|d7 }|| || fD ].}| |f|žŽ }|
d7 }
||	k rX|}	|}d}qX|d k	r˜||ƒ |d k	r,|
|kr,d}q°q,t j|	|||
|dkd�S )Nr   r   rº  TFr€  )r
   r‚  )rr   r  rn   rö   rƒ  rN   r`  rq   r„  r…  r†  r‡  rˆ  r‰  rŒ  r�  r   r   r   rŽ  ¬  s2    
 ÿz?TestOptimizeScalar.test_minimize_scalar_custom.<locals>.custmin)r   r|   r�  r‘  )r  ro   rq   r)   rx   )r   Nr+   rÓ   N)r
   r  rr   r’  r   r   rM   )rS   rŽ  r…   r   r   r   Útest_minimize_scalar_customª  s        ÿ

þz.TestOptimizeScalar.test_minimize_scalar_customc                 C   s   t j| jdd� d S )Nr$   ©rn   ©r
   r  rr   rR   r   r   r   Ú&test_minimize_scalar_coerce_args_paramÍ  s    z9TestOptimizeScalar.test_minimize_scalar_coerce_args_paramro   r	  r  r  c                 C   s"   dD ]}t j| jd|id� qd S )N)r   r   r"   rF   rk   )rq   r  )rS   ro   rk   r   r   r   Ú	test_dispÑ  s    zTestOptimizeScalar.test_dispc                 C   sˆ   |dkrdddgini }t j| jfd|i|—Ž}t|dƒs>t‚t|dƒsLt‚t|dƒsZt‚t|d	ƒsht‚t|d
ƒsvt‚t|dƒs„t‚d S )Nr  rÇ   r  r˜   ro   r   r’   ra  rr   rs   r²   )r
   r  rr   rÆ  r8   )rS   ro   r"  rÞ   r   r   r   Útest_result_attributes×  s    z)TestOptimizeScalar.test_result_attributesc              
      sÂ   t j d¡ dg‰ ‡ fdd„}d}d}t jdd��† tƒ �t}| td	¡ | td
¡ | td¡ dg‰ |dkrvd|ini }tj	|fd|i||t
dd�dœ—Ž}t|jdƒ W 5 Q R X W 5 Q R X d S )Nr&   r   c                    s<   ˆ d  d7  < ˆ d dkr"t jS | d dt  | ¡  S d S )Nr   r   r|   r"   r+   )r   r,  r.   r   rà  r   r   r]   é  s    z0TestOptimizeScalar.test_nan_values.<locals>.funcr  r  r¡   r0  ræ  rç  rè  r  rÇ   r  rI  rX  r¯   F)r   r%   r(   r¤   r   ré  rê  rË  r
   r  r’  r   r’   )rS   ro   r]   r  rÇ   rì  r"  r“   r   rà  r   rî  â  s"     þ
z"TestOptimizeScalar.test_nan_valuesc                 C   sF   dd„ }t  |¡}t|jddd� t j|dddid	�}t|jd
ƒ d S )Nc                 S   s   | d S r	  r   r   r   r   r   r\     s    zCTestOptimizeScalar.test_minimize_scalar_defaults_gh10911.<locals>.fr   r  rx   )r   rÓ   r  r  )rÇ   rq   r   )r
   r  r   r   )rS   r\   r…   r   r   r   Ú%test_minimize_scalar_defaults_gh10911   s    
ÿz8TestOptimizeScalar.test_minimize_scalar_defaults_gh10911c              	   C   sh   d}t jt|d�� tjtjdtjfd� W 5 Q R X t jt|d�� tjtjtjdfd� W 5 Q R X d S )Nz+Optimization bounds must be finite scalars.rú   r   rÐ  )	rí   r	   r;   r
   r  r   r.   r  r,  )rS   rÿ   r   r   r   Ú'test_minimize_non_finite_bounds_gh10911  s
     z:TestOptimizeScalar.test_minimize_non_finite_bounds_gh10911c              	   C   s4   d}t jt|d�� tjtj|dd� W 5 Q R X d S )Nz'Use of `bounds` is incompatible with...rú   r  ©ro   rÇ   )rí   r	   r;   r
   r  r   r.   )rS   ro   rÿ   r   r   r   Ú2test_minimize_unbounded_method_with_bounds_gh10911  s    zETestOptimizeScalar.test_minimize_unbounded_method_with_bounds_gh10911N)r$   )re   rf   rg   rT   rr   r
  r  r  r  r  r  r  r  rí   rî   rð  r  r  rî  r  r  r!  r   r   r   r   rÿ    s(   
<#



	rÿ  c                   C   s   t ttjtjdd� d S )Ng{®Gáz„¿r  )r:   r;   r
   r	  r   r2   r   r   r   r   Útest_brent_negative_tolerance  s    r"  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestNewtonCgc                 C   sX   t  ddg¡}tjtj|tjtjddd�}|js:t|j	ƒ‚t
|jt  ddg¡dd� d S ©	Nrk  rC   r�   rÜ   ©rp   rb   rN  ro   r   r   r‘   )r   r6   r
   r‚   r±   rl  r³  r’   r8   ra  r   r   ©rS   r?   r“   r   r   r   Útest_rosenbrock$  s    
üzTestNewtonCg.test_rosenbrockc                 C   sT   t  t¡}tjt|ttddd�}|js0t	|j
ƒ‚t|jtdd� t|jtdd� d S )NrÜ   r)   )rp   rb   ro   rN  r   r‘   rx   )r   r6   r>   r
   r‚   Ú
himmelblaur<   r=   r’   r8   ra  r   r   Úhimmelblau_xoptrr   Úhimmelblau_minr&  r   r   r   Útest_himmelblau.  s    
ûzTestNewtonCg.test_himmelblauc                 C   sV   t  ddg¡}tjtj|tjdddd�}|js8t|jƒ‚t	|j
t  ddg¡dd	� d S )
Nrk  rC   r8  r�   rÜ   r%  r   r   r‘   )r   r6   r
   r‚   r±   rl  r’   r8   ra  r   r   r&  r   r   r   Útest_finite_difference:  s    
üz#TestNewtonCg.test_finite_differencec                 C   sZ   t  ddg¡}tjtj|tjt ¡ ddd�}|js<t|j	ƒ‚t
|jt  ddg¡dd� d S r$  )r   r6   r
   r‚   r±   rl  r•   r’   r8   ra  r   r   r&  r   r   r   Útest_hessian_update_strategyD  s    
üz)TestNewtonCg.test_hessian_update_strategyN)re   rf   rg   r'  r+  r,  r-  r   r   r   r   r#  #  s   

r#  c                  C   s„  t jj} t ddddg¡}t ddddg¡}t d	d
d
d
g¡}t d	ddd
g¡}|t dd
d
d
g¡ddf|t d	dd
d
g¡ddf|t d	d
dd
g¡ddf|t d	d
d
dg¡ddf|t ddd
d
g¡ddf|t dd
ddg¡ddf|t dd
ddg¡ddf|t dd
d
d
g¡ddf|t d	dd
d
g¡ddf|t d	d
dd
g¡ddf|t d	d
d
dg¡ddf|t ddd
d
g¡ddf|t dd
dd
g¡ddff}|D ]<\}}}}	| ||||ƒ\}
}t|
|dd� t||	dd� �q�t tj dtj dg¡}t tjddtjg¡}|t dd
d
d
g¡tj tjf|t d	dd
d
g¡ddf|t d	d
dd
g¡tj df|t d	d
d
dg¡dtjf|t ddd
d
g¡ddf|t dd
ddg¡dtjf|t dd
d
d
g¡tj tjf|t d	dd
d
g¡ddf|t d	d
dd
g¡tj df|t d	d
d
dg¡dtjf|t ddd
d
g¡ddf|t dd
dd
g¡dtjff}|D ]<\}}}}	| ||||ƒ\}
}t|
|dd� t||	dd� �qBd S )Ng333333ÀrÛ   r�   r½  r«   r   gffffff@rF   rG   r   r"   rC   r$   rº  gffffffî?g333333@r)   rx   g333333À)r
   rý   Z_line_for_searchr   r6   r   r  )Zline_for_searchÚlower_boundÚupper_boundr?   Úx1Ú	all_testsr   ÚalphaZlminZlmaxÚmiÚmar   r   r   Útest_line_for_searchO  sT    óôr5  c                  C   sš  t jj} dd„ }t ddddg¡}||ƒ}t tj gd ¡}t tjgd ¡}t ddddg¡dft ddddg¡d	ft ddddg¡d
ft ddddg¡dft ddddg¡dft ddddg¡dft ddddg¡dff}|D ]°\}}| ||||dd�\}	}
}t|	||| ƒdd� t|
|| dd� t||| dd� | |||d|||d�\}	}
}t|	||| ƒdd� t|
|| dd� t||| dd� qäd S )Nc              	   S   s    t  | t  ddddg¡ d ¡S ©NrÚ  rº  r$   çš™™™™™Ù¿r"   ©r   r/   r6   r   r   r   r   rž   “  rŸ   z(test_linesearch_powell.<locals>.<lambda>rG   r   r|   rC   rÛ   r   r"   r$   r7  rÚ  ç      ô?çš™™™™™á?rº  çÍÌÌÌÌÌä¿r�   )ÚfvalrN  r)   rx   ©rN  r.  r/  r<  )r
   rý   Ú_linesearch_powellr   r6   r  r   ©Zlinesearch_powellr]   r  r<  r.  r/  r1  ÚxiÚlr\   r_   r'   r   r   r   Útest_linesearch_powellŽ  s<    ù
 ÿ
ýrB  c                  C   s\  t jj} dd„ }t ddddg¡}||ƒ}t dgd ¡}t dgd ¡}t ddddg¡d	ft dd
ddg¡dft ddd
dg¡dft dddd
g¡dft ddd
dg¡dft ddd
d
g¡dft ddd	d
g¡dff}|D ]^\}}| |||d|||d�\}	}
}t|	||| ƒdd� t|
|| dd� t||| dd� qÞt dgd d	g ¡}t dgd dg ¡}t ddddg¡dft dd
ddg¡dft ddd
dg¡dft dddd
g¡dft ddd
dg¡dft ddd
d
g¡dft ddd	d
g¡dff}|D ]`\}}| |||d|||d�\}	}
}t|	||| ƒdd� t|
|| dd� t||| dd� �qþt ddddg¡}||ƒ}t ddddg¡dft dd
ddg¡dft ddd
dg¡dft dddd
g¡dff}|D ]h\}}| |||d|||d�\}	}
}t|	||||  ƒdd� t|
|||  dd� t||| dd� �qÒt ddddg¡}||ƒ}t dtj tj d	g¡}t tjdtjdg¡}t ddddg¡dft dd
ddg¡dft ddd
dg¡dft dddd
g¡dft ddd
dg¡dft ddd
d
g¡dft ddd	d
g¡dff}|D ]`\}}| |||d|||d�\}	}
}t|	||| ƒdd� t|
|| dd� t||| dd� �qt ddddg¡}||ƒ}t ddddg¡dft dd
ddg¡dft ddd
dg¡dft dddd
g¡dff}|D ]h\}}| |||d|||d�\}	}
}t|	||||  ƒdd� t|
|||  dd� t||| dd� �qîd S )Nc              	   S   s    t  | t  ddddg¡ d ¡S r6  r8  r   r   r   r   rž   ¸  rŸ   z0test_linesearch_powell_bounded.<locals>.<lambda>rG   r   g       Àr|   rº  rC   rÛ   r   r"   r$   r7  rÚ  r9  r:  r;  r�   r=  r)   rx   g333333Ó¿rF   gÍÌÌÌÌÌÜ?r�  rD   g333333Ã¿r©   g333333À)r
   rý   r>  r   r6   r   r  r?  r   r   r   Útest_linesearch_powell_bounded³  s¾    ù

ýù

ýü
ýù

ýü
ýrC  c                     sl   t  ddgddg¡‰ ‡ fdd„} t j| ddgdˆ d� t jdgdgd	gd
�‰ dd„ }t j|dgdˆ d� d S )Nr   g333333ã?rI  c                    s8   | \}}| ˆ j k ¡ r$| ˆ jk ¡ s(t‚|d |d  S r	  )Úlbr5   Úubr8   )r   r¬  ÚbrÐ  r   r   rr   3  s     ztest_powell_limits.<locals>.funrµ   ©r?   ro   rÇ   r   T)rD  rE  Zkeep_feasiblec                 S   s   | dkr| dkst ‚t | ¡S rÙ  )r8   r   r   r   r   r   r   r]   =  s    z test_powell_limits.<locals>.funcrE   r   )rr   r?   ro   rÇ   )r
   r   r‚   )rr   r]   r   rÐ  r   Útest_powell_limits/  s    rH  c                   @   s   e Zd Zdd„ ZdS )Ú	TestRosenc                 C   sL   t  dddg¡}t  dddg¡}t ||¡}t  t |¡|¡}t||ƒ d S )NrF   r|   rá   r"   )r   r6   r
   Úrosen_hess_prodrV   r³  r   )rS   r   r_   ÚhpZdothpr   r   r   Ú	test_hessF  s
    zTestRosen.test_hessN)re   rf   rg   rL  r   r   r   r   rI  D  s   rI  c                 C   s8   | \}}|| | d }|||  d }|| ||  S )zx
    R^2 -> R^1 test function for optimization. The function has four local
    minima where himmelblau(xopt) == 0.
    é   r{   r   )r_   r   rt  r¬  rF  r   r   r   r(  O  s    r(  c                 C   sn   | \}}t  d|d  d| |  d|  d|d   d d|d  d| |  d|d   d|  d g¡S )Nr|   rF   é*   r"   é   é   rà   r�  ©r_   r   rt  r   r   r   r<   Z  s    2.ÿr<   c                 C   s^   | \}}t  d|d  d|  d d| d|  gd| d|  d| d|d   d gg¡S )Né   r"   r|   rN  rP  r�  rQ  r   r   r   r=   `  s    *&ÿr=   gHáz®GÑ¿gÍÌÌÌÌÌì¿rF   r"   rG   c                  C   sn   dd„ } dd„ }dd„ }d| dœd|dœd|dœf}d	d
„ }t j|dddgd|d�}t|jdddgdd� d S )Nc                 S   s0   t  dd| d   d| d   d| d   g¡S )Né   r4   r   rÍ  r   rÎ  r"   r�  r   r   r   r   r]   m  s    z0test_minimize_multiple_constraints.<locals>.funcc                 S   s   t  | d g¡S r   r�  r   r   r   r   Úfunc1p  s    z1test_minimize_multiple_constraints.<locals>.func1c                 S   s   t  | d g¡S r	  r�  r   r   r   r   râ  s  s    z1test_minimize_multiple_constraints.<locals>.func2rÀ  rÁ  c                 S   s   d| d | d  | d   S )NrÛ   r   r   r"   r   r   r   r   r   rž   z  rŸ   z4test_minimize_multiple_constraints.<locals>.<lambda>r   rÅ  rÃ  é}   r  rx   )r
   r‚   r   r   )r]   rT  râ  r¿  r\   r…   r   r   r   Ú"test_minimize_multiple_constraintsk  s    þrV  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestOptimizeResultAttributesc                 C   s8   ddg| _ tj| _tj| _tj| _tj| _	ddg| _
d S )Nrá   )rG   rF  )r?   r
   r±   r]   rl  rp   r³  rb   rJ  rd   rÇ   rR   r   r   r   rT   ƒ  s    
z)TestOptimizeResultAttributes.setup_methodc              
   C   s¶   dddddddg}ddgi}t D ]�}tƒ �2}| td	¡ tj| j| j|| j| j	| j
d
�}W 5 Q R X |D ]8}||kr€||| kr€qft||ƒsŽt‚|t|ƒksft‚qft|jtƒs t‚q d S )Nr²   rs   r   r’   ru   rr   ra  r¤  z7Method .+ does not use (gradient|Hessian.*) information)ro   rp   rb   rd   )r   r   ré  rË  r
   r‚   r]   r?   rp   rb   rd   rÆ  r8   ÚdirÚ
isinstancera  Ústr)rS   Ú
attributesÚskipro   rì  r…   Ú	attributer   r   r   Útest_attributes_present‹  s(    ÿ
ÿ þz4TestOptimizeResultAttributes.test_attributes_presentN)re   rf   rg   rT   r^  r   r   r   r   rW  €  s   rW  c                 G   s^   | \}}|\}}}}}}	}
}}}}}}||d  || |  ||d   ||  ||  |	 S r	  r   ©rœ  r†   r   rt  r¬  rF  rb  rT  r�   r\   rz  rí  rþ   rØ   r}  rA  rØ  r   r   r   Úf1¢  s    r`  c                 G   sP   | \}}|\}}}}}}	}
}}}}}}|
 t  || d || d   | ¡ S r	  r   r_  r   r   r   Úf2¨  s    ra  c                 G   sP   | \}}|\}}}}}}	}
}}}}}}| t  || d || d   | ¡ S r	  r   r_  r   r   r   Úf3®  s    rb  c                 G   s*   t | f|žŽ t| f|žŽ  t| f|žŽ  S r-   )r`  ra  rb  ©rœ  r†   r   r   r   Ú
brute_func´  s    rd  c                   @   sD   e 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S )Ú	TestBrutec                 C   s4   d| _ tdddƒtdddƒf| _t ddg¡| _d S )N)r"   rF   r{   r™   rz   r˜   é,   rÛ   r"   rP  r   r  rE   r  r|   ç      Ð?g_}ú×èð¿g•÷iÃþîü?)r†   ÚsliceÚrrangesr   r6   rM   rR   r   r   r   rT   º  s    zTestBrute.setup_methodc                 G   s   t |f|žŽ S r-   )rd  )rS   rœ  r†   r   r   r   rd  ¿  s    zTestBrute.brute_funcc                 C   sÐ   t jt| j| jdt jd�}t|d | jdd� t|d t| jf| jžŽ dd� t jt| j| jdt jd�}t|d | jdd� t|d t| jf| jžŽ dd� t j| j| j| jdt jd�}t|d | jdd� d S )NT©rn   rv   Úfinishr   r®   rx   r   )	r
   Úbruterd  ri  r†   rÎ   r   rM   r‚   )rS   Úresbruter   r   r   Ú
test_bruteÃ  s,     ÿÿþÿ þzTestBrute.test_brutec                 C   s    dd„ }t j|dgdd d� d S )Nc                 S   s,   t | jƒdkst‚| jd dks$t‚| d S )Nr   r   r"   )r  Úshaper8   r   r   r   r   r\   Ý  s    zTestBrute.test_1D.<locals>.fr  rF   )ZNsrk  )r
   rl  rP  r   r   r   Útest_1DÚ  s    zTestBrute.test_1Dc                 C   sZ   t jt| j| jdd d�}t jt| j| jdd dd�}t|d |d ƒ t|d |d ƒ d S )NTrj  r"   )rn   rv   rk  ÚworkersrÛ   r   )r
   rl  rd  ri  r†   r   )rS   rm  Z	resbrute1r   r   r   Útest_workersä  s     ÿ  ÿzTestBrute.test_workersc              	      sL   t j d¡‰ ‡ fdd„}tjtdd�� tj|| j| j	dd� W 5 Q R X d S )Nr&   c                    s   ˆ   d¡d S rð   rñ   rc  rò   r   r   r]   ò  s    z,TestBrute.test_runtime_warning.<locals>.funcz)Either final optimization did not succeedrú   T)rn   rk   )
r   r%   r÷   rí   rÊ  rË  r
   rl  ri  r†   )rS   r]   r   rò   r   rÌ  ï  s    ÿzTestBrute.test_runtime_warningc                 C   s0   dd„ }t j|tdddƒfdd�}t|dƒ d S )	Nc                 W   s   | |d  S r1  r   ©r   rn   r   r   r   r\   û  s    z+TestBrute.test_coerce_args_param.<locals>.fr  r|   rg  r"   r  r   )r
   rl  rh  r   )rS   r\   rm  r   r   r   Útest_coerce_args_paramù  s    z TestBrute.test_coerce_args_paramN)
re   rf   rg   rT   rd  rn  rp  rr  rÌ  rt  r   r   r   r   re  ¸  s   

re  c               	      s˜   dd l } dd l‰‡fdd„‰‡fdd„‰d‰ ‡ ‡fdd„}‡ ‡fd	d
„}| j ¡ �<}g }| | |¡¡ | | |¡¡ |D ]}| ¡ }q|W 5 Q R X d S )Nr   c                    s   ˆ   d¡ | d d S )Nr+   r   r"   ©Úsleepr   ©Útimer   r   Ú
objective1		  s    
z*test_cobyla_threadsafe.<locals>.objective1c                    s   ˆ   d¡ | d d d S )Nr+   r   r   r"   ru  r   rw  r   r   Ú
objective2	  s    
z*test_cobyla_threadsafe.<locals>.objective2ÚCOBYLAc                      s   t jˆdgˆ d�S ©NrG   r�   r«  r   )Ú
min_methodry  r   r   Ú
minimizer1	  s    þz*test_cobyla_threadsafe.<locals>.minimizer1c                      s   t jˆdgˆ d�S r|  r«  r   )r}  rz  r   r   Ú
minimizer2	  s    þz*test_cobyla_threadsafe.<locals>.minimizer2)Úconcurrent.futuresrx  ÚfuturesÚThreadPoolExecutorrX   ÚsubmitrÞ   )Ú
concurrentr~  r  ÚpoolÚtasksr  r…   r   )r}  ry  rz  rx  r   Útest_cobyla_threadsafe	  s    r‡  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestIterationLimitsc                 C   s
   d| _ d S r1  )r†  rR   r   r   r   rT   )	  s    z TestIterationLimits.setup_methodc                 C   s\   |  j d7  _ t |d d |d d  ¡t |d |d ¡ }}t |d | ¡|d  S )Nr   r   r"   rI  rE   )r†  r   r3  Zarctan2r.   )rS   ri  r@   r  r   r   r   Ú	slow_func,	  s    4zTestIterationLimits.slow_funcc                 C   s   |   dd¡ d S )Nrõ   éÈ   ©Úcheck_limitsrR   r   r   r   Útest_neldermead_limit1	  s    z)TestIterationLimits.test_neldermead_limitc                 C   s   |   dd¡ d S )Nr   rH   r‹  rR   r   r   r   Útest_powell_limit4	  s    z%TestIterationLimits.test_powell_limitc              	   C   s0  ddgddgddgfD �]}dD ]^}d| _ tj| j||d|id�}| j |d ksTt‚|d	 rn|d |k s~t‚q |d |ks t‚q dD ]F}tj| j||d
|id�}|d	 rº|d |ksÊt‚q„|d |ks„t‚q„ddgddgdtjgfD ]„\}}d| _ tj| j||||dœd�}| j |d k�s t‚|d	 �rL|d |k �rF|d |k�sht‚qä|d |ksä|d |ksät‚qätjd gd tjgfD ]ª\}}d| _ tj| j||||dœd�}| j |d k�sºt‚|d	 �rþ|d k�ræ|d |d k �süt‚n|d |d k�s&t‚n(|d |d k�s~|d |d k�s~t‚�q~qd S )Nr+   r   r"   )rÔ   iô  éˆ  r   rö   r¯   rs   r’   rN   r²   rÔ   r�  )rN   rö   )r†  r
   r‚   r‰  r8   r   r  )rS   ro   Zdefault_itersZstart_vZmfevr…   Zmitr   r   r   rŒ  7	  sZ    
þ
þ 
ÿþ
"
ÿþ

z TestIterationLimits.check_limitsN)re   rf   rg   rT   r‰  r�  rŽ  rŒ  r   r   r   r   rˆ  %	  s
   rˆ  c                  C   s¨   dd„ } dd„ }dd„ }ddd	d
ddddg}|D ],}t j| t dg¡|d�}|jjdks0t‚q0ddddddg}|D ]0}t j| t dg¡|||d�}|jjdksrt‚qrd S )Nc                 S   s   | |  S r-   r   r   r   r   r   rr   g	  s    z2test_result_x_shape_when_len_x_is_one.<locals>.func                 S   s   d|  S ©Nrº  r   r   r   r   r   rp   j	  s    z2test_result_x_shape_when_len_x_is_one.<locals>.jacc                 S   s   t  dgg¡S r�  r�  r   r   r   r   rb   m	  s    z3test_result_x_shape_when_len_x_is_one.<locals>.hessrõ   rµ   rm   r•   rd  r7  r{  rÅ  r+   r�   )r   r?  rC  r@  rD  rA  rÜ   rB  )r
   r‚   r   r6   r   ro  r8   )rr   rp   rb   r<  ro   r…   r   r   r   Ú%test_result_x_shape_when_len_x_is_onef	  s&     ÿ ÿÿr‘  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚFunctionWithGradientc                 C   s
   d| _ d S r1  )Únumber_of_callsrR   r   r   r   rZ  €	  s    zFunctionWithGradient.__init__c                 C   s$   |  j d7  _ t |d ¡d| fS r!   )r“  r   r/   r[  r   r   r   r\  ƒ	  s    zFunctionWithGradient.__call__Nr]  r   r   r   r   r’  	  s   r’  c                   C   s   t ƒ S r-   )r’  r   r   r   r   Úfunction_with_gradientˆ	  s    r”  c                 C   s„   t | ƒ}t ddg¡}t||ƒdƒ | jdks2t‚t| |¡d| ƒ | jdksXtdƒ‚t|d| ƒddd	� | jdks€tdƒ‚d S )
NrC   rº  ç      @r   r"   zHfunction is not recomputed if gradient is requested after function valueg      4@ú(different input triggers new computationrÛ  )r   r   r6   r   r“  r8   Ú
derivative©r”  Úmemoized_functionr?   r   r   r   Ú)test_memoize_jac_function_before_gradient�	  s     ÿ
 þÿrš  c                 C   sŠ   t | ƒ}t ddg¡}t| |¡d| ƒ | jdks8t‚t||ƒdƒ | jdksXtdƒ‚t| d| ¡d| dd	� | jdks†tdƒ‚d S )
NrC   rº  r"   r   r•  zHfunction is not recomputed if function value is requested after gradientr|   r–  rÛ  )r   r   r6   r   r—  r“  r8   r˜  r   r   r   Ú)test_memoize_jac_gradient_before_function 	  s     ÿ þÿr›  c                 C   s‚   t | ƒ}|j}t ¡ }t ddg¡}t||d||ddƒ}| jdksFt‚| 	|d ¡ | jdksbt‚| 	|d ¡ | jd	ks~t‚dS )
z¹ Tests that using MemoizedJac in combination with ScalarFunction
        and BFGS does not lead to repeated function evaluations.
        Tests changes made in response to GH11868.
    rC   rE   r   Nr   r+   r"   r4   rF   )
r   r—  r
   r•   r   r6   r   r“  r8   rr   )r”  r™  rp   rb   r?   Zscalar_functionr   r   r   Útest_memoize_jac_with_bfgs³	  s$          ÿrœ  c                	   C   s2   t ƒ �" tjdd„ tj tjdd� W 5 Q R X d S )Nc                 S   s   t  | d g¡S r	  r�  r   r   r   r   rž   Ì	  rŸ   ztest_gh12696.<locals>.<lambda>Fr£   )r   r
   r  r   rÃ   r   r   r   r   Útest_gh12696È	  s       ÿr�  c                     sœ  t j d¡ t j d¡} t  ddddg¡‰t  ddddg¡}ˆ|k‰d ‡‡fdd	„	‰ ‡ fd
d„‰‡ fdd„‰‡ fdd„}‡ fdd„}‡ fdd„}‡ fdd„}‡ fdd„}t|t j dƒ}t|t j d|ƒ}t|t j dƒ}	t|t j d|ƒ}
d}ˆddœˆˆdœ‡‡fdd„ddœf}dd„ tf}dg g f||f|
|
f|g|gf|	g|
gf||	g||
gf||
g||
gf||
g||
gff	}d |f}|||||ˆ|| ˆdœ	}|S )!Nr   r|   r"   rÛ   rÚ  rF   Tc                    s,   |r| j dkst‚|r(t| ˆ  ˆˆ  ƒ d S )Nr|   )r�  r8   r   )r   Z
check_sizeÚcheck_values)Úi_ebrD  r   r   Úcheck_xÙ	  s    z(setup_test_equal_bounds.<locals>.check_xc                    s   ˆ | ƒ t  | ¡S r-   )r
   r±   r   ©r   r   r   r]   ß	  s    z%setup_test_equal_bounds.<locals>.funcc                    s   ˆ | ƒ t  | ¡S r-   )r
   rl  r   r¡  r   r   r`   ã	  s    z%setup_test_equal_bounds.<locals>.gradc                    s   ˆ | ƒ d S r-   r   rs  r¡  r   r   r`  ç	  s    z)setup_test_equal_bounds.<locals>.callbackc                    s   ˆ | dd� | dd… d S )NF©rž  r   r   r   r   r¡  r   r   Úconstraint1ê	  s    z,setup_test_equal_bounds.<locals>.constraint1c                    s"   ˆ | dd� t  | ¡}d|d< |S )NFr¢  r   r   ©r   Z
zeros_like©r   Zdcr¡  r   r   Ú	jacobian1î	  s    
z*setup_test_equal_bounds.<locals>.jacobian1c                    s   ˆ | dd� | dd… d S )NFr¢  r"   rF   rE   r   r   r¡  r   r   Úconstraint2ô	  s    z,setup_test_equal_bounds.<locals>.constraint2c                    s"   ˆ | dd� t  | ¡}d|d< |S )NFr¢  r   r"   r¤  r¥  r¡  r   r   Ú	jacobian2ø	  s    
z*setup_test_equal_bounds.<locals>.jacobian2)rd  rÅ  r7  Frõ  c                    s   ˆ | ƒˆ| ƒfS r-   r   r   rW  r   r   rž   

  rŸ   z)setup_test_equal_bounds.<locals>.<lambda>c                 S   s   t t| |ƒƒS r-   )ÚlistÚzip©rD  rE  r   r   r   rž   
  rŸ   rô  )	r<  ÚkwdsÚbound_typesr˜  Ú	callbacksrD  rE  r?   rŸ  )TT)r   r%   r(   r5  r6   r   r  r   )r?   rE  r`  r£  r¦  r§  r¨  Zc1aZc1bZc2aZc2br<  r¬  r­  r˜  r®  Údatar   )r   r]   r`   rŸ  rD  r   Úsetup_test_equal_boundsÑ	  s\    ÿþÿ 
 
û    þr°  z0Failures due to floating point issues, not logicr<  r¬  Ú
bound_typer­  r˜  r`  r®  c                 C   s´  t  ¡ dkr2| dkr2|d dkr2|dk	r2t d¡ td td  }}td	 td
  }}|\}	}
|	rt| dkstt d¡ |	|
k}|||ƒ}| || ||	|dœ¡ tjf |Ž}tjtj|| tj	||
d�}|j
sÌt‚t|j|jdd� t|j|jdd� |�s|d dk�rtj|j|< |jjd dk�s&t‚t|j| |j| dd� |d �s°|	�s°t|tƒ�s°dd„ }tj||ddg | |ddd… d�}t|j|jƒ t|jddg |jdd� dS )z½
    Tests that minimizers still work if (bounds.lb == bounds.ub).any()
    gh12502 - Divide by zero in Jacobian numerical differentiation when
    equality bounds constraints are used
    Úaarch64r7  rp   FNzTolerance violation on aarchrD  rE  r?   rŸ  rÅ  z)Only SLSQP supports nonlinear constraints)r?   ro   rÇ   r˜  r`  )ro   rp   rÇ   r˜  r)   r‘   gü©ñÒMb@?r   r|   c                 S   s,   t  t jdt jdg¡}| |ddg< t |¡S )Nr"   rÛ   r   )r   r6   r,  r
   r±   )r   Znew_xr   r   r   rr   [
  s    ztest_equal_bounds.<locals>.funr"   r   g�íµ ÷ÆÀ>)ÚplatformÚmachinerí   r\  Úeb_dataÚupdater
   r‚   r±   rl  r’   r8   r   rr   r   r   r,  rp   ro  rY  r   )ro   r¬  r±  r˜  r`  rD  rE  r?   rŸ  Ztest_constraintsZreference_constraintsZ	fd_neededrÇ   r…   Úexpectedrr   Zfd_resr   r   r   Útest_equal_bounds)
  sN    
ÿÿ



 ÿ þ

ýr¸  c           	      C   s’  ddd„}ddg}d}t j|||| d�}|js2t‚t|j|dd	gƒƒ |jdksTt‚|jd
ksbt‚d}t j|||| |d�}|js„t‚t|j|dd	gdƒƒ |  ¡ dk�rŽdd„ }t	|t
j dƒ}t j|||| |gd�}|jdksät‚t|j|dd	gƒƒ |jdk�st‚d}|j |¡�st‚t	|t
j dƒ}t j|||| |gd�}|jdk�sTt‚t|j|dd	gƒƒ |jdk�sxt‚d}|j |¡�sŽt‚d S )Nr   c                 S   s   t j | ¡| S r-   )r   ZlinalgZnorm)r   Úp1r   r   r   r\   q
  s    z test_all_bounds_equal.<locals>.f)r   r   )r"   r"   )rC   r¼  r  rC   rº  z/All independent variables were fixed by bounds.)r"   r  r"   rÅ  c                 S   s
   t  | ¡S r-   r
  r   r   r   r   Úcon‚
  s    z"test_all_bounds_equal.<locals>.conrG   )rÇ   ro   r˜  Fz3All independent variables were fixed by bounds, butr|   Tz8All independent variables were fixed by bounds at values)r   )r
   r‚   r’   r8   r   rr   rs   ra  Úupperr   r   r  r´  )	ro   r\   rÇ   r?   r…   rn   rº  Znlcra  r   r   r   Útest_all_bounds_equalm
  sP    


    ÿ    ÿr¼  c                  C   sb   dd„ } dd„ }d|dœg}dgd }d	|d
< t j| d
dddgd||d� |d d |ks^t‚d S )Nc                 S   s(   | d d | d d  | d | d   S )Nr   rF   r   r"   r   r   r   r   r   r\   œ
  s    ztest_eb_constraints.<locals>.fc                 S   s$   | d | d  | d  | d  d S )Nr   r   r"   rF   é(   r   r   r   r   r   ÚcfunŸ
  s    z!test_eb_constraints.<locals>.cfunrÀ  rÁ  )r   rI  r|   )rá   rá   r   r"   rF   rÅ  )r?   ro   rÇ   r˜  r   rr   )r
   r‚   r8   )r\   r¾  r˜  rÇ   r   r   r   Útest_eb_constraints™
  s    

ûr¿  c                  C   sh   t tttttdœ} |  ¡ D ]\}}|D ]}t||ƒ q&qddddœ}| ¡ D ]\}}tt	t||ƒ qLd S )N)r‚   r  ÚrootZroot_scalarZlinprogZquadratic_assignmentZekkir¡  )r‚   ZmaximizeZmaximize_scalar)
r   r   r   r   r   r   Úitemsr   r:   r;   )Zsolver_methodsZsolverr<  ro   Zunknown_solver_methodr   r   r   Útest_show_options°
  s     úýrÂ  c                  C   s8   t jddgddgd�} t jt jt ddg¡d| d� d S )Nr•  rF  r«  rz   rµ   rG  )r
   r   r‚   r±   r   r6   rÐ  r   r   r   Útest_bounds_with_listÈ
  s       ÿrÃ  c            
      C   s¢   dd„ } dd„ }dd„ }ddd	d
ddg}dd	d
ddg}t  d¡d }tD ]T}d }d }||kr`|}||krl|}tj| ||||d�}	t|	jt  t  |¡¡dd� qHd S )Nc                 S   s*   t  t  | ¡¡}| |8 } | | 9 } t  | ¡S r-   )r   r9   r�  r/   r¾  r   r   r   ÚfquadÔ
  s    z/test_x_overwritten_user_function.<locals>.fquadc                 S   s(   t  t  | ¡¡}| d9 } | d| 8 } | S r	  )r   r9   r�  r¾  r   r   r   Ú	fquad_jacÚ
  s    z3test_x_overwritten_user_function.<locals>.fquad_jacc                 S   s   t  t  | ¡¡d S r�  )r   Úeyer�  r   r   r   r   rž   à
  rŸ   z2test_x_overwritten_user_function.<locals>.<lambda>r¢  rC  r@  rD  rA  r?  rá   r$   rB  g-Cëâ6*?rx   )	r   Zonesr   r
   r‚   r   r   r9   r�  )
rÄ  rÅ  Z
fquad_hessZmeth_jacZ	meth_hessr?   Úmethrp   rb   r…   r   r   r   Ú test_x_overwritten_user_functionÐ
  s4        þ    ÿrÈ  c                   @   s   e Zd Zdd„ ZdS )ÚTestGlobalOptimizationc                 C   sº   dd„ }t j|dd�t  |dg¡t  |dg¡t  |dg¡t  |dg¡g}|D ]h}t|t jƒs`t‚t	|dƒsnt‚t	|dƒs|t‚t	|dƒsŠt‚t	|d	ƒs˜t‚t	|d
ƒs¦t‚t	|dƒsLt‚qLd S )Nc                 S   s   | d S r	  r   r   r   r   r   r]   ú
  s    zDTestGlobalOptimization.test_optimize_result_attributes.<locals>.funcr   )r?   )r  r|   r   r’   ra  rr   rs   r²   )
r
   ZbasinhoppingZdifferential_evolutionZshgoZdual_annealingÚdirectrY  r‚  r8   rÆ  )rS   r]   r±  rÞ   r   r   r   Útest_optimize_result_attributesù
  s    üz6TestGlobalOptimization.test_optimize_result_attributesN)re   rf   rg   rË  r   r   r   r   rÉ  ÷
  s   rÉ  c                  C   s@   t  tt¡} t| ttƒdd� t  tt¡}t|ttƒdd� d S )Nr¸   r‘   )r
   Zapprox_fprimer>   r(  r   r<   r=   )rz  rí  r   r   r   Útest_approx_fprime  s    rÌ  c                  C   s€   dd„ } t ddgddgd�}tj| dd|d�}t t ddg¡t ddg¡d�}tj| dd|d�}t|j|jƒ t|j|jƒ d S )	Nc                 S   s   | d d | d d d  S r  r   r   r   r   r   r\     s    ztest_gh12594.<locals>.fr  r˜   r«  )r   r   rµ   rG  )r   r
   r‚   r   r6   r   rr   r   )r\   rÇ   r…   r³   r   r   r   Útest_gh12594  s     rÍ  )erh   r:  r³  Únumpyr   Znumpy.testingr   r   r   r   r   r   r   rí   r	   r:   Zscipyr
   Zscipy.optimize._minimizer   r   r   r   Zscipy.optimize._linprogr   Zscipy.optimize._rootr   Zscipy.optimize._root_scalarr   Zscipy.optimize._qapr   Z(scipy.optimize._differentiable_functionsr   r   Zscipy.optimize._optimizer   r   rA   rB   ri   rø   r   r  r  r  r  r  r  r#  r$  r&  r'  r(  r)  rî   rð  rò  ró  rÿ  r"  r#  r5  rB  rC  rH  rI  r(  r<   r=   r>   r)  r*  rV  rW  r`  ra  rb  rd  re  r‡  rˆ  r‘  r’  Zfixturer”  rš  r›  rœ  r�  r°  rµ  Zxfail_on_32bitr¸  r¼  r¿  rÂ  rÃ  rÈ  rÉ  rÌ  rÍ  r   r   r   r   Ú<module>   sÂ   $50   	K)     A
þ

=  ,?%|"J#A	
	T
>
+'
