U
    /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   C/tmp/pip-unpacked-wheel-9gxwnfpp/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 )	Nr   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@   	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 }pg 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 )zRun 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   rh   fprime)rh   fprime2tolr3   r4   c                    s*   g | ]"}t j|fd  qS ))ra   rb   )listrf   ).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   rm   eltr   r   r   rn      s     
 c                    s    g | ]}|d  d  kr|qS rP   IDr   rq   )
known_failr   r   rn      s      c                 S   s   g | ]}|d  d qS rs   r   rq   r   r   r   rn      s     r   r   r3   r4   c                 S   s   g | ]}|d  j r|qS ro   rp   rq   r   r   r   rn      s     
 c                 S   s   g | ]}|d  j qS ro   r@   rq   r   r   r   rn      s     c                 S   s   g | ]}|d  qS r   r   rq   r   r   r   rn      s     c                    s<   g | ]4\}}}t || d s|d d kr|g| qS ))r4   r8   rP   rt   )r   )rm   rF   crr   )r8   ru   r4   r   r   rn      s    c                 S   s*   g | ]"\}}}}|d  |f|d  qS )rT   rX   r   )rm   Zarootry   Zfulloutr`   r   r   r   rn      s    
 c                 S   s"   g | ]\}}|d kr|g| qS rx   r   )rm   Zfvrr   r   r   r   rn      s      )_getfullargspecr   
kwonlyargslendefaultsrX   rZ   r
   rN   r\   rY   r=   )rB   testsr1   rC   r3   r4   ru   rE   sigZ	nDefaultsZ	nRequiredresultsZnotcvgdZnotcvged_IDSZtolsZcvgdZapproxcorrectZnotcloseZfvsr   )r8   ru   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   ru   N)r   r   )
rB   
collectionr1   rC   rD   ru   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   ru   r   r^   r   rB   ru   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   rh   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   ư>)rk   r   r8      )rS   rk   )ri   rk   )ri   rj   rk   )	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   ri   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()rg   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()rh   r0   r   )r1   r2   ri   rj   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 )	Nrg   r0   r   )r1   r2   r3   r   rh   )r1   ri   r2   r3   )r1   rj   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~EO5@g$J ?g~5,@gXCڭ@gͮ9@@gӍ@
   r5   g      @g&.>gMbp?gn2d?)
gԩ˰@g9~4b'@gaq(@g0p@gk"z?g4se?gU+F@gwQu%@gd6)@g)i!@)rj   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   ri   \  s    z3TestBasic.test_array_newton_complex.<locals>.fprimer   r   )ri           )r:   fullr^   r   r	   Zones)rB   rT   ri   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   )gNO@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   ri   Tg:0yE>r   r   rh   )r1   r2   ri   rj   )r1   r2   rj   )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st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)rk   rM   ri   rj   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   rf   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   rw   r   r   rT     s    ztest_gh_5555.<locals>.fg    חg    cArv   z	method %sr7   )r^   r   r   TOLr	   r   )rT   methodsr3   r4   r1   resr   rw   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/   g333333?r   r   r   r   r   rT     s    ztest_gh_5557.<locals>.fgRQ?r   r   r   rv   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     ug      y)g     u@g      |@g      y@c                    s   t |   S r&   r   r   ry   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   ri   rj   rk   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dxZ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?gCl@c              	      s6   dt |  dt  d | d| t |     S )Nr   r   g@gGz@)r:   r   log10)Zdarcy_frictionreZdiaZ	roughnessr   r   colebrook_eqn]  s
    z1test_array_newton_failures.<locals>.colebrook_eqng{Gz?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   ri   )r2   ri   rj   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)ri   rM   ri   rj   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
 st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   Znumpyr:   r   r   r   r   Zscipy.optimizer   r^   r   r   Zscipy._lib._utilr   rz   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"
