a
    a0]                    @   s  d 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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 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 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*G dd  d e$Z+G d!d" d"e$Z,G d#d$ d$e$Z-G d%d& d&e$Z.G d'd( d(e#Z/G d)d* d*Z0G d+d, d,Z1d-d. Z2G d/d0 d0Z3d1d2 Z4d3d4 Z5d5d6 Z6G d7d8 d8Z7d9d: Z8d;d< Z9d=d> Z:d?d@gZ;dAdBgZ<dCZ=dDdE Z>G dFdG dGZ?dHdI Z@dJdK ZAdLdM ZBdNdO ZCG dPdQ dQZDdRdS ZEG dTdU dUZFdVdW ZGG dXdY dYZHejIdZd[ ZJd\d] ZKd^d_ ZLd`da ZMdbdc ZNddde ZOdfdg ZPdhdi ZQdS )jz
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_assert_almost_equalassert_no_warningsassert_warnsassert_array_lesssuppress_warnings)raises)optimize)MINIMIZE_METHODSMINIMIZE_SCALAR_METHODS)LINPROG_METHODS)ROOT_METHODS)ROOT_SCALAR_METHODS)QUADRATIC_ASSIGNMENT_METHODS)ScalarFunction)
MemoizeJacshow_optionsc                  C   sz   dd } dd }t dg}t| ||}t|d tj| ||dd}t|d ttj| ||d	dd }t|d
k d S )Nc                 S   s   ddt |    S N   npexpx r   r/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/scipy/optimize/tests/test_optimize.pylogit#   s    ztest_check_grad.<locals>.logitc                 S   s    t |  dt |   d  S Nr      r   r   r   r   r   	der_logit&   s    z"test_check_grad.<locals>.der_logit      ?r   ư>)epsilon皙?Hz>)r   arrayr   Z
check_gradr   absr   )r   r!   x0rr   r   r   test_check_grad   s    

r+   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   sv   t g dg dg dg dg dg| _t g d| _t dt j| _t g d| _d| _d	| _	d	| _
g | _d S )
Nr   r   r   )r   r   r   )r   r   r   )r   r   r   )      ?333333?      ?   )        g\g)3?  r   )r   r'   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)r:   RuntimeErrorr   dotr4   logsumr   r5   r<   appendcopy)r>   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   )	r;   r   rA   r4   rB   rC   r   Z	transposer5   r>   r   rF   rG   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 N)r   rA   r4   rB   rC   r   TZdiagrJ   r   r   r   hess[   s    
"zCheckOptimize.hessc                 C   s   t | ||S rM   )r   rA   rO   r>   r   rK   r   r   r   hesspb   s    zCheckOptimize.hesspN)	__name__
__module____qualname____doc__r?   rI   rL   rO   rQ   r   r   r   r   r,   6   s   
r,   c                   @   s   e Z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 t| jdk| j t| jdk| j t	| jdd g dg dgddd d S )NFr9   disp
return_allr   CG)argsmethodjacoptionsr   funnfevnjevstatusT)r9   full_outputrX   retallr#   atol	      r       )r         r0   )r   g;ӱ.g)`$|;?+=r&   rf   rtol)use_wrapperr9   rX   r   minimizerI   r7   rL   fmin_cgr   r8   r   r:   r;   r<   )	r>   optsresparamsfopt
func_calls
grad_callswarnflagretvalr   r   r   test_cgh   s6     
z"CheckOptimizeParameterized.test_cgc                 C   sN   dd }t dddD ]2}tj||gdd}t|j t|jdgd	d
 qd S )Nc                 S   s   ddt d| d   d  S )Ng      @r         r0   r    r   )r*   r   r   r   rH      s    z8CheckOptimizeParameterized.test_cg_cornercase.<locals>.fg      r1   G   rZ   r\   r0   h㈵>rm   )r   Zlinspacer   ro   r   successr   r   )r>   rH   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 t| jdk| j t| jdk| j t	| jdd g dg dgddd d S )NFrW   BFGSr   r]   r\   r[   r^   r   r_   r]   Zhess_invr`   ra   rb   Tr[   r9   rc   rX   rd   r#   re   
         )r   g&/LgB__E7?)r   g$g
|3?rk   r&   rl   )rn   r9   rX   r   ro   rI   r7   rL   	fmin_bfgsr   r8   r   r:   r;   r<   )r>   rq   rr   rs   rt   ZgoptZHoptru   rv   rw   rx   r   r   r   	test_bfgs   s<    
z$CheckOptimizeParameterized.test_bfgsc              	      s   dd   fdd}dg}t jddd | jrTd| ji}tj ||dd	|d
d }ntj ||| jd}tt  |  W d    n1 s0    Y  d S )Nc                 S   s   t j|    S rM   )r   er   r   r   r   <lambda>       z?CheckOptimizeParameterized.test_bfgs_infinite.<locals>.<lambda>c                    s
    |  S rM   r   r   rI   r   r   r      r   r   ignore)overrX   r   r   r   r   rX   )	r   errstatern   rX   r   ro   r   r   isfinite)r>   fprimer)   rq   r   r   r   r   test_bfgs_infinite   s    
z-CheckOptimizeParameterized.test_bfgs_infinitec           
   	   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 t
| jdk| j t
| jdk| j d S )NFrW   r   Powellr[   r\   r^   r   r_   direcnitr`   rb   Tr   r#   re   r   gh㈵>   r   )rn   r9   rX   r   ro   rI   r7   fmin_powellr   r8   r   r:   r;   
r>   rq   rr   rs   rt   r   numiterru   rw   rx   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 g dg dg dg dg dgddd d S )NFrW   r   r   r   r   r_   r   r   r`   rb   Tr   "   '   )病~W?f"Bܿg%?)r   r   g:&?)gSϼW?gf"Bg{år?)r   r   {år?)gB?r   r   rk   r&   rl   )
rn   r9   rX   r   ro   rI   r7   r   r   r<   r   r   r   r   test_powell_gh14014   s2    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sJ t| || | j	dd | jdksJ | j
dksJ d S )Nc                 S   s   g | ]}t j t jfqS r   )r   pi).0_r   r   r   
<listcomp>  r   zBCheckOptimizeParameterized.test_powell_bounded.<locals>.<listcomp>FrW   r   r   )r[   boundsr\   r^   r   r_   r   r   r`   rb   r#   re      r   )r7   rn   r9   rX   r   ro   rI   r:   r   r8   r;   )
r>   r   rq   rr   rs   rt   r   r   ru   rw   r   r   r   test_powell_bounded  s$    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 t
| jdk| j t
| jdk| j t| jdd g dg dgddd d S )NFrW   r   Nelder-meadr   r   r_   r   r`   rb   Tr   r#   re      r   L   N   )g	dװ?g]fgt䝁?)gә ?g#=^goT?rk   r&   rl   )rn   r9   rX   r   ro   rI   r7   fminr   r8   r   r:   r;   r<   )	r>   rq   rr   rs   rt   r   ru   rw   rx   r   r   r   test_neldermead%  s6    z*CheckOptimizeParameterized.test_neldermeadc              
   C   sD  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 t| jdk| j t| jdk| j t	| jdd g dg dgddd d S )N)ri   r1   .r1   r   r%   FTr9   rX   rY   initial_simplexr   r   r   r   r_   r   r`   rb   Zallvecsr   r[   r9   rc   rX   rd   r   r#   re   d   2   4   )gIt?g?'ΛTgx8?)gҢ_׆?goMg囎|52?rk   r&   rl   )r   r6   r7   rangern   r9   r   ro   rI   r   r   r8   r   r:   r;   r<   )r>   simplexjrq   rr   rs   rt   r   ru   rw   rx   r   r   r   test_neldermead_initial_simplexD  sF    

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)r1   r    r    .r   r%   )r1   r1   Fr   r   r   r   Tr   )r   r6   r7   r   rD   rn   r9   assert_raises
ValueErrorr   ro   rI   r   )r>   Zbad_simplicesr   r   rq   r   r   r   #test_neldermead_initial_simplex_badl  s6    



