U
    »mœdo  ã                   @   s–  d dl Z d dlmZmZmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlZd dlmZmZmZmZ d dlmZmZmZ d dlmZ d dlmZmZ m!Z" d	e e#¡j$ Z%ee#ƒj$Z&d
d„ Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-eƒ dd„ ƒZ.G dd„ dƒZ/dd„ Z0dd„ Z1d d!„ Z2G d"d#„ d#ƒZ3d$d%„ Z4d&d'„ Z5d(d)„ Z6d*d+„ Z7d,d-„ Z8d.d/„ Z9e j: ;d0d1ej<fd2ej=fg¡d3d4„ ƒZ>d5d6„ Z?dS )7é    N)ÚsqrtÚexpÚsinÚcos)Ú	lru_cache)Úassert_warnsÚassert_Úassert_allcloseÚassert_equalÚassert_array_equalÚsuppress_warnings)ÚfinfoÚpowerÚnanÚisclose)Ú	_zeros_pyÚnewtonÚroot_scalar)Úgetfullargspec_no_self)Ú	get_testsÚ	functionsÚfstringsé   c                 C   s   | d d|   d S ©Né   é   © ©Úxr   r   úX/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/optimize/tests/test_zeros.pyÚf1   s    r    c                 C   s   d|  d S ©Nr   r   r   r   r   r   Úf1_1    s    r"   c                 C   s   dd|   S ©Nç       @r   r   r   r   r   r   Úf1_2$   s    r%   c                 C   s   t | ƒt| ƒt| ƒfS ©N)r    r"   r%   r   r   r   r   Úf1_and_p_and_pp(   s    r'   c                 C   s   t | ƒt| ƒ S r&   ©r   r   r   r   r   r   Úf2-   s    r)   c                 C   s   t | ƒt| ƒ S r&   ©r   r   r   r   r   r   Úf2_11   s    r+   c                 C   s   t | ƒt| ƒ S r&   r(   r   r   r   r   Úf2_25   s    r,   c                 C   s   | S r&   r   r   r   r   r   Úf_lrucached:   s    r-   c                   @   sZ  e Zd ZdHdd„Zdd„ Zdd„ ZdId	d
„Zde de dfdd„Zddde de f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dd„ ƒZed d!„ ƒZed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dS )JÚ	TestBasicr   c              	   K   s    d}t dƒ}dt t¡j }dt t¡j }tttƒD ]d\}}	|dkrP|	dkrPq6t|f|||g|||dœ|—Ž}
|
j	}t
|
jƒ t|d||d||	f d	� q6d S )
Nç      à?é   r   r   )Zf4Zf5Zf6)ÚmethodZbracketÚx0ÚxtolÚrtolç      ð?úmethod %s, function %s©Úatolr4   Úerr_msg)r   Únpr   ÚfloatÚepsÚzipÚtstutils_functionsÚtstutils_fstringsr   Úrootr   Ú	convergedr	   )ÚselfÚnameÚ
smoothnessÚkwargsÚaÚbr3   r4   ÚfunctionÚfnameÚrÚzeror   r   r   Úrun_check_by_nameA   s$     ÿÿ


ÿzTestBasic.run_check_by_namec              	   C   sp   d}t dƒ}dt }dt }tttƒD ]D\}}||||||dd�\}	}
t|
jƒ t|	d||d||f d� q&d S )	Nr/   r0   r   T)r3   r4   Úfull_outputr5   r6   r7   )r   Ú
_FLOAT_EPSr=   r>   r?   r   rA   r	   )rB   r1   rC   rF   rG   r3   r4   rH   rI   rK   rJ   r   r   r   Ú	run_checkP   s    ÿ



ÿzTestBasic.run_checkc                 C   s@   d}d}|t ||dd�\}}t|jƒ t|dd|df d� d S )	Néÿÿÿÿr   T©rM   r   r6   r-   )r9   )r-   r   rA   r	   )rB   r1   rC   rF   rG   rK   rJ   r   r   r   Úrun_check_lru_cached\   s    

ÿzTestBasic.run_check_lru_cachedNc              
   K   sÚ   g }|p
