o
    `^h|                     @   s<  d dl Z d dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl
Z
d dl
mZmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZ G dd	 d	Zd
d ZG dd deZeddgd d gdZeddgd d gdZeddgd d gdZ G dd deZ!e!dgdgde"dgdgdgdgdgdgdgdgdgdgg
e"g d d!Z#e!d"gdgdge"dgge"dgd!Z$G d#d$ d$eZ%e%d%d&gd'd(gd)d*Z&G d+d, d,eZ'e'd-gd. g d/d0d*Z(G d1d2 d2eZ)e)d3d3gd4gd5d6gd7Z*G d8d9 d9eZ+d:Z,e-e.d;gd: d<gd: Z/e+e/d=gdd7Z0G d>d? d?eZ1e1d@gdA dBe2dAdC d7Z3G dDdE dEeZ4e4d-d-gdFgdGdGgd7Z5G dHdI dIeZ6e6d%dJgddd7Z7e
j89dK			PdfdQdRZ:G dSdT dTZ;G dUdV dVZ<G dWdX dXZ=G dYdZ dZZ>G d[d\ d\Z?d]d^ Z@e
j8Ad_d`da ZBdbdc ZCddde ZDdS )g    N)Pool)assert_allcloseIS_PYPY)raiseswarns)shgoBoundsminimize_scalarminimizerosen	rosen_der
rosen_hessNonlinearConstraint)new_constraint_to_old)SHGOc                   @   s   e Zd Z		dddZdS )StructTestFunctionNc                 C   s"   || _ || _|| _|| _|| _d S Nbounds
expected_xexpected_funexpected_xlexpected_funl)selfr   r   r   r   r    r   ]/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/scipy/optimize/tests/test__shgo.py__init__   s
   
zStructTestFunction.__init__)NNN)__name__
__module____qualname__r   r   r   r   r   r      s    r   c                 C   sR   g }| d ur%t | ttfs| f} n	 | D ]
} |d| d qt|}|S d }|S )Nineqtypefun)
isinstancetuplelistappend)gconsr   r   r   wrap_constraints   s   
r*   c                   @   s$   e Zd Zdd Zdd ZeeZdS )StructTest1c                 C      |d d |d d  S Nr         r   r   xr   r   r   f+      zStructTest1.fc                 C   s   t j| ddd  S )Nr   axisg      @npsumr1   r   r   r   r(   .      zStructTest1.gNr   r   r   r2   r(   r*   r)   r   r   r   r   r+   *   s    r+   )   )r   r   r   r/   NNc                   @   s(   e Zd ZdZdd Zdd ZeeZdS )StructTest2zN
    Scalar function with several minima to test all minimiser retrievals
    c                 C   s   |d t | S )N   )r7   sinr0   r   r   r   r2   A      zStructTest2.fc                 C   s   dt j| dd S )N:   r   r4   r6   r9   r   r   r   r(   D   rC   zStructTest2.gNr   r   r   __doc__r2   r(   r*   r)   r   r   r   r   r@   <   s
    r@   )r   <   g⡽4$?0_r<g GK@g
]<@gI{_H@gi<&,@g>E@gqŤCQ4@g8$B@go.n:@g^5	>@)
rH   gs8g^V&+6g+?-2g+!/gN|1(gc=C#g^\gNg自ݿr   )r   g      @c                   @   sD   e Zd ZdZdd Zdd Zdd Zdd	 Zeed
e	j
ZefZdS )StructTest3a  
    Hock and Schittkowski 18 problem (HS18). Hoch and Schittkowski (1981)
    http://www.ai7.uni-bayreuth.de/test_problem_coll.pdf
    Minimize: f = 0.01 * (x_1)**2 + (x_2)**2

    Subject to: x_1 * x_2 - 25.0 >= 0,
                (x_1)**2 + (x_2)**2 - 25.0 >= 0,
                2 <= x_1 <= 50,
                0 <= x_2 <= 50.

    Approx. Answer:
        f([(250)**0.5 , (2.5)**0.5]) = 5.0


    c                 C   s   d|d d  |d d  S )Ng{Gz?r   r.   r/   r   r0   r   r   r   r2   {      zStructTest3.fc                 C   s   | d | d  d S )Nr   r/         9@r   r9   r   r   r   g1~   r:   zStructTest3.g1c                 C   s   | d d | d d  d S )Nr   r.   r/   rK   r   r9   r   r   r   g2   rJ   zStructTest3.g2c                 C   s0   | d | d  d | d d | d d  d fS )Nr   r/   rK   r.   r   r9   r   r   r   r(         0zStructTest3.gr   N)r   r   r   rF   r2   rL   rM   r(   r   r7   inf_StructTest3__nlcr)   r   r   r   r   rI   i   s    
rI   )r.   2   )r   rQ   g'In/@gS[:XL?      @)r   r   r   c                   @   L   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZeeeefZ	e
e	ZdS )StructTest4z
    Hock and Schittkowski 11 problem (HS11). Hoch and Schittkowski (1981)

    NOTE: Did not find in original reference to HS collection, refer to
          Henderson (2015) problem 7 instead. 02.03.2016
    c                 C   s   |d d d d|d d d   |d d  d|d d	 d   d|d d
   d|d d   |d
 d  d|d  |d
   d|d   d|d
   S )Nr   
   r.      r/               r=         r   r0   r   r   r   r2      s&   .

