o
    Eb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      | d d|   d S N       xr   r   A/usr/lib/python3/dist-packages/scipy/optimize/tests/test_zeros.pyf1      r!   c                 C      d|  d S Nr   r   r   r   r   r    f1_1       r%   c                 C      dd|   S N       @r   r   r   r   r   r    f1_2$   r&   r*   c                 C   s   t | t| t| fS N)r!   r%   r*   r   r   r   r    f1_and_p_and_pp(      r,   c                 C      t | t|  S r+   r   r   r   r   r   r    f2-      r0   c                 C      t | t|  S r+   r   r   r   r   r   r    f2_11   r1   r4   c                 C   r2   r+   r/   r   r   r   r    f2_25   r1   r5   c                 C   s   | S r+   r   r   r   r   r    f_lrucached:   s   r6   c                   @   s^  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 ]2\}}	|dkr(|	dv r(qt|f|||g|||d|}
|
j	}t
|
j t|d||d||	f d	 qd S )
N      ?   r   r   )Zf4Zf5Zf6)methodZbracketx0xtolrtol      ?method %s, function %satolr=   err_msg)r   npr   floatepsziptstutils_functionststutils_fstringsr   rootr   	convergedr	   )selfname
smoothnesskwargsabr<   r=   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\}	}
t|
j t|	d||d||f d qd S )	Nr8   r9   r   T)r<   r=   full_outputr>   r?   r@   )r   
_FLOAT_EPSrF   rG   rH   r   rJ   r	   )rK   r:   rL   rO   rP   r<   r=   rQ   rR   rT   rS   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rV   r   r?   r6   )rB   )r6   r   rJ   r	   )rK   r:   rL   rO   rP   rT   rS   r   r   r    run_check_lru_cached\   s   


zTestBasic.run_check_lru_cachedNc              
   K   s   g }|pg D ]}||vrdddd ||}|||  qtd
i |}|ddd |p0g D ]}|| ||< q1| d}	| d	d
}
z||d	|
i|\}}|	||fW S  tyk   |	ttddtj|f Y S w )Nr;   x1f)rO   rP   funcTFrV   disprI   argsr   rY   )	getappenddictupdate	ExceptionzerosRootResultsr   Z
_EVALUEERR)rK   tcr:   sig_args_keyssig_kwargs_keysrN   Zmethod_argskZmethod_kwargsrI   Z	func_argsrS   Z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v r:|dv r5d |dv r5d |d< n|d< d	< fd
d|D }pRg dd |D }fdd|D }dd |D }tt||gdg g dt dt d}|j	di  |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   ro   fprime)ro   fprime2tolr<   r=   c                    s*   g | ]}t j|fd  qS ))rj   rk   )listrm   ).0ri   )rN   r:   rK   rj   rk   r   r    
<listcomp>   s    z'TestBasic.run_tests.<locals>.<listcomp>c                 S   s   g | ]	}|d  j s|qS r   rJ   rt   eltr   r   r    ru          c                    s    g | ]}|d  d  vr|qS rY   IDr   rx   )
known_failr   r    ru      s     c                 S   s   g | ]}|d  d qS r{   r   rx   r   r   r    ru      s    r   r   r<   r=   c                 S   s   g | ]	}|d  j r|qS rv   rw   rx   r   r   r    ru      rz   c                 S   s   g | ]}|d  j qS rv   rI   rx   r   r   r    ru      s    c                 S   s   g | ]}|d  qS r   r   rx   r   r   r    ru          c                    s<   g | ]\}}}t || d s|d d vr|g| qS ))r=   rA   rY   r|   )r   )rt   rO   cry   )rA   r}   r=   r   r    ru      s
    c                 S   s,   g | ]\}}}}|d  |g|d R  qS )r]   ra   r   )rt   Zarootr   Zfulloutri   r   r   r    ru      s   , c                 S   s"   g | ]\}}|d kr|g| qS r   r   )rt   Zfvry   r   r   r    ru      s   " r   )_getfullargspecr   