g D ].}||kr,ddddœ  ||¡}| || ¡ qtf |Ž}| dddœ¡ |p\g D ]}|| ||< q^|  d¡}	|  d	d
¡}
z"||d	|
i|—Ž\}}|	||fW S  tk
rÔ   |	t tddtj¡|f Y S X d S )Nr2   Úx1Úf)rF   rG   ÚfuncTF©rM   Údispr@   Úargsr   rP   )	ÚgetÚappendÚdictÚupdateÚ	ExceptionÚzerosÚRootResultsr   Z
_EVALUEERR)rB   Útcr1   Úsig_args_keysÚsig_kwargs_keysrE   Zmethod_argsÚkZmethod_kwargsr@   Z	func_argsrJ   Úrrr   r   r   Ú_run_one_teste   s     

zTestBasic._run_one_testr   c                    s¤  t ˆƒ}t|j ƒ t|jƒ}	t|jƒ|	 }
|jd|
… ‰g ‰|dkrt|dkrjˆ d¡ |dkrjˆ d¡ |ˆd< n|ˆd< ˆˆd	< ‡‡‡‡‡fd
d„|D ƒ}ˆp¤g ‰dd„ |D ƒ}‡fdd„|D ƒ}dd„ |D ƒ}tt|ƒ|gdg gƒ dt dt dœ}|j	f ˆŽ |d	 ‰| 
d|d ¡‰ dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}‡ ‡‡fdd„t|||ƒD ƒ}dd„ |D ƒ}dd„ t||ƒD ƒ}t|t|ƒgg dgƒ dS )zÒRun test-cases using the specified method and the supplied signature.

        Extract the arguments for the method call from the test case
        dictionary using the supplied keys for the method's signature.N)Úsecantr   Úhalley)r   rg   Úfprime)rg   Úfprime2Útolr3   r4   c                    s*   g | ]"}t ˆj|ˆfˆˆd œˆ —Žƒ‘qS ))ra   rb   )Úlistre   )Ú.0r`   )rE   r1   rB   ra   rb   r   r   Ú
<listcomp>–   s   þ ÿþþz'TestBasic.run_tests.<locals>.<listcomp>c                 S   s   g | ]}|d  j s|‘qS ©r   ©rA   ©rl   Úeltr   r   r   rm   œ   s     
 c                    s    g | ]}|d  d ˆ kr|‘qS ©rP   ÚIDr   rp   )Ú
known_failr   r   rm   �   s      c                 S   s   g | ]}|d  d ‘qS rr   r   rp   r   r   r   rm   ž   s     r   r   ©r3   r4   c                 S   s   g | ]}|d  j r|‘qS rn   ro   rp   r   r   r   rm   §   s     
 c                 S   s   g | ]}|d  j ‘qS rn   ©r@   rp   r   r   r   rm   ¨   s     c                 S   s   g | ]}|d  ‘qS ©r   r   rp   r   r   r   rm   ©   s     c                    s<   g | ]4\}}}t ||ˆˆ d �s|d d ˆkr|g| ‘qS ))r4   r8   rP   rs   )r   )rl   rF   Úcrq   )r8   rt   r4   r   r   rm   ª   s    þc                 S   s*   g | ]"\}}}}|d  |f|d žŽ ‘qS )rT   rX   r   )rl   Zarootrx   Zfulloutr`   r   r   r   rm   ®   s    
 c                 S   s"   g | ]\}}|d kr|g| ‘qS rw   r   )rl   Zfvrq   r   r   r   rm   ¯   s      )Ú_getfullargspecr   Ú
kwonlyargsÚlenÚdefaultsrX   rZ   r
   rN   r\   rY   r=   )rB   Útestsr1   rC   r3   r4   rt   rE   ÚsigZ	nDefaultsZ	nRequiredÚresultsZnotcvgdZnotcvged_IDSZtolsZcvgdZapproxZcorrectZnotcloseZfvsr   )r8   rt   rE   r1   r4   rB   ra   rb   r   Ú	run_tests|   sB    




þzTestBasic.run_testsc           
      K   s.   t ||d�}	| j|	||f|||dœ|—Ž dS )zuRun a collection of tests using the specified method.

        The name is used to determine some optional arguments.©rD   )r3   r4   rt   N)r   r€   )
