o
    Ö­j‡m  ã                   @   sJ  d dl Z d dlZd dlZd dlmZ d dlm  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j!ded�ejj!de d�G dd„ dƒƒƒZ"G dd„ dƒZ#ejj!ded�ejj!de d�G dd„ de#ƒƒƒZ$ejj!ded�ejj!de d�G d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                	   @   sd  e Zd Zdd„ Zej dde ddd¡g¡dd	„ ƒZ	ejj
d
d�ej dejj¡dd„ ƒƒZej dddg¡ej deƒ dddg¡dd„ ƒƒZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zej d*d+¡ej dd,d,d-gf¡ej d.d/¡d0d1„ ƒƒƒZd2d3„ Zd4d5„ Zejj
d
d�ejjej dd6d7„ dfd8d7„ dff¡d9d:„ ƒƒƒZd;S )<ÚTestDerivativec                 C   s
   t  |¡S ©N©r   Úndtr)ÚselfÚx© r   úi/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/differentiate/tests/test_differentiate.pyÚf   ó   
zTestDerivative.fr   ç333333ã?çš™™™™™©¿çÍÌÌÌÌÌð?é
   c                 C   sn   |  d¡j}t| j|j ||d�ƒ}|j t ¡  |¡|d�}t|j|ƒ t	|ƒs5t
| |j| ¡|jƒ d S d S )Nç      ð?©Údtype)Úasarrayr#   r   r   r	   ÚnormÚpdfr   Údfr   r   ÚabsÚerror)r   r   ÚxpÚdefault_dtypeÚresÚrefr   r   r   Ú
test_basic   s   ÿzTestDerivative.test_basicT)Únp_onlyÚcasec                 C   sL   |\}}t t|ƒ|Ž }| ¡ d }t|j|ƒ}| |¡}t|j|dd� d S )Nçš™™™™™¹?ç»½×Ùß|Û=©Úatol)Úgetattrr	   Úmedianr   Úcdfr&   r   r'   )r   r0   ÚdistnameÚparamsÚdistr   r,   r-   r   r   r   Útest_accuracy)   s   
zTestDerivative.test_accuracyÚorderé   é   Úshape)é   ©é   é   )rB   é   rD   c                    sè  |rt  ddd¡ |¡nd}t  |¡‰ i ‰t j‡‡fdd„ƒ}‡ ‡‡fdd„}d	ˆd
< dˆd< t||j||jd�ˆd�}||ƒ ¡ }dd„ |D ƒ}	t	| |j
d¡| |	¡ƒ dd„ |D ƒ}
t	| |jd¡| |
¡ƒ dd„ |D ƒ}t	| |jd¡| |¡dd� dd„ |D ƒ}t| |jd¡| |¡ƒ dd„ |D ƒ}t| |jd¡| |¡ƒ dd„ |D ƒ}t| |jd¡| |¡ƒ t|ƒrÌ| |j¡ˆd ksÌJ ‚dd„ |D ƒ}t| |jd¡| |¡ƒ t|ƒrð| |j¡ˆd
 ksòJ ‚d S d S )Nr   r   r@   r   c                    s   t ˆj| ˆ d�S )N©r<   )r   r   ©r   )r<   r   r   r   Ú_derivative_single<   s   z=TestDerivative.test_vectorization.<locals>._derivative_singlec                    sV   ˆd  d7  < ˆd  | j ˆ ks| jdkrdn| jd 7  < ˆj| g|¢R i |¤ŽS )NÚnitr=   Úfevaléÿÿÿÿ)ÚsizeÚndimr?   r   )r   ÚargsÚkwargs)Únr   Ústater   r   r   @   s   .z,TestDerivative.test_vectorization.<locals>.frJ   rH   r   rI   r"   rE   c                 S   ó   g | ]}|j ‘qS r   rF   ©Ú.0r-   r   r   r   Ú