z>CheckOptimizeParameterized.test_neldermead_initial_simplex_badc                 C   s6   ddi}t j| j| jd| jd|d}t|jdk d S )Nr9   	Newton-CGr   r\   r]   r[   r^   r   )r   ro   rI   r7   rL   r   rb   )r>   rq   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	 t| jd
k| j t| jdk| j t	| jdd g dg dgddd d S )NFrW   r   r   r   r   r   r#   re   rh      r1      (6-H=g?g4u3?r   g_g/N3?r&   rl   )rn   r9   rX   r   ro   rI   r7   rL   fmin_ncgr   r8   r   r:   r;   r<   r>   rq   rx   rs   r   r   r   test_ncg  s6    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	 t| jd
k| j t| jdk| j t
| jdd g dg dgddd d S )NFrW   r   r   )r\   r]   rO   r[   r^   r   )Zfhessr[   r9   rc   rX   rd   r#   re   rh      r1   r   r   r   r&   rl   )rn   r9   rX   r   ro   rI   r7   rL   rO   r   r   r8   r   r:   r;   r<   r   r   r   r   test_ncg_hess  s:    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	 t| jd
k| j t| jdk| j t
| jdd g dg dgddd d S )NFrW   r   r   )r\   r]   rQ   r[   r^   r   )Zfhess_pr[   r9   rc   rX   rd   r#   re   rh   r   r1   r   r   r   r&   rl   )rn   r9   rX   r   ro   rI   r7   rL   rQ   r   r   r8   r   r:   r;   r<   r   r   r   r   test_ncg_hessp  s:    z)CheckOptimizeParameterized.test_ncg_hesspN)rR   rS   rT   ry   r   r   r   r   pytestmarkxfailr   r   r   r   r   r   r   r   r   r   r   r   r   rV   f   s   "#
 (!"rV   c                  C   sR   d} t t| d. tjdd tddgdd W d    n1 sD0    Y  d S )Nz@The user-provided objective function must return a scalar value.matchc                 S   s   | S rM   r   r   r   r   r   r     r   z.test_obj_func_returns_scalar.<locals>.<lambda>r   r   r|   )r   r   r   ro   r   r'   r   r   r   r   test_obj_func_returns_scalar  s    r   c               	   C   sD   dd } t jj| ddgdddd tt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     r   z-test_neldermead_xatol_fatol.<locals>.<lambda>r   r    MbP?)r9   ZxatolZfatol)xtolftolr9   )r   Z	_minimizeZ_minimize_neldermeadr   DeprecationWarningr   r   r   r   test_neldermead_xatol_fatol   s    r   c                  C   sR   dd } g d}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   rC   r   r   r   r   r     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Τ?Nelder-Meadr|   FZadaptiveTr\   r^   )r   ro   r   r   )rI   p0rr   r   r   r   test_neldermead_adaptive  s    
r   c                  C   s  dd } d}g d}t tj" tj| ||dd}W d    n1 sF0    Y  t|jtdgt| dd	 t	|j
d
 t	|jd g dg dg dg}t tj( tj| ||dd|id}W d    n1 s0    Y  t|jtg ddd	 t	|j
d t	|jd d S )Nc                 S   s   t | d S r   r   r   r   r   r   r     r   z3test_bounded_powell_outsidebounds.<locals>.<lambda>)r   r   r   r   )r0   gr   r   r\   r2   r#   re   Tr   r   r   r   )r   r   r   )r   r   r   r   )r   r\   r^   )g      r   r   Fri   )r   r   OptimizeWarningro   r   r   r   r'   lenr   r   rb   )rI   r   r)   rr   r   r   r   r   !test_bounded_powell_outsidebounds  s"    0 $r   c                  C   s  dd } d}g d}ddd}t j| |d|d}t|jd	d
d t|jd	d
d t j| |||dd}tg d}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g d}t|j|d
d t|j| |d
d dd } dgd }g d}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 g d}dgd }t	t j
" t j| ||dd}W d    n1 s0    Y  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   )i皙)r   gffffff"@)r   gffffff@g/)g gffffff?r   r   绽|=r   r   r   r   r2   r#   re   )r^   r   r\   )r   r   r   r   r   )Nr   r   r   )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    )r   sincosr   tr   r   r   rI   ]  s    D.z+test_bounded_powell_vs_powell.<locals>.func)r   r   r1   )rj   rj   rj   r|   r   g8:}?r   )gb4F@g:gW?@)r   ro   r   r   r_   r   r'   infr`   r   r   )rI   r   r)   r^   Z
res_powellZres_bounded_powellrK   r   r   r   test_bounded_powell_vs_powell8  s`    




&r   c                  C   s   dt j dfgd dddd} g d}dd	 }tj||fi | }t|jd
dd dd }tj||fi | }t|jd dd }tj||fi | }t|jddd dd }t j dfgd | d< tj||fi | }t|jddd d S )Nr   g    .Ar1   :0yE>r   )r\   r   r^   r-   c                 S   s   t |  S rM   r   r   r   r   r   r     r   z8test_onesided_bounded_powell_stability.<locals>.<lambda>g    `F-C6?re   c                 S   s,   t t | d  t | dkr&dnd S )Nr%   r   r   r   r   r(   rC   allr   r   r   r   rH     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   rH     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   rH     s    :g     @@r   g 4&k\)r   r   r   ro   r   r_   )kwargsr)   rH   rr   r   r   r   &test_onesided_bounded_powell_stability  s$    r   c                   @   s   e Zd ZdZdZdS )TestOptimizeWrapperDispTNrR   rS   rT   rn   rX   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                   @   sB  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d!d" Zejd#g d$e d%d& Zejd#g d'd(d) Zd*d+ Zejd#g d,d-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zejd#g d7d8d9 Z ejd#g d:d;d< Z!d=S )>TestOptimizeSimplec                 C   sn   dd }dd }t jg}t jddd4 tj|||dd}tt || W d    n1 s`0    Y  d S )Nc                 S   s   | S rM   r   r   r   r   r   r     r   z2TestOptimizeSimple.test_bfgs_nan.<locals>.<lambda>c                 S   s
   t | S rM   r   Z	ones_liker   r   r   r   r     r   r   )r   invalidFr   )r   nanr   r   r   r   isnan)r>   rI   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 d    n1 s60    Y  tt |d  t|d du  d	d }d