rB   Ú
collectionr1   rC   rD   rt   r3   r4   rE   r}   r   r   r   Úrun_collection²   s    ÿÿzTestBasic.run_collectionc                 C   s>   |   tjd¡ |  tjd¡ |  d¡ | jdtjddd� d S )NÚbisectÚapsr   r�   )rO   r^   r„   rR   rL   rƒ   ©rB   r   r   r   Útest_bisect½   s    
zTestBasic.test_bisectc                 C   s>   |   tjd¡ |  tjd¡ |  d¡ | jdtjddd� d S )NÚridderr…   r   r�   )rO   r^   rˆ   rR   rL   rƒ   r†   r   r   r   Útest_ridderÃ   s    
zTestBasic.test_ridderc                 C   sB   |   tjd¡ |  tjd¡ |  d¡ | jdtjddddd� d S )NÚbrentqr…   r   ç›+¡†›„=©rD   r3   r4   )rO   r^   rŠ   rR   rL   rƒ   r†   r   r   r   Útest_brentqÉ   s    
 ÿzTestBasic.test_brentqc                 C   sB   |   tjd¡ |  tjd¡ |  d¡ | jdtjddddd� d S )NÚbrenthr…   r   r‹   rŒ   )rO   r^   rŽ   rR   rL   rƒ   r†   r   r   r   Útest_brenthÑ   s    
 ÿzTestBasic.test_brenthc                 C   s>   |   tjd¡ |  tjd¡ |  d¡ | jdtjddd� d S )NÚtoms748r…   r   r�   )rO   r^   r�   rR   rL   rƒ   r†   r   r   r   Útest_toms748Ø   s    
zTestBasic.test_toms748c                 C   s6   dg}|ddg7 }dD ]}| j |tjdd|d� qd S )Nú	aps.13.00z	aps.12.05ú	aps.12.17©r…   Úcomplexr   r   ©rD   rt   ©rƒ   r^   r   ©rB   rt   r‚   r   r   r   Útest_newton_collectionsÞ   s     ÿz!TestBasic.test_newton_collectionsc                 C   sD   ddddddddd	d
ddddg}dD ]}| j |tjdd|d� q$d S )Nz	aps.12.06z	aps.12.07z	aps.12.08z	aps.12.09z	aps.12.10z	aps.12.11z	aps.12.12z	aps.12.13z	aps.12.14z	aps.12.15z	aps.12.16r“   z	aps.12.18r’   r”   rg   r   r–   r—   r˜   r   r   r   Útest_halley_collectionså   s"           ý ÿz!TestBasic.test_halley_collectionsc                 C   s   | d d|   d S r   r   r   r   r   r   r    î   s    zTestBasic.f1c                 C   s   d|  d S r!   r   r   r   r   r   r"   ò   s    zTestBasic.f1_1c                 C   s   dd|   S r#   r   r   r   r   r   r%   ö   s    zTestBasic.f1_2c                 C   s   t | ƒt| ƒ S r&   r(   r   r   r   r   r)   ú   s    zTestBasic.f2c                 C   s   t | ƒt| ƒ S r&   r*   r   r   r   r   r+   þ   s    zTestBasic.f2_1c                 C   s   t | ƒt| ƒ S r&   r(   r   r   r   r   r,     s    zTestBasic.f2_2c                 C   sÀ   | j | j| jf| j| j| jffD ]š\}}}tj|ddd�}t||ƒddd� tj|dddd�}t||ƒddd� tj|d|dd�}t||ƒddd� tj|d||dd	�}t||ƒddd� q d S )
Nr0   ç�íµ ÷Æ°>)rj   r   ©r8   é   )rS   rj   )rh   rj   )rh   ri   rj   )	r    r"   r%   r)   r+   r,   r^   r   r	   )rB   rT   Úf_1Úf_2r   r   r   r   Útest_newton  s    ÿzTestBasic.test_newtonc                 C   sJ   t ttftttffD ]0\}}}t|dd|dd�}t||jƒddd� qdS )z#Invoke newton through root_scalar()r   r0   r›   )r1   r2   rh   r3   r   rœ   N©	r    r"   r%   r)   r+   r,   r   r	   r@   ©rB   rT   rž   rŸ   rJ   r   r   r   Útest_newton_by_name  s    zTestBasic.test_newton_by_namec                 C   sp   t ttftttffD ]V\}}}t|ddddd�}t||jƒddd� t|ddddd�}t||jƒddd� qd	S )
z#Invoke secant through root_scalar()rf   r0   r   r›   )r1   r2   rS   r3   r   rœ   r�   Nr¡   r¢   r   r   r   Útest_secant_by_name  s
    zTestBasic.test_secant_by_namec              	   C   sL   t ttftttffD ]2\}}}t|dd||dd�}t||jƒddd� qdS )z#Invoke halley through root_scalar()rg   r0   r›   )r1   r2   rh   ri   r3   r   rœ   Nr¡   r¢   r   r   r   Útest_halley_by_name   s      ÿzTestBasic.test_halley_by_namec              	   C   s    t  t¡� ttdddd� W 5 Q R X t  t¡� ttdddd� W 5 Q R X t  t¡� ttdtddd� W 5 Q R X t  t¡� ttdtddd� W 5 Q R X d S )	Nrf   r0   r›   )r1   r2   r3   r   rg   )r1   rh   r2   r3   )r1   ri   r2   r3   )ÚpytestÚraisesÚ
