
    S_f<                     j    d dl Z d dlZd dlmZmZmZ d dlmc m	Z
 d dlmZ d dlmZmZ  G d d      Zy)    N)assert_array_lessassert_allcloseassert_equal)stats)_differentiate_EERRORINCREASEc            	       N   e Zd Zd Zej
                  j                  dd ej                  ddd      g      d        Z	ej
                  j                  de
j                  j                        d	        Zej
                  j                  d
ddg      ej
                  j                  d e       dddg      d               Zd Zd Zd Zd Zd Zd Zd Zd Zej
                  j                  dd      ej
                  j                  ddddgf      ej
                  j                  dej0                  ej2                  ej4                  f      d                      Zd  Zd! Zej
                  j<                  ej
                  j                  dd" dfd# dff      d$               Zy%)&TestDifferentiatec                 H    t        j                         j                  |      S N)r   normcdf)selfxs     Glib/python3.12/site-packages/scipy/optimize/tests/test_differentiate.pyfzTestDifferentiate.f   s    zz|""    r   333333?皙?
   c                 l   t        | j                  |      }t        j                         j	                  |      }t
        j                  j                  |j                  |       t        t        |j                  |z
        |j                         |j                  j                  |j                  k(  sJ y r   )differentiater   r   r   pdfnptestingr   dfr   abserrorr   shape)r   r   resrefs       r   
test_basiczTestDifferentiate.test_basic   sy     DFFA&jjlq!


""3663/ 	#cffsl+SYY7uu{{cii'''r   casec                     |\  }} t        t        |      | }|j                         dz   }t        |j                  |      }|j                  |      }t        |j                  |d       y )Ng?绽|=atol)getattrr   medianr   r   r   r   r   )r   r$   distnameparamsdistr   r!   r"   s           r   test_accuracyzTestDifferentiate.test_accuracy   s\    &'wuh'0KKMCDHHa(hhqk%0r   order      r    )   )      )r3      r5   c                 z	    |r&t        j                  ddd      j                  |      nd}t        j                  |      t         j                   fd       } fdd_        d_        t        |	      } ||      j                         }|D cg c]  }|j                   }}t        |j                  j                         |       t        |j                  j                  |       |D cg c]  }|j                   }	}t        |j                  j                         |	       t        |j                  j                  |       |D cg c]  }|j                   }
}t        |j                  j                         |
d
       t        |j                  j                  |       |D cg c]  }|j                   }}t        |j                  j                         |       t        |j                  j                  |       t        j                   |j                  j"                  t         j$                        sJ |D cg c]  }|j&                   }}t        |j&                  j                         |       t        |j&                  j                  |       t        j                   |j&                  j"                  t         j(                        sJ |D cg c]  }|j*                   }}t        |j*                  j                         |       t        t        j,                  |j*                        j                         t        |j*                  j                  |j                  j                         t        j                   |j*                  j"                  t         j(                        sJ |D cg c]  }|j
                   }}t        |j
                  j                         |       t        t        j,                  |j
                        j
                         t        |j
                  j                  |j                  j                         t        j                   |j
                  j"                  t         j(                        sJ y c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nr   r   r2   r   c                 4    t        j                  |       S )Nr/   )r   r   )r   r/   r   s    r   _differentiate_singlezCTestDifferentiate.test_vectorization.<locals>._differentiate_single,   s     %88r   c                     xj                   dz  c_         xj                  | j                  k(  s| j                  dk  rdn| j                  d   z  c_         j
                  | g|i |S )Nr0   )nitfevalsizendimr    r   )r   argskwargsr   nr   s      r   r   z/TestDifferentiate.test_vectorization.<locals>.f0   sW    EEQJEGGQVVq[AFFQJqQWWR[HG466!-d-f--r   r;   r   r8   +<r'   )r   linspacereshaper>   	vectorizer<   r=   r   ravelr   r   r   r    r   r   success
issubdtypedtypebool_statusintegernfevmax)r   r/   r    r   r9   r!   refsr"   ref_xref_df	ref_errorref_successref_flagref_nfevref_nitr   rB   s   ``             @@r   test_vectorizationz$TestDifferentiate.test_vectorization$   s&   
 <ABKKtR(007cGGAJ		9 
	9	. Aq.$Q'--/"&'3''u-SUU[[%($()S#&&))/SVV\\5)*./3SYY/	/		)95ASYY__e,.23ss{{33S[[&&(+6S[[&&.}}S[[..999*./3CJJ//SZZ%%'2SZZ%%u-}}SZZ--rzz:::(,-CHH--SXX^^%x0RVVCHH%qww/SXX^^SUU[[1}}SXX^^RZZ888&*+s377++SWW]]_g.RVVCGG_aee,SWW]]CEEKK0}}SWW]]BJJ777A ( * 0 4
 0
 . ,s*   R7RR$3R)
R.!R3?R8c                    t         j                  j                  d      fdd_        t        j                  dt         j
                        f}t        dgdz  dd|	      }t        j                  t        j                  t        t        j                  t        j                  g      }t        |j                  |       y )