<listcomp>K   ó    z5TestDerivative.test_vectorization.<locals>.<listcomp>©rJ   c                 S   rQ   r   )r'   rR   r   r   r   rT   N   rU   c                 S   rQ   r   )r)   rR   r   r   r   rT   Q   rU   gê-�™—q=r3   c                 S   s   g | ]}t |jƒ‘qS r   )ÚboolÚsuccessrR   r   r   r   rT   U   ó    c                 S   ó   g | ]}t  |j¡‘qS r   )ÚnpÚint32ÚstatusrR   r   r   r   rT   X   ó    c                 S   rZ   r   )r[   r\   ÚnfevrR   r   r   r   rT   [   r^   c                 S   rZ   r   )r[   r\   rH   rR   r   r   r   rT   `   r^   )r[   ÚlinspaceÚreshaperK   Ú	vectorizer   r$   Úfloat64Úravelr   r   r'   r)   r   rX   r]   r_   r   ÚmaxrH   )r   r<   r?   r*   r   rG   r   r,   ÚrefsÚref_xÚref_dfÚ	ref_errorÚref_successÚref_flagÚref_nfevÚref_nitr   )rO   r<   r   rP   r   Útest_vectorization3   s@   
ÿÿz!TestDerivative.test_vectorizationc                    s†   t j d¡‰‡ ‡‡fdd„‰ dˆ _ˆjdˆjd�f}tˆ ˆjdˆjd�t	dd�d	|d
�}ˆj
tjttjtjgˆjd�}t|j|ƒ d S )Nì   •¾;O  c                    sb   ˆ j d7  _ dd„ ‡‡fdd„‡fdd„‡fdd„g‰ ‡ fdd„t| ˆ |d	¡ƒD ƒ}ˆ |¡S )
Nr=   c                 S   s   | d S ©Ng      @r   rF   r   r   r   Ú<lambda>k   ó    z6TestDerivative.test_flags.<locals>.f.<locals>.<lambda>c                    s   ˆ  | ¡ˆ  ¡  S r   )ÚexpÚrandomrF   ©Úrngr*   r   r   rq   l   rU   c                    ó
   ˆ   | ¡S r   ©rs   rF   ©r*   r   r   rq   m   ó   
 c                    s   ˆ   | ˆ j¡S r   )Ú	full_likeÚnanrF   ry   r   r   rq   n   ó    c                    s    g | ]\}}ˆ t |ƒ |ƒ‘qS r   )Úint)rS   r   Új©Úfuncsr   r   rT   o   s     z8TestDerivative.test_flags.<locals>.f.<locals>.<listcomp>rV   )rH   Úzipra   Ústack)ÚxsÚjsr,   ©r   rv   r*   r€   r   r   i   s   

