a
    ‡ù»j6>  ã                   @   sd   d dl Z d dlZd dlmZmZmZ d dlm  m	Z
 d dlmZ d dlmZmZ G dd„ dƒZdS )é    N)Úassert_array_lessÚassert_allcloseÚassert_equal)Ústats)Ú_differentiateÚ_EERRORINCREASEc                	   @   sL  e Zd Zdd„ Zej dde ddd¡g¡dd	„ ƒZ	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ej d&d'¡ej dd(d(d)gf¡ej d*ejejejf¡d+d,„ ƒƒƒZd-d.„ Zd/d0„ Zejjej d
d1d2„ dfd3d2„ dff¡d4d5„ ƒƒZd6S )7ÚTestDifferentiatec                 C   s   t  ¡  |¡S ©N)r   ÚnormÚcdf)ÚselfÚx© r   úME:\soccer\ml_env\Lib\site-packages\scipy/optimize/tests/test_differentiate.pyÚf   s    zTestDifferentiate.fr   ç333333ã?çš™™™™™©¿çÍÌÌÌÌÌð?é
   c                 C   sV   t | j|ƒ}t ¡  |¡}tj |j|¡ t	t
|j| ƒ|jƒ |jj|jksRJ ‚d S r	   )Údifferentiater   r   r
   ÚpdfÚnpZtestingr   Údfr   ÚabsÚerrorr   Úshape)r   r   ÚresÚrefr   r   r   Ú
test_basic   s
    zTestDifferentiate.test_basicÚcasec                 C   sL   |\}}t t|ƒ|Ž }| ¡ d }t|j|ƒ}| |¡}t|j|dd� d S )Ngš™™™™™¹?ç»½×Ùß|Û=©Úatol)Úgetattrr   Zmedianr   r   r   r   r   )r   r   ÚdistnameÚparamsÚdistr   r   r   r   r   r   Útest_accuracy   s    
zTestDifferentiate.test_accuracyÚorderé   é   r   )é   )é   é   )r,   é   r.   c                    s<  |rt  ddd¡ |¡nd}t  |¡‰t j‡‡fdd„ƒ}‡ ‡‡fdd„‰ d	ˆ _d
ˆ _tˆ |ˆd�}||ƒ ¡ }dd„ |D ƒ}t	|j
 ¡ |ƒ t|j
