
    ^Mhm                        d dl Z d dlZd dlZd dlmZ d dlmc mZ	 d dl
mZmZmZ d dlmZmZmZ d dlmZmZmZ d dlmZmZmZ d dlmZ eej                            d          gZd	Zd
Z ej        !                    de          ej        !                    de            G d d                                  Z" G d d          Z#ej        !                    de          ej        !                    de            G d de#                                  Z$ej        !                    de          ej        !                    de            G d de#                                  Z%dS )    N)array_api_compatible)xp_assert_closexp_assert_equalxp_assert_less)is_numpyis_torcharray_namespace)statsoptimizespecial)
derivativejacobianhessian)_EERRORINCREASEskip_xp_backendsz5Array API does not support fancy indexing assignment.z*JAX arrays do not support item assignment.array_api_strict)reasonz	jax.numpyc            	          e Zd Zd Zej                            dd ej        ddd          g          d             Z	ej        
                    d	          ej                            d
ej        j                  d                         Zej                            dddg          e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d Zej                            dd          ej                            dddd gf          ej                            d!d"          d#                                     Zd$ Zd% Zej        
                    d	          ej        j        ej                            d
d& dfd' dff          d(                                     Zd)S )*TestDerivativec                 *    t          j        |          S Nr   ndtr)selfxs     l/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/scipy/differentiate/tests/test_differentiate.pyfzTestDerivative.f   s    |A    r   333333?皙?
   c                    |                     d          j        }t          | j        |                     ||                    }|                     t	          j                                        |          |          }t          |j        |           t          |          s2t          |                    |j        |z
            |j                   d S d S )N      ?dtype)asarrayr&   r   r   r
   normpdfr   dfr   r   abserror)r   r   xpdefault_dtyperesrefs         r   
test_basiczTestDerivative.test_basic   s     

2,A]!C!CDDjj))!,,MjBB$$$ || 	<266#&3,//;;;;;	< 	<r   T)np_onlycasec                     |\  }} t          t          |          | }|                                dz   }t          |j        |          }|                    |          }t          |j        |d           d S )N皙?绽|=atol)getattrr
   medianr   cdfr)   r   r*   )r   r3   distnameparamsdistr   r/   r0   s           r   test_accuracyzTestDerivative.test_accuracy)   ss      &'wuh''0KKMMC1%%hhqkk%000000r   order      shape)         )rF      rH   c                 D    |r)t          j        ddd                              |          nd}t          j        |          i t           j         fd            } fd}dd<   d	d
<   t          ||                    ||j                            } ||                                          }d |D             }	t          |                    |j
        d          |                    |	                     d |D             }
t          |                    |j        d          |                    |
                     d |D             }t          |                    |j        d          |                    |          d           d |D             }t          |                    |j        d          |                    |                     d |D             }t          |                    |j        d          |                    |                     d |D             }t          |                    |j        d          |                    |                     t#          |          r&|                    |j                  d
         k    sJ d |D             }t          |                    |j        d          |                    |                     t#          |          r&|                    |j                  d         k    sJ d S d S )Nr    r!   rD   r   c                 2    t          j        |           S )Nr@   )r   r   )r   r@   r   s    r   _derivative_singlez=TestDerivative.test_vectorization.<locals>._derivative_single<   s    dfau5555r   c                     dxx         dz  cc<   dxx         | j         k    s| j        dk    rdn| j        d         z  cc<    j        | g|R i |S )NnitrA   feval)sizendimrC   r   )r   argskwargsnr   states      r   r   z,TestDerivative.test_vectorization.<locals>.f@   so    %LLLALLL'NNNAFaKK16A::aaAGBKONNN46!-d---f---r   rP   rN   r   rO   r%   rK   c                     g | ]	}|j         