ý 
z$TestDerivative.test_flags.<locals>.fr   rC   r"   ç›+¡†›„=©ÚrtolrD   )Ú
tolerancesr<   rM   )r[   rt   Údefault_rngrH   ÚarangeÚint64r   Úonesrc   Údictr$   ÚeimÚ_ECONVERGEDr   Ú	_ECONVERRÚ
_EVALUEERRr\   r   r]   )r   r*   rM   r,   Ú	ref_flagsr   r†   r   Ú
test_flagse   s    þýýzTestDerivative.test_flagsc                    sl   t j d¡‰ ‡ ‡fdd„}t|ˆjdˆjd�tdd�dd	d
�}ˆjtjt	tj
tjgˆjd�}t|j|ƒ d S )Nro   c                    s8   | d ˆ  | ¡ˆ  ¡  ˆ  | ¡ˆ | ˆj¡g}ˆ |¡S rp   )rs   rt   r{   r|   rƒ   ©r   Úoutru   r   r   r   �   s   ý
z3TestDerivative.test_flags_preserve_shape.<locals>.fr=   r"   r‡   rˆ   rD   T)rŠ   r<   Úpreserve_shape)r[   rt   r‹   r   r$   rc   r�   r�   r‘   r   r’   r“   r\   r   r]   )r   r*   r   r,   r”   r   ru   r   Útest_flags_preserve_shape~   s   þýýz(TestDerivative.test_flags_preserve_shapec                    s    ‡ fdd„}ˆ   d¡}ˆ   ˆ   d¡dˆ  d| ¡ ddˆ  d| ¡  dˆ  d| ¡ |d d  dˆ  d| ¡ |d   g¡}t||d	d
�}t|j|ƒ d S )Nc                    sD   | ˆ   d|  ¡| ˆ   d|  ¡ ˆ   d|  ¡| d d  g}ˆ  |¡S )NrB   r    é   r=   rD   )Úsinrƒ   r–   ry   r   r   r   ”   s   :
z-TestDerivative.test_preserve_shape.<locals>.fç        r=   rB   r    rš   rD   T©r˜   )r$   Úcosr›   r   r   r'   )r   r*   r   r   r-   r,   r   ry   r   Útest_preserve_shape’   s   
06ÿz"TestDerivative.test_preserve_shapec           	      C   sF  |j d|jd�}tj}ttj d¡ƒ}tddd�}| 	¡ }d|d< t
|||dd�}t|j| ƒdk s4J ‚d	|d< t
|||dd�}t|j| ƒd	k sKJ ‚t|j| ƒt|j| ƒk s[J ‚| 	¡ }d|d
< t
|||dd�}t|j| ƒd| k sxJ ‚d	|d
< t
|||dd�}t|j| ƒd	| k s‘J ‚t|j| ƒt|j| ƒk s¡J ‚d S )Nr!   r"   r   )r4   r‰   gü©ñÒMbP?r4   rC   )rŠ   r<   g�íµ ÷Æ°>r‰   )r$   rc   r   r   Úfloatr	   r%   r&   r�   Úcopyr   r(   r'   )	r   r*   r   r   r-   Útolerances0rŠ   Úres1Úres2r   r   r   Útest_convergencež   s(    $zTestDerivative.test_convergencec           	      C   s¨  |j d|jd�}tj}ttj d¡ƒ}t||ddd�}t||ddd�}t	|j
| ƒt	|j
| ƒk s3J ‚t||ddd�}t||d	dd�}t	|j
| ƒt	|j
| ƒk sSJ ‚td
ddd�}t||fdddœ|¤Ž}t||fdddœ|¤Ž}t|j
|j
dd� tdddd�}t||fdddœ|¤Ž}t||fdt d¡ ddœ|¤Ž}t|j
|j
dd� d|d< t||fdddœ|¤Ž}t||fdt d¡ ddœ|¤Ž}t|j
|j
dd� d S )Nr!   r"   ç      à?r=   )Úinitial_stepÚmaxitergš™™™™™©?rD   )Ústep_factorr¨   rš   rC   r   )r<   r¨   Ústep_direction)r§   r©   g›+¡†›„ö<rˆ   rJ   rª   )r$   rc   r   r   r    r	   r%   r&   r   r(   r'   r�   r   r[   Úsqrt)	r   r*   r   r   r-   r£   r¤   rN   r,   r   r   r   Útest_step_parameters·   s*     ""z#TestDerivative.test_step_parametersc                    sp   ‡ fdd„}ˆ   ddd¡}ˆ  |¡}d\||dk < ||dk< t|||d	�}t|jˆ  |¡ƒ ˆ  |j¡s6J ‚d S )
Nc                    s$   ˆ   | ¡}ˆ j|| dk | dk < |S )Nr   rD   )rs   r|   ©r   Úyry   r   r   r   Ø   s   
z-TestDerivative.test_step_direction.<locals>.fr   rD   r    )r=   rJ   r   gffffffö?©rª   )r`   Ú
zeros_liker   r   r'   rs   ÚallrX   )r   r*   r   r   rª   r,   r   ry   r   Útest_step_directionÖ   s   
z"TestDerivative.test_step_directionc           	      C   s    dd„ }dd„ }|  | g d¢¡d¡}|  | g d¢¡d¡}|  | d	d
g¡d¡}t||||fd�}| |||ƒ|jj¡}|j|| d¡jd�}t|j|ƒ d S )Nc                 S   s   | | S r   r   ©r   Úpr   r   r   r   æ   s   z=TestDerivative.test_vectorized_step_direction_args.<locals>.fc                 S   s   || |d   S ©Nr=   r   r³   r   r   r   r'   é   s   z>TestDerivative.test_vectorized_step_direction_args.<locals>.df)r=   rD   rB   rC   )rJ   r=   r=   ©rJ   r   r=   )r=   rJ   r=   rD   rB   )r=   r=   rJ   )rª   rM   r!   r"   )ra   r$   r   Úbroadcast_tor'   r?   r#   r   )	r   r*   r   r'   r   Úhdirr´   r,   r-   r   r   r   Ú#test_vectorized_step_direction_argsä   s   z2TestDerivative.test_vectorized_step_direction_argsc           
   	      sä   ‡ fdd„}ˆ j dˆ jd�}ˆ   g d¢¡}ˆ  ˆ  ddd¡d	¡}t|||d
d|d�}ˆ  |j||ƒ ¡}ˆ  |d d…df |dd …df k ¡sIJ ‚t|j	d ƒD ]}t||||df d
d|d�}	t
|j|d d …f |	jdd� qPd S )Nc                    rw   r   rx   rF   ry   r   r   r   ö   r   z+TestDerivative.test_initial_step.<locals>.frœ   r"   r¶   éýÿÿÿr   r    )rJ   r=   rD   r=   )r§   r<   r¨   rª   rJ   .r‡   rˆ   )r$   rc   ra   Úlogspacer   r(   r'   r±   Úranger?   r   )
r   r*   r   r   rª   Úh0r,   ÚerrÚir-   r   ry   r   Útest_initial_stepô   s   ÿ*ÿ ýz TestDerivative.test_initial_stepc                    s   |j d|jd�}d‰dd„ }d}t||ˆtdd�d	�}| |j¡r#J ‚| |j|d
 ˆd
 d  k¡s5J ‚| |jˆk¡s?J ‚‡ ‡fdd„‰ dˆ _	d ˆ _
tƒ ˆ _t||ˆ tdd�d�}| ¡ D ].}|dkrx|| tjksnJ ‚|| tjkswJ ‚q_|| ˆ j
|   krŠ|| ks�J ‚ J ‚q_d S )Ng~ý,œã?r"   rB   c                 S   s   t  | ¡}|S r   r   )r   r,   r   r   r   r     s   
z/TestDerivative.test_maxiter_callback.<locals>.fé   çVçž¯Ò<rˆ   )r¨   rŠ   r=   rD   c                    sj   ˆ  j d7  _ | ˆ _t| dƒsJ ‚t| jƒˆ jvsJ ‚ˆ j t| jƒ¡ | jtj	ks,J ‚ˆ j ˆkr3t
‚d S )Nr=   r   )Úiterr,   Úhasattrr    r'   ÚdfsÚaddr]   r�   Ú_EINPROGRESSÚStopIteration©r,   ©Úcallbackr¨   r   r   rË     s   
ÿz6TestDerivative.test_maxiter_callback.<locals>.callbackrJ   )rË   rŠ   r]   )r$   rc   r   r�   ÚanyrX   r±   r_   rH   rÃ   r,   ÚsetrÅ   Úkeysr�   r’   Ú
_ECALLBACK)r   r*   r   r   Údefault_orderr,   r¤   Úkeyr   rÊ   r   Útest_maxiter_callback
  s&   $	,ûz$TestDerivative.test_maxiter_callbackr¸   r¶   gÍÌÌÌÌÌä?gffffffæ?r#   )Úfloat16Úfloat32rc   c           
         sÒ   ˆ dkrt ˆƒst d¡ tˆˆ ƒ‰ ˆj|ˆ d�}‡ ‡fdd„}‡ fdd„}t||d||d	�}|jjˆ ks7J ‚|jjˆ ks?J ‚|j	jˆ ksGJ ‚ˆ 
ˆ ¡j}tˆƒrW|d
 d n|d
 }	t|jˆ |j¡|	d� d S )NrÓ   z+float16 not tested for alternative backendsr"   c                    s   | j ˆ ksJ ‚ˆ | ¡S r   )r#   rs   rF   ©r#   r*   r   r   r   ;  s   
z$TestDerivative.test_dtype.<locals>.fc                    s4   | j jˆ ksJ ‚| jjˆ ksJ ‚| jjˆ ksJ ‚d S r   )r   r#   r'   r)   rÉ   r"   r   r   rË   ?  s   z+TestDerivative.test_dtype.<locals>.callbackrC   )r<   rª   rË   r¦   é2   rˆ   )r   ÚpytestÚskipr5   r$   r   r   r#   r'   r)   ÚfinfoÚepsr   r   rs   )
r   r¸   r   r#   r*   r   rË   r,   rÚ   r‰   r   rÕ   r   Ú
test_dtype0  s   

zTestDerivative.test_dtypec                 C   sH  |  d¡}d}tjt|d�� td |ƒ W d   ƒ n1 sw   Y  d}tjt|d�� tdd„ |  d¡ƒ W d   ƒ n1 sAw   Y  d}tjt|d�� td	d„ |  d
dg¡ƒ W d   ƒ n1 sfw   Y  d}tjt|d�� tdd„ |tdd�d� W d   ƒ n1 s‹w   Y  tjt|d�� tdd„ |tdd�d� W d   ƒ n1 s®w   Y  tjt|d�� tdd„ |tƒ d� W d   ƒ n1 sÏw   Y  d}tjt|d�� tdd„ |dd� W d   ƒ n1 sñw   Y  tjt|d�� tdd„ |dd� W d   ƒ n	1 �sw   Y  d}tjt|d�� tdd„ |dd� W d   ƒ n	1 �s5w   Y  tjt|d�� tdd„ |dd� W d   ƒ n	1 �sVw   Y  d }tjt|d�� td!d„ |d"d#� W d   ƒ n	1 �syw   Y  d$}tjt|d�� td%d„ |d&d'� W d   ƒ d S 1 �s�w   Y  d S )(Nr=   z`f` must be callable.©Úmatchz3Abscissae and function output must be real numbers.c                 S   ó   | S r   r   rF   r   r   r   rq   W  ó    z6TestDerivative.test_input_validation.<locals>.<lambda>y      À      ð?z6When `preserve_shape=False`, the shape of the array...c                 S   s   g d¢S )N)r=   rD   rB   r   rF   r   r   r   rq   [  rr   éþÿÿÿrº   z6Tolerances and step parameters must be non-negative...c                 S   rÞ   r   r   rF   r   r   r   rq   _  rß   rJ   r3   ©rŠ   c                 S   rÞ   r   r   rF   r   r   r   rq   a  rß   Úekkirˆ   c                 S   rÞ   r   r   rF   r   r   r   rq   c  rß   ©r©   ú%`maxiter` must be a positive integer.c                 S   rÞ   r   r   rF   r   r   r   rq   g  rß   ç      ø?©r¨   c                 S   rÞ   r   r   rF   r   r   r   rq   i  rß   r   z"`order` must be a positive integerc                 S   rÞ   r   r   rF   r   r   r   rq   m  rß   rE   c                 S   rÞ   r   r   rF   r   r   r   rq   o  rß   z'`preserve_shape` must be True or False.c                 S   rÞ   r   r   rF   r   r   r   rq   s  rß   Úherringr�   z`callback` must be callable.c                 S   rÞ   r   r   rF   r   r   r   rq   w  rß   Ú	shrubbery)rË   )r$   r×   ÚraisesÚ
ValueErrorr   r�   Úobject)r   r*   ÚoneÚmessager   r   r   Útest_input_validationM  sZ   
ÿÿÿÿÿÿÿÿÿÿÿ$ÿz$TestDerivative.test_input_validationc                    s¾  dd„ }t |ƒs#t|| d¡tdd�d�}|jsJ ‚t|j| d¡ƒ t|j| d¡|jd	�}t	|j| |j¡ƒ t	|j
|jd
|jd�ƒ t|j| d¡dd�}t	|j| |j¡ƒ t	|j
|jd
|jd�ƒ tdƒD ]X‰ |jd|jd�}‡ fdd„}dˆ  |ˆ d   }t||dtdˆ ƒd�}t|j|dd� t	|j|j|j|jd�ƒ t||tdˆ ƒd�}|js³J ‚|jdksºJ ‚t|j|dd� qjdd„ }t|| d¡| d¡d�}t|j| d¡ƒ d S )Nc                 S   s&   t | ƒ}| | jd¡sJ ‚| d d S )Nzreal floatingéc   r=   )r   Úisdtyper#   )r   Úxp_testr   r   r   r   ~  s   z,TestDerivative.test_special_cases.<locals>.fé   r2   rˆ   rá   gl)~IéŠQr=   r¯   rº   r"   r   ©r§   r>   rå   c                    s   d| ˆ   S ©NrD   r   rF   ©rO   r   r   r   š  ó   rD   )r¨   r<   rÂ   rE   c                 S   s   ||  d S rµ   r   )r   Úcr   r   r   r   ©  rö   rB   )rM   g      @)r   r   r$   r�   rX   r   r'   rs   r|   r   r]   r\   r¼   rc   re   r)   rH   )r   r*   r   r,   r   r-   r   rõ   r   Útest_special_casesy  s2   
	
z!TestDerivative.test_special_casesc                 C   s   | d d S )Nr=   rB   r   rF   r   r   r   rq   ³  s    zTestDerivative.<lambda>c                 C   s"   t  | dk| d d | d d ¡S )Nr=   é   rB   )r[   ÚwhererF   r   r   r   rq   ´  s   " c                 C   s<   d}t |g d¢|dœŽ}t |j¡sJ ‚t|jd|d� d S )Ng¼‰Ø—²Òœ<r¶   )rª   r4   r   r3   )r   r[   r±   rX   r   r'   )r   r0   r4   r,   r   r   r   Útest_saddle_gh18811°  s   
z"TestDerivative.test_saddle_gh18811N)Ú__name__Ú
__module__Ú__qualname__r   r×   ÚmarkÚparametrizer[   r`   r.   r   r	   Ú_distr_paramsÚdistcontr;   Útuplern   r•   r™   rŸ   r¥   r¬   r²   r¹   rÀ   rÒ   rÛ   rî   rø   Úxfailrû   r   r   r   r   r      s@    
0&,7