ValueErrorr   r    r"   r%   r†   r   r   r   Útest_root_scalar_fail'  s    zTestBasic.test_root_scalar_failc           
      C   sÀ   dd„ }dd„ }dd„ }t  ddd	d
ddddddg
¡}t  tdƒ¡d d }||ddddf}dgd }t ||||¡}d}	t||	ƒ tj|||||d�}t||	ƒ tj|||d�}t||	ƒ dS )ztest newton with arrayc                 W   sJ   |d | |d   }|d |d t  ||d  ¡d   ||d   |  S )Nr   r0   r   r   r�   r5   r   ©r:   r   ©r   rF   rG   r   r   r   r    4  s    z'TestBasic.test_array_newton.<locals>.f1c                 W   sP   |d |d  }|d  t  |d |d  | |  ¡ | |d |d   d S )Nr0   r�   r   r   r   r   rª   r«   r   r   r   r"   8  s    z)TestBasic.test_array_newton.<locals>.f1_1c                 W   s@   |d |d  }|d  t  |d |d  | |  ¡ |d  S )Nr0   r�   r   r   rª   r«   r   r   r   r%   <  s    z)TestBasic.test_array_newton.<locals>.f1_2g“ù4O@g�­Nkò@g]0Jû@g]QçÝšt@g~�EO¡5@g$ÇJŠ— ÷?g~5È,ì@gXCÚ­Ø@gÍ®9@@g¬¹’Ó�®@é
   r5   g      @g•Ö&è.>gü©ñÒMbp?gn‹2d’Ñ?)
gÔ©áË°@g9~¨4bŠ'@g’¹�a©q(@géŽ0Òp@gk"zçò?g€4s³eÂ?gU+ïñF@gw´»Qu%@gd¬6ÿ¯‚)@g)êiÓ!@)ri   ©rX   N)r:   Úarrayr   Úranger^   r   r	   )
rB   r    r"   r%   Za0Za1rX   r2   r   Z
x_expectedr   r   r   Útest_array_newton1  s2          ü


zTestBasic.test_array_newtonc                 C   s€   dd„ }dd„ }t  dd¡}tj|||d�}t||ƒdƒ t  d¡}tj|||d�}t||ƒdƒ t ||¡}t||ƒdƒ d S )	Nc                 S   s   | d d S )Nr   ù              ð?r   r   r   r   r   rT   Y  s    z.TestBasic.test_array_newton_complex.<locals>.fc                 S   s   dS ©Nr5   r   r   r   r   r   rh   \  s    z3TestBasic.test_array_newton_complex.<locals>.fprimer   r±   )rh   ç        )r:   Úfullr^   r   r	   Zones)rB   rT   rh   Útr   r   r   r   Útest_array_newton_complexX  s    
z#TestBasic.test_array_newton_complexc                 C   s2   t jdd„ ddgt ddg¡gd�}t|dƒ d	S )
z8test secant doesn't continue to iterate zero derivativesc                 W   s   | |  |d  S )Nr   r   ©r   rF   r   r   r   Ú<lambda>m  ó    z=TestBasic.test_array_secant_active_zero_der.<locals>.<lambda>gË¡E¶ó}@r�   é   é   )r2   rX   )çí¯f~@g      @N)r^   r   r:   r®   r	   ©rB   r   r   r   r   Ú!test_array_secant_active_zero_derk  s    ÿz+TestBasic.test_array_secant_active_zero_derc                 C   sX   t jdd„ dgd ddgfd�}t|dƒ t jd	d„ d
gd ddgfd�}t|dƒ d S )Nc                 S   s   || d  S r!   r   ©ÚyÚzr   r   r   r¸   s  r¹   z6TestBasic.test_array_newton_integers.<locals>.<lambda>ç      @r   g      .@g      1@r­   )gÚNO±Þû@r¼   c                 S   s   || d  S r!   r   r¿   r   r   r   r¸   w  r¹   r   é   rº   )r^   r   r	   r½   r   r   r   Útest_array_newton_integersq  s    ÿ
 z$TestBasic.test_array_newton_integersc              	   C   s~   t ttjdd„ ddgdd„ ƒ t t¡�L tjdd„ ddgdd„ dd�}t|jd	ƒ |j 	¡ sbt