j|ƒ dd„ |D ƒ}t	|j ¡ |ƒ t|jj|ƒ dd„ |D ƒ}	t	|j ¡ |	dd� t|jj|ƒ dd„ |D ƒ}
t|j ¡ |
ƒ t|jj|ƒ t  |jjt j¡�s<J ‚dd„ |D ƒ}t|j ¡ |ƒ t|jj|ƒ t  |jjt j¡�s€J ‚dd„ |D ƒ}t|j ¡ |ƒ tt  |j¡ˆ jƒ t|jj|j
jƒ t  |jjt j¡�sÜJ ‚dd„ |D ƒ}t|j ¡ |ƒ tt  |j¡ˆ jƒ t|jj|j
jƒ t  |jjt j¡�s8J ‚d S )Nr   r   r+   r   c                    s   t ˆj| ˆ d�S )N©r(   )r   r   ©r   )r(   r   r   r   Ú_differentiate_single,   s    zCTestDifferentiate.test_vectorization.<locals>._differentiate_singlec                    sR   ˆ  j d7  _ ˆ  j| jˆks(| jdkr,dn| jd 7  _ˆj| g|¢R i |¤ŽS )Nr)   éÿÿÿÿ)ÚnitÚfevalÚsizeÚndimr   r   )r   ÚargsÚkwargs)r   Únr   r   r   r   0   s    ,z/TestDifferentiate.test_vectorization.<locals>.fr2   r   r/   c                 S   s   g | ]
}|j ‘qS r   r0   ©Ú.0r   r   r   r   Ú
<listcomp>:   ó    z8TestDifferentiate.test_vectorization.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r   )r   r:   r   r   r   r<   >   r=   c                 S   s   g | ]
}|j ‘qS r   )r   r:   r   r   r   r<   B   r=   ç›+¡†›„ö<r!   c                 S   s   g | ]
}|j ‘qS r   )Úsuccessr:   r   r   r   r<   F   r=   c                 S   s   g | ]
}|j ‘qS r   )Ústatusr:   r   r   r   r<   K   r=   c                 S   s   g | ]
}|j ‘qS r   )Únfevr:   r   r   r   r<   P   r=   c                 S   s   g | ]
}|j ‘qS r   )r3   r:   r   r   r   r<   V   r=   )r   ÚlinspaceÚreshaper5   Z	vectorizer3   r4   r   Úravelr   r   r   r   r   r   r?   Ú
issubdtypeÚdtypeZbool_r@   ÚintegerrA   Úmax)r   r(   r   r   r1   r   ÚrefsZref_xZref_dfZ	ref_errorZref_successZref_flagZref_nfevZref_nitr   )r   r9   r(   r   r   Útest_vectorization$   sH    
z$TestDifferentiate.test_vectorizationc                    sr   t j d¡‰‡ ‡fdd„‰ dˆ _t jdt jd�f}tˆ dgd dd	|d
�}t  tj	t
tjtjg¡}t|j|ƒ d S )Nì   •¾;O  c                    sN   ˆ j d7  _ dd„ ‡fdd„dd„ dd„ g‰ ‡ fdd„t| | ¡ ƒD ƒ}|S )	Nr)   c                 S   s   | d S )Nç      @r   r0   r   r   r   Ú<lambda>b   r=   z9TestDifferentiate.test_flags.<locals>.f.<locals>.<lambda>c                    s   t  | ¡ˆ  ¡  S r	   )r   ÚexpÚrandomr0   ©Úrngr   r   rM   c   r=   c                 S   s
   t  | ¡S r	   )r   rN   r0   r   r   r   rM   d   r=   c                 S   s   t  | t j¡d S )Nr   )r   Ú	full_likeÚnanr0   r   r   r   rM   e   r=   c                    s   g | ]\}}ˆ | |ƒ‘qS r   r   )r;   r   Új©Úfuncsr   r   r<   f   r=   z;TestDifferentiate.test_flags.<locals>.f.<locals>.<listcomp>)r3   ÚziprD   )ZxsÚjsr   ©r   rQ   rU   r   r   `   s    
ýz'TestDifferentiate.test_flags.<locals>.fr   r-   ©rF   r)   ç›+¡†›„=r.   )Úrtolr(   r7   )r   rO   Údefault_rngr3   ZarangeZint64r   ÚarrayÚeimÚ_ECONVERGEDr   Ú	_ECONVERRÚ
_EVALUEERRr   r@   )r   r7   r   Ú	ref_flagsr   rY   r   Ú
test_flags\   s    ýzTestDifferentiate.test_flagsc                    sR   t j d¡‰ ‡ fdd„}t|ddddd�}t  tjttjtj	g¡}t
|j|ƒ d S )	NrK   c                    s2   | d t  | ¡ˆ  ¡  t  | ¡t  | t j¡d gS )NrL   r   )r   rN   rO   rR   rS   r0   rP   r   r   r   v   s
    ýz6TestDifferentiate.test_flags_preserve_shape.<locals>.fr)   r[   r.   T)r\   r(   Úpreserve_shape)r   rO   r]   r   r^   r_   r`   r   ra   rb   r   r@   )r   r   r   rc   r   rP   r   Útest_flags_preserve_shapes   s    ýz+TestDifferentiate.test_flags_preserve_shapec              	   C   sŠ   dd„ }d}ddt  d| ¡ ddt  d| ¡  dt  d| ¡ |d d  dt  d| ¡ |d   g}t||d	d