zStructTest4.fc                 C   sJ   d| d d  d| d d   | d  d| d d   d| d   d  S )Nr.   r   rY   r/   rX   rV      r   r9   r   r   r   rL      s
   6
zStructTest4.g1c                 C   s>   d| d  d| d   d| d d   | d  | d  d  S )	Nr[   r   rY   r/   rU   r.   rX   g     q@r   r9   r   r   r   rM      s   >zStructTest4.g2c                 C   s:   d| d  | d d  d| d d   d| d   d  S )	N   r   r/   r.   r=   rV   r\      r   r9   r   r   r   g3   s   :zStructTest4.g3c                 C   sZ   d| d d  | d d  d| d  | d   d| d d   d| d   d| d    S )	NrX   r   r.   r/   rY   rV   rZ   r=   r   r9   r   r   r   g4   s
   >

zStructTest4.g4Nr   r   r   rF   r2   rL   rM   r`   ra   r(   r*   r)   r   r   r   r   rT      s    rT   )irU   r[   )gܤ@g$H8?g	޿g0ev@gn8)gk_@/?g0g+?gP{[
E@c                   @       e Zd Zdd ZdZeeZdS )StructTest5c              
   C   sb   |d d  t t t|d d |d d   |d t t t|d |d d    S Nr/   g     G@r          @r7   rB   sqrtabsr0   r   r   r   r2         4*zStructTest5.fNr;   r   r   r   r   rd          rd   )i i   g g      @gyCy@)r   r   r   c                   @   s$   e Zd ZdZdd ZdZeeZdS )StructTestLJzZ
    LennardJones objective function. Used to test symmetry constraints
    settings.
    c                 G   s   t d|  |d | _t| jd }d}t|d D ]T}t|d |D ]J}d| }d| }|| ||  }	||d  ||d   }
||d  ||d   }|	|	 |
|
  ||  }|| | }|dkrn|d| d | 7 }q$q|S )	Nzx = r   rY           r/   r.         ?rf   )printNintrange)r   r1   argsksijabxdydzdedudr   r   r   r2      s$   
zStructTestLJ.fNrE   r   r   r   r   rl      s
    rl   r=   g            @      c                   @   rc   )StructTestSc                 C   s@   |d d d |d d d  |d d d  |d d d  S )Nr         ?r.   r/   rY   r   r0   r   r   r   r2      s
   zStructTestS.fNr;   r   r   r   r   r      s    r   )r   rf   rX   rm   r   c                   @   rc   )StructTestTablec                 C   s    |d dkr|d dkrdS dS )Nr         @r/   rQ   d   r   r0   r   r   r   r2   
  s   zStructTestTable.fNr;   r   r   r   r   r   	  rk   r   rQ   r   c                   @   rS   )StructTestInfeasiblez0
    Test function with no feasible domain.
    c                 G   r,   r-   r   )r   r1   rs   r   r   r   r2     r3   zStructTestInfeasible.fc                 C   s   | d | d  d S Nr   r/   r   r9   r   r   r   rL   !  r:   zStructTestInfeasible.g1c                 C   s   | d | d  d  S r   r   r9   r   r   r   rM   $     zStructTestInfeasible.g2c                 C   s   | d  | d  d S r   r   r9   r   r   r   r`   '  r   zStructTestInfeasible.g3c                 C   s   | d  | d  d  S r   r   r9   r   r   r   ra   *  r3   zStructTestInfeasible.g4Nrb   r   r   r   r   r     s    r   )r<   r/   
Not a testr   h㈵>r   sobolr/   c
                 C   s   t | j| j|| j|||||||	d}
td|
  td|
  | jd ur2tj	j
|
j| j||d | jd urBtj	j
|
j| j|d | jd urRtj	j
|
j| j|d | jd urbtj	j
|
j| j|d d S )N)	rs   constraintsniterscallbackminimizer_kwargsoptionssampling_methodworkerszres = rtolatolr   )r   r2   r   r)   ro   logginginfor   r7   testingr   r1   r   r#   r   xlr   funl)testrs   	test_atolr   r   r   r   r   r   r   resr   r   r   run_test7  s8   