þr   c                   @   s   e Zd Zdd„ ZdS )ÚJacobianHessianTestc                 C   sª  | j j}d}tjt|d�� ||jdtdd�d� W d   ƒ n1 s#w   Y  | d¡}tj	}d}tjt|d�� |||tdd�d� W d   ƒ n1 sNw   Y  tjt|d�� |||tdd	�d� W d   ƒ n1 sow   Y  tjt|d�� |||dd
� W d   ƒ n1 s�w   Y  d}tjt|d�� |||dd� W d   ƒ n1 s­w   Y  d}tjt|d�� |||dd� W d   ƒ d S 1 sÎw   Y  d S )Nz"Argument `x` must be at least 1-D.rÜ   r=   rJ   r3   rá   rB   z<Tolerances and step parameters must be non-negative scalars.rˆ   rã   z#`order` must be a positive integer.rE   rä   ræ   )
Újh_funcÚ__func__r×   ré   rê   r›   r�   rŽ   r
   Úrosen)r   r*   r  rí   r   Úfuncr   r   r   Útest_ivÁ  s2   ÿ
ÿÿÿÿ"ÿzJacobianHessianTest.test_ivN)rü   rý   rþ   r
  r   r   r   r   r  À  s    r  c                   @   s  e Zd ZeZdd„ Zdd„ Zde_ee_dd„ Z	dd	„ Z