d }t jdd  tj|d|d}W d    n1 s0    Y  tt |d  t|d du  d S )Nc                 S   s   t jS rM   r   r  r   r   r   r   r     r   z9TestOptimizeSimple.test_bfgs_nan_return.<locals>.<lambda>r   r  r   r_   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 rM   r  r   r   r   r   r     r   )r]   )r   r   r   ro   r   r  )r>   rI   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 )Nr.   r   F)r$   r[   r9   rX   r#   re   )r   sqrtspacingrandomrandr   r8   r   r   rI   r7   r9   r   )r>   r$   rs   r   r   r   test_bfgs_numerical_jacobian  s    "z/TestOptimizeSimple.test_bfgs_numerical_jacobianc                 C   s^   g d}g d}t ||D ]<\}}tj| j| j||d}t| |j| | jdd qd S )N)r   rZ   TNCz2-point3-pointN)r\   r]   r#   re   )		itertoolsproductr   ro   rI   r7   r   r   r8   )r>   methodsjacsr\   r]   r   r   r   r   test_finite_differences  s    z*TestOptimizeSimple.test_finite_differencesc                 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r.   r   r   r   r   r   rH     s    z/TestOptimizeSimple.test_bfgs_gh_2169.<locals>.f      $@Fr   r.   r   rm   rf   )r   r   r   )r>   rH   xsr   r   r   test_bfgs_gh_2169  s    z$TestOptimizeSimple.test_bfgs_gh_2169c                    s*    fdd}t   tj|ddddd d S )Nc                    s2   t | }| vsJ  | d| d  d|  fS )Nr   r       )floatadd)r   Zxpseenr   r   rH     s    
z:TestOptimizeSimple.test_bfgs_double_evaluations.<locals>.fibfgsTr&   )r\   r]   tol)setr   ro   r>   rH   r   r  r   test_bfgs_double_evaluations  s    z/TestOptimizeSimple.test_bfgs_double_evaluationsc                 C   s   t j| j| j| jd| jd}|\}}}t| || | jdd t| j	dk| j	 t| j
dk| j
 t| jdd g dg d	gd