kwonlyargslendefaultsra   rc   r
   rW   re   rb   rF   )rK   testsr:   rL   r<   r=   r}   rN   ZsigZ	nDefaultsZ	nRequiredresultsZnotcvgdZnotcvged_IDSZtolsZcvgdZapproxZcorrectZnotcloseZfvsr   )rA   r}   rN   r:   r=   rK   rj   rk   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.rM   )r<   r=   r}   N)r   r   )
rK   
collectionr:   rL   rM   r}   r<   r=   rN   r   r   r   r    run_collection   s   
zTestBasic.run_collectionc                 C   >   |  tjd | tjd | d | jdtjddd d S )Nbisectapsr   r   )rX   rg   r   r[   rU   r   rK   r   r   r    test_bisect      
zTestBasic.test_bisectc                 C   r   )Nridderr   r   r   )rX   rg   r   r[   rU   r   r   r   r   r    test_ridder   r   zTestBasic.test_ridderc                 C   B   |  tjd | tjd | d | jdtjddddd d S )Nbrentqr   r   +=rM   r<   r=   )rX   rg   r   r[   rU   r   r   r   r   r    test_brentq   s   

zTestBasic.test_brentqc                 C   r   )Nbrenthr   r   r   r   )rX   rg   r   r[   rU   r   r   r   r   r    test_brenth   s   

zTestBasic.test_brenthc                 C   r   )Ntoms748r   r   r   )rX   rg   r   r[   rU   r   r   r   r   r    test_toms748   r   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   rM   r}   r   rg   r   rK   r}   r   r   r   r    test_newton_collections   s   z!TestBasic.test_newton_collectionsc                 C   s,   g d}dD ]}| j |tjdd|d qd S )N)z	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   ro   r   r   r   r   r   r   r    test_halley_collections   s   z!TestBasic.test_halley_collectionsc                 C   r   r   r   r   r   r   r    r!      s   zTestBasic.f1c                 C   r#   r$   r   r   r   r   r    r%         zTestBasic.f1_1c                 C   r'   r(   r   r   r   r   r    r*      r   zTestBasic.f1_2c                 C   r.   r+   r/   r   r   r   r    r0         zTestBasic.f2c                 C   r2   r+   r3   r   r   r   r    r4      r   zTestBasic.f2_1c                 C   r2   r+   r/   r   r   r   r    r5     r   zTestBasic.f2_2c                 C   s   | j | j| jf| j| j| jffD ]M\}}}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 )
Nr9   ư>)rr   r   rA      )r\   rr   )rp   rr   )rp   rq   rr   )	r!   r%   r*   r0   r4   r5   rg   r   r	   )rK   r]   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 ]\}}}t|dd|dd}t||jddd q
dS )z#Invoke newton through root_scalar()r   r9   r   )r:   r;   rp   r<   r   r   N	r!   r%   r*   r0   r4   r5   r   r	   rI   rK   r]   r   r   rS   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 ]+\}}}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()rn   r9   r   r   )r:   r;   r\   r<   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 ]\}}}t|dd||dd}t||jddd q
dS )z#Invoke halley through root_scalar()ro   r9   r   )r:   r;   rp   rq   r<   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 d    n1 sw   Y  t t ttdddd W d    n1 s5w   Y  t t ttdtddd W d    n1 sSw   Y  t t ttdtddd W d    d S 1 srw   Y  d S )	Nrn   r9   r   )r:   r;   r<   r   ro   )r:   rp   r;   r<   )r:   rq   r;   r<   )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 g d}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   r9   r   r   r   r>   r   rC   r   r   rO   rP   r   r   r    r!   4  s   6z'TestBasic.test_array_newton.<locals>.f1c                 W   sP   |d |d  }|d  t |d |d  | |   | |d |d   d S )Nr9   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 )Nr9   r   r   r   r   r   r   r   r    r*   <  s   0z)TestBasic.test_array_newton.<locals>.f1_2)
g4O@gNk@g]0J@g]Qݚt@g~EO5@g$J ?g~5,@gXCڭ@gͮ9@@gӍ@
   r>   g      @g&.>gMbp?gn2d?)