N   ;O c                     xj                   dz  c_         d fdd d g}t        | |j                               D cg c]  \  }} ||   |       }}}|S c c}}w )Nr0   c                     | dz
  S )N      @ r   s    r   <lambda>z9TestDifferentiate.test_flags.<locals>.f.<locals>.<lambda>b   s
    q3w r   c                 P    t        j                  |       j                         z  S r   )r   exprandomr   rngs    r   r`   z9TestDifferentiate.test_flags.<locals>.f.<locals>.<lambda>c   s    rvvay5 r   c                 ,    t        j                  |       S r   )r   rb   r_   s    r   r`   z9TestDifferentiate.test_flags.<locals>.f.<locals>.<lambda>d   s    rvvay r   c                 P    t        j                  | t         j                        d   S )Nr^   )r   	full_likenanr_   s    r   r`   z9TestDifferentiate.test_flags.<locals>.f.<locals>.<lambda>e   s    r||Arvv6r: r   )r<   ziprG   )xsjsfuncsr   jr!   r   re   s         r   r   z'TestDifferentiate.test_flags.<locals>.f`   s^    EEQJE&5(:<E ,/r288:+>?41a858A;?C?J @s    Ar   r4   rJ   r0   +=r5   )rtolr/   r@   )r   rc   default_rngr<   arangeint64r   arrayeim_ECONVERGEDr   	_ECONVERR
_EVALUEERRr   rL   )r   r@   r!   	ref_flagsr   re   s       @@r   
test_flagszTestDifferentiate.test_flags\   s     ii##$45	 		!288,.As1u5EHHcoo-!mm!nn. /	 	SZZ+r   c                 (   t         j                  j                  d      fd}t        |dddd      }t        j                  t
        j                  t        t
        j                  t
        j                  g      }t        |j                  |       y )NrZ   c                     | dz
  t        j                  |       j                         z  t        j                  |       t        j                  | t         j                        d   gS )Nr]   r^   )r   rb   rc   rh   ri   rd   s    r   r   z6TestDifferentiate.test_flags_preserve_shape.<locals>.fv   sL    GFF1Icjjl*FF1ILLBFF+B/1 1r   r0   rp   r5   T)rq   r/   preserve_shape)r   rc   rr   r   ru   rv   rw   r   rx   ry   r   rL   )r   r   r!   rz   re   s       @r   test_flags_preserve_shapez+TestDifferentiate.test_flags_preserve_shapes   sk    ii##$45	1 AquAdKHHcoo-!mm!nn. /	 	SZZ+r   c           	      T   d }d}ddt        j                  d|z        z  ddt        j                  d|z        z  z   dt        j                  d|z        z  |dz
  dz  z  dt        j                  d|z        z  |dz
  z  z   g}t        ||d	      }t	        |j
                  |       y )