dd d S )Nr   )r[   r9   r#   re   rh   r   r1   )g><gwT볹gUuAX?)r2   gHg!mʲ3?rk   r&   rl   )r   fmin_l_bfgs_brI   r7   rL   r9   r   r8   r   r:   r;   r<   r>   rx   rs   rt   dr   r   r   test_l_bfgs_b  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_gradr9   r#   re   )r   r%  rI   r7   r9   r   r8   r&  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 rM   )rI   rL   r   r=   r   r   r_   ,  s    z4TestOptimizeSimple.test_l_bfgs_b_funjac.<locals>.funr9   r#   re   )r   r%  r7   r9   r   rI   r8   )r>   r_   rx   rs   rt   r'  r   r=   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 t	|j
d	u  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 r  )r   r_   r   r=   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   rosenr_   r   r>   r   r   r   r   __call__@  s    zCTestOptimizeSimple.test_l_bfgs_b_maxiter.<locals>.Callback.__call__NrR   rS   rT   r,  r/  r   r   r   r   Callback:  s   r1  r2   l-bfgs-br9   r   )r\   callbackr^   r   Fz+STOP: TOTAL NO. of ITERATIONS REACHED LIMIT)r   ro   r-  r   r   r   r   r_   rb   r   r   message)r>   r1  crr   r   r   r   test_l_bfgs_b_maxiter7  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sTJ d | _| _	tj| j| jd|d}| j|jksJ t| |j| | jdd d | _| _	tj| j| jd	d|d
}| j|jksJ t| |j| | jdd d S )NF)rX   r9   L-BFGS-Br\   r]   r^   r#   re   r   r   r  r]   r\   r^   )r9   r   ro   rI   r7   rL   r   r   r8   r;   ra   r:   r`   )r>   rq   r*   rar   r   r   test_minimize_l_bfgs_bQ  s2    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 u rN|}nt||k  t|| | j	|d qd S )N)r%   r   r&   r   F)rX   r9   r   r7  r8  r~   )
r9   r   ro   rI   r7   rL   r   r   r   r8   )r>   Zv0r!  rq   r   vr   r   r   test_minimize_l_bfgs_b_ftolm  s    z.TestOptimizeSimple.test_minimize_l_bfgs_b_ftolc                 C   s8   t jt jtddgdt jdddd}t|j  d S )N333333r.   r7  Fr   )rX   Zmaxlsr8  )r   ro   r-  r   r'   	rosen_derr   r   )r>   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 )	Nrh   r3   c                    s    | } | |S rM   )rD   )r   valuerH   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 rM   r   )r   iyr   r   r   	<genexpr>  r   zPTestOptimizeSimple.test_minimize_l_bfgs_b_maxfun_interruption.<locals>.<genexpr>)
r   r-  r?  r   fullr%  max	enumerateminr   )r>   gr)   rD  lowZmediumhighr<  krF  targetZxminr   r'  r   rB  r   *test_minimize_l_bfgs_b_maxfun_interruption  s    
"z=TestOptimizeSimple.test_minimize_l_bfgs_b_maxfun_interruptionc                 C   sB   ddd}g d}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 ]B}t|}|||< | |g|R  }|
d7 }
||	k rb|}	|}d}qb|d ur|| |d urF|
|krFd} qqFqtj|	|||
|dkdS )Nr   r   TFr_   r   r   r`   r   )r   r   sizerE   r   OptimizeResult)r_   r)   r[   maxfevstepsizer9   r3  r^   bestxbestyfuncallsniterimprovedstopZdimstestxtestyr   r   r   custmin  s6    

z/TestOptimizeSimple.test_custom.<locals>.custmin)g??皙?g?g333333?皙?rX  r   r.   r   r  )r   Nr%   r   N)r   ro   r-  dictr   r   )r>   rb  r)   rr   r   r   r   test_custom  s      
zTestOptimizeSimple.test_customc                    s<   ddg d fdd}ddg}t jt j|| d d S )N)r   r    )r   r1   constraintsc                    s(   |d  u sJ |d u s J t  S )Nr   ri  r   rV  )r_   r)   r^   r   ri  r   r   rb    s    z0TestOptimizeSimple.test_gh10771.<locals>.custminr   )r\   r   ri  )r   ro   r-  )r>   rb  r)   r   rk  r   test_gh10771  s    zTestOptimizeSimple.test_gh10771c                 C   s   dd }dd }dD ]v}|dv r&d }n|}t j|ddg|d|d	}t j|ddg|d
|d	}t||j||jk d|||j||jf  qd S )Nc                 S   s$   | \}}|d |d  |d  d S )Nr    ri   r   r   zr   rH  r   r   r   rI     s    z<TestOptimizeSimple.test_minimize_tol_parameter.<locals>.funcc                 S   s:   | \}}t d| |d  d|d   d|d  | gS )Nr    ri   r1   r   r'   rm  r   r   r   dfunc  s    z=TestOptimizeSimple.test_minimize_tol_parameter.<locals>.dfunc	nelder-meadpowellcgr   	newton-cgr2  tnccobylaslsqprr  rs  rw  r   r   )r]   r!  r\   r.   z%s: %s vs. %s)r   ro   r   r   )r>   rI   rp  r\   r]   Zsol1Zsol2r   r   r   test_minimize_tol_parameter  s    z.TestOptimizeSimple.test_minimize_tol_parameterr\   )r   r   rp   r   r   r%  fmin_tnc
fmin_slsqpc           	         s^   dkrd S  dv rdd }nt j}t j}t j}td}i } drtt  } dkrdd|d	< q d
krvd|d< qd|d< n2 fdd} dkrtdd|d< ntdd|d<  dv r||d< n* dv r||d< n dv r||d< ||d< g fdd}|||fd|i| t	t
dk t	tdd D  t	td d tdD   d S )!Nrw  )r{  r%  c                 S   s   t | t | fS rM   )r   r-  r?  r   r   r   r   r     r   zHTestOptimizeSimple.test_minimize_callback_copies_array.<locals>.<lambda>r   r   r|  r   iterr{  r   rF  r9   c                     s    |d< t j| i |S )Nr\   r   ro   )akwr|   r   r   routine  s    zGTestOptimizeSimple.test_minimize_callback_copies_array.<locals>.routinerv  )rF  r^   r*  )r   r   )ru  r]   trust-krylovtrust-exact	trust-ncgdoglegtrust-constrrO   c                    s     | t| f d S rM   )rD   r   rE   )r   r[   r   )resultsr   r   r3  "  s    zHTestOptimizeSimple.test_minimize_callback_copies_array.<locals>.callbackr3  r    c                 s   s    | ]\}}t ||kV  qd S rM   )r   r   r   r   rH  r   r   r   rI  *  r   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   rI  +  s   )r   r-  r?  
rosen_hessr   r6   
startswithgetattrrg  r   r   r   anyr  combinations)	r>   r\   rI   r]   rO   r)   r   r  r3  r   )r\   r  r   #test_minimize_callback_copies_array  sF    	










z6TestOptimizeSimple.test_minimize_callback_copies_arrayrq  c                 C   s   dd }dd }t dg}||}|}|dv r4d }tj||||tddd	}t||j|j |d
krrt	d t
||j|k d S )Nc                 S   s   | d d S r   r   r   r   r   r   rI   5  s    z1TestOptimizeSimple.test_no_increase.<locals>.funcc                 S   s   d| d  d d S )Nr    r   r   r   r   r   r   r   bad_grad8  s    z5TestOptimizeSimple.test_no_increase.<locals>.bad_grad       @ry  r  r*  r9  rx  zSLSQP returns slightly worse)r   r'   r   ro   rg  r   r   r_   r   r   r   )r>   r\   rI   r  r)   Zf0r]   r   r   r   r   test_no_increase.  s    
z#TestOptimizeSimple.test_no_increasec                 C   sX   dd }dd }t g d}tj||dd|dd	}t|jt g d
d dd d S )Nc                 S   s   t | tg d d S )N)r.   r  g      @g      @r    )rC   r   r'   r   r   r   r   rH   L  s    z7TestOptimizeSimple.test_slsqp_respect_bounds.<locals>.fc                 S   s:   t g dg dg}t t || t ddg | gS )N)r   r   r   r   )r  r   r   r   r   )r   r'   ZconcatenaterA   r   r  r   r   r   consO  s    z:TestOptimizeSimple.test_slsqp_respect_bounds.<locals>.cons)r0   r.   r"   r  rx  ineqtyper_   r\   ri  )r2   r    r   r   r1   g-q=re   )r   r'   r   ro   r   r   )r>   rH   r  r)   rr   r   r   r   test_slsqp_respect_boundsJ  s    
z,TestOptimizeSimple.test_slsqp_respect_bounds)r   r   rZ   r   r   r7  SLSQPr  r  r  r  r  c                 C   s   d}t d}ttj|dtjtjd d }|t|dd}|dv rL|j|d< n|dv rh|j|d< |j	|d	< tj
|j|fi |}|j|ksJ |j|jksJ t|d
r|j|jksJ |dkr|jdksJ d S )Nri   r   r   r*  r   )r   r]   r  rO   ra   r  rg   )r   r6   r   r   r-  r?  r  rg  rL   rO   ro   r_   r   r`   hasattrra   Zngevrb   )r>   r\   MAXITERr)   Zsfr   r   r   r   r   test_respect_maxiterX  s$    