de	_e
e	_d
d„ Zdd„ Zde_ee_dd„ Zdd„ Zde_ee_dd„ Zdd„ Zde_ee_d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 d!„ ƒƒƒZd"d#„ Zd$d%„ Zd&S )'ÚTestJacobianc                 C   s,   | \}}|  |d | d| | |¡ g¡S ©NrD   rù   ©rƒ   r›   )Úzr*   r   r®   r   r   r   Úf1æ  s   $zTestJacobian.f1c                 C   s2   | \}}d| | |d gt  |d¡t  |¡ggS r  )r[   r{   rž   ©r  r   r®   r   r   r   Údf1ê  s   *zTestJacobian.df1)rD   rD   c                 C   s*   | \}}|  || |¡ || |¡ g¡S r   ©rƒ   rž   r›   )r  r*   ÚrÚphir   r   r   Úf2ñ  s   "zTestJacobian.f2c                 C   s:   | \}}t  |¡| t  |¡ gt  |¡|t  |¡ ggS r   )r[   rž   r›   )r  r  r  r   r   r   Údf2õ  s   ÿzTestJacobian.df2c                 C   sL   | \}}}|  || |¡ | |¡ || |¡ | |¡ || |¡ g¡S r   )rƒ   r›   rž   )r  r*   r  r  Úthr   r   r   Úf3ý  s   
0ÿzTestJacobian.f3c                 C   s°   | \}}}t  |¡t  |¡ |t  |¡ t  |¡ | t  |¡ t  |¡ gt  |¡t  |¡ |t  |¡ t  |¡ |t  |¡ t  |¡ gt  |¡| t  |¡ t  |¡ggS r   )r[   r›   rž   r°   )r  r  r  r  r   r   r   Údf3  s   
(ÿ(ÿ üzTestJacobian.df3)rB   rB   c              	   C   s:   | \}}}|  |d| d|d  d|  || |¡ g¡S ©Nrù   rC   rD   r  ©r   r*   Úx1Úx2Úx3r   r   r   Úf4  s   
0zTestJacobian.f4c                 C   sl   | \}}}t  |¡}|d| d| gd| d| d| gd| d| d| g|t  |¡ d| t  |¡ggS ©Nr   rù   rÁ   rà   )r[   Ú	ones_likerž   r›   ©r   r  r  r  rì   r   r   r   Údf4  s   

ýzTestJacobian.df4rA   c              	   C   s<   | \}}}|  d| d|d  d| || ¡  || g¡S r  r  r  r   r   r   Úf5  s   
2zTestJacobian.f5c                 C   sh   | \}}}t  |¡}d| d| d| gd| d| t  || ¡ d| t  || ¡ gd| ||ggS r   )r[   r!  rž   r"  r   r   r   Údf5   s   

0þzTestJacobian.df5c                 C   s
   t  | ¡S r   )r
   r  )r   Ú_r   r   r   r  *  rz   zTestJacobian.rosen)rù   r=   r#   )rÔ   rc   rK   )r   )r>   )rD   rB   r	  c                    sŽ   |dkrdnd}t ˆ|ƒ}tj d¡}ˆ j\}}|j|f| d�}	t‡ ‡fdd„ˆj|	|d�ƒ}