gԩ˰@g9~4b'@gaq(@g0p@gk"z?g4se?gU+F@gwQu%@gd6)@g)i!@)rq   ra   N)rC   arrayr   rangerg   r   r	   )
rK   r!   r%   r*   Za0Za1ra   r;   r   Z
x_expectedr   r   r    test_array_newton1  s   


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    r]   Y  r&   z.TestBasic.test_array_newton_complex.<locals>.fc                 S      dS Nr>   r   r   r   r   r    rp   \     z3TestBasic.test_array_newton_complex.<locals>.fprimer   r   )rp           )rC   fullrg   r   r	   Zones)rK   r]   rp   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   rO   r   r   r    <lambda>m  s    z=TestBasic.test_array_secant_active_zero_der.<locals>.<lambda>gˡE}@r         )r;   ra   )f~@g      @N)rg   r   rC   r   r	   rK   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      || d  S r$   r   yzr   r   r    r   s      z6TestBasic.test_array_newton_integers.<locals>.<lambda>      @r   g      .@g      1@r   )gNO@r   c                 S   r   r$   r   r   r   r   r    r   w  r   r      r   )rg   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, tjdd ddgdd dd}t|jd	 |j	 s1J |j
 r8J W d    d S 1 sCw   Y  d S )
Nc                 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      d|  S r$   r   r   r   r   r    r   }      c                 S   r   r$   r   r   r   r   r    r     r   c                 S   r   r$   r   r   r   r   r    r     r   TrZ   r   )r   RuntimeWarningrg   r   r   warnsr	   rI   Zzero_derallrJ   any)rK   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   r   r   r   r   r   r   r    r     r   z0TestBasic.test_newton_combined.<locals>.<lambda>c                 S   r#   r$   r   r   r   r   r    r     r   c                 S   r'   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   r9   )r:   r;   rp   Tg:0yE>r   r   ro   )r:   r;   rp   rq   )r:   r;   rq   )r   r	   rI   r
   function_calls)rK   r!   r%   r*   r,   Zsol0Zsolr   r   r    test_newton_combined  s   zTestBasic.test_newton_combinedc           
   	   C   s|  d}g d}t dD ]}ddd}d| jgd| jggd | D ]\}}|||< qtj| j|fdd	i|\}}t|j t||j	 t|j
|jf||  |d
kr\|j|j
d ks[J nt|j|d |j
  |j
d }	tj| j|f|	d	d|\}}t|j  t||j	 t|j
|	 |dkrtjtd|	 d tj| j|f|	dd|\}}W d    n1 sw   Y  q
d S )Nr9   ))      )r   r   )r9   	   r   T)rr   rV   rp   rq   r`   Fr   r   )maxiterr`   z3Failed to converge after %d iterations, value is .*match)r   r%   r*   rg   r   r!   r   rJ   r
   rI   
iterationsr   r   r   RuntimeError)
rK   r;   Zexpected_countsZderivsrN   rl   vr   rS   Zitersr   r   r    test_newton_full_output  s6   
$


 "z!TestBasic.test_newton_full_outputc                 C   sh   dd }dd }t ttj|d|dd tjtdd t|d| W d    d S 1 s-w   Y  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   r   r$   r   r   r   r   r    r     r   r   Fr`   zDerivative was zeror   )r   r   rg   r   r   r   r   )rK   r^   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皙?r9   )rC   r   copyr   r   r   r   )rK   r;   Zx0_copyr   r   r    test_newton_does_not_modify_x0  s   z(TestBasic.test_newton_does_not_modify_x0c              	   C   sd   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 d    n1 s*w   Y  qd S )Nz2'float' object cannot be interpreted as an integerr   r   r>   gR@)r   )rg   r   r   r   r   r   r   r   r   	TypeErrorr!   )rK   r:   r   r   r    test_maxiter_int_check  s   z TestBasic.test_maxiter_int_checkr   )NN)'__name__