z'TestOptimizeSimple.test_respect_maxiterc           	   
   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`J d S )
Nri   c                 S   s,   t d| d  d| d   d| d   gS )N皙?r   皙?r   Q?r    ro  r   r   r   r   r     r   zWTestOptimizeSimple.test_respect_maxiter_trust_constr_ineq_constraints.<locals>.<lambda>r  r  r   r  r*  )ri  r]   rO   r\   r^   )	r   r-  r?  r  r   r6   ro   rg  r   )	r>   r  rH   r]   rO   r_   r  r)   r   r   r   r   2test_respect_maxiter_trust_constr_ineq_constraintsz  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 ]}	t|	j 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   rH     s    z6TestOptimizeSimple.test_minimize_automethod.<locals>.fc                 S   s   | d S r   r   r   r   r   r   r    s    z9TestOptimizeSimple.test_minimize_automethod.<locals>.consr  r  r  )ri  )r   r   r   )ri  r   r   r   r   r&   re   r    r   )r   r'   r   ro   r   r   r   r   )
r>   rH   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   sH   dd }ddd}t g d}t jt|}tj||||dd d S )	Nc                 S   s   t | | d S r   r   r   r5  r   r   r   Y  s    z=TestOptimizeSimple.test_minimize_coerce_args_param.<locals>.Yc                 S   s   d| |  S r   r   r  r   r   r   dY_dx  s    zATestOptimizeSimple.test_minimize_coerce_args_param.<locals>.dY_dx)r1   r   ri   r   r   rg   r    r   r   r1   r   r   )r]   r[   r\   )N)r   r'   r  Zrandnr   r   ro   )r>   r  r  r5  Zxinitr   r   r   test_minimize_coerce_args_param  s
    
z2TestOptimizeSimple.test_minimize_coerce_args_paramc           	         s  g d}g d} fdd}fdd}t ||D ]\}|dv rXtd d	}nt }d
k rp|dv rpq8dgd g tj||||d}d| |}t|j| t|j	dg|d t|j
dk| d
kr8|dv rt d d|d n t d dko d dk | q8q8d S )N)gJz5r   gd~QJ)rZ   r   r7  r   c                    s`    d d u 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    )r(   rK  AssertionErrorr   Zfirst_step_sizescaler)   r   r   rH     s
    z7TestOptimizeSimple.test_initial_step_scaling.<locals>.fc                    s   t  | d d  gS )Nr   r   ro  r   )r  r   r   rN    s    z7TestOptimizeSimple.test_initial_step_scaling.<locals>.g)rZ   r   r   )Zgtolr   )r7  r         r9  z{0} {1}: {2}: {3}r.   err_msgr1   r   g)\(?r0   )r  r  rg  r   ro   formatr   r   r   r   r   )	r>   Zscalesr  rH   rN  r\   r^   rr   r  r   r  r   test_initial_step_scaling  s:    z,TestOptimizeSimple.test_initial_step_scaling)rr  rs  rt  r   ru  r2  rv  rw  rx  r  r  r  r  r  c                    sD  t jd dg dd } fdd}dd }d	d
 }t dg}|dv }|dv }||g}	|rd|gn|d g}
|rv|gn|d g}t jdd t |}|td |td |td t	
|	|
|D ]8\}}}dg tj|||||tddd}t|jd qW d    n1 s0    Y  W d    n1 s60    Y  d S )N  r   c                 S   s   t jS rM   r  r   r   r   r   rI     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  r  r   countr   r   func2  s    z1TestOptimizeSimple.test_nan_values.<locals>.func2c                 S   s   t dgS Nr.   ro  r   r   r   r   rL     s    z0TestOptimizeSimple.test_nan_values.<locals>.gradc                 S   s   t dggS r  ro  r   r   r   r   rO      s    z0TestOptimizeSimple.test_nan_values.<locals>.hessr.   ru  r  r  r  r  r  r  r  r  r   r  delta_grad == 0.*.*does not use Hessian.*.*does not use gradient.*r  r*  )r]   rO   r\   r^   F)r   r  seedr'   r   r	   filterUserWarningRuntimeWarningr  r  r   ro   rg  r   r   )r>   r\   rI   r  rL   rO   r)   Z
needs_gradZ
needs_hessfuncsZgradsZhessssuprH   rN  hr   r   r  r   test_nan_values  s,    z"TestOptimizeSimple.test_nan_values)rr  rt  r   r2  rv  rw  rx  r  r  r  r  r  c              	   C   s   d  }}|dv r| j }|dv r$| j}tjddZ t 4}|td tj| j	| j
|||d W d    n1 sr0    Y  W d    n1 s0    Y  tdt| jD ].}t| j|d  | j| rtd|qd S )	Nr  r  r   r  r  r\   r]   rO   r   z Duplicate evaluations made by {})rL   rO   r   r   r	   r  r  r   ro   rI   r7   r   r   r<   Zarray_equalr@   r  )r>   r\   r]   rO   r  rG  r   r   r   test_duplicate_evaluations  s    Bz-TestOptimizeSimple.test_duplicate_evaluationsN)"rR   rS   rT   r  r	  r  r  r  r$  r(  r)  r+  r6  r;  r=  r@  rS  rh  rl  rz  r   r   parametrizer   r  r  r  r  r  r  r  r  r  r  r   r   r   r   r     sH   			&
=

5
,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   r8   r=   r   r   r   r?   5  s    zTestLBFGSBBounds.setup_methodr  c                 C   s    d| |d | |d |   S )Nr.   r   r   r   rP   r   r   r   r_   9  s    zTestLBFGSBBounds.func                 C   s   ||d  S r   r   rP   r   r   r   r]   <  s    zTestLBFGSBBounds.jacc                 C   s   |  ||| ||fS rM   )r_   r]   rP   r   r   r   fj?  s    zTestLBFGSBBounds.fjc                 C   sL   t j| jddg| j| jd\}}}t|d dk|d  t|| jdd d S )Nr   r   )r   r   rw   taskr#   re   )r   r%  r_   r]   r   r   r   r8   r>   r   rH   r'  r   r   r   test_l_bfgs_b_boundsB  s    z%TestLBFGSBBounds.test_l_bfgs_b_boundsc                 C   sJ   t j| jddgd| jd\}}}t|d dk|d  t|| jdd d S )	Nr   r   r  )r[   r   rw   r  r#   re   )r   r%  r  r   r   r   r8   r  r   r   r   r+  I  s
    z%TestLBFGSBBounds.test_l_bfgs_b_funjacc                 C   sF   t j| jddgd| j| jd}t|d |d  t|j| jdd d S )	Nr   r   r7  r\   r]   r   r   r4  r#   re   )	r   ro   r_   r]   r   r   r   r   r8   )r>   rr   r   r   r   test_minimize_l_bfgs_b_boundsP  s
    z.TestLBFGSBBounds.test_minimize_l_bfgs_b_boundsr   )r   r   r  c                 C   sN   t jtdd, tj| jddgd| j|d W d    n1 s@0    Y  d S )Nz
.*bounds.*r   r   r   r7  r  )r   r
   r   r   ro   r_   r]   )r>   r   r   r   r   'test_minimize_l_bfgs_b_incorrect_boundsW  s    z8TestLBFGSBBounds.test_minimize_l_bfgs_b_incorrect_boundsc              
   C   sr   g d}ddg}t ||D ]P\}}tj| jddg|d|| jdd id}t|d	 |d
  t|j| j	dd qd S )Nr  r  r   r   r   r7  Zfinite_diff_rel_step)r[   r\   r]   r   r^   r   r4  r#   re   )
r  r  r   ro   r_   r   r   r   r   r8   )r>   r  Zargssr]   r[   rr   r   r   r    test_minimize_l_bfgs_b_bounds_FDa  s    z1TestLBFGSBBounds.test_minimize_l_bfgs_b_bounds_FDN)r  )r  )r  )rR   rS   rT   r?   r_   r]   r  r  r+  r  r   r   r  r  r  r   r   r   r   r  4  s   