�}t|j|ƒ d S )Nc                 S   s:   | t  d|  ¡| t  d|  ¡ t  d|  ¡| d d  gS )Nr,   r   é   r)   r.   )r   Úsinr0   r   r   r   r   †   s    z0TestDifferentiate.test_preserve_shape.<locals>.fr   r)   r,   r   rg   r.   T©re   )r   Úcosrh   r   r   r   )r   r   r   r   r   r   r   r   Útest_preserve_shape„   s    &6ÿz%TestDifferentiate.test_preserve_shapec           	      C   sF  t  ¡ }d}|j}| |¡}tdddd�}| ¡ }d|d< t||fi |¤Ž}tt|j	| ƒdƒ d|d< t||fi |¤Ž}tt|j	| ƒdƒ tt|j	| ƒt|j	| ƒƒ | ¡ }d|d< t||fi |¤Ž}tt|j	| ƒdt
 |¡ ƒ d|d< t||fi |¤Ž}tt|j	| ƒdt
 |¡ ƒ tt|j	| ƒt|j	| ƒƒ d S )	Nr)   r   r-   )r"   r\   r(   gü©ñÒMbP?r"   g�íµ ÷Æ°>r\   )r   r
   r   r   ÚdictÚcopyr   r   r   r   r   )	r   r&   r   r   r   Zkwargs0r8   Úres1Úres2r   r   r   Útest_convergence�   s*    
z"TestDifferentiate.test_convergencec           	      C   sž  t  ¡ }d}|j}| |¡}t||ddd�}t||ddd�}t|j| ƒt|j| ƒk s\J ‚t||ddd�}t||ddd�}t|j| ƒt|j| ƒk sœJ ‚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)   g      à?)Úinitial_stepÚmaxitergš™™™™™©?r.   )Ústep_factorrr   rg   r-   r   )r(   rr   Ústep_direction)rq   rs   r>   ©r\   r2   rt   )r   r
   r   r   r   r   r   rl   r   r   Úsqrt)	r   r&   r   r   r   rn   ro   r8   r   r   r   r   Útest_step_parameters©   s4    
  ÿÿz&TestDifferentiate.test_step_parametersc                 C   sl   dd„ }t  ddd¡}t  |¡}d\||dk < ||dk< t|||d	�}t|jt  |¡ƒ t  |j¡shJ ‚d S )
Nc                 S   s$   t  | ¡}t j|| dk | dk < |S )Nr   r.   )r   rN   rS   )r   Úyr   r   r   r   Í   s    
z0TestDifferentiate.test_step_direction.<locals>.fr   r.   r   )r)   r2   r   gffffffö?)rt   )	r   rB   Z
zeros_liker   r   r   rN   Úallr?   )r   r   r   rt   r   r   r   r   Útest_step_directionË   s    
z%TestDifferentiate.test_step_directionc                 C   s�   dd„ }dd„ }t  g d¢¡ ddd¡}t  g d¢¡ ddd¡}t  d	d
g¡ ddd¡}t||||fd�}t  |||ƒ|jj¡}t|j|ƒ d S )Nc                 S   s   | | S r	   r   ©r   Úpr   r   r   r   Û   s    z@TestDifferentiate.test_vectorized_step_direction_args.<locals>.fc                 S   s   || |d   S ©Nr)   r   r{   r   r   r   r   Þ   s    zATestDifferentiate.test_vectorized_step_direction_args.<locals>.df)r)   r.   r,   r-   r2   r)   ©r2   r   r)   r.   r,   )rt   r7   )r   r^   rC   r   Zbroadcast_tor   r   r   )r   r   r   r   Úhdirr|   r   r   r   r   r   Ú#test_vectorized_step_direction_argsÙ   s    z5TestDifferentiate.test_vectorized_step_direction_argsc                    s(  d}t  ¡ ‰d‰‡fdd„}d}t||ˆdd�}t |j¡r@J ‚t |j|d ˆd d	  k¡sdJ ‚t |jˆk¡sxJ ‚‡ ‡fd
d„‰ dˆ _	d ˆ _
tƒ ˆ _t||ˆ dd�}| ¡ D ]p}|dkrø|| tjksÐJ ‚ˆ j
| tjksäJ ‚|| tjksöJ ‚q²|| ˆ j
|   k�r|| ks²n J ‚q²d S )Ng~ý,œã?r,   c                    s   ˆ   | ¡}|S r	   )r   )r   r   )r&   r   r   r   î   s    
z2TestDifferentiate.test_maxiter_callback.<locals>.fé   çVçž¯Ò<)rr   r\   r)   r.   c                    sb   ˆ  j d7  _ | ˆ _t| dƒs"J ‚| jˆ jvs2J ‚ˆ j | j¡ | jtjksPJ ‚ˆ j ˆkr^t	‚d S )Nr)   r   )
Úiterr   Úhasattrr   ÚdfsÚaddr@   r_   Ú_EINPROGRESSÚStopIteration©r   )Úcallbackrr   r   r   rŠ   ø   s    
z9TestDifferentiate.test_maxiter_callback.<locals>.callbackr2   )rŠ   r\   r@   )r   r
   r   r   Úanyr?   ry   rA   r3   rƒ   r   Úsetr…   Úkeysr_   ra   r‡   Z