Nc                     | t        j                  d| z        | t        j                  d| z        z   t        j                  d| z        | dz
  dz  z  gS )Nr3   r      r0   r5   )r   sinr_   s    r   r   z0TestDifferentiate.test_preserve_shape.<locals>.f   sF    rvvac{AbffRTlNBFF2a4L!A#4IJJr   r   r0   r3   r   r   r5   Tr~   )r   cosr   r   r   r   )r   r   r   r"   r!   s        r   test_preserve_shapez%TestDifferentiate.test_preserve_shape   s    	K !BFF1Q3K-2bffRTl?!2"&&A,!ax'!BFF2a4L.!A#*>>@Aq6$r   c                    t        j                         }d}|j                  }|j                  |      }t	        ddd      }|j                         }d|d<   t        ||fi |}t        t        |j                  |z
        d       d|d<   t        ||fi |}t        t        |j                  |z
        d       t        t        |j                  |z
        t        |j                  |z
               |j                         }d|d<   t        ||fi |}t        t        |j                  |z
        dt        j                  |      z         d|d<   t        ||fi |}t        t        |j                  |z
        dt        j                  |      z         t        t        |j                  |z
        t        |j                  |z
               y )	Nr0   r   r4   )r(   rq   r/   gMbP?r(   gư>rq   )r   r   r   r   dictcopyr   r   r   r   r   )	r   r-   r   r   r"   kwargs0rA   res1res2s	            r   test_convergencez"TestDifferentiate.test_convergence   sr   zz|HHhhqkAAQ/vQ,V,#dggm,d3vQ,V,#dggm,d3#dggm,c$''C-.@AvQ,V,#dggm,dRVVC[.@AvQ,V,#dggm,dRVVC[.@A#dggm,c$''C-.@Ar   c                    t        j                         }d}|j                  }|j                  |      }t	        ||dd      }t	        ||dd      }t        |j                  |z
        t        |j                  |z
        k  sJ t	        ||dd      }t	        ||dd      }t        |j                  |z
        t        |j                  |z
        k  sJ t        ddd	
      }t	        ||fddd|}t	        ||fddd|}t        |j                  |j                  d       t        ddd
      }t	        ||fddd|}t	        ||fdt        j                  d      z  dd|}t        |j                  |j                  d       d|d<   t	        ||fddd|}t	        ||fdt        j                  d      z  dd|}t        |j                  |j                  d       y )Nr0   g      ?)initial_stepmaxiterg?r5   )step_factorr   r   r4   r   )r/   r   step_direction)r   r   rC   rq   r;   r   )r   r   r   r   r   r   r   r   r   r   sqrt)	r   r-   r   r   r"   r   r   rA   r!   s	            r   test_step_parametersz&TestDifferentiate.test_step_parameters   s   zz|HHhhqkQQ?Qa@477S=!C#$6666Qq!<Qr1=477S=!C#$6666 Aq;AqNsNvNAqJqaJ6JU3 Aq;AqJqaJ6JAq -q| -%+-U3#% AqJqaJ6JAq -q| -%+-U3r   c                 4   d }t        j                  ddd      }t        j                  |      }d\  ||dk  <   ||dkD  <   t        |||      }t	        |j
                  t        j                  |             t        j                  |j                        sJ y )	Nc                 h    t        j                  |       }t         j                  || dk  | dkD  z   <   |S )Nr   r5   )r   rb   ri   )r   ys     r   r   z0TestDifferentiate.test_step_direction.<locals>.f   s/    q	A#%66Aq1uQ Hr   r   r5   r   )r0   r;   r   gffffff?)r   )	r   rD   