r  c                   @   sx   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g ddd ZdS )TestOptimizeScalarc                 C   s
   d| _ d S )Nr"   )r8   r=   r   r   r   r?   r  s    zTestOptimizeScalar.setup_methodr"   c                 C   s   || d d S )zObjective functionr    rd  r   )r>   r   r  r   r   r   r_   u  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 S )	Nr#   re   r  r   ZbrackTrc   r   ir      )r   brentr_   r   r8   r.  r   r   r   
test_brenty  s    zTestOptimizeScalar.test_brentc                 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 t j| jdd	}t|| j g d
}|D ]H}t j| jddd}t j| j|dd}|d |d  }}t|| | qd S )Nr#   re   r  r  Tr  r   r  r!  )r   r   r   )r9   rc   r    )r   goldenr_   r   r8   r   )r>   r   Zmaxiter_test_casesr9   r)   Znfev0r`   r   r   r   test_golden  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   re   r   r#   )	r   	fminboundr_   r   r8   r   r'   r   r   r.  r   r   r   test_fminbound  s     z!TestOptimizeScalar.test_fminboundc                 C   sn   t jtdd& t| jtdd W d    n1 s:0    Y  t| jdtd}t	|| j
dd d S )Nz.*must be scalar.*r   )r   r    r   r   r#   re   )r   r
   r   r   r  r_   r   r6   r'   r   r8   r.  r   r   r   test_fminbound_scalar  s    4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   r_     s    z,TestOptimizeScalar.test_gh11207.<locals>.funr   )r   r  )r>   r_   r   r   r   test_gh11207  s    zTestOptimizeScalar.test_gh11207c                 C   s6  t | jj}t|| jdd t j| jdd}t|j t j| jdtddd}t|j  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#   re   ZBrentr|   r1   r*  r   r  )r"   )bracketr[   r\   )r\   r[   r  r  )r   r   ZBounded)r   r[   r\   r   r   )r   r   boundedr   r"   )r   r   )r   r\   r[   r    r   )r   minimize_scalarr_   r   r   r8   r   r   rg  r   r'   r   r   r6   r.  r   r   r   test_minimize_scalar  sr    








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 ]0}| |g|R  }|
d7 }
||	k rX|}	|}d}qX|d ur|| |d ur,|
|kr,d}qq,t j|	|||
|dkdS )Nr   r   r  TFrT  rj  )r_   r  r[   rW  rX  r9   r3  r^   rY  rZ  r[  r\  r]  r^  r`  ra  r   r   r   rb    s0    
z?TestOptimizeScalar.test_minimize_scalar_custom.<locals>.custmin)r   ri   re  rf  )r  r\   r^   r#   re   )r   Nr%   r   N)r   r  r_   rg  r   r   r8   )r>   rb  rr   r   r   r   test_minimize_scalar_custom  s      

z.TestOptimizeScalar.test_minimize_scalar_customc                 C   s   t j| jdd d S )Nr"   )r[   )r   r  r_   r=   r   r   r   &test_minimize_scalar_coerce_args_param  s    z9TestOptimizeScalar.test_minimize_scalar_coerce_args_paramr\   )r  r  r  c              
      s   t jd dg  fdd}d}d}t jdd t `}|td	 |td
 |td dg tj	||||t
ddd}t|jd W d    n1 s0    Y  W d    n1 s0    Y  d S )Nr  r   c                    s<    d  d7  <  d dkr"t jS | d dt |   S d S )Nr   r   ri   r    r%   )r   r  r   r   r  r   r   rI     s    z0TestOptimizeScalar.test_nan_values.<locals>.func)r   r   r   r   r   r  r  r  r  r  r*  )r  r   r\   r^   F)r   r  r  r   r	   r  r  r  r   r  rg  r   r   )r>   r\   rI   r  r   r  r   r   r  r   r    s    z"TestOptimizeScalar.test_nan_valuesN)r"   )rR   rS   rT   r?   r_   r  r  r  r  r  r  r  r  r   r   r  r  r   r   r   r   r  q  s   
<#r  c                   C   s   t ttjtjdd d S )Ng{Gzr  )r   r   r   r  r   r   r   r   r   r   test_brent_negative_tolerance4  s    r  c                   @   s   e Zd Zdd Zdd ZdS )TestNewtonCgc                 C   sV   t ddg}tjtj|tjtjddd}t|j|j	 t
|jt ddgdd d S )	Nr>  r.   r}   r   )r]   rO   r!  r\   r   r   r~   )r   r'   r   ro   r-  r?  r  r   r   r4  r   r   r>   r)   r   r   r   r   test_rosenbrock9  s    
zTestNewtonCg.test_rosenbrockc                 C   sR   t t}tjt|ttddd}t|j	|j
 t|jtdd t|jtdd d S )Nr   r#   )r]   rO   r\   r!  r   r~   re   )r   r'   himmelblau_x0r   ro   
himmelblauhimmelblau_gradhimmelblau_hessr   r   r4  r   r   himmelblau_xoptr_   himmelblau_minr  r   r   r   test_himmelblauC  s    
zTestNewtonCg.test_himmelblauN)rR   rS   rT   r  r  r   r   r   r   r  8  s   
r  c                  C   s  t j j} tg d}tg d}tg d}tg d}|tg dddf|tg dd	d
f|tg dddf|tg dddf|tg dd	d
f|tg dddf|tg dddf|tg dddf|tg ddd	f|tg dddf|tg dddf|tg ddd	f|tg dddff}|D ]<\}}}}	| ||||\}
}t|
|dd t||	dd qLttj d	tj dg}ttjd
dtjg}|tg dtj tjf|tg dd	d
f|tg dtj df|tg ddtjf|tg dd	d
f|tg ddtjf|tg dtj tjf|tg ddd	f|tg dtj df|tg ddtjf|tg ddd	f|tg ddtjff}|D ]<\}}}}	| ||||\}
}t|
|dd t||	dd qd S )N)333333r   rz   r  )r   r   ffffff@r1   r2   r   r   r   )r2   r    r  r   r.   r   r   r   r  r   r2   r   r   r   r   r   r2   r   r   r   rz   r  r2   r   r   r   r  r1   )r.   r   r   r   )r.   r   r   r    r"   )r  r   r   r    gffffff?g333333@)r.   r   r   r   r#   re   g333333)r   Z_line_for_searchr   r'   r   r   )Zline_for_searchlower_boundupper_boundr)   x1	all_testsr   alphaZlminZlmaxmimar   r   r   test_line_for_searchP  sT    r  c               
   C   sz  t j j} dd }tg d}||}ttj gd }ttjgd }tg ddftg ddftg d	d