r   c                   @   s`   e Zd 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 Zdd Zdd ZdS )TestShgoSobolTestFunctionsz8
    Global optimisation tests with Sobol sampling:
    c                 C      t t dS )VMultivariate test function 1:
        x[0]**2 + x[1]**2 with bounds=[(-1, 6), (-1, 6)]Nr   test1_1r   r   r   r   test_f1_1_sobol`     z*TestShgoSobolTestFunctions.test_f1_1_sobolc                 C   r   )zUMultivariate test function 1:
         x[0]**2 + x[1]**2 with bounds=[(0, 1), (0, 1)]Nr   test1_2r   r   r   r   test_f1_2_sobole  r   z*TestShgoSobolTestFunctions.test_f1_2_sobolc                 C   s   ddi}t t|d dS )z_Multivariate test function 1:
        x[0]**2 + x[1]**2 with bounds=[(None, None),(None, None)]dispT)r   Nr   test1_3r   r   r   r   r   test_f1_3_sobolj  s   z*TestShgoSobolTestFunctions.test_f1_3_sobolc                 C   r   )RUnivariate test function on
        f(x) = (x - 30) * sin(x) with bounds=[(0, 60)]Nr   test2_1r   r   r   r   test_f2_1_sobolp  r   z*TestShgoSobolTestFunctions.test_f2_1_sobolc                 C   r   )NUnivariate test function on
        f(x) = (x - 30) * sin(x) bounds=[(0, 4.5)]Nr   test2_2r   r   r   r   test_f2_2_sobolu  r   z*TestShgoSobolTestFunctions.test_f2_2_sobolc                 C   r   )%NLP: Hock and Schittkowski problem 18Nr   test3_1r   r   r   r   test_f3_sobolz  s   z(TestShgoSobolTestFunctions.test_f3_sobolc                 C      ddi}t td|d dS )?NLP: (High dimensional) Hock and Schittkowski 11 problem (HS11)infty_constraintsFi  r   r   Nr   test4_1r   r   r   r   test_f4_sobol~  s   z(TestShgoSobolTestFunctions.test_f4_sobolc                 C   s   t tdd dS )NLP: Eggholder, multimodalrG   )r   Nr   test5_1r   r   r   r   test_f5_1_sobol  s   z*TestShgoSobolTestFunctions.test_f5_1_sobolc                 C      t tddd dS )r   rG   rV   )r   r   Nr   r   r   r   r   test_f5_2_sobol     z*TestShgoSobolTestFunctions.test_f5_2_sobolN)r   r   r   rF   r   r   r   r   r   r   pytestmarkslowr   r   r   r   r   r   r   r   Z  s    
r   c                   @   s   e Zd 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 Zdd Zdd Zdd Ze
jddd Ze
jddd Ze
jddd ZdS )TestShgoSimplicialTestFunctionsz=
    Global optimisation tests with Simplicial sampling:
    c                 C   r   )r   r/   
simplicialr   r   Nr   r   r   r   r   test_f1_1_simplicial  r   z4TestShgoSimplicialTestFunctions.test_f1_1_simplicialc                 C   r   )zTMultivariate test function 1:
        x[0]**2 + x[1]**2 with bounds=[(0, 1), (0, 1)]r/   r   r   Nr   r   r   r   r   test_f1_2_simplicial  r   z4TestShgoSimplicialTestFunctions.test_f1_2_simplicialc                 C   r   )z_Multivariate test function 1: x[0]**2 + x[1]**2
        with bounds=[(None, None),(None, None)]rV   r   r   Nr   r   r   r   r   test_f1_3_simplicial  r   z4TestShgoSimplicialTestFunctions.test_f1_3_simplicialc                 C      ddi}t tdd|dd dS )r   minimize_every_iterF   r[   r   r   r   r   r   Nr   r   r   r   r   test_f2_1_simplicial  s   

z4TestShgoSimplicialTestFunctions.test_f2_1_simplicialc                 C   r   )r   r/   r   r   Nr   r   r   r   r   test_f2_2_simplicial  r   z4TestShgoSimplicialTestFunctions.test_f2_2_simplicialc                 C   r   )r   r/   r   r   Nr   r   r   r   r   test_f3_simplicial  s   z2TestShgoSimplicialTestFunctions.test_f3_simplicialc                 C   r   )r   r/   r   r   Nr   r   r   r   r   test_f4_simplicial  r   z2TestShgoSimplicialTestFunctions.test_f4_simplicialc                 C   s&   ddd}d}t t|d|ddd dS )	z&LJ: Symmetry-constrained test functionTsymmetryr   r=   ,  r/   r   rs   r   r   r   r   Nr   testLJr   r   rs   r   r   r   test_lj_symmetry_old  s   
z4TestShgoSimplicialTestFunctions.test_lj_symmetry_oldc                 C   s,   dgd dd}d}t t|d|ddd	 d
S )z&LJ: Symmetry constrained test functionr   r=   Tr   r   r   r/   r   r   Nr   r   r   r   r   test_f5_1_lj_symmetry  s   
z5TestShgoSimplicialTestFunctions.test_f5_1_lj_symmetryc                 C   s$   ddgdd}t td|ddd dS )	z"Symmetry constrained test functionr   Tr   r   r/   r   r   r   r   r   Nr   r   r   r   r   test_f5_2_cons_symmetry  s   
z7TestShgoSimplicialTestFunctions.test_f5_2_cons_symmetryrU   c                 C   s$   g ddd}t td|ddd dS )	z(Asymmetrically constrained test function)r   r   r   rY   Tr   i'  r/   r   r   N)r   test_sr   r   r   r   test_f5_3_cons_symmetry  s   
z7TestShgoSimplicialTestFunctions.test_f5_3_cons_symmetryr   c                    sV   d d fddd}t tjddg |d}|jsJ t|jd	d
d t|jd dS )zOReturn a minimum on a perfectly symmetric problem, based on
            gh10429r   eqc                    s   t |   S r   )r7   meanr9   avgr   r   <lambda>  s    zFTestShgoSimplicialTestFunctions.test_f0_min_variance.<locals>.<lambda>r!   r=   r>   r   r   r   V瞯<r   N)r   r7   varsuccessr   r#   r1   )r   r)   r   r   r   r   test_f0_min_variance  s   