__module____qualname__rU   rX   r[   rm   rW   r   r   r   r   r   r   r   r   r   staticmethodr!   r%   r*   r0   r4   r5   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r7   ?   s`    
	

6
	






'	%r7   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   r   r   r    r]        ztest_gh_5555.<locals>.fg    חg    cAr~   z	method %sr@   )rg   r   r   TOLr	   r   )r]   methodsr<   r=   r:   resr   r   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 )Nr8   g333333?r   r   r   r   r    r]     s   ztest_gh_5557.<locals>.fgRQ?r   r   r   r~   r   rA   r=   )rW   rg   r   r   r	   )r]   rA   r=   r   r:   r   r   r   r    test_gh_5557  s   
r   c                     sZ   d} d}| |fD ]"\}}}t | tjtjfD ]}| fdd||}t|| qqd S )N)g      |g     ug      y)g     u@g      |@g      y@c                    s   t |   S r+   r   r   r   r   r    r     s    z9test_brent_underflow_in_root_bracketing.<locals>.<lambda>)rC   r   rg   r   r   r	   )Zunderflow_scenarioZoverflow_scenariorO   rP   rI   r:   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 )Nr>   ,   .   r   )rI   r   r   flagzo      converged: True
           flag: 'converged'
 function_calls: 46
     iterations: 44
           root: 1.0)rg   rh   r
   repr)rK   rS   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| |g|R  dd
d |gd }d	}tj| ||||d
d}t| |g|R  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    r]     s   $ztest_complex_halley.<locals>.fc                 W   s   d|d  |  |d  S )Nr   r   r   r   r   r   r   r    r        z test_complex_halley.<locals>.f_1c                 W   s:   d|d  }zt | }W n ty   | Y S w |g| S )Nr   r   )r   r   )r   rO   Zretvalsizer   r   r    r     s   
z test_complex_halley.<locals>.f_2r>   r)   )r)   g      @r   r   )ra   rp   rq   rr   r   r   r   N)r   rg   r   r	   )r]   r   r   r   Zcoeffsr   r   r   r    test_complex_halley  s   
	
r  c                  C   s  t tjd } d|  d|   }t }|td tjdd |gd d}W d	   n1 s0w   Y  t	|d
gd  d}t }|td tjdd |dd}W d	   n1 s]w   Y  t	|d t
jtdd tjdd |dd}W d	   n1 sw   Y  d}t }|td tjdd |dd}W d	   n1 sw   Y  t	|d t
jtdd tjdd |dd}W d	   d	S 1 sw   Y  d	S )zBTest secant method with a non-zero dp, but an infinite newton stepgQ?g      i@r)   zRMS ofc                 S      | d d S )Ng      Y@r   r   r   r   r   r    r   =  r   z%test_zero_der_nz_dp.<locals>.<lambda>r   r;   Nd   g.ЗK.?zTolerance ofc                 S   r	  Nr>   r   r   r   r   r   r    r   C  r   F)r;   r`   r   r   c                 S   r	  r  r   r   r   r   r    r   F  r   Tg.ЗK.c                 S      | d d S r  r   r   r   r   r    r   J  r   rY   c                 S   r  r  r   r   r   r   r    r   M  r   )rC   r   rD   rE   r   filterr   rg   r   r	   r   r   r   )ZdxZp0supr   r   r   r    test_zero_der_nz_dp0  s2   