ftg ddftg ddftg ddftg d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 g d d S N)r  r  r"   皙ٿr    r   rC   r'   r   r   r   r   r     r   z(test_linesearch_powell.<locals>.<lambda>r  ri   r  r   r  r    r  r"   r  r  r  r   r   r         ?r2   r   r   r   皙?r  r   r   r   r}   )fvalr!  r#   re   r!  r  r  r	  )r   _linesearch_powellr   r'   r   r   Zlinesearch_powellrI   r   r	  r  r  r  xilrH   rK   	directionr   r   r   test_linesearch_powell  s:    

r  c               
   C   s  t j j} dd }tg d}||}tdgd }tdgd }tg ddftg d	d
ftg ddftg ddftg ddftg ddftg d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g ddftg d	dftg ddftg ddftg ddftg ddftg ddff}|D ]`\}}| |||d|||d\}	}
}t|	||| dd t|
|| dd t||| dd qtg d}||}tg dd ftg d	dftg ddftg dd!ff}|D ]h\}}| |||d|||d\}	}
}t|	||||  dd t|
|||  dd t||| dd qtg d}||}tdtj tj dg}ttjdtjdg}tg ddftg d	dftg ddftg ddftg ddftg ddftg ddff}|D ]`\}}| |||d|||d\}	}
}t|	||| dd t|
|| dd t||| dd qtg d}||}tg dd ftg d	dftg ddftg dd!ff}|D ]h\}}| |||d|||d\}	}
}t|	||||  dd t|
|||  dd t||| dd qjd S )"Nc                 S   s   t | t g d d S r   r  r   r   r   r   r     r   z0test_linesearch_powell_bounded.<locals>.<lambda>r  g       ri   r  r  r   r  r    r  r"   r  r  r  r  r  r  r  r  r}   r
  r#   re   g333333ӿr1   g?rc  r/   g333333ÿ)r  r   r   r    gffffff?g333333)r   r  r   r'   r   r   r  r   r   r   test_linesearch_powell_bounded  s    







r  c                   @   s   e Zd Zdd ZdS )	TestRosenc                 C   sH   t g d}t g d}t||}t t||}t|| d S )N)r1   ri   r   )r    r    r    )r   r'   r   rosen_hess_prodrA   r  r   )r>   r   rK   hpZdothpr   r   r   	test_hess2  s
    zTestRosen.test_hessN)rR   rS   rT   r  r   r   r   r   r  0  s   r  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.
       rh   r   )rK   r   rH  r  br   r   r   r  ;  s    r  c                 C   sn   | \}}t d|d  d| |  d|  d|d   d d|d  d| |  d|d   d|  d gS )Nri   r1   *   r          r   ro  rK   r   rH  r   r   r   r  F  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    ri   r  r  ro  r  r   r   r   r  L  s    *&r  gHzGѿgr1   r    r2   c                  C   sj   dd } dd }dd }d| dd|dd|df}d	d
 }t j|g dd|d}t|jg ddd d S )Nc                 S   s0   t dd| d   d| d   d| d   gS )N   r  r   r  r   r  r    ro  r   r   r   r   rI   Y  s    z0test_minimize_multiple_constraints.<locals>.funcc                 S   s   t | d gS r   ro  r   r   r   r   func1\  s    z1test_minimize_multiple_constraints.<locals>.func1c                 S   s   t | d gS r   ro  r   r   r   r   r  _  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   f  r   z4test_minimize_multiple_constraints.<locals>.<lambda>r   r  r  )}   r   r   r   re   )r   ro   r   r   )rI   r  r  r  rH   rr   r   r   r   "test_minimize_multiple_constraintsW  s    r   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   )r2   r  )r)   r   r-  rI   r?  r]   r  rO   r  rQ   r   r=   r   r   r   r?   o  s    
z)TestOptimizeResultAttributes.setup_methodc              
   C   s   g d}ddgi}t D ]}t <}|td tj| j| j|| j| j	| j
d}W d    n1 sb0    Y  |D ]8}||v r||| v rqpt||sJ t|t|v  qpt|jtsJ qd S )N)r   r`   r   r   rb   r_   r4  rw  r   z7Method .+ does not use (gradient|Hessian.*) information)r\   r]   rO   rQ   )r   r	   r  r  r   ro   rI   r)   r]   rO   rQ   r  r   dir
isinstancer4  str)r>   
attributesskipr\   r  rr   	attributer   r   r   test_attributes_presentw  s"    
$z4TestOptimizeResultAttributes.test_attributes_presentN)rR   rS   rT   r?   r(  r   r   r   r   r!  l  s   r!  c                 G   s^   | \}}|\}}}}}}	}
}}}}}}||d  || |  ||d   ||  ||  |	 S r   r   rn  rs   r   rH  r  r  r5  r'  r   rH   rN  r  rG  r   rQ  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    r,  c                 G   s0   t | g|R  t| g|R   t| g|R   S rM   )r*  r+  r,  )rn  rs   r   r   r   
brute_func  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 )	TestBrutec                 C   s4   d| _ tdddtdddf| _tddg| _d S )N)r    r1   rh   r   rg   r   ,   r   r    r  r   r   r0   r   ri   g      ?g_}gi?)rs   slicerrangesr   r'   r8   r=   r   r   r   r?     s    zTestBrute.setup_methodc                 G   s   t |g|R  S rM   )r-  )r>   rn  rs   r   r   r   r-    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g| jR  dd t jt| j| jdt jd}t|d | jdd t|d t| jg| jR  dd t j| j| j| jdt jd}t|d | jdd d S )NTr[   rc   finishr   r   re   r   )	r   bruter-  r1  rs   r   r   r8   ro   )r>   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 t| jdk t | jd dk | d S )Nr   r   r    )r   r   shaper   r   r   r   rH     s    zTestBrute.test_1D.<locals>.fr   r1   )ZNsr3  )r   r4  r#  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 )NTr2  r    )r[   rc   r3  workersr   r   )r   r4  r-  r1  rs   r   )r>   r5  Z	resbrute1r   r   r   test_workers  s    zTestBrute.test_workersN)rR   rS   rT   r?   r-  r6  r8  r:  r   r   r   r   r.    s
   
r.  c                     s   dd l } dd lfddfddd  fdd} fd	d
}| j F}g }||| ||| |D ]}| }q|W d    n1 s0    Y  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    r;  r   r=  r   r   
objective2  s    
z*test_cobyla_threadsafe.<locals>.objective2COBYLAc                      s   t jdg dS Nr2   r|   r~  r   )
min_methodr?  r   r   
minimizer1  s    z*test_cobyla_threadsafe.<locals>.minimizer1c                      s   t jdg dS rB  r~  r   )rC  r@  r   r   
minimizer2  s    z*test_cobyla_threadsafe.<locals>.minimizer2)concurrent.futuresr>  futuresThreadPoolExecutorrD   submitr   )
concurrentrD  rE  pooltasksr   rr   r   )rC  r?  r@  r>  r   test_cobyla_threadsafe  s    rM  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 r  )r[  r=   r   r   r   r?     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    r  r0   )r[  r   r
  Zarctan2r   )r>   r<  r*   r   r   r   r   	slow_func  s    4zTestIterationLimits.slow_funcc                 C   s   |  dd d S )Nr      check_limitsr=   r   r   r   test_neldermead_limit  s    z)TestIterationLimits.test_neldermead_limitc                 C   s   |  dd d S )Nrs  r3   rQ  r=   r   r   r   test_powell_limit  s    z%TestIterationLimits.test_powell_limitc              	   C   s&  ddgddgddgfD ]}dD ]^}d| _ tj| j||d|id}t| j |d k |d	 rnt|d |k  q t|d |k q dD ]F}tj| j||d
|id}|d	 rt|d |k qt|d |k qddgddgdtjgfD ]\}}d| _ tj| j||||dd}t| j |d k |d	 rHt|d |k oB|d |k qt|d |kpb|d |k qtjd gd tjgfD ]\}}d| _ tj| j||||dd}t| j |d k |d	 r|d u rt|d |d k  nt|d |d k n&t|d |d kp|d |d k q|qd S )Nr%   r   r    )r   i    r   rW  r   r`   r   r9   r   r   rU  )r9   rW  )r[  r   ro   rO  r   r   r   )r>   r\   Zdefault_itersZstart_vZmfevrr   Zmitr   r   r   rR    s^    

 

  