z4TestShgoSimplicialTestFunctions.test_f0_min_variancec                 C   sX   dd }dg}t ||d}t||d d}|jsJ t|j|j t|j|jdd dS )	zRReturn a minimum on a perfectly symmetric 1D problem, based on
            gh10538c                 S   s   | | d  | d  S )Nrn   r   r   r9   r   r   r   r#     r:   zDTestShgoSimplicialTestFunctions.test_f0_min_variance_1D.<locals>.funr>   )r   r   ư>)r   N)r   r	   r   r   r#   r1   )r   r#   r   r   refr   r   r   test_f0_min_variance_1D  s   
z7TestShgoSimplicialTestFunctions.test_f0_min_variance_1DN)r   r   r   rF   r   r   r   r   r   r   r   r   r   r   r   r   r   	fail_slowr   skipr   r   r   r   r   r   r     s&    
	

	




r   c                   @   sr  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	e
jjdd Ze
jj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eoaejd'kd(d)d*d+ Zd,d- Ze
jjd.d)d/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&e
j'd=d>d? Z(d@dA Z)dBdC Z*e
j+dDg dEdFdG Z,dHdI Z-dJdK Z.dLS )MTestShgoArgumentsc                 C      t tdddd dS )z>Iterative simplicial sampling on TestFunction 1 (multivariate)Nr.   r   r   r   r   r   r   r   r   r   test_1_1_simpl_iter     z%TestShgoArguments.test_1_1_simpl_iterc                 C   s   ddi}t tdd|dd dS )z3Iterative simplicial on TestFunction 2 (univariate)r   FN	   r   r   r   r   r   r   r   test_1_2_simpl_iter     

z%TestShgoArguments.test_1_2_simpl_iterc                 C   r   )z9Iterative Sobol sampling on TestFunction 1 (multivariate)Nr/   r   r   r   r   r   r   r   test_2_1_sobol_iter  r   z%TestShgoArguments.test_2_1_sobol_iterc                 C   sL   t tjtjtjdddd}tjj|jtj	ddd tjj|j
tjdd dS )z7Iterative Sobol sampling on TestFunction 2 (univariate)Nr/   r   )r   r   r   r   r   r   r   )r   r   r2   r   r)   r7   r   r   r1   r   r#   r   r   r   r   r   r   test_2_2_sobol_iter  s
   z%TestShgoArguments.test_2_2_sobol_iterc              	   C   sR   dd }t tfD ]}t|j|jdd|ddid t|j|jdd|ddid qd	S )
zKIterative sampling on TestFunction 1 and 2  (multi and univariate)
        c                 S      t d d S Nz Local minimization callback testro   r9   r   r   r   callback_func     zATestShgoArguments.test_3_1_disp_simplicial.<locals>.callback_funcr/   r   r   Tr   r   r   r   r   r   r   r   Nr   r   r   r2   r   r   r  r   r   r   r   test_3_1_disp_simplicial  s   z*TestShgoArguments.test_3_1_disp_simplicialc              	   C   sR   dd }t tfD ]}t|j|jdd|ddid t|j|jdd|ddid	 qd
S )zAIterative sampling on TestFunction 1 and 2 (multi and univariate)c                 S   r  r  r  r9   r   r   r   r  )  r  z<TestShgoArguments.test_3_2_disp_sobol.<locals>.callback_funcr/   r   r   Tr	  r   r
  Nr  r  r   r   r   test_3_2_disp_sobol&  s   z%TestShgoArguments.test_3_2_disp_sobolc                 C   sF   t dd dgdd}t dd dgd}t|j|j t|j|j dS )	zMUsing `args` used to cause `shgo` to fail; see #14589, #15986,
        #16506c                 S   s   | | | S r   r   )r1   yzr   r   r   r   6      z5TestShgoArguments.test_args_gh14589.<locals>.<lambda>)r   rY   )r/   r.   )funcr   rs   c                 S   s   d|  d S )Nr.   r/   r   r9   r   r   r   r   8  r  )r  r   N)r   r   r#   r1   )r   r   r   r   r   r   test_args_gh145893  s   z#TestShgoArguments.test_args_gh14589c                 C   s$   t jddd}tt dd|dd dS )z,Test known function minima stopping criteriar   T)f_minf_tolr   Nr   r   r   r   r   r   r   r   r   r   r   r   r   test_4_1_known_f_min<  s   

z&TestShgoArguments.test_4_1_known_f_minc                 C   s&   t jdddd}tt dd|dd dS )	z+Test Global mode limiting local evaluationsr   Tr/   )r  r  r   
local_iterNr   r   r  r  r   r   r   r   test_4_2_known_f_minG  s   

z&TestShgoArguments.test_4_2_known_f_minc              	   C   sJ   t jddddd}tt jt jt jdd|dd}tjj|j	t j
d	d	d
 dS )z8Test Global mode limiting local evaluations for 1D funcsr   Tr/   Fr  r  r   r  r   Nr   r   r   r   r   r   r   r   )r   r   r   r2   r   r)   r7   r   r   r1   r   r   r   r   r   r   r   test_4_4_known_f_minT  s   z&TestShgoArguments.test_4_4_known_f_minc                 C   s0   t tjtjtjd}tjj|jtj	ddd dS )z;Test Default simplicial sampling settings on TestFunction 1r   r   r   N