"r  c                     s   d} d d}d}d}|| |  | } fdd}t t tj|g dd	|| gd
d}|j r3J W d   n1 s=w   Y  t t tj|dgd	 d	|| gd
d}W d   dS 1 sbw   Y  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@)rC   r   Zlog10)Zdarcy_frictionreZdiaZ	roughnessr   r    colebrook_eqn]  s
   z1test_array_newton_failures.<locals>.colebrook_eqn){Gz?g?gvÖ?g333333?r   T)r;   r   ra   rV   Nr  )	r   r   r   rg   r   rJ   r   r   r   )ZdiameterZrhoZmuuZreynolds_numberr  resultr   r  r    test_array_newton_failuresP  s(   
"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 Nr9   r   r   r   r   r   r    f_zeroder_rootv  r1   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  r"   z/test_gh8904_zeroder_at_root_fails.<locals>.fderc                 S   s   d|  d S )Nr   r   r   r   r   r   r    fder2  r&   z0test_gh8904_zeroder_at_root_fails.<locals>.fder2)r;   rp   )r;   rp   rq   r8   N)rg   r   r	   Z_xtolZ_rtol)r  rS   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s%J t | |||d	d\}}|js5J 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    r]     s   ztest_gh_8881.<locals>.fc                    s   t | d      S r   r  r   r  r   r    fp  r-   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)rp   rV   rp   rq   rV   N)r   rJ   )r]   r   r!  r;   rtrS   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s%J t jddgt jd}tt tj| |||d	d
}W d   n1 sIw   Y  dd }tj| |||d	d
}|j	 scJ 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    r]     r   z,test_gh_9608_preserve_array_shape.<locals>.fc                 S   r   r$   r   r   r   r   r    r     r   z-test_gh_9608_preserve_array_shape.<locals>.fpc                 S   r   r$   r   r   r   r   r    r!    r   z.test_gh_9608_preserve_array_shape.<locals>.fppZdtypeTr"  Nc                 S   s   t jt | dt jdS )Nr   r&  )rC   r   shapefloat32r   r   r   r    	fpp_array  r  z4test_gh_9608_preserve_array_shape.<locals>.fpp_array)
rC   r   r)  r   rJ   r   r   
IndexErrorrg   r   )	r]   r   r!  r;   r#  rS   Zx0_arrayr  r*  r   r   r    !test_gh_9608_preserve_array_shape  s"   


r,  z maximum_iterations,flag_expectedr   r  c                 C   sv   t jdd ddddd| ddd		}|d
 j|ksJ |t jkr)|d
 j| ks'J dS |t jkr7|d
 j| k s9J dS 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     s    z6test_gh9254_flag_if_maxiter_exceeded.<locals>.<lambda>i   r   r   TFr_   r   N)rg   r   r  CONVERRr   	CONVERGED)Zmaximum_iterationsZflag_expectedr  r   r   r    $test_gh9254_flag_if_maxiter_exceeded  s   

r0  c                  C   s   dd } dd }t ttj| d|dd tjtdd	 t| d| W d
   n1 s,w   Y  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    r]     r&   z/test_gh9551_raise_error_if_disp_true.<locals>.fc                 S   r   r$   r   r   r   r   r    f_p  r   z1test_gh9551_raise_error_if_disp_true.<locals>.f_pr>   Fr   zY^Derivative was zero\. Failed to converge after \d+ iterations, value is [+-]?\d*\.\d+\.$r   Ng      $@r   )	r   r   rg   r   r   r   r   r   r	   )r]   r1  rI   r   r   r    $test_gh9551_raise_error_if_disp_true  s   r2  )@r   Zmathr   r   r   r   	functoolsr   Znumpy.testingr   r   r	   r
   r   r   ZnumpyrC   r   r   r   r   Zscipy.optimizer   rg   r   r   Zscipy._lib._utilr   r   Zscipy.optimize._tstutilsr   r   rG   r   rH   rD   rE   r   rW   r!   r%   r*   r,   r0   r4   r5   r6   r7   r   r   r   r   r  r  r  r  r$  r,  ZmarkZparametrizer.  r/  r0  r2  r   r   r   r    <module>   sP     

    "0"