z TestIterationLimits.check_limitsN)rR   rS   rT   r?   rO  rS  rT  rR  r   r   r   r   rN    s
   rN  c                  C   s   dd } dd }dd }g d}|D ],}t j| tdg|d	}|jjd
ks$J q$g d}|D ]0}t j| tdg|||d}|jjd
ks^J q^d S )Nc                 S   s   | |  S rM   r   r   r   r   r   r_   B  s    z2test_result_x_shape_when_len_x_is_one.<locals>.func                 S   s   d|  S Nr  r   r   r   r   r   r]   E  s    z2test_result_x_shape_when_len_x_is_one.<locals>.jacc                 S   s   t dggS rV  ro  r   r   r   r   rO   H  s    z3test_result_x_shape_when_len_x_is_one.<locals>.hess)r   r   rZ   r   r7  r  rA  r  r%   r|   )r   )r  r  r  r  r  r   r  )r   ro   r   r'   r   r7  )r_   r]   rO   r  r\   rr   r   r   r   %test_result_x_shape_when_len_x_is_oneA  s    rW  c                   @   s   e Zd Zdd Zdd ZdS )FunctionWithGradientc                 C   s
   d| _ d S r  )number_of_callsr=   r   r   r   r,  [  s    zFunctionWithGradient.__init__c                 C   s$   |  j d7  _ t|d d| fS r   )rY  r   rC   r.  r   r   r   r/  ^  s    zFunctionWithGradient.__call__Nr0  r   r   r   r   rX  Z  s   rX  c                   C   s   t  S rM   )rX  r   r   r   r   function_with_gradientc  s    rZ  c                 C   s   t | }tddg}t||d | jdks2J t||d|  | jdksXJ dt|d| ddd	 | jdksJ dd S )
Nr.   r        @r   r    zHfunction is not recomputed if gradient is requested after function valueg      4@(different input triggers new computationr  )r   r   r'   r   rY  
derivativerZ  memoized_functionr)   r   r   r   )test_memoize_jac_function_before_gradienth  s    r`  c                 C   s   t | }tddg}t||d|  | jdks8J t||d | jdksXJ dt|d| d| dd	 | jdksJ dd S )
Nr.   r  r    r   r[  zHfunction is not recomputed if function value is requested after gradientri   r\  r  )r   r   r'   r   r]  rY  r^  r   r   r   )test_memoize_jac_gradient_before_function{  s    ra  c                 C   s   t | }|j}t }tddg}t||d||dd}| jdksFJ ||d  | jdksbJ ||d  | jd	ks~J 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.
    r.   r0   r   Nr   r%   r    r  r1   )	r   r]  r   r   r   r'   r   rY  r_   )rZ  r_  r]   rO   r)   Zscalar_functionr   r   r   test_memoize_jac_with_bfgs  s    rb  c                   C   sF   t  , tjdd tj tjdd W d    n1 s80    Y  d S )Nc                 S   s   t | d gS r   ro  r   r   r   r   r     r   ztest_gh12696.<locals>.<lambda>Fr   )r   r   r  r   r   r   r   r   r   test_gh12696  s    rc  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)ro   r  rootZroot_scalarZlinprogZquadratic_assignmentZekkirt  )ro   ZmaximizeZmaximize_scalar)
r   r   r   r   r   r   itemsr   r   r   )Zsolver_methodsZsolverr  r\   Zunknown_solver_methodr   r   r   test_show_options  s     rf  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[  r  )ZlbZubrg   r   )r)   r\   r   )r   ZBoundsro   r-  r   r'   r  r   r   r   test_bounds_with_list  s    rg  c            
      C   s   dd } dd }dd }g d}g d}t d	d
 }tD ]T}d }d }||v rR|}||v r^|}tj| ||||d}	t|	jt t |dd q:d S )Nc                 S   s*   t t | }| |8 } | | 9 } t | S rM   )r   arangerU  rC   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   rh  rU  r  r   r   r   	fquad_jac  s    z3test_x_overwritten_user_function.<locals>.fquad_jacc                 S   s   t t | d S rV  )r   ZeyerU  r   r   r   r   r     r   z2test_x_overwritten_user_function.<locals>.<lambda>)ru  r  r  r  r  r  )r  r  r  r  r  r   r"   r  g-C6*?re   )	r   Zonesr   r   ro   r   r   rh  rU  )
ri  rj  Z
fquad_hessZmeth_jacZ	meth_hessr)   methr]   rO   rr   r   r   r    test_x_overwritten_user_function  s    rl  )RrU   r  Znumpyr   Znumpy.testingr   r   r   r   r   r   r   r	   r   r
   r   Zscipyr   Zscipy.optimize._minimizer   r   Zscipy.optimize._linprogr   Zscipy.optimize._rootr   Zscipy.optimize._root_scalarr   Zscipy.optimize._qapr   Z(scipy.optimize._differentiable_functionsr   Zscipy.optimize.optimizer   r   r+   r,   rV   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r*  r+  r,  r-  r.  rM  rN  rW  rX  ZfixturerZ  r`  ra  rb  rc  rf  rg  rl  r   r   r   r   <module>   s   (0   K)    x= D?%|"8#B	