‚|j ¡ rpt
‚W 5 Q R X d S )
Nc                 S   s   | d d S r!   r   ©rÀ   r   r   r   r¸   }  r¹   z?TestBasic.test_array_newton_zero_der_failures.<locals>.<lambda>r³   c                 S   s   d|  S r!   r   rÅ   r   r   r   r¸   }  r¹   c                 S   s   | d d S r!   r   rÅ   r   r   r   r¸   €  r¹   c                 S   s   d|  S r!   r   rÅ   r   r   r   r¸   �  r¹   TrQ   r   )r   ÚRuntimeWarningr^   r   r¦   Úwarnsr	   r@   Zzero_derÚallÚAssertionErrorrA   Úany)rB   r   r   r   r   Ú#test_array_newton_zero_der_failuresz  s      ÿ ÿz-TestBasic.test_array_newton_zero_der_failuresc                 C   s®   dd„ }dd„ }dd„ }dd„ }t |dd|d	�}t |ddd
d	�}t|j|jdd� td|j |jƒ t |dd||d�}t |ddd
d�}t|j|jdd� td|j |jƒ d S )Nc                 S   s   | d d|   d S r   r   r   r   r   r   r¸   ‡  r¹   z0TestBasic.test_newton_combined.<locals>.<lambda>c                 S   s   d|  d S r!   r   r   r   r   r   r¸   ˆ  r¹   c                 S   s   dd|   S r#   r   r   r   r   r   r¸   ‰  r¹   c                 S   s"   | d d|   d d|  d dfS )Nr   r   r$   r   r   r   r   r   r'   ‹  s    z7TestBasic.test_newton_combined.<locals>.f1_and_p_and_ppr   r0   )r1   r2   rh   Tg:Œ0âŽyE>rœ   r   rg   )r1   r2   rh   ri   )r1   r2   ri   )r   r	   r@   r
   Úfunction_calls)rB   r    r"   r%   r'   Zsol0Zsolr   r   r   Útest_newton_combined†  s    zTestBasic.test_newton_combinedc           
   
   C   sl  d}dddg}t dƒD �]N}dddœ}d| jgd	| jggd |… D ]\}}|||< qBtj| j|fd
di|—Ž\}}t|jƒ t||j	ƒ t|j
|jf|| ƒ |dkr¼|j|j
d ksÒt‚nt|j|d |j
 ƒ |j
d }	tj| j|f|	ddœ|—Ž\}}t|j ƒ t||j	ƒ t|j
|	ƒ |dkrtjtd|	 d��& tj| j|f|	ddœ|—Ž\}}W 5 Q R X qd S )Nr0   )é   é   )r�   r¬   )r0   é	   r›   T)rj   rM   rh   ri   rW   Fr   r   )ÚmaxiterrW   z3Failed to converge after %d iterations, value is .*©Úmatch)r¯   r"   r%   r^   r   r    r   rA   r
   r@   Ú
iterationsrÌ   rÉ   r¦   r§   ÚRuntimeError)
rB   r2   Zexpected_countsZderivsrE   rc   Úvr   rJ   Zitersr   r   r   Útest_newton_full_output˜  s0    

$


 þz!TestBasic.test_newton_full_outputc              	   C   sR   dd„ }dd„ }t ttj|d|dd� tjtdd�� t |d|¡ W 5 Q R X d S )	Nc                 S   s   | d d S )Nr   r$   r   r   r   r   r   r¸   ¾  r¹   z3TestBasic.test_deriv_zero_warning.<locals>.<lambda>c                 S   s   d|  S r!   r   r   r   r   r   r¸   ¿  r¹   r³   F©rW   zDerivative was zerorÒ   )r   rÆ   r^   r   r¦   r§   rÕ   )rB   rU   Zdfuncr   r   r   Útest_deriv_zero_warning½  s
    z!TestBasic.test_deriv_zero_warningc                 C   s4   t  ddg¡}| ¡ }tt j|t jƒ t||ƒ d S )Nçš™™™™™¹?r0   )r:   r®   Úcopyr   r   r   r   )rB   r2   Zx0_copyr   r   r   Útest_newton_does_not_modify_x0Ä  s    z(TestBasic.test_newton_does_not_modify_x0c              
   C   sP   t jt jt jt jt jt jfD ].}tjt	dd�� |t