zeros_liker   r   r   rb   allrH   )r   r   r   r   r!   s        r   test_step_directionz%TestDifferentiate.test_step_direction   s    	
 KK1b!q);@8q3wC!8Aq@q	*vvckk"""r   c                    d }d }t        j                  g d      j                  ddd      }t        j                  g d      j                  ddd      }t        j                  ddg      j                  ddd      }t        ||||f	      }t        j                   |||      |j
                  j                        }t        |j
                  |       y )
Nc                     | |z  S r   r^   r   ps     r   r   z@TestDifferentiate.test_vectorized_step_direction_args.<locals>.f   s    6Mr   c                     || |dz
  z  z  S Nr0   r^   r   s     r   r   zATestDifferentiate.test_vectorized_step_direction_args.<locals>.df   s    qQU|##r   )r0   r5   r3   r4   r;   r0   r;   r   r0   r5   r3   )r   r@   )r   ru   rE   r   broadcast_tor   r    r   )r   r   r   r   hdirr   r!   r"   s           r   #test_vectorized_step_direction_argsz5TestDifferentiate.test_vectorized_step_direction_args   s    		$ HH\"**2q!4xx
#++Ar15HHaV$$Q2.AqQDAoobAh5$r   c                   	 d}t        j                         d	fd}d}t        ||	d      }t        j                  |j
                        rJ t        j                  |j                  |dz   	dz
  dz  z   k(        sJ t        j                  |j                  	k(        sJ 	fd	d
_	        d _
        t               _        t        ||d      }|j                         D ]}  }|dk(  rS||   t        j                  k(  sJ j                  |   t        j                   k(  sJ ||   t        j"                  k(  rYJ ||   j                  |   cxk(  r
||   k(  rzJ  J  y )Ng~,?r3   c                 *    j                  |       }|S r   )r   )r   r!   r-   s     r   r   z2TestDifferentiate.test_maxiter_callback.<locals>.f   s    ((1+CJr      V瞯<)r   rq   r0   r5   c                 @   xj                   dz  c_         | _        t        | d      sJ | j                  j                  vsJ j                  j                  | j                         | j                  t        j                  k(  sJ j                   k(  rt        y )Nr0   r   )
iterr!   hasattrr   dfsaddrL   rv   _EINPROGRESSStopIteration)r!   callbackr   s    r   r   z9TestDifferentiate.test_maxiter_callback.<locals>.callback   s    MMQMHL3$$$66---LLSVV$::!1!1111}}'## (r   r;   )r   rq   rL   )r   r   r   r   anyrH   r   rN   r<   r   r!   setr   keysrv   rx   r   
_ECALLBACK)
r   r   r   default_orderr!   r   keyr   r-   r   s
          @@@r   test_maxiter_callbackz'TestDifferentiate.test_maxiter_callback   sS   zz|	 Aq'>66#++&&&vvchh-!"3w{Ao"EEFFFvvcgg()))	$ uQH5A 88: 	BCh3x3==000||C(C,<,<<<<CyCNN222CyHLL$5ASAAAAA	Br   r   r   g?gffffff?rJ   c                    t        j                  |      d   }fd}fd}t        ||d||      }|j                  j                  k(  sJ |j
                  j                  k(  sJ |j                  j                  k(  sJ t        j                        j                  }t        |j
                  t        j                  |j                        t        j                  |             y )Nro   r^   c                 P    | j                   k(  sJ t        j                  |       S r   )rJ   r   rb   )r   rJ   s    r   r   z'TestDifferentiate.test_dtype.<locals>.f  s#    77e###66!9r   c                     | j                   j                  k(  sJ | j                  j                  k(  sJ | j                  j                  k(  sJ y r   )r   rJ   r   r   )r!   rJ   s    r   r   z.TestDifferentiate.test_dtype.<locals>.callback  sE    55;;%'''66<<5(((99??e+++r   r4   )r/   r   r   r   )r   asarrayr   r   rJ   r   r   finfoepsr   rb   r   )r   r   r   rJ   r   r   r!   r   s      `    r   
test_dtypezTestDifferentiate.test_dtype  s    
 JJq&r*		,
 Aq$,46uu{{e###vv||u$$$yy%'''hhuo!!suuBGGCLAr   c                    d}t        j                  t        |      5  t        d d       d d d        d}t        j                  t        |      5  t        d d       d d d        d}t        j                  t        |      5  t        d d	d
g       d d d        d}t        j                  t        |      5  t        d dd       d d d        t        j                  t        |      5  t        d dd       d d d        t        j                  t        |      5  t        d dd        d d d        t        j                  t        |      5  t        d dt	                      d d d        d}t        j                  t        |      5  t        d dd       d d d        t        j                  t        |      5  t        d dd       d d d        d}t        j                  t        |      5  t        d dd       d d d        t        j                  t        |      5  t        d dd       d d d        d }t        j                  t        |      5  t        d! dd"#       d d d        d$}t        j                  t        |      5  t        d% dd&'       d d d        y # 1 sw Y   xY w# 1 sw Y   ]xY w# 1 sw Y   5xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   kxY w# 1 sw Y   ExY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)(Nz`func` must be callable.)matchr0   z3Abscissae and function output must be real numbers.c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>1      A r   y            ?z6When `preserve_shape=False`, the shape of the array...c                 
    g dS )N)r0   r5   r3   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>5  s    I r   z6Tolerances and step parameters must be non-negative...c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>9  r   r   r;   r'   c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>;  r   r   ekkir   c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>=  r   r   )r   c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>?  r   r   )r   z%`maxiter` must be a positive integer.c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>C  r   r         ?)r   c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>E  r   r   r   z"`order` must be a positive integerc                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>I  r   r   r8   c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>K  r   r   z'`preserve_shape` must be True or False.c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>O  r   r   herringr   z`callback` must be callable.c                     | S r   r^   r_   s    r   r`   z9TestDifferentiate.test_input_validation.<locals>.<lambda>S  r   r   	shrubbery)r   )pytestraises
ValueErrorr   object)r   messages     r   test_input_validationz'TestDifferentiate.test_input_validation(  s    -]]:W5 	#$"	# H]]:W5 	.+u-	. K]]:W5 	9-Bx8	9 K]]:W5 	3+qr2	3]]:W5 	7+qv6	7]]:W5 	=+qt<	=]]:W5 	@+qfh?	@ :]]:W5 	7+q#6	7]]:W5 	5+q!4	5 7]]:W5 	5+q4	5]]:W5 	3+q2	3 <]]:W5 	D+qC	D 1]]:W5 	@+q;?	@ 	@M	# 	#	. 	.	9 	9	3 	3	7 	7	= 	=	@ 	@	7 	7	5 	5	5 	5	3 	3	D 	D	@ 	@s   J,J9K8K+K K-K:LL6L!)L.L:M,J69KKK K*-K7:LLL!L+.L7:MMc           
      P   d }t        |dd      }|j                  sJ t        |j                  d       t	        d      D ]  d}fd}d	z  |d
z
  z  z  }t        ||d
t        d
            }t        |j                  |d       t        |j                  t        j                         t        ||t        d
            }|j                  sJ |j                  d	k(  sJ t        |j                  |d        d }t        |d	d      }t        |j                  d       y )Nc                 r    t        j                  | j                  t         j                        sJ | dz  dz
  S )Nc   r0   )r   rI   rJ   floatingr_   s    r   r   z/TestDifferentiate.test_special_cases.<locals>.fZ  s,    =="++6667Q;r      r&   r   gl)~IQr1   r   c                     d| z  z  S )Nr5   r^   )r   rB   s    r   r   z/TestDifferentiate.test_special_cases.<locals>.fk  s    Avr   r5   r0   )r   r/   r   r8   c                     || z  dz
  S r   r^   )r   cs     r   r   z/TestDifferentiate.test_special_cases.<locals>.fz  s    Q37Nr   r3   )r@   )r   rH   r   r   rangerO   r   r   r   ri   r<   )r   r   r!   r   r"   rB   s        @r   test_special_casesz$TestDifferentiate.test_special_casesU  s   
	 Aqu-{{{	* q 	5AA A#a!A#h,C1as1ayACCFFCe4BFF+1C1I6C;;;77a<<CFFCe4	5"	 Aqq)"r   c                     | dz
  dz  S )Nr0   r3   r^   r_   s    r   r`   zTestDifferentiate.<lambda>  s    AEa< r   c                 N    t        j                  | dkD  | dz
  dz  | dz
  dz        S )Nr0      r3   )r   wherer_   s    r   r`   zTestDifferentiate.<lambda>  s'    288AEAEa<!a%A> r   c                     d}t        |g d|d}t        j                  |j                        sJ t	        |j
                  d|       y )NgؗҜ<r   )r   r(   r   r'   )r   r   r   rH   r   r   )r   r$   r(   r!   s       r   test_saddle_gh18811z%TestDifferentiate.test_saddle_gh18811  s=     T*4Hvvckk"""-r   N) __name__
__module____qualname__r   r   markparametrizer   rD   r#   r   _distr_paramsdistcontr.   tuplerX   r{   r   r   r   r   r   r   r   float16float32float64r   r   r   xfailr   r^   r   r   r
   r
      s   # [[S3E4(D"EF( G( [[VU%8%8%A%AB1 C1 [[Wq!f-[[Wuwvy&IJ48 K .48l,.,"	%B4 4D#%&BP [[VZ0[[S4$"56[[Wrzz2::rzz&JKB L 7 1B*+@Z)#V [[[[V	#	>B& .	 
.r   r
   )r   numpyr   numpy.testingr   r   r   (scipy._lib._elementwise_iterative_method_lib_elementwise_iterative_methodrv   scipyr   scipy.optimize._differentiater   r   r   r
   r^   r   r   <module>r      s+      J J 6 6 <A. A.r   