r   r   r2   r   r)   r7   r   r   r1   r   r  r   r   r   test_5_1_simplicial_arglessc  s   z-TestShgoArguments.test_5_1_simplicial_arglessc                 C   s2   t tjtjtjdd}tjj|jtj	ddd dS )z6Test Default sobol sampling settings on TestFunction 1r   r   r   r   r   Nr   r  r   r   r   test_5_2_sobol_arglessh  s   z(TestShgoArguments.test_5_2_sobol_arglessc                 C   R   ddi}t tjtjtj|dd}tjj|jtj	ddd tjj|j
tjdd dS )	:Test that maximum iteration option works on TestFunction 3max_iterr.   r   r   r   r   r   r   r   Nr   r   r2   r   r)   r7   r   r   r1   r   r#   r   r  r   r   r   test_6_1_simplicial_max_itern     z.TestShgoArguments.test_6_1_simplicial_max_iterc                 C   r$  )	r%  min_iterr.   r   r'  r   r   r   Nr(  r  r   r   r   test_6_2_simplicial_min_iterv  r*  z.TestShgoArguments.test_6_2_simplicial_min_iterc                 C   s,   dD ]}|t jd}tt dd|dd qdS )z@Test the minimizer_kwargs arguments for solvers with constraints)COBYLACOBYQASLSQP)methodr   r   MbP?r   r   r   r   r   N)r   r)   r   )r   solverr   r   r   r   test_7_1_minkwargs~  s   z$TestShgoArguments.test_7_1_minkwargsc                 C   s0   ddi}ddi}t tjtjtjd ||d dS )z'Test the minimizer_kwargs default initsftolr   r   Tr   )r   r   r   Nr   r   r2   r   r)   )r   r   r   r   r   r   test_7_2_minkwargs  s
   
z$TestShgoArguments.test_7_2_minkwargsc                 C   sV   dD ]&}dd }dd }|||d}t d|  t d ttd	d
|dd qdS )z?Test minimizer_kwargs arguments for solvers without constraints)zNelder-MeadPowellCGBFGS	Newton-CGzL-BFGS-BTNCdoglegz	trust-ncgztrust-exactztrust-krylovc                 S   s    t d| d  d| d  gjS )Nr.   r   r/   )r7   arrayTr9   r   r   r   jac  s    z1TestShgoArguments.test_7_3_minkwargs.<locals>.jacc                 S   s   t ddgddggS Nr.   r   )r7   r>  r9   r   r   r   hess  r   z2TestShgoArguments.test_7_3_minkwargs.<locals>.hess)r0  r@  rB  z	Solver = zd====================================================================================================r   r1  r   r2  N)r   r   r   r   )r   r3  r@  rB  r   r   r   r   test_7_3_minkwargs  s   
z$TestShgoArguments.test_7_3_minkwargsc                 C   s    ddd}t td d |dd d S )Nr/   T)minhgrdr   r   r   r   r   r   r   r   test_8_homology_group_diff  s   

z,TestShgoArguments.test_8_homology_group_diffc                 C   s   t tjtjtjd d dS )'Test single function constraint passingr   r  Nr6  r   r   r   r   test_9_cons_g  s   zTestShgoArguments.test_9_cons_gwin32z2Failing and fix in PyPy not planned (see gh-18632))reasonc                 C   s4   ddi}dd }t |tjd|d}|jdksJ dS )	rF  maxtimer   c                 S   s   t d dS )Ng+=rm   )timesleepr9   r   r   r   r2     s   
z0TestShgoArguments.test_10_finite_time.<locals>.frV   )r   r   r/   N)r   r   r   nit)r   r   r2   r   r   r   r   test_10_finite_time  s   z%TestShgoArguments.test_10_finite_timec                 C   sN   ddd}t tjtjdd|dd}tjd|jd  tjd|jd	  dS )
*Test to cover the case where f_lowest == 0rm   T)r  r   rU   Nr   r   r   r/   )r   r   r2   r   r7   r   assert_equalr1   r  r   r   r   test_11_f_min_0  s   z!TestShgoArguments.test_11_f_min_0z no way of currently testing thisc                 C   s6   ddd}t tjtjdd|dd}tjd|j dS )rO  r   rm   )rJ  r  r/   Nr   r   )r   r   r2   r   r7   r   rP  r#   r  r   r   r   test_12_sobol_inf_cons  s   z(TestShgoArguments.test_12_sobol_inf_consc                 C   s0   dd }dgd }t ||dd}|dd d	S )
z-Test init of high-dimensional sobol sequencesc                 S      dS Nr   r   r9   r   r   r   r2        z/TestShgoArguments.test_13_high_sobol.<locals>.fr?   )   r   r   r.   rQ   N)r   sampling_function)r   r2   r   SHGOcr   r   r   test_13_high_sobol  s   
z$TestShgoArguments.test_13_high_sobolc                 C   r   )z6Test limited local iterations for a pseudo-global moder  rX   rG   r   Nr   r   r   r   r   test_14_local_iter  s   z$TestShgoArguments.test_14_local_iterc                 C   r   )z9Test minimize every iter options and cover function cacher   Tr/   r[   r   r   Nr   r   r   r   r   test_15_min_every_iter  r   z(TestShgoArguments.test_15_min_every_iterc                 C   s$   ddi}ddi}t td||d dS )z:Test disp=True with minimizers that do not support bounds r   Tr0  znelder-meadr   )r   r   r   Nr   )r   capsysr   r   r   r   r   test_16_disp_bounds_minimizer  s
   
