U
    /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j67d0d1d2d3d4g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j67d0eZdw ej67dxeZdx ej67dyeZdz ej67d{eZd{ ej67d|eZd} d~d Z\ej67d0eZdw dd Z]dd Z^dd Z_dd Z`dd ZaG dd dZbdd Zcdd 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stttj| ||ddddd }|dkst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   F/tmp/pip-unpacked-wheel-9gxwnfpp/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(   皙?Hz>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st| j| jdkst| 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st| j| jdkst| 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&/LgB__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xrtolMbP?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st| j
| jdkst| 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?gf"Bܿg%?g:&?gSϼW?gf"Bg{år?g{år?gB?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stt	| || | j
ddd | jdkst| jdkst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st| j
| jdkst| 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#=^goT?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   gIt?g?'ΛTgx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st| j| jdkst| 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u3?_/N3?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st| j| jdkst| 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st| j| jdkst| 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	   <vgR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   :0yE>)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>gM@'?gOC?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   gr   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  g8:}?gb4F@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+Iar,   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 st|d dkst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   gB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\   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>.fr   Tr,   )ro   rp   tol)setr
   r   rS   r\   r   rL  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볹gUuAX?rG   gHg!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
   rS  r]   rL   rN   r   rM   rT  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
   rS  rL   rN   r   r]   rM   )rS   rr   r   r   r   rU  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   r[  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stt| |j| | jdd d | _| _	tj| j| jd	d|d
}| j|jkst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  re  rf  r   )
rN   r
   r   r]   rL   r`   r   r8   r   rM   )rS   Zv0rO  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 )N333333rC   re  Fr   )rk   Zmaxlsrf  )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   rm  r   fullrS  max	enumerateminr   )rS   gr?   rr  lowZmediumhighrj  krt  targetZxminr   rU  r   rp  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 rd}|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   ra  rq   bestxbestyfuncallsniterimprovedstopZ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rd|kstt jf |d
dd | \}}d|krd|kst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   re  z
At iterater   r   F)r  rk   T)r
   r   rm  rS  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   ru  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   rO  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   rS  fmin_tnc
fmin_slsqpc           	         sh   dkrdd }nt j}t j}t j}td}i } drtt  } dkrXd|d< q d	krjd
|d< q dkr|d|d< qd|d< n2 fdd} dkrt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  rS  c                 S   s   t | t | fS r-   )r
   r   rm  r   r   r   r   r     r   zHTestOptimizeSimple.test_minimize_callback_copies_array.<locals>.<lambda>r   r   r  r   iterr  r   rt  )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  rt  rq   rY  )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   ra    s    zHTestOptimizeSimple.test_minimize_callback_copies_array.<locals>.callbackra  r"   c                 s   s    | ]\}}t ||kV  qd S r-   )r   r5   r   r   ru  r   r   r   rv    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   rv    s     )r
   r   rm  
rosen_hessr   rK   
startswithgetattrr  r  r8   r5   anyr:  combinations)	rS   ro   r]   rp   rb   r?   r"  r  ra  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rt	d ||j|kst
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  rJ  r  rY  r  rg  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   re  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st|j|jkstt|d
r|j|jkst|dkr|jdkstd S )Nr|   r   r   rY  r   )r   rp   r  rb   rt   r  rz   )r   rK   r   r
   r   rm  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   rm  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?  rY  )r  rp   rb   ro   rq   )
r
   r   rm  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stqt|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   rc  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  rc  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st|t|j	dg|d |j
dkst|dkr>|dkrt d d|d n$ d dkr d dk s"t|q>q>d S )NgJz5r   gd~QJrm   r   re  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   rx  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   r{  ]  s    z7TestOptimizeSimple.test_initial_step_scaling.<locals>.g)rm   r   r  )r   r  )re  r         rg  z{0} {1}: {2}: {3}rC   err_msgrF   r   g)\(?rE   )r:  r;  r  r
   r   formatr   r8   r   r   r   )	rS   Zscalesr<  r\   r{  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rt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 qW 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  rJ  r  rY  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\   r{  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| rtd|qd 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  rI  rR  rV  rW  rZ  rd  ri  rk  rn  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   )rN  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
   rS  rr   rp   r   r8   r   rM   rS   r   r\   rU  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
   rS  r  r   r8   r   rM   r  r   r   r   rZ    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   re  ro   rp   r   r   rb  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   re  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   re  Zfinite_diff_rel_step)rn   ro   rp   r   rq   r   rb  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  rZ  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   ir      /\(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   rb  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|| | qd}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  rO  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   rb  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   rY  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 rd}|d7 }|| || fD ].}| |f| }|
d7 }
||	k rX|}	|}d}qX|d k	r|| |d k	r,|
|kr,d}qq,t j|	|||
|dkdS )Nr   r   r  TFr  )r
   r  )rr   r  rn   r   r  rN   ra  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std S )Nr  r   r  r   ro   r   r   rb  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  rJ  rY  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{Gzr
  )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 	Nrl  rC   r   r   rp   rb   rO  ro   r   r   r   )r   r6   r
   r   r   rm  r  r   r8   rb  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   rO  r   r   rx   )r   r6   r>   r
   r   
himmelblaur<   r=   r   r8   rb  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 )
Nrl  rC   r8  r   r   r$  r   r   r   )r   r6   r
   r   r   rm  r   r8   rb  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   rm  r   r   r8   rb  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 qt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    r4  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 qd 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$   r6  r        ?皙?r  r   )fvalrO  r)   rx   rO  r-  r.  r;  )r
   r   _linesearch_powellr   r6   r  r   Zlinesearch_powellr]   r  r;  r-  r.  r0  xilr\   r_   r'   r   r   r   test_linesearch_powell  s<    
 