dddd� W 5 Q R X qd S )Nz2'float' object cannot be interpreted as an integerrÒ   r³   r5   gÍÌÌÌÌR@)rÑ   )r^   r„   r   rˆ   rŠ   rŽ   r�   r¦   r§   Ú	TypeErrorr    )rB   r1   r   r   r   Útest_maxiter_int_checkË  s     ÿÿz TestBasic.test_maxiter_int_check)r   )NN)'Ú__name__Ú
__module__Ú__qualname__rL   rO   rR   re   rN   r€   rƒ   r‡   r‰   r�   r�   r‘   r™   rš   Ústaticmethodr    r"   r%   r)   r+   r,   r    r£   r¤   r¥   r©   r°   r¶   r¾   rÄ   rË   rÍ   r×   rÙ   rÜ   rÞ   r   r   r   r   r.   ?   sb   
	  ÿ
 þ
6 þ
	






'	%r.   c                     s\   d‰ ‡ fdd„} t jt jg}t }}|D ].}|| dd||d�}tˆ |||d|j d� q(d S )	NrÚ   c                    s   | ˆ  S r&   r   r   rv   r   r   rT   Ö  s    ztest_gh_5555.<locals>.fg    „×—Ág    ÐcAru   z	method %sr7   )r^   r„   rˆ   ÚTOLr	   rß   )rT   Úmethodsr3   r4   r1   Úresr   rv   r   Útest_gh_5555Ó  s    
ÿræ   c                  C   sP   dd„ } d}dt  }tjtjg}|D ]&}|| dd||d�}td|||d	� q$d S )
Nc                 S   s   | dk rdS | d S d S )Nr/   gš™™™™™¹¿ç333333ã?r   r   r   r   r   rT   ë  s    ztest_gh_5557.<locals>.fgR¸…ëQà?r   r   r   ru   rç   ©r8   r4   )rN   r^   rŠ   rŽ   r	   )rT   r8   r4   rä   r1   rå   r   r   r   Útest_gh_5557á  s    
ré   c                     sZ   d} d}| |fD ]D\}}}t  |¡‰ tjtjfD ]"}|‡ fdd„||ƒ}t||ƒ q0qd S )N)g      |Àg     àuÀg      yÀ)g     àu@g      |@g      y@c                    s   t  | ¡ˆ  S r&   rª   r   ©rx   r   r   r¸     r¹   z9test_brent_underflow_in_root_bracketing.<locals>.<lambda>)r:   r   r^   rŽ   rŠ   r	   )Zunderflow_scenarioZoverflow_scenariorF   rG   r@   r1   rå   r   rê   r   Ú'test_brent_underflow_in_root_bracketingù  s    
rë   c                   @   s   e Zd Zdd„ ZdS )ÚTestRootResultsc                 C   s(   t jddddd�}d}tt|ƒ|ƒ d S )Nr5   é,   é.   r   )r@   rÔ   rÌ   Úflagzo      converged: True
           flag: 'converged'
 function_calls: 46
     iterations: 44
           root: 1.0)r^   r_   r
   Úrepr)rB   rJ   Zexpected_reprr   r   r   Ú	test_repr	  s    ýzTestRootResults.test_reprN)rß   rà   rá   rñ   r   r   r   r   rì     s   rì   c                  C   s”   dd„ } dd„ }dd„ }t ddƒ}d	}tj| ||||d
d�}t| |f|žŽ dd
d� |gd }d	}tj| ||||d
d�}t| |f|žŽ dd
d� dS )z&Test Halley's works with complex rootsc                 W   s$   |d | d  |d |   |d  S )Nr   r   r   r   r·   r   r   r   rT     s    ztest_complex_halley.<locals>.fc                 W   s   d|d  |  |d  S )Nr   r   r   r   r·   r   r   r   rž     s    z test_complex_halley.<locals>.f_1c                 W   s@   d|d  }zt | ƒ}W n tk
r0   | Y S X |g| S d S )Nr   r   )r{   rÝ   )r   rF   ÚretvalÚsizer   r   r   rŸ     s    
z test_complex_halley.<locals>.f_2r5   r$   )r$   g      @rÂ   r›   )rX   rh   ri   rj   r   rœ   r¬   N)r•   r^   r   r	   )rT   rž   rŸ   rÁ   ZcoeffsrÀ   r   r   r   Útest_complex_halley  s    	