ˆjt ˆ  |	¡¡|d�}t|
j	||d	� d S )
Nrc   r2   g“ÆhUM`?ì   6Hœ2«)rK   c                    s
   ˆ | ˆƒS r   r   rF   ©r	  r*   r   r   rq   7  rz   z,TestJacobian.test_examples.<locals>.<lambda>r"   r3   )
r5   r[   rt   r‹   Úmnr   r$   r-   r   r'   )r   r#   rK   r	  r*   r4   rv   ÚmrO   r   r,   r-   r   r(  r   Útest_examples.  s   

zTestJacobian.test_examplesc                    sx  ˆ  ddg¡‰‡fdd„}‡fdd„‰ ‡fdd„‰t|ˆd	d
�}tˆƒr<tt |j¡ƒdks0J ‚tt |j¡ƒdks<J ‚t‡ ‡fdd„ˆdd… d	d
�}t‡ ‡fdd„ˆdd… d	d
�}t‡‡fdd„ˆdd… d	d
�}t‡‡fdd„ˆdd… d	d
�}t 	¡ }dD ]7}	ˆ  t
||	ƒt
||	ƒgt
||	ƒt
||	ƒgg¡}
ˆ |
¡||	< ||	 jˆjkr¬dnd}t||	 ||	 |d� q‚d S )Nr¦   ç      Ð?c                    s<   | \}}ˆ   ˆ  d| ¡ˆ  |¡ ˆ  d| ¡|d  g¡S )Nr¦   rD   r  r  ry   r   r   r  B  s   4z$TestJacobian.test_attrs.<locals>.df1c                    s   ˆ   d|  ¡ˆ   |¡ S )Nr¦   )rž   r­   ry   r   r   Údf1_0xyF  s   z(TestJacobian.test_attrs.<locals>.df1_0xyc                    s   ˆ   d|  ¡|d  S rô   )r›   r­   ry   r   r   Údf1_1xyI  s   z(TestJacobian.test_attrs.<locals>.df1_1xyr    ró   rC   c                    ó   ˆ | ˆd ƒS rµ   r   rF   ©r-  r  r   r   rq   Q  r}   z)TestJacobian.test_attrs.<locals>.<lambda>r   r=   c                    ó   ˆ ˆd | ƒS ©Nr   r   ©r®   r0  r   r   rq   R  r}   rD   c                    r/  rµ   r   rF   ©r.  r  r   r   rq   S  r}   c                    r1  r2  r   r3  r4  r   r   rq   T  r}   )rX   r]   r'   rH   r_   giUMuï>g´àø¤tã=rˆ   )r$   r   r   Úlenr[   ÚuniquerH   r_   r
   ÚOptimizeResultr5   Úsqueezer#   rÔ   r   )r   r*   r  r,   Úres00Úres01Úres10Úres11r-   ÚattrÚref_attrr‰   r   )r-  r.  r*   r  r   Ú
test_attrs<  s*       ÿûzTestJacobian.test_attrsc           	         sž   t j d¡}| d¡‰ d‰‡ ‡‡fdd„}g d¢}g d¢}dd	i}t|ˆjˆ ˆjd
�|||d�}ˆjt ˆ ¡ˆjd
�}t|j	|d	d� ˆ 
ˆ |¡¡sMJ ‚d S )Nl   ]2œZëVrB   gH¯¼šò×z>c                    s€   ˆj | d| d ˆ d k f< ˆj | d| d ˆ d d kf< ˆj | d| d ˆ d kf< ˆj | d| d ˆ d d ˆ k f< t | ˆ¡S )Nr   r,  r=   r1   )r|   r  r$  rF   ©ÚbrÚ   r*   r   r   r   d  s
   "z0TestJacobian.test_step_direction_size.<locals>.f)r=   rJ   r   )r,  r1   r¦   r4   ç:Œ0âŽyE>r"   )r§   rª   rŠ   r3   )r[   rt   r‹   r   r$   rc   r  r%  r   r'   r±   Úisfinite)	r   r*   rv   r   Údirr½   r4   r,   r-   r   r@  r   Útest_step_direction_size]  s   
ÿz%TestJacobian.test_step_direction_sizeN)rü   rý   rþ   r   r  r  r  r)  r-   r  r  r  r  r  r#  r$  r%  r  r
   Ú	rosen_derr×   rÿ   r   r+  r?  rE  r   r   r   r   r  Þ  s>    !r  c                   @   sZ   e Zd ZeZej dg d¢¡dd„ ƒZdd„ Z	dd„ Z
ejjejjd	d
d�dd„ ƒƒZdS )ÚTestHessianr?   )r   )rC   )rD   rC   c                 C   s¤   t j d¡}d}|j| |f| ¡|jd�}ttj|ƒ}|rC| ||df¡}| 	dd„ |j
D ƒ¡}| |dd¡}| |||f| ¡}nt |¡}t|j|dd	� d S )
Nr'  rB   r"   rJ   c                 S   s   g | ]}t  |¡‘qS r   )r
   Ú
rosen_hess)rS   Úxir   r   r   rT   ‚  rY   z,TestHessian.test_example.<locals>.<listcomp>r   rB  r3   )r[   rt   r‹   r$   rc   r   r
   r  ra   rƒ   ÚTÚmoveaxisrH  r   Úddf)r   r?   r*   rv   r*  r   r,   r-   r   r   r   Útest_examplez  s   
zTestHessian.test_examplec                 C   sŒ   t j d¡}|j| d¡|jd�}ttj|ƒ}t |¡}|dk}t	|j
| || ƒ d| | || ¡¡ }t	|j
|  ||  |d� d S )Nr'  rB   r"   r   g{®Gáz„?r3   )r[   rt   r‹   r$   rÔ   r   r
   r  rH  r   rL  r(   Úmin)r   r*   rv   r   r,   r-   Úmaskr4   r   r   r   Útest_float32Ž  s   
 zTestHessian.test_float32c                    sÞ   ˆ  ddg¡‰tˆƒ‰‡ ‡‡fdd„‰ dˆ _tˆ ˆdd�}dˆ _t‡ ‡fdd	„ˆdd
… dd�}|jd ˆ j  krB|jd ksEJ ‚ J ‚dˆ _t‡ ‡fdd	„ˆd
d… dd�}|jd ˆ j  krj|jd ksmJ ‚ J ‚d S )Nr¦   r,  c                    sJ   ˆj | Ž \}}ˆ j|jdkrt |jdd … ¡nd ˆ _ˆ |¡|d  S )NrD   r=   rB   )Úbroadcast_arraysr_   rL   ÚmathÚprodr?   r›   r  )r  r*   rñ   r   r   r  œ  s   *z!TestHessian.test_nfev.<locals>.f1r   r    ró   c                    s   ˆ | d ˆd gƒS )Nr   r=   r   rF   ©r  r  r   r   rq   ¥  ó    z'TestHessian.test_nfev.<locals>.<lambda>r=   )r   r   c                    s   ˆ ˆd | d gƒS r2  r   r3  rT  r   r   rq   ©  rU  rD   )r=   r=   )r$   r   r_   r   )r   r*   r,   r9  r<  r   )r  r*   rñ   r  r   Ú	test_nfev˜  s    * .zTestHessian.test_nfevTz$Python list input uses NumPy backend)r/   r   c                 C   sP   d}t jt|d�� t|jdgtdd�d� W d   ƒ d S 1 s!w   Y  d S )Nz"The specified `rtol=1e-15`, but...rÜ   r!   rÂ   rˆ   rá   )r×   ÚwarnsÚRuntimeWarningr   r›   r�   )r   r*   rí   r   r   r   Útest_small_rtol_warning±  s   "ÿz#TestHessian.test_small_rtol_warningN)rü   rý   rþ   r   r  r×   rÿ   r   rM  rP  rV  Úthread_unsafer   rY  r   r   r   r   rG  u  s    

ÿrG  )&rR  r×   Únumpyr[   Ú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  r  rG  r   r   r   r   Ú<module>   s6       + 