rA  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 qt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 qt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 qt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 qd S )Nc              	   S   s    t | t ddddg d S r5  r7  r   r   r   r   r     r   z0test_linesearch_powell_bounded.<locals>.<lambda>rG   r   g       r|   r  rC   r   r   r"   r$   r6  r  r8  r9  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    







rB  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?rJ  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)rC  rD  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    rG  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   rK  r   r   r   r   rH  D  s   rH  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   ru  r  rE  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   ru  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|   rM  rO  r  rP  r   r   r   r=   `  s    *&r=   gHzGѿgrF   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]   rS  r  r  r\   r   r   r   r   "test_minimize_multiple_constraintsk  s    rU  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]   rm  rp   r  rb   rI  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rqft||st|t|ksftqft|jts tq d S )Nr   rs   r   r   ru   rr   rb  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
isinstancerb  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   rV    s   rV  c                 G   s^   | \}}|\}}}}}}	}
}}}}}}||d  || |  ||d   ||  ||  |	 S r	  r   r  r   r   ru  r  rE  rc  rU  r   r\   r{  r  r   r   r~  r@  r  r   r   r   f1  s    r_  c                 G   sP   | \}}|\}}}}}}	}
}}}}}}|
 t || d || d   |  S r	  r   r^  r   r   r   f2  s    r`  c                 G   sP   | \}}|\}}}}}}	}
}}}}}}| t || d || d   |  S r	  r   r^  r   r   r   f3  s    ra  c                 G   s*   t | f| t| f|  t| f|  S r-   )r_  r`  ra  r  r   r   r   r   
brute_func  s    rc  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"   rO  r   r  rE   r  r|         ?g_}gi?)r   slicerrangesr   r6   rM   rR   r   r   r   rT     s    zTestBrute.setup_methodc                 G   s   t |f| S r-   )rc  )rS   r  r   r   r   r   rc    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
   bruterc  rh  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Nsrj  )r
   rk  rQ  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 )NTri  r"   )rn   rv   rj  workersr   r   )r
   rk  rc  rh  r   r   )rS   rl  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   rb  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
   rk  rh  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|   rf  r"   r  r   )r
   rk  rg  r   )rS   r\   rl  r   r   r   test_coerce_args_param  s    z TestBrute.test_coerce_args_paramN)
re   rf   rg   rT   rc  rm  ro  rq  r  rs  r   r   r   r   rd    s   

rd  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"   rt  r   rv  r   r   
objective2	  s    
z*test_cobyla_threadsafe.<locals>.objective2COBYLAc                      s   t jdg dS NrG   r   r  r   )
min_methodrx  r   r   
minimizer1	  s    z*test_cobyla_threadsafe.<locals>.minimizer1c                      s   t jdg dS r{  r  r   )r|  ry  r   r   
minimizer2	  s    z*test_cobyla_threadsafe.<locals>.minimizer2)concurrent.futuresrw  ZfuturesZThreadPoolExecutorrX   Zsubmitr   )Z
concurrentr}  r~  poolZtasksr  r   r   )r|  rx  ry  rw  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"   rJ  rE   )r  r   r3  Zarctan2r.   )rS   rj  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stq|d |kstqd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stqtjd gd tjgfD ]\}}d| _ tj| j||||dd}| j |d kst|d	 r|d kr|d |d k st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   re  r7  rz  r  r+   r   )r   r?  rC  r@  rD  rA  r   rB  )r
   r   r   r6   r   rn  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   r[  	  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st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st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_ebrC  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
   rm  r   r  r   r   r`   	  s    z%setup_test_equal_bounds.<locals>.gradc                    s    |  d S r-   r   rr  r  r   r   ra  	  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   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)re  r  r7  Fr  c                    s    | | fS r-   r   r   rX  r   r   r   

  r   z)setup_test_equal_bounds.<locals>.<lambda>c                 S   s   t t| |S r-   )listziprC  rD  r   r   r   r   
  r   r  )	r<  kwdsbound_typesr  	callbacksrC  rD  r?   r  )TT)r   r%   r(   r5  r6   r   r  r   )r?   rD  ra  r  r  r  r  Zc1aZc1bZc2aZc2br<  r  r  r  r  datar   )r  r]   r`   r  rC  r   setup_test_equal_bounds	  s\     
 
    r  z0Failures due to floating point issues, not logicr<  r  
bound_typer  r  ra  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
st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|	st|tsd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 aarchrC  rD  r?   r  r  z)Only SLSQP supports nonlinear constraints)r?   ro   r   r  ra  )ro   rp   r   r  r)   r   gMb@?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   rm  r   r8   r   rr   r   r   r,  rp   rn  rX  r   )ro   r  r  r  ra  rC  rD  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stt|j|dd	gd |  dkrdd }t	|t
j d}t j|||| |gd}|jdkst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|st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   rb  upperr   r   r  r  )	ro   r\   r   r?   r   rn   r  Znlcrb  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   rJ  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   rF  )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   Z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stt	|d	stt	|d
st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   rb  rr   rs   r   )
r
   ZbasinhoppingZdifferential_evolutionZshgoZdual_annealingdirectrX  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=   )r{  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   rF  )r   r
   r   r   r6   r   rr   r   )r\   r   r   r   r   r   r   test_gh12594  s     r  )erh   r:  r  Z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"  r4  rA  rB  rG  rH  r'  r<   r=   r>   r(  r)  rU  rV  r_  r`  ra  rc  rd  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
>
+'