z/TestShgoArguments.test_16_disp_bounds_minimizerc                 C   s   dd }t td|d dS )=Test the functionality to add custom sampling methods to shgoc                 S   s   t jj| |fdS )N)size)r7   randomuniform)r   dr   r   r   sample  rC   z9TestShgoArguments.test_17_custom_sampling.<locals>.samplerA   r   Nr   )r   rd  r   r   r   test_17_custom_sampling  s   z)TestShgoArguments.test_17_custom_samplingc           	      C   s   dd }g d}g d}t t||}t||}t||}t||}|j|jks*J |j|jks2J |j|jks:J tg d}tj	
|j| tj	
|j|j d S )Nc                 S   s   t |  S r   )r7   squarer8   r9   r   r   r   r2     s   z1TestShgoArguments.test_18_bounds_class.<locals>.f)g      rn   g      )r   r   rR   )r   rn   rm   )r&   zipr   r   nfevmessager   r7   r>  r   r   r1   )	r   r2   lbub
bounds_old
bounds_newres_old_boundsres_new_boundsx_optr   r   r   test_18_bounds_class  s   


z&TestShgoArguments.test_18_bounds_classrU   c                 C   s   t d}ttd|jd W d   n1 sw   Y  ttdtd t d}ttd|jd W d   n1 s:w   Y  ttdtd dS )r_  r.   rA   )r   r   N)r   r   r   mapr   )r   pr   r   r   test_19_parallelization  s   

z)TestShgoArguments.test_19_parallelizationc                 C   sz   dd }dd }dgd }dd }d	d
 }dd }d|ddd|dd|df}t ||dd|d t ||dd|dd dS )z0Test that constraints can be passed to argumentsc              
   S   sb   | d d  t t t| d d | d d   | d t t t| d | d d    S re   rg   r9   r   r   r   	eggholder  rj   z=TestShgoArguments.test_20_constrained_args.<locals>.eggholderc                 S   s0   d| d  d| d   d| d   d| d   S )	Nǧ8@r   g     :@r/   '   r.   g     @D@rY   r   r9   r   r   r   r2   !  rN   z5TestShgoArguments.test_20_constrained_args.<locals>.fr   rn   rX   c                 S   s<   |d | d  |d | d   d| d   d| d   d	 S )
Ngffffff@r   gffffff@r/   g333333&@r.   g?rY   rV   r   )r1   rv   r   r   r   g1_modified&  s
   .z?TestShgoArguments.test_20_constrained_args.<locals>.g1_modifiedc                 S   s~   d| d  d| d   d| d   d| d   d	 d
t d| d d  d| d d   d| d d   d| d d     S )NrW   r   g'@r/   gfffffD@r.   gJ@rY      gRQ?gQ?gRQ?g     4@gףp=
?)r7   rh   r9   r   r   r   rM   *  s   2>z6TestShgoArguments.test_20_constrained_args.<locals>.g2c                 S   $   | d | d  | d  | d  d S Nr   r/   r.   rY   r   r9   r   r   r   h12     $z6TestShgoArguments.test_20_constrained_args.<locals>.h1r    )r   )r"   r#   rs   r!   r   r   r/   )r   r   r   r   )r   r   r   r   N)r   )r   ru  r2   r   rx  rM   r|  r)   r   r   r   test_20_constrained_args  s   


z*TestShgoArguments.test_20_constrained_argsc              	   C   s   dd }t |ddgddggdddd	d
dd dd }ddgddgddgddgddgg}t ||dd	d
dd}t|g d|d
d}|jsFJ t|j|j t|j|jdd dS )z|Test that shgo can handle objective functions that return the
        gradient alongside the objective value. Fixes gh-13547c                 S   s   t t | dd|  fS Nr.   )r7   r8   powerr9   r   r   r   r  B  s   z2TestShgoArguments.test_21_1_jac_true.<locals>.funcr<   r/   r.   r   rV   r   r/  T)r0  r@  )r   r   r   r   r   c                 S   s   t | d d|  fS r  r6   r9   r   r   r   r  N  r   r   rY   )r   r   r   )r/   r/   r/   r/   r/   )x0r   r@  r   r   N)r   r
   r   r   r#   r1   )r   r  r   r   r   r   r   r   test_21_1_jac_true>  s&   	"