_ECALLBACK)r   r   r   Zdefault_orderr   ro   Úkeyr   )rŠ   r&   rr   r   Útest_maxiter_callbackè   s(    $	z'TestDifferentiate.test_maxiter_callbackr   r~   gÍÌÌÌÌÌä?gffffffæ?rF   c                    sš   t j|ˆ d�d }‡ fdd„}‡ fdd„}t||d||d�}|jjˆ ksLJ ‚|jjˆ ks\J ‚|jjˆ kslJ ‚t  ˆ ¡j}t	|jt  
|j¡t  |¡d	� d S )
NrZ   r   c                    s   | j ˆ ksJ ‚t | ¡S r	   )rF   r   rN   r0   rZ   r   r   r     s    z'TestDifferentiate.test_dtype.<locals>.fc                    s4   | j jˆ ksJ ‚| jjˆ ks J ‚| jjˆ ks0J ‚d S r	   )r   rF   r   r   r‰   rZ   r   r   rŠ     s    z.TestDifferentiate.test_dtype.<locals>.callbackr-   )r(   rt   rŠ   ru   )r   Zasarrayr   r   rF   r   r   ZfinfoÚepsr   rN   rv   )r   r   r   rF   r   rŠ   r   r�   r   rZ   r   Ú
test_dtype  s    
ÿzTestDifferentiate.test_dtypec                 C   sl  d}t jt|d�� td dƒ W d   ƒ n1 s20    Y  d}t jt|d�� tdd„ dƒ W d   ƒ n1 sr0    Y  d}t jt|d��" td	d„ d
dgƒ W d   ƒ n1 s¶0    Y  d}t jt|d��" tdd„ ddd� W d   ƒ n1 sú0    Y  t jt|d��" tdd„ ddd� W d   ƒ n1 �s<0    Y  t jt|d��" tdd„ dd d� W d   ƒ n1 �s~0    Y  t jt|d��$ tdd„ dtƒ d� W d   ƒ n1 �sÂ0    Y  d}t jt|d��" tdd„ ddd� W d   ƒ n1 �s0    Y  t jt|d��" tdd„ ddd� W d   ƒ n1 �sJ0    Y  d}t jt|d��" tdd„ ddd� W d   ƒ n1 �s�0    Y  t jt|d��" td d„ ddd� W d   ƒ n1 �sÒ0    Y  d!}t jt|d��" td"d„ dd#d$� W d   ƒ n1 �s0    Y  d%}t jt|d��" td&d„ dd'd(� W d   ƒ n1 �s^0    Y  d S ))Nz`func` must be callable.)Úmatchr)   z3Abscissae and function output must be real numbers.c                 S   s   | S r	   r   r0   r   r   r   rM   1  r=   z9TestDifferentiate.test_input_validation.<locals>.<lambda>y      À      ð?z6When `preserve_shape=False`, the shape of the array...c                 S   s   g d¢S )N)r)   r.   r,   r   r0   r   r   r   rM   5  r=   éþÿÿÿéýÿÿÿz6Tolerances and step parameters must be non-negative...c                 S   s   | S r	   r   r0   r   r   r   rM   9  r=   r2   r!   c                 S   s   | S r	   r   r0   r   r   r   rM   ;  r=   Zekkiru   c                 S   s   | S r	   r   r0   r   r   r   rM   =  r=   )rq   c                 S   s   | S r	   r   r0   r   r   r   rM   ?  r=   )rs   z%`maxiter` must be a positive integer.c                 S   s   | S r	   r   r0   r   r   r   rM   C  r=   ç      ø?)rr   c                 S   s   | S r	   r   r0   r   r   r   rM   E  r=   r   z"`order` must be a positive integerc                 S   s   | S r	   r   r0   r   r   r   rM   I  r=   r/   c                 S   s   | S r	   r   r0   r   r   r   rM   K  r=   z'`preserve_shape` must be True or False.c                 S   s   | S r	   r   r0   r   r   r   rM   O  r=   Zherringri   z`callback` must be callable.c                 S   s   | S r	   r   r0   r   r   r   rM   S  r=   Z	shrubbery)rŠ   )ÚpytestZraisesÚ
ValueErrorr   Úobject)r   Úmessager   r   r   Útest_input_validation(  sD    (,0022422222z'TestDifferentiate.test_input_validationc                    sô   dd„ }t |ddd�}|js J ‚t|jdƒ tdƒD ]˜‰ d}‡ fd	d„}d
ˆ  |ˆ d   }t ||dtdˆ ƒd�}t|j|dd� t|jtj	ƒ t ||tdˆ ƒd�}|js®J ‚|j
d
ks¼J ‚t|j|dd� q4dd„ }t |d
dd�}t|jdƒ d S )Nc                 S   s    t  | jt j¡sJ ‚| d d S )Néc   r)   )r   rE   rF   Zfloatingr0   r   r   r   r   Z  s    z/TestDifferentiate.test_special_cases.<locals>.fé   r    ru   gl)~IéŠQr*   r•   c                    s   d| ˆ   S )Nr.   r   r0   ©r9   r   r   r   k  s    r.   r)   )rr   r(   r‚   r/   c                 S   s   ||  d S r}   r   )r   Úcr   r   r   r   z  s    r,   )r7   )r   r?   r   r   ÚrangerH   r   r   r   rS   r3   )r   r   r   r   r   r   r�   r   Útest_special_casesU  s$    
	