S  r   .0r0   s     r   
<listcomp>z5TestDerivative.test_vectorization.<locals>.<listcomp>K   s    '''3'''r   rP   c                     g | ]	}|j         
S rX   )r*   rZ   s     r   r\   z5TestDerivative.test_vectorization.<locals>.<listcomp>N   s    )))S#&)))r   c                     g | ]	}|j         
S rX   )r,   rZ   s     r   r\   z5TestDerivative.test_vectorization.<locals>.<listcomp>Q   s    ///3SY///r   g-q=r7   c                 6    g | ]}t          |j                  S rX   )boolsuccessrZ   s     r   r\   z5TestDerivative.test_vectorization.<locals>.<listcomp>U   s"    999StCK((999r   c                 @    g | ]}t          j        |j                  S rX   )npint32statusrZ   s     r   r\   z5TestDerivative.test_vectorization.<locals>.<listcomp>X   s$    999SBHSZ((999r   c                 @    g | ]}t          j        |j                  S rX   )rd   re   nfevrZ   s     r   r\   z5TestDerivative.test_vectorization.<locals>.<listcomp>[   s$    7773BHSX&&777r   c                 @    g | ]}t          j        |j                  S rX   )rd   re   rN   rZ   s     r   r\   z5TestDerivative.test_vectorization.<locals>.<listcomp>`   s$    55528CG$$555r   )rd   linspacereshaperQ   	vectorizer   r'   float64ravelr   r   r*   r,   r   rb   rf   rh   r   maxrN   )r   r@   rC   r-   r   rL   r   r/   refsref_xref_df	ref_errorref_successref_flagref_nfevref_nitrU   rV   s   ``              @@r   test_vectorizationz!TestDerivative.test_vectorization3   s"   
 <AIBKtR((00777cGAJJ		6 	6 	6 	6 	6 
	6	. 	. 	. 	. 	. 	. 	.
 egBJJq
J;;5III!!!$$**,,''$'''

35%00"**U2C2CDDD))D)))

365112::f3E3EFFF//$///	

39e44bjj6K6K"	$ 	$ 	$ 	$ :9D999

3;66

;8O8OPPP99D999

3:u55rzz(7K7KLLL77$777

38U33RZZ5I5IJJJB<< 	666#(##uW~555555555

37E22BJJw4G4GHHHB<< 	366#'??eEl2222	3 	322r   c                    t           j                            d          fdd_                            dj                  f}t                              dj                  t          d          d|	          }
                    t          j        t          t          j        t          j        gj                  }t#          |j        |           d S )
N   ;O c                     xj         dz  c_         d fdfdfdgfdt          |                     |d                    D             }                    |          S )NrA   c                     | dz
  S Ng      @rX   rY   s    r   <lambda>z6TestDerivative.test_flags.<locals>.f.<locals>.<lambda>k   s
    q3w r   c                 X                         |                                           z  S r   )exprandom)r   rngr-   s    r   r~   z6TestDerivative.test_flags.<locals>.f.<locals>.<lambda>l   s    rvvayy5 r   c                 .                         |           S r   r   r   r-   s    r   r~   z6TestDerivative.test_flags.<locals>.f.<locals>.<lambda>m   s    rvvayy r   c                 :                         | j                  S r   )	full_likenanr   s    r   r~   z6TestDerivative.test_flags.<locals>.f.<locals>.<lambda>n   s    r||Arv66 r   c                 R    g | ]#\  }} t          |                   |          $S rX   )int)r[   r   jfuncss      r   r\   z8TestDerivative.test_flags.<locals>.f.<locals>.<listcomp>o   s1    OOO1=5Q=##OOOr   r]   )rN   ziprk   stack)xsjsr/   r   r   r   r-   s      @r   r   z$TestDerivative.test_flags.<locals>.fi   s    EEQJEE&&55555((((66668E POOOB

2u8M8M0N0NOOOC88C== r   r   rG   r%   +=rtolrH   )
tolerancesr@   rS   )rd   r   default_rngrN   arangeint64r   onesrm   dictr'   eim_ECONVERGEDr   	_ECONVERR
_EVALUEERRre   r   rf   )r   r-   rS   r/   	ref_flagsr   r   s    `   @@r   
test_flagszTestDerivative.test_flagse   s     i##$455	! 	! 	! 	! 	! 	! 	! 		!28	,,.BGGARZG88$(e$4$4$4 t- - - JJ / # # 0 8:x  A A	 	
I.....r   c                 |   t           j                            d          fd}t          |                    dj                  t          d          dd	          }                    t          j        t          t          j
        t          j        gj                  }t          |j        |           d S )
Nrz   c                     | dz
                       |                                           z                       |                               | j                  g}                    |          S r}   )r   r   r   r   r   )r   outr   r-   s     r   r   z3TestDerivative.test_flags_preserve_shape.<locals>.f   s]    s766!99SZZ\\)66!99<<26**,C 88C== r   rA   r%   r   r   rH   T)r   r@   preserve_shape)rd   r   r   r   r'   rm   r   r   r   r   r   r   re   r   rf   )r   r-   r   r/   r   r   s    `   @r   test_flags_preserve_shapez(TestDerivative.test_flags_preserve_shape~   s    i##$455	! 	! 	! 	! 	! 	! BJJq
J;;$(e$4$4$4 7 7 7 JJ / # # 0 8:x  A A	 	
I.....r   c                    fd}                     d          }                                          d          d                    d|z            z  dd                    d|z            z  z   d                    d|z            z  |dz
  dz  z  d                    d|z            z  |dz
  z  z   g          }t          ||d	          }t	          |j        |           d S )
Nc                     |                      d| z            |                      d| z            z                        d| z            | dz
  dz  z  g}                    |          S )NrF   r"      rA   rH   )sinr   )r   r   r-   s     r   r   z-TestDerivative.test_preserve_shape.<locals>.f   s\    bffQqSkk1RVVBqD\\>266"Q$<<1q3HIC88C== r           rA   rF   r"   r   rH   Tr   )r'   cosr   r   r   r*   )r   r-   r   r   r0   r/   s    `    r   test_preserve_shapez"TestDerivative.test_preserve_shape   s    	! 	! 	! 	! 	! JJrNNjj"**Q--266!A#;;"RVVBqD\\/8IRVVBqD\\/1Q3(2Qrvvbd||^QqS5IIK L LAd333$$$$$r   c                    |                     d|j                  }t          j        }t	          t
          j                            d                    }t          dd          }|	                                }d|d<   t          |||d          }t          |j        |z
            dk     sJ d	|d<   t          |||d          }t          |j        |z
            d	k     sJ t          |j        |z
            t          |j        |z
            k     sJ |	                                }d|d
<   t          |||d          }t          |j        |z
            d|z  k     sJ d	|d
<   t          |||d          }t          |j        |z
            d	|z  k     sJ t          |j        |z
            t          |j        |z
            k     sJ d S )Nr$   r%   r   )r8   r   gMbP?r8   rG   )r   r@   gư>r   )r'   rm   r   r   floatr
   r(   r)   r   copyr   r+   r*   )	r   r-   r   r   r0   tolerances0r   res1res2s	            r   test_convergencezTestDerivative.test_convergence   s   JJrJ,,LEJNN2&&''*** %%''
!
6!Q:Q???47S=!!D((((!
6!Q:Q???47S=!!D((((47S=!!C#$6$66666 %%''
!
6!Q:Q???47S=!!D3J....!
6!Q:Q???47S=!!D3J....47S=!!C#$6$6666666r   c                 (   |                     d|j                  }t          j        }t	          t
          j                            d                    }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           d S )Nr$   r%         ?rA   )initial_stepmaxiterg?rH   )step_factorr   r   rG   r   )r@   r   step_direction)r   r   g+<r   rP   r   )r'   rm   r   r   r   r
   r(   r)   r   r+   r*   r   r   rd   sqrt)	r   r-   r   r   r0   r   r   rT   r/   s	            r   test_step_parametersz#TestDerivative.test_step_parameters   sA   JJrJ,,LEJNN2&&''!QS!<<<!QT1===47S=!!C#$6$66666!QAq999!QB:::47S=!!C#$6$66666 Aq;;;AKCSKKFKKAGA1GGGGU3333 Aq;;;AGA1GGGGATAbgajjLcTTVTTU3333#% AGA1GGGGATAbgajjLcTTVTTU333333r   c                 <   fd}                     ddd          }                    |          }d\  ||dk     <   ||dk    <   t          |||          }t          |j                            |                                         |j                  sJ d S )	Nc                 \                         |           }j        || dk     | dk    z   <   |S )Nr   rH   )r   r   r   yr-   s     r   r   z-TestDerivative.test_step_direction.<locals>.f   s0    q		A#%6Aq1uQ Hr   r   rH   r"   )rA   rP   r   gffffff?r   )rj   
zeros_liker   r   r*   r   allrb   )r   r-   r   r   r   r/   s    `    r   test_step_directionz"TestDerivative.test_step_direction   s    	 	 	 	 	
 KK1b!!q));@8q3wC!8An===q		***vvck"""""""r   c                    d }d }|                     |                    g d          d          }|                     |                    g d          d          }|                     |                    ddg          d	          }t          ||||f
          }|                     |||          |j        j                  }|                    ||                    d          j                  }t          |j        |           d S )Nc                     | |z  S r   rX   r   ps     r   r   z=TestDerivative.test_vectorized_step_direction_args.<locals>.f   s    6Mr   c                     || |dz
  z  z  S NrA   rX   r   s     r   r*   z>TestDerivative.test_vectorized_step_direction_args.<locals>.df   s    qQU|##r   )rA   rH   rF   rG   )rP   rA   rA   rP   r   rA   )rA   rP   rA   rH   rF   )rA   rA   rP   )r   rS   r$   r%   )rk   r'   r   broadcast_tor*   rC   r&   r   )	r   r-   r   r*   r   hdirr   r/   r0   s	            r   #test_vectorized_step_direction_argsz2TestDerivative.test_vectorized_step_direction_args   s    	 	 		$ 	$ 	$ JJrzz,,,//<<zz"**ZZZ00*==JJrzz1a&)):66Ad!>>>oobbAhh55jjBJJrNN$8j99$$$$$r   c           	      b   fd}                     dj                  }                     g d          }                                        ddd          d          }t	          |||d	d
|          }                    |j         ||          z
            }                    |d ddf         |d
d df         k               sJ t          |j	        d                   D ]E}t	          ||||df         d	d
|          }	t          |j        |d d f         |	j        d           Fd S )Nc                 .                         |           S r   r   r   s    r   r   z+TestDerivative.test_initial_step.<locals>.f   s    66!99r   r   r%   r   r   r"   )rP   rA   rH   rA   )r   r@   r   r   rP   .r   r   )r'   rm   rk   logspacer   r+   r*   r   rangerC   r   )
r   r-   r   r   r   h0r/   errir0   s
    `        r   test_initial_stepz TestDerivative.test_initial_step   s^   	 	 	 	 	 JJrJ,,JJJ//ZZB2..88ABa(68 8 8ffSVaadd]## vvc#2#s(mc!""c'l233333 rx{## 	> 	>AQ1a41,:< < <CCF1aaa4L#&u=====	> 	>r   c                   	 |                     d|j                  }d	d }d}t          ||	t          d                    }|                    |j                  rJ |                    |j        |d	z   	d	z
  d
z  z   k              sJ |                    |j        	k              sJ 	fdd_	        d _
        t                      _        t          ||t          d                    }|                                D ]a}|dk    r1||         t          j        k    sJ ||         t          j        k    sJ 9||         j
        |         cxk    r||         k    sn J bd S )Ng~,?r%   rF   c                 .    t          j        |           }|S r   r   )r   r/   s     r   r   z/TestDerivative.test_maxiter_callback.<locals>.f  s    ,q//CJr      V瞯<r   )r   r   rA   rH   c                 >   xj         dz  c_         | _        t          | d          sJ t          | j                  j        vsJ j                            t          | j                             | j        t          j	        k    sJ j         k    rt          d S )NrA   r   )iterr/   hasattrr   r*   dfsaddrf   r   _EINPROGRESSStopIteration)r/   callbackr   s    r   r   z6TestDerivative.test_maxiter_callback.<locals>.callback  s    MMQMMHL3$$$$$==4444LU36]]+++:!11111}''## ('r   rP   )r   r   rf   )r'   rm   r   r   anyrb   r   rh   rN   r   r/   setr   keysr   r   
_ECALLBACK)
r   r-   r   r   default_orderr/   r   keyr   r   s
           @@r   test_maxiter_callbackz$TestDerivative.test_maxiter_callback
  s   JJxrzJ22	 	 	 Aw4U;K;K;KLLL66#+&&&&&vvch-!"3w{Ao"EEFFFFFvvcg()))))	$ 	$ 	$ 	$ 	$ 	$ uu!Qd>N>N>NOOO 88:: 	B 	BCh3x3=0000CyCN22222CyHL$5AAAASAAAAAAA	B 	Br   r   r   g?gffffff?r&   )float16float32rm   c                    dk    r#t                    st          j        d           t                                        |          }fd}fd}t          ||d||          }|j        j        k    sJ |j        j        k    sJ |j	        j        k    sJ 
                              j        }t                    r|dz  d	z  n|dz  }	t          |j                            |j                  |	
           d S )Nr   z+float16 not tested for alternative backendsr%   c                 H    | j         k    sJ                     |           S r   )r&   r   )r   r&   r-   s    r   r   z$TestDerivative.test_dtype.<locals>.f;  s&    7e####66!99r   c                 t    | j         j        k    sJ | j        j        k    sJ | j        j        k    sJ d S r   )r   r&   r*   r,   )r/   r&   s    r   r   z+TestDerivative.test_dtype.<locals>.callback?  sH    5;%''''6<5((((9?e++++++r   rG   )r@   r   r   r   2   r   )r   pytestskipr9   r'   r   r   r&   r*   r,   finfoepsr   r   r   )
r   r   r   r&   r-   r   r   r/   r   r   s
      ``     r   
test_dtypezTestDerivative.test_dtype0  s>    IhrllKEFFF E""JJqJ&&	 	 	 	 	 		, 	, 	, 	, 	,
 AQthOOOu{e####v|u$$$$y%''''hhuoo! (:sCx"}}#s(suD999999r   c                 t   |                     d          }d}t          j        t          |          5  t	          d |           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t	          d |                     d                     d d d            n# 1 swxY w Y   d}t          j        t          |          5  t	          d |                     d	d
g                     d d d            n# 1 swxY w Y   d}t          j        t          |          5  t	          d |t          d                     d d d            n# 1 swxY w Y   t          j        t          |          5  t	          d |t          d                     d d d            n# 1 swxY w Y   t          j        t          |          5  t	          d |t                                 d d d            n# 1 swxY w Y   d}t          j        t          |          5  t	          d |d           d d d            n# 1 swxY w Y   t          j        t          |          5  t	          d |d           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t	          d |d           d d d            n# 1 swxY w Y   t          j        t          |          5  t	          d |d           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t	          d  |d!"           d d d            n# 1 swxY w Y   d#}t          j        t          |          5  t	          d$ |d%&           d d d            d S # 1 swxY w Y   d S )'NrA   z`f` must be callable.matchz3Abscissae and function output must be real numbers.c                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>W       r   y            ?z6When `preserve_shape=False`, the shape of the array...c                 
    g dS )N)rA   rH   rF   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>[  s
     r   r   z6Tolerances and step parameters must be non-negative...c                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>_  r   r   rP   r7   r   c                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>a  r   r   ekkir   c                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>c  r   r   r   %`maxiter` must be a positive integer.c                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>g  r   r         ?r   c                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>i  r   r   r   z"`order` must be a positive integerc                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>m  r   r   rK   c                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>o  r   r   z'`preserve_shape` must be True or False.c                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>s  r   r   herringr   z`callback` must be callable.c                     | S r   rX   rY   s    r   r~   z6TestDerivative.test_input_validation.<locals>.<lambda>w  r   r   	shrubbery)r   )r'   r   raises
ValueErrorr   r   object)r   r-   onemessages       r   test_input_validationz$TestDerivative.test_input_validationM  s   jjmm)]:W555 	" 	"tS!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" H]:W555 	7 	7{{BJJu$5$5666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 K]:W555 	B 	B**BJJBx,@,@AAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B K]:W555 	C 	C{{CDbMMMBBBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C]:W555 	G 	G{{CDf4E4E4EFFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G]:W555 	? 	?{{CVXX>>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? :]:W555 	6 	6{{C5555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6]:W555 	4 	4{{C3333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 7]:W555 	4 	4{{Cs3333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4]:W555 	2 	2{{Cq1111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 <]:W555 	C 	C{{C	BBBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 1]:W555 	? 	?{{C+>>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?s   AAA8%B))B-0B-'DDD,"EE!E "F..F25F2 H  HH(III.JJJ6KKK<LL #L M$$M(+M(N--N14N1c           
         d }t          |          sdt          ||                    d          t          d                    }|j        sJ t          |j        |                    d                     t          |j        |                    d          |j                  }t          |j        |                    |j                             t          |j
        |                    d	|j        
                     t          |j        |                    d          d          }t          |j        |                    |j                             t          |j
        |                    d	|j        
                     t          d          D ]|                    d|j        
          }fd}dz  |dz
  z  z  }t          ||dt          d                    }t          |j        |d           t          |j        |                    |j        |j        
                     t          ||t          d                    }|j        sJ |j        dk    sJ t          |j        |d           d }t          ||                    d          |                    d                    }t          |j        |                    d                     d S )Nc                 j    t          |           }|                    | j        d          sJ | dz  dz
  S )Nzreal floatingc   rA   )r	   isdtyper&   )r   xp_tests     r   r   z,TestDerivative.test_special_cases.<locals>.f~  s9    %a((G??17O<<<<<7Q;r      r6   r   r   gl)~IQrA   r   r   r%   r   r   rB   r  c                     d| z  z  S NrH   rX   )r   rU   s    r   r   z,TestDerivative.test_special_cases.<locals>.f  s    Avr   rH   )r   r@   r   rK   c                     || z  dz
  S r   rX   )r   cs     r   r   z,TestDerivative.test_special_cases.<locals>.f  s    Q37Nr   rF   )rS   g      @)r   r   r'   r   rb   r   r*   r   r   r   rf   re   r   rm   ro   r,   rN   )r   r-   r   r/   r   r0   rU   s         @r   test_special_casesz!TestDerivative.test_special_casesy  s   
	 	 	
 || 	;Q