z$TestShgoArguments.test_21_1_jac_true
derivativer@  rB  hesspc                 C   s   dd }dd }dd }dd }|||d	}||| i}d
di}dg}	t ||	||d}
t|fdg|	d||}|
js>J tj|
j|j tj|
j|j dS )zzshgo used to raise an error when passing `options` with 'jac'
        # see gh-12963. check that this is resolved
        c                 S   s$   d| d  | d  d| d   d S )NrY   r   r.   rV   r   r9   r   r   r   	objectivea  r}  zATestShgoArguments.test_21_2_derivative_options.<locals>.objectivec                 S   s   d| d  d S )Nr=   r   r.   r   r9   r   r   r   gradientd     z@TestShgoArguments.test_21_2_derivative_options.<locals>.gradientc                 S   rS  Nr=   r   r9   r   r   r   rB  g  rU  z<TestShgoArguments.test_21_2_derivative_options.<locals>.hessc                 S   s   d| S r  r   )r1   rs  r   r   r   r  j  s   z=TestShgoArguments.test_21_2_derivative_options.<locals>.hesspr  r0  trust-constr)ir   r   r   r   )r  r   N)r   r
   r   r7   r   r   r#   r1   )r   r  r  r  rB  r  derivative_funcsr   r   r   r   r   r   r   r   test_21_2_derivative_options[  s"   
z.TestShgoArguments.test_21_2_derivative_optionsc                 C   st   g d}t td}ddi}tt|||d}tttdfddi|}|js(J t|j	|j	 t|j
|j
dd d	S )
zsEnsure the Hessian gets passed correctly to the local minimizer
        routine. Previous report gh-14533.
        )r   g?r  r   gffffff?r  r  )r@  rB  r0  r;  r  rV   r   r   N)r   r   r   r   r
   r7   zerosr   r   r#   r1   )r   r   r   r   r   r   r   r   r   test_21_3_hess_options_rosen{  s   

z.TestShgoArguments.test_21_3_hess_options_rosenc                 C   sp   dd }ddd d}dg}t ||d|d	d
}t|td|d|d}|js(J t|j|j t|j|j dS )zwshgo used to raise an error when passing `args` with Sobol sampling
        # see gh-12114. check that this is resolvedc                 S   s   | d | S rT  r   )r1   rt   r   r   r   r#     r  z6TestShgoArguments.test_21_arg_tuple_sobol.<locals>.funr    c                 S   s   | d d S r   r   r9   r   r   r   r     r  z;TestShgoArguments.test_21_arg_tuple_sobol.<locals>.<lambda>r!   r   rU   )r/   r   )rs   r   r   r/   )r   rs   r   N)r   r
   r7   r  r   r   r#   r1   )r   r#   r   r   r   r   r   r   r   test_21_arg_tuple_sobol  s   

z)TestShgoArguments.test_21_arg_tuple_sobolN)/r   r   r   r   r   r  r  r  r  r  r   r   r   r  r  r  r!  r#  r)  r,  r4  r7  rC  rE  rG  xfailr   sysplatformrN  rQ  r   rR  rZ  r[  r\  r^  re  rq  r   rt  r~  r  parametrizer  r  r  r   r   r   r   r     sV    	








&
r   c                   @   sl   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ejjdd Zdd ZdS )TestShgoFailuresc                 C   sD   ddi}t tjtjdd|dd}tjd|j tjd|j dS )z'Test failure on insufficient iterationsmaxiterr.   Nr   r   FrX   )	r   r   r2   r   r7   r   rP  r   tnevr  r   r   r   test_1_maxiter  s   zTestShgoFailures.test_1_maxiterc                 C   s   t tttjtjdd dS )z$Rejection of unknown sampling method	not_SobolrW  N)assert_raises
ValueErrorr   r   r2   r   r   r   r   r   test_2_sampling  s   
z TestShgoFailures.test_2_samplingc                 C   sD   ddd}t tjtjd|dd}tjd|j tjd|j d	S )
zoCheck that the routine stops when no minimiser is found
           after maximum specified function evaluationsrU   T)maxfevr   rY   r   r   r   r   FrW   N)	r   
test_tabler2   r   r7   r   rP  r   rh  r  r   r   r   test_3_1_no_min_pool_sobol  s   z+TestShgoFailures.test_3_1_no_min_pool_sobolc                 C   s4   ddd}t tjtjd|dd}tjd|j dS )	zoCheck that the routine stops when no minimiser is found
           after maximum specified sampling evaluationsrU   Tmaxevr   rY   r   r  FN)r   r  r2   r   r7   r   rP  r   r  r   r   r   test_3_2_no_min_pool_simplicial  s   z0TestShgoFailures.test_3_2_no_min_pool_simplicialc                 C      ddg}t tttj| dS )zSpecified bounds ub > lb)r=   rY   rY   rV   Nr  r  r   r   r2   r   r   r   r   r   test_4_1_bound_err     z#TestShgoFailures.test_4_1_bound_errc                 C   r  )z)Specified bounds are of the form (lb, ub))rY   rV   rV   r  Nr  r  r   r   r   test_4_2_bound_err  r  z#TestShgoFailures.test_4_2_bound_errc                 C   s8   ddd}t tjtjtjd|dd}tjd|j dS )zxEnsures the algorithm terminates on infeasible problems
           after maxev is exceeded. Use infty constraints optionr   Tr  r   r   r   r   r   FN	r   test_infeasibler2   r   r)   r7   r   rP  r   r  r   r   r   test_5_1_1_infeasible_sobol     
z,TestShgoFailures.test_5_1_1_infeasible_sobolc                 C   s:   dddd}t tjtjtjd|dd}tjd|j dS )zEnsures the algorithm terminates on infeasible problems
           after maxev is exceeded. Do not use infty constraints optionr   TF)r  r   r   r   r  Nr  r  r   r   r   test_5_1_2_infeasible_sobol  s   