rô   c               	   C   sF  t  t¡jd } d|  d|   }tƒ �*}| td¡ tjdd„ |gd d�}W 5 Q R X t	|d	gd ƒ d
}tƒ �&}| td¡ tjdd„ |dd�}W 5 Q R X t	|dƒ t
jtdd�� tjdd„ |dd�}W 5 Q R X d}tƒ �&}| td¡ tjdd„ |dd�}W 5 Q R X t	|dƒ t
jtdd�� tjdd„ |dd�}W 5 Q R X dS )zBTest secant method with a non-zero dp, but an infinite newton stepg…ëQ¸Õ?g      i@r$   zRMS ofc                 S   s   | d d S )Ng      Y@r   r   rÅ   r   r   r   r¸   =  r¹   z%test_zero_der_nz_dp.<locals>.<lambda>r¬   ©r2   éd   g.Ð—K.ÿï?zTolerance ofc                 S   s   | d d S ©Nr5   r   r   rÅ   r   r   r   r¸   C  r¹   F)r2   rW   r   rÒ   c                 S   s   | d d S r÷   r   rÅ   r   r   r   r¸   F  r¹   Tg.Ð—K.ÿï¿c                 S   s   | d d S r÷   r   rÅ   r   r   r   r¸   J  r¹   rP   c                 S   s   | d d S r÷   r   rÅ   r   r   r   r¸   M  r¹   N)r:   r   r;   r<   r   ÚfilterrÆ   r^   r   r	   r¦   r§   rÕ   )ZdxÚp0Úsupr   r   r   r   Útest_zero_der_nz_dp0  s(    "

rû   c               	      s¬   d} d‰ d}d}d}|| |  | }‡ fdd„}t  t¡�4 tj|dd	d
dgd|| gdd�}|j ¡ rjt‚W 5 Q R X t  t	¡�$ tj|dgd d|| gdd�}W 5 Q R X dS )z(Test that array newton fails as expectedrÚ   ga2U0*©#?gÍÌÌÌÌàŽ@g\âmJôA?g�•C‹lç@c              	      s6   dt  | ¡ dt  ˆ d | d| t  | ¡  ¡  S )Nr   r   gš™™™™™@g®Gáz@)r:   r   Úlog10)Zdarcy_frictionÚreZdia©Z	roughnessr   r   Úcolebrook_eqn]  s
    ÿÿz1test_array_newton_failures.<locals>.colebrook_eqng{®Gáz„?gš™™™™™É?gˆ×õvÃ–?g333333Ó?r   T)r2   rÑ   rX   rM   N)
r¦   rÇ   rÆ   r^   r   rA   rÈ   rÉ   r§   rÕ   )ZdiameterÚrhoÚmuÚuZreynolds_numberrÿ   Úresultr   rþ   r   Útest_array_newton_failuresP  s0     
  þ   þr  c                  C   sT  dd„ } t j| dd�}t|dt jt jd� t j| dgd d�}t|dt jt jd� dd„ }d	d
„ }t j| d|d�}t|dt jt jd� t j| d||d�}t|dt jt jd� t j| dgd |d�}t|dt jt jd� t j| dgd ||d�}t|dt jt jd� t j| d|d�}t|dt jt jd� t j| dgd |d�}t|dt jt jd� dS )z@Test that Newton or Halley don't warn if zero derivative at rootc                 S   s   | d | d  S ©Nr0   r   r   r   r   r   r   Úf_zeroder_rootv  s    z9test_gh8904_zeroder_at_root_fails.<locals>.f_zeroder_rootr   rõ   rè   r¬   c                 S   s   d| d  d|   S r  r   r   r   r   r   Úfder�  s    z/test_gh8904_zeroder_at_root_fails.<locals>.fderc                 S   s   d|  d S )NrÎ   r   r   r   r   r   r   Úfder2…  s    z0test_gh8904_zeroder_at_root_fails.<locals>.fder2)r2   rh   )r2   rh   ri   r/   N)r^   r   r	   Z_xtolZ_rtol)r  rJ   r  r  r   r   r   Ú!test_gh8904_zeroder_at_root_failsr  s.    
ÿÿr	  c                     sn   d‰ ‡ fdd„} ‡ fdd„}‡ fdd„}d}t | ||d	d
�\}}|jsJt‚t | |||d	d�\}}|jsjt‚dS )zzTest that Halley's method realizes that the 2nd order adjustment
    is too big and drops off to the 1st order adjustment.rÐ   c                    s   t | dˆ  ƒt ˆ dˆ  ƒ S r²   ©r   r   ©Únr   r   rT   §  s    ztest_gh_8881.<locals>.fc                    s   t | dˆ  ˆ  ƒˆ  S r²   r
  r   r  r   r   Úfpª  s    ztest_gh_8881.<locals>.fpc                    s*   t | ddˆ   ˆ  ƒdˆ   dˆ   ˆ  S r÷   r
  r   r  r   r   Úfpp­  s    ztest_gh_8881.<locals>.fpprÚ   T)rh   rM   ©rh   ri   rM   N)r   rA   rÉ   )rT   r  r  r2   ÚrtrJ   r   r  r   Útest_gh_8881¢  s    