1$E:J:J:JKKKC;CFBJJy$9$9::: ArvFFF

26 2 2333
BJJrJ$B$BCCCAQ???

26 2 2333
BJJrJ$B$BCCC q 	5 	5A

3bj
11A     A#a!A#h,CQ1C1II>>>CCFCe4444CIrzz"&
z'K'KLLLQQ333C;7a<<<<CFCe44444	 	 	 BJJqMM

1>>>

2/////r   c                     | dz
  dz  S )NrA   rF   rX   rY   s    r   r~   zTestDerivative.<lambda>  s    AEa< r   c                 N    t          j        | dk    | dz
  dz  | dz
  dz            S )NrA      rF   )rd   whererY   s    r   r~   zTestDerivative.<lambda>  s(    28AEAEa<!a%A>> r   c                     d}t          |g d|d}t          j        |j                  sJ t	          |j        d|           d S )NgؗҜ<r   )r   r8   r   r7   )r   rd   r   rb   r   r*   )r   r3   r8   r/   s       r   test_saddle_gh18811z"TestDerivative.test_saddle_gh18811  sV     $zzzEEEvck"""""------r   N)__name__
__module____qualname__r   r   markparametrizerd   rj   r1   r   r
   _distr_paramsdistcontr?   tuplerx   r   r   r   r   r   r   r   r   r   r   r  r  xfailr$  rX   r   r   r   r      s          [S3E4(D(D"EFF	< 	< GF	< [!!$!//[VU%8%ABB1 1 CB 0/1 [Wq!f--[Wuuwwvy&IJJ.3 .3 KJ .-.3`/ / /2/ / /(
% 
% 
%7 7 724 4 4># # #% % % > > >,$B $B $BL [VZ00[S4$"566[W&GHH: : IH 76 10:4*? *? *?X40 40 40n [!!$!//[[V		#	>	>B&  . .	   0/. . .r   r   c                       e Zd Zd ZdS )JacobianHessianTestc                    | j         j        }d}t          j        t          |          5   ||j        dt          d                     d d d            n# 1 swxY w Y   |                    d          }t          j	        }d}t          j        t          |          5   |||t          d                     d d d            n# 1 swxY w Y   t          j        t          |          5   |||t          d	                     d d d            n# 1 swxY w Y   t          j        t          |          5   |||d
           d d d            n# 1 swxY w Y   d}t          j        t          |          5   |||d           d d d            n# 1 swxY w Y   d}t          j        t          |          5   |||d           d d d            d S # 1 swxY w Y   d S )Nz"Argument `x` must be at least 1-D.r   rA   rP   r7   r   rF   z<Tolerances and step parameters must be non-negative scalars.r   r  z#`order` must be a positive integer.rK   r  r  )
jh_func__func__r   r  r  r   r   r   r   rosen)r   r-   r1  r  r   funcs         r   test_ivzJacobianHessianTest.test_iv  sm   ,' 7]:W555 	9 	9GBFA$B---8888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9
 GGAJJ~P]:W555 	7 	7GD!"6666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7]:W555 	7 	7GD!"6666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7]:W555 	- 	-GD!,,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 8]:W555 	' 	'GD!2&&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' :]:W555 	) 	)GD!R((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)sk   "AAA!C

CC0DD D?EE!EFF!$F!G!!G%(G%N)r%  r&  r'  r5  rX   r   r   r/  r/    s#        ) ) ) ) )r   r/  c                      e Zd ZeZd Zd Zde_        ee_        d Z	d Z
de	_        e
e	_        d Zd Zde_        ee_        d	 Zd
 Zde_        ee_        d Zd Zde_        ee_        d Zde_        ej        e_        ej                            dd          ej                            dg d          ej                            dee	eeeeg          d                                     Zd Zd ZdS )TestJacobianc                 x    | \  }}|                     |dz  |z  d|z  |                    |          z   g          S NrH   r!  r   r   )zr-   r   r   s       r   f1zTestJacobian.f1  s=    1xxa!QURVVAYY%67888r   c                 x    | \  }}d|z  |z  |dz  gt          j        |d          t          j        |          ggS r9  )rd   r   r   )r;  r   r   s      r   df1zTestJacobian.df1  s@    1QAF#bl1a&8&8"&))%DEEr   )rH   rH   c                     | \  }}|                     ||                    |          z  ||                    |          z  g          S r   r   r   r   )r;  r-   rphis       r   f2zTestJacobian.f2  s>    3xxRVVC[[!bffSkk/:;;;r   c                     | \  }}t          j        |          | t          j        |          z  gt          j        |          |t          j        |          z  ggS r   )rd   r   r   )r;  rA  rB  s      r   df2zTestJacobian.df2  sP    3qb26#;;./a"&++o.0 	0r   c                    | \  }}}|                     ||                    |          z  |                    |          z  ||                    |          z  |                    |          z  ||                    |          z  g          S r   )r   r   r   )r;  r-   rA  rB  ths        r   f3zTestJacobian.f3  sx    
3xxRVVC[[266"::5q266#;;PR7SRVVC[[* + + 	+r   c                    | \  }}}t          j        |          t          j        |          z  |t          j        |          z  t          j        |          z  | t          j        |          z  t          j        |          z  gt          j        |          t          j        |          z  |t          j        |          z  t          j        |          z  |t          j        |          z  t          j        |          z  gt          j        |          | t          j        |          z  t          j        |          ggS r   )rd   r   r   r   )r;  rA  rB  rG  s       r   df3zTestJacobian.df3  s    
3rvbzz)1rvc{{?RVBZZ+GbfSkk!BF2JJ.0rvbzz)1rvc{{?RVBZZ+GRVC[[26"::-/qb26#;;.a0@0@A	C 	Cr   )rF   rF   c           	          | \  }}}|                     |d|z  d|dz  z  d|z  z
  ||                    |          z  g          S Nr!  rG   rH   r:  r   r-   x1x2x3s        r   f4zTestJacobian.f4  sK    
BxxQVQq[1r6%92r

?KLLLr   c                     | \  }}}t          j        |          }|d|z  d|z  gd|z  d|z  d|z  gd|z  d|z  d|z  g|t          j        |          z  d|z  t          j        |          ggS Nr   r!  r   r   )rd   	ones_liker   r   r   rN  rO  rP  r  s        r   df4zTestJacobian.df4  s    
Bl2a#gq3w'S!c'1s7+S!b&"s(+bfRjj!c'26"::68 	8r   rE   c           	          | \  }}}|                     d|z  d|dz  z  d|                    ||z            z  z
  ||z  g          S rL  r:  rM  s        r   f5zTestJacobian.f5  sN    
BxxRR1Wq266"r'??/B!BBGLMMMr   c                     | \  }}}t          j        |          }d|z  d|z  d|z  gd|z  d|z  t          j        ||z            z  d|z  t          j        ||z            z  gd|z  ||ggS rS  )rd   rT  r   rU  s        r   df5zTestJacobian.df5   s    
Bl2S!c'1s7+Rb26"r'??2BGbfR"Woo4MNS"b!# 	#r   c                 *    t          j        |           S r   )r   r3  )r   _s     r   r3  zTestJacobian.rosen*  s    HN1---r   )r!  rA   r&   )r   rm   rQ   )rX   )rB   )rH   rF   r4  c                    |dk    rdnd}t          |          }t          j                            d          }j        \  }}|                    |f|z             }	t          fd                    |	|                    }
                    t          j                            |	                    |          }t          |
j	        ||           d S )	Nrm   r6   ghUM`?   6H2)rQ   c                      |           S r   rX   )r   r4  r-   s    r   r~   z,TestJacobian.test_examples.<locals>.<lambda>7  s    a" r   r%   r7   )
r9   rd   r   r   mnr   r'   r0   r   r*   )r   r&   rQ   r4  r-   r8   r   mrU   r   r/   r0   s      ``       r   test_exampleszTestJacobian.test_examples.  s     **uuE""i##L11w1JJQD4KJ((-----rzz!5z/I/IJJjjDHHQKK00j>>$//////r   c           	                              ddg          fd}fdfdt          |d          }t                    rXt          t	          j        |j                            dk    sJ t          t	          j        |j                            dk    sJ t          fd	d
d         d          }t          fddd         d          }t          fdd
d         d          }t          fddd         d          }t          j	                    }dD ]}	                     t          ||	          t          ||	          gt          ||	          t          ||	          gg          }
                    |
          ||	<   ||	         j        j        k    rdnd}t          ||	         ||	         |           d S )Nr         ?c                     | \  }}                                         d|z                                |          z                      d|z            |dz  z  g          S )Nr   rH   r@  )r;  r   r   r-   s      r   r>  z$TestJacobian.test_attrs.<locals>.df1B  sW    DAq88RVVCE]]RVVAYY6qsad8JKLLLr   c                 `                         d| z                                 |          z  S )Nr   )r   r   s     r   df1_0xyz(TestJacobian.test_attrs.<locals>.df1_0xyF  s&    66#a%==266!99,,r   c                 @                         d| z            |dz  z  S r  )r   r   s     r   df1_1xyz(TestJacobian.test_attrs.<locals>.df1_1xyI  s     66!A#;;A%%r   r"   r  rG   c                 (     | d                   S r   rX   )r   rg  r;  s    r   r~   z)TestJacobian.test_attrs.<locals>.<lambda>Q      771ad#3#3 r   r   rA   c                 (     d         |           S Nr   rX   )r   rg  r;  s    r   r~   z)TestJacobian.test_attrs.<locals>.<lambda>R      771Q4#3#3 r   rH   c                 (     | d                   S r   rX   )r   ri  r;  s    r   r~   z)TestJacobian.test_attrs.<locals>.<lambda>S  rk  r   c                 (     d         |           S rm  rX   )r   ri  r;  s    r   r~   z)TestJacobian.test_attrs.<locals>.<lambda>T  rn  r   )rb   rf   r*   rN   rh   giUMu>gt=r   )r'   r   r   lenrd   uniquerN   rh   r   OptimizeResultr9   squeezer&   r   r   )r   r-   r>  r/   res00res01res10res11r0   attrref_attrr   rg  ri  r;  s    `          @@@r   
test_attrszTestJacobian.test_attrs<  sF   JJT{##	M 	M 	M 	M 	M	- 	- 	- 	- 	-	& 	& 	& 	& 	& sAB///B<< 	1ry))**a////ry**++q000033333QqsV"MMM33333QqsV"MMM33333QqsV"MMM33333QqsV"MMM%''> 	= 	=DzzGE4$8$8'%:N:N#O$+E4$8$8'%:N:N#O#Q R RH

8,,CI Y_
::66DCIs4yt<<<<<	= 	=r   c                   	
 t           j                            d          }|                    d          	d
	
fd}g d}g d}ddi}t          |                    	j        	          |||
          }                    t                              	          j        	          }t          |j	        |d           
                                        |                    sJ d S )Nl   ]2ZVrF   gHz>c                 ,   j         | d| d         d         k     f<   j         | d| d         d         dz   k    f<   j         | d| d         d         k    f<   j         | d| d         d         dz
  z
  k     f<   t                              |           S )Nr   rd  rA   r5   )r   r7  rX  )r   br   r-   s    r   r   z0TestJacobian.test_step_direction_size.<locals>.fd  s     "Aa1!n')vAa1!t##$ "Aa1!n*,&Aa1!s
3&&'??1b)))r   )rA   rP   r   )rd  r5   r   r8   :0yE>r%   )r   r   r   r7   )rd   r   r   r   r'   rm   r7  rZ  r   r*   r   isfinite)r   r-   r   r   dirr   r8   r/   r0   r~  r   s    `       @@r   test_step_direction_sizez%TestJacobian.test_step_direction_size]  s	    i##N33JJqMM	* 	* 	* 	* 	* 	* 	* jj~q"**Qbj*99&)d< < <jj))!,,BJj??$////vvbkk#&&'''''''r   N)r%  r&  r'  r   r1  r<  r>  r`  r0   rC  rE  rH  rJ  rQ  rV  rX  rZ  r3  r   	rosen_derr   r(  r)  rb  r{  r  rX   r   r   r7  r7    s        G
9 9 9F F F BEBF< < <0 0 0
 BEBF+ + +
C C C BEBFM M M8 8 8 BEBFN N N# # # BEBF---EH"EI[W&<==[V%7%7%788[Vb"b"b%%@AA	0 	0 BA 98 >=	0= = =B( ( ( ( (r   r7  c                       e Zd ZeZej                            dg d          d             Zd Z	d Z
ej        j        ej                            dd          d	                         Zd
S )TestHessianrC   )rX   )rG   )rH   rG   c                    t           j                            d          }d}|                    |                    |f|z             |j                  }t          t          j        |          }|ro|                    ||df          }|	                    d |j
        D                       }|                    |dd          }|                    |||f|z             }nt          j        |          }t          |j        |d           d S )	Nr^  rF   r%   rP   c                 6    g | ]}t          j        |          S rX   )r   
rosen_hess)r[   xis     r   r\   z,TestHessian.test_example.<locals>.<listcomp>  s#    BBBH/33BBBr   r   r  r7   )rd   r   r   r'   rm   r   r   r3  rk   r   Tmoveaxisr  r   ddf)r   rC   r-   r   ra  r   r/   r0   s           r   test_examplezTestHessian.test_examplez  s    i##L11JJszz1$,//rzJBBhna(( 	)

1q"g&&A((BBacBBBCCC++c1b))C**S1a'E/22CC%a((C4000000r   c                    t           j                            d          }|                    |                    d          |j                  }t          t          j        |          }t          j        |          }|dk    }t          |j
        |         ||                    d|                    |                    ||                             z  }t          |j
        |          ||          |           d S )Nr^  rF   r%   r   g{Gz?r7   )rd   r   r   r'   r   r   r   r3  r  r   r  r+   min)r   r-   r   r   r/   r0   maskr8   s           r   test_float32zTestHessian.test_float32  s    i##L11JJszz!}}BJJ77hna((!!$$qs4y111bffRVVCI..///TE
>>>>>>r   c                                         ddg          t                    fdd_        t          d          }d_        t          fddd         d          }|j        d	         j        cxk    r|j        d	         k    sn J d_        t          fd
dd         d          }|j        d         j        cxk    r|j        d	         k    sn J d S )Nr   rd  c                      j         |  \  }}j        |j        dk    r!t          j        |j        dd                    ndz   _                            |          |dz  z  S )NrH   rA   rF   )broadcast_arraysrh   rR   mathprodrC   r   )r;  r   r   r<  r-   r  s      r   r<  z!TestHessian.test_nfev.<locals>.f1  s`    +7+Q/DAqg16A::17122;!7!7!71MBG66!99qAv%%r   r   r"   r  c                 6     | d         d         g          S )Nr   rA   rX   )r   r<  r;  s    r   r~   z'TestHessian.test_nfev.<locals>.<lambda>      ""adAaD\"2"2 r   rA   )r   r   c                 6     d         | d         g          S rm  rX   )r   r<  r;  s    r   r~   z'TestHessian.test_nfev.<locals>.<lambda>  r  r   rH   )rA   rA   )r'   r	   rh   r   )r   r-   r/   ru  rx  r<  r  r;  s    `   @@@r   	test_nfevzTestHessian.test_nfev  s8   JJT{##!!$$	& 	& 	& 	& 	& 	& 	&  b!"---22222AacFLLLx~<<<<EJt,<<<<<<<22222AacFLLLx~<<<<EJt,<<<<<<<<<r   Tz$Python list input uses NumPy backend)r2   r   c                     d}t          j        t          |          5  t          |j        dgt          d                     d d d            d S # 1 swxY w Y   d S )Nz"The specified `rtol=1e-15`, but...r   r$   r   r   r   )r   warnsRuntimeWarningr   r   r   )r   r-   r  s      r   test_small_rtol_warningz#TestHessian.test_small_rtol_warning  s     7\.888 	? 	?BFRDTu-=-=-=>>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?s   'AAAN)r%  r&  r'  r   r1  r   r(  r)  r  r  r  thread_unsafer   r  rX   r   r   r  r  u  s         G[W&8&8&8991 1 :91&? ? ?= = =2 [[!!$)O " Q Q? ?Q Q ? ? ?r   r  )&r  r   numpyrd   scipy.conftestr   (scipy._lib._elementwise_iterative_method_lib_elementwise_iterative_methodr   scipy._lib._array_api_no_0dr   r   r   scipy._lib._array_apir   r   r	   scipyr
   r   r   scipy.differentiater   r   r   "scipy.differentiate._differentiater   r(  usefixtures
pytestmarkarray_api_strict_skip_reasonjax_skip_reasonr   r   r/  r7  r  rX   r   r   <module>r     s         / / / / / / 6 6 6 6 6 6 6 6 6 X X X X X X X X X X E E E E E E E E E E * * * * * * * * * * = = = = = = = = = = > > > > > > #FK$;$;<N$O$OP
V > 09UVVkAAe. e. e. e. e. e. e. BA WVe.P) ) ) ) ) ) ) )< 09UVVkAAR( R( R( R( R(& R( R( BA WVR(j 09UVVkAA@? @? @? @? @?% @? @? BA WV@? @? @?r   