z,TestShgoFailures.test_5_1_2_infeasible_sobolc                 C   s8   ddd}t tjtjtjd|dd}tjd|j dS )z[Ensures the algorithm terminates on infeasible problems
           after maxev is exceeded.i  Fr  r   r   r  Nr  r  r   r   r   test_5_2_infeasible_simplicial  r  z/TestShgoFailures.test_5_2_infeasible_simplicialc                 C   sP   t jd ddddd}t jt jf}t jdd|dd	}tttg|R i | dS )
z<Test Global mode limiting local evaluations with f* too highrf   r   Tr/   Fr  Nr   r  )r   r   r2   r   r)   r   UserWarningr   )r   r   rs   kwargsr   r   r   test_6_1_lower_known_f_min  s   z+TestShgoFailures.test_6_1_lower_known_f_minc                    sL   ddl mm} g d} fdd d _| |}t|j|j j d S )Nr   )r   r   r   r.   r  r  r  r  c                    s     j d7  _ | S Nr/   )rh  r9   r#   r   r   r   r#   	     z"TestShgoFailures.test.<locals>.fun)scipy.optimizer   r   rh  ro   r1   r#   )r   r   r   resultr   r  r   r     s   
zTestShgoFailures.testN)r   r   r   r  r  r  r  r  r  r  r  r  r   r   thread_unsafer  r   r   r   r   r   r    s    
	
r  c                   @   s   e Zd Zdd Zdd ZdS )TestShgoReturnsc                    s:   g d} fdd d _ t |}tj j |j  d S )Nr  c                         j d7  _ t| S r  rh  r   r9   r#   r   r   r#     r  z3TestShgoReturns.test_1_nfev_simplicial.<locals>.funr   rh  r   r7   r   rP  r   r   r  r   r  r   test_1_nfev_simplicial  s
   
z&TestShgoReturns.test_1_nfev_simplicialc                    s>   g d} fdd d _ t |dd}tj j |j  d S )Nr  c                    r  r  r  r9   r  r   r   r#   $  r  z.TestShgoReturns.test_1_nfev_sobol.<locals>.funr   r   rW  r  r  r   r  r   test_1_nfev_sobol!  s
   z!TestShgoReturns.test_1_nfev_sobolN)r   r   r   r  r  r   r   r   r   r    s    r  c                  C   s   dd } t | dgdg}t|tddg}ttddg|dd}tt|jd	 dks/J tt|jd	 d
ks>J |j	sCJ d S )Nc                 S      t | } t | d gS r  r7   asarrayr8   r9   r   r   r   quad0     
z$test_vector_constraint.<locals>.quadg@rY   rn   r  r   r"  r.   r   )
r   r   r7   r>  r   r   allr8   r1   r   )r  nlcoldcr   r   r   r   test_vector_constraint.  s   r  zignore:delta_gradc                  C   s   dd } t | dgdg}ddi}ttddg|d|d	}tt|jd
 dks*J tt|jd
 dks9J |js>J d S )Nc                 S   r  r  r  r9   r   r   r   r  ?  r  ztest_trust_constr.<locals>.quadg@rY   r0  r  r  r   )r   r   r   r.   r   )r   r   r   r7   r  r8   r1   r   )r  r  r   r   r   r   r   test_trust_constr=  s   r  c                  C   s   dgd } dd }t |dd}tt| |d}tt|jd dd }d|d	}tt| |d}tt|jd d
gd } dd }d|d	}tdd | |dd}tt|jd d S )N)g?r   r.   c                 S   s   | d | d  S r   r   r9   r   r   r   faultyX  r  z)test_equality_constraints.<locals>.faulty333333@r   c                 S   s   | d | d  d S )Nr   r/   r  r   r9   r   r   r   r  _  r:   r   r!   rw  rX   c                 S   rz  r{  r   r9   r   r   r   r  h  r}  c                 S   s   t |  S r   )r7   prodr9   r   r   r   r   n  r  z+test_equality_constraints.<locals>.<lambda>r   )r   r   r   rn   )r   r   r   r   r7   r8   r1   )r   r  r  r   r   r   r   r   test_equality_constraintsT  s&   



r  c                  C   sj   dd } | dd}ddddd	d
}t tdgd ||d}|jd  dks(J |jd d dks3J d S )Nc                 S   s   t | d d S rA  r6   r9   r   r   r   r)   v  rC   ztest_gh16971.<locals>.consr    )r#   r"   r-  rV   r   g?)rhobegtolcatol)r0  r   r  r.   )r   r   r0  cobylar   r  )r   r   r   lower)r)   cr   ru   r   r   r   test_gh16971u  s   

r  )	r   r   r   NNNNr   r/   )Er   r  numpyr7   rK  multiprocessingr   numpy.testingr   r   r   r   r  r   r  r   r   r	   r
   r   r   r   r   scipy.optimize._constraintsr   scipy.optimize._shgor   r   r*   r+   r   r   r   r@   r>  r   r   rI   r   rT   r   rd   r   rl   rp   r&   rg  boundsLJr   r   onesr   r   r  r   r  r   r   r   r   r   r   r  r  r  filterwarningsr  r  r  r   r   r   r   <module>   s    (


%
"
	
":m    v

!