z$TestDifferentiate.test_special_casesc                 C   s   | d d S )Nr)   r,   r   r0   r   r   r   rM   ‚  r=   zTestDifferentiate.<lambda>c                 C   s"   t  | dk| d d | d d ¡S )Nr)   é   r,   )r   Úwherer0   r   r   r   rM   ƒ  r=   c                 C   s<   d}t |g d¢|dœŽ}t |j¡s(J ‚t|jd|d� d S )Ng¼‰Ø—²Òœ<r~   )rt   r"   r   r!   )r   r   ry   r?   r   r   )r   r   r"   r   r   r   r   Útest_saddle_gh18811€  s    	z%TestDifferentiate.test_saddle_gh18811N) Ú__name__Ú
__module__Ú__qualname__r   r–   ÚmarkZparametrizer   rB   r   r   Z_distr_paramsZdistcontr'   ÚtuplerJ   rd   rf   rk   rp   rw   rz   r€   r�   Zfloat16Zfloat32Zfloat64r‘   rš   r    Zxfailr£   r   r   r   r   r      s8   


6"(-+

þr   )r–   Únumpyr   Znumpy.testingr   r   r   Z(scipy._lib._elementwise_iterative_methodZ_libZ_elementwise_iterative_methodr_   Zscipyr   Zscipy.optimize._differentiater   r   r   r   r   r   r   r   Ú<module>   s   