r  c            	   	   C   s¶   dd„ } dd„ }dd„ }t jdgt jd�}t| |||d	d
�\}}|jsJt‚t jddgt jd�}t t¡� t	j| |||d	d
�}W 5 Q R X dd„ }t	j| |||d	d
�}|j 
¡ s²t‚dS )z_
    Test that shape is preserved for array inputs even if fprime or fprime2 is
    scalar
    c                 S   s   | d S r!   r   r   r   r   r   rT   Á  s    z,test_gh_9608_preserve_array_shape.<locals>.fc                 S   s   d|  S r!   r   r   r   r   r   r  Ä  s    z-test_gh_9608_preserve_array_shape.<locals>.fpc                 S   s   dS r!   r   r   r   r   r   r  Ç  s    z.test_gh_9608_preserve_array_shape.<locals>.fppéþÿÿÿ©ZdtypeTr  éýÿÿÿc                 S   s   t jt  | ¡dt jd�S )Nr   r  )r:   r´   ÚshapeÚfloat32r   r   r   r   Ú	fpp_arrayÕ  s    z4test_gh_9608_preserve_array_shape.<locals>.fpp_arrayN)r:   r®   r  r   rA   rÉ   r¦   r§   Ú
IndexErrorr^   rÈ   )	rT   r  r  r2   r  rJ   Zx0_arrayr  r  r   r   r   Ú!test_gh_9608_preserve_array_shape¼  s0    
    ÿ    ÿr  z maximum_iterations,flag_expectedr¬   rö   c                 C   sp   t jdd„ ddddd| ddd	�	}|d
 j|ks2t‚|t jkrP|d
 j| kslt‚n|t jkrl|d
 j| k slt‚dS )z]
    Test that if the maximum iterations is exceeded that the flag is not
    converged.
    c                 S   s   d|  d |  d |  d S )Ng333333ó?gffffff@g333333@g      @r   r   r   r   r   r¸   ç  r¹   z6test_gh9254_flag_if_maxiter_exceeded.<locals>.<lambda>iâÿÿÿé   r   r›   TFrV   r   N)r^   rŠ   rï   rÉ   ÚCONVERRrÔ   Ú	CONVERGED)Zmaximum_iterationsZflag_expectedr  r   r   r   Ú$test_gh9254_flag_if_maxiter_exceededÞ  s           ý

r  c               	   C   sv   dd„ } dd„ }t ttj| d|dd� tjtdd	�� t | d|¡ W 5 Q R X t | td
d
ƒ|¡}t|tddƒƒ dS )zBTest that if disp is true then zero derivative raises RuntimeErrorc                 S   s   | |  d S )Nr   r   r   r   r   r   rT   ö  s    z/test_gh9551_raise_error_if_disp_true.<locals>.fc                 S   s   d|  S r!   r   r   r   r   r   Úf_pù  s    z1test_gh9551_raise_error_if_disp_true.<locals>.f_pr5   FrØ   zY^Derivative was zero\. Failed to converge after \d+ iterations, value is [+-]?\d*\.\d+\.$rÒ   g      $@r³   N)	r   rÆ   r^   r   r¦   r§   rÕ   r•   r	   )rT   r  r@   r   r   r   Ú$test_gh9551_raise_error_if_disp_trueó  s    þr  )@r¦   Úmathr   r   r   r   Ú	functoolsr   Znumpy.testingr   r   r	   r
   r   r   Únumpyr:   r   r   r   r   Zscipy.optimizer   r^   r   r   Zscipy._lib._utilr   ry   Zscipy.optimize._tstutilsr   r   r>   r   r?   r;   r<   rã   rN   r    r"   r%   r'   r)   r+   r,   r-   r.   ræ   ré   rë   rì   rô   rû   r  r	  r  r  ÚmarkZparametrizer  r  r  r  r   r   r   r   Ú<module>   sN    

    "0"þ
