o
    g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   ]/home/ubuntu/cloudmapper/venv/lib/python3.10/site-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   )f4f5f6)methodbracketx0xtolrtol      ?method %s, function %satolrA   err_msg)r   npr   floatepsziptstutils_functionststutils_fstringsr   rootr   	convergedr	   )selfname
smoothnesskwargsabr@   rA   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@   rA   full_outputrB   rC   rD   )r   
_FLOAT_EPSrJ   rK   rL   r   rN   r	   )rO   r=   rP   rS   rT   r@   rA   rU   rV   rX   rW   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rZ   r   rC   r6   )rF   )r6   r   rN   r	   )rO   r=   rP   rS   rT   rX   rW   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)rS   rT   funcTFrZ   disprM   argsr   r]   )	getappenddictupdate	ExceptionzerosRootResultsr   
_EVALUEERR)rO   tcr=   sig_args_keyssig_kwargs_keysrR   method_argskmethod_kwargsrM   	func_argsrW   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   rx   fprime)rx   fprime2tolr@   rA   c                    s*   g | ]}t j|fd  qS ))ro   rp   )listrv   ).0rn   )rR   r=   rO   ro   rp   r   r    
<listcomp>   s    z'TestBasic.run_tests.<locals>.<listcomp>c                 S   s   g | ]	}|d  j s|qS r   rN   r}   eltr   r   r    r~          c                    s    g | ]}|d  d  vr|qS r]   IDr   r   )
known_failr   r    r~      s     c                 S   s   g | ]}|d  d qS r   r   r   r   r   r    r~      s    r   r   r@   rA   c                 S   s   g | ]	}|d  j r|qS r   r   r   r   r   r    r~      r   c                 S   s   g | ]}|d  j qS r   rM   r   r   r   r    r~      s    c                 S   s   g | ]}|d  qS r   r   r   r   r   r    r~          c                    s<   g | ]\}}}t || d s|d d vr|g| qS ))rA   rE   r]   r   )r   )r}   rS   cr   )rE   r   rA   r   r    r~      s    c                 S   s,   g | ]\}}}}|d  |g|d R  qS )ra   re   r   )r}   arootr   fulloutrn   r   r   r    r~      s   , c                 S   s"   g | ]\}}|d kr|g| qS r   r   )r}   fvr   r   r   r    r~      s   " r   )_getfullargspecr   
kwonlyargslendefaultsre   rg   r
   r[   ri   rf   rJ   )rO   testsr=   rP   r@   rA   r   rR   sig	nDefaults	nRequiredresultsnotcvgdnotcvged_IDStolscvgdapproxcorrectnotclosefvsr   )rE   r   rR   r=   rA   rO   ro   rp   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.rQ   )r@   rA   r   N)r   r   )
rO   
collectionr=   rP   rQ   r   r@   rA   rR   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   )r\   rk   r   r_   rY   r   rO   r   r   r    test_bisect      
zTestBasic.test_bisectc                 C   r   )Nridderr   r   r   )r\   rk   r   r_   rY   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   +=rQ   r@   rA   )r\   rk   r   r_   rY   r   r   r   r   r    test_brentq   s   

zTestBasic.test_brentqc                 C   r   )Nbrenthr   r   r   r   )r\   rk   r   r_   rY   r   r   r   r   r    test_brenth   s   

zTestBasic.test_brenthc                 C   r   )Ntoms748r   r   r   )r\   rk   r   r_   rY   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   rQ   r   r   rk   r   rO   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   rx   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   ư>)r{   r   rE      )r`   r{   )ry   r{   )ry   rz   r{   )	r!   r%   r*   r0   r4   r5   rk   r   r	   )rO   ra   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?   ry   r@   r   r   N	r!   r%   r*   r0   r4   r5   r   r	   rM   rO   ra   r   r   rW   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()rw   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()rx   r9   r   )r=   r?   ry   rz   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 )	Nrw   r9   r   )r=   r?   r@   r   rx   )r=   ry   r?   r@   )r=   rz   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   rB   r   rG   r   r   rS   rT   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Ӎ@
   rB   g      @g&.>gMbp?gn2d?)
gԩ˰@g9~4b'@gaq(@g0p@gk"z?g4se?gU+F@gwQu%@gd6)@g)i!@)rz   re   N)rG   arrayr   rangerk   r   r	   )
rO   r!   r%   r*   a0a1re   r?   r   
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    ra   Y  r&   z.TestBasic.test_array_newton_complex.<locals>.fc                 S      dS NrB   r   r   r   r   r    ry   \     z3TestBasic.test_array_newton_complex.<locals>.fprimer   r   )ry           )rG   fullrk   r   r	   ones)rO   ra   ry   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   rS   r   r   r    <lambda>m  s    z=TestBasic.test_array_secant_active_zero_der.<locals>.<lambda>gˡE}@r         )r?   re   )f~@g      @N)rk   r   rG   r   r	   rO   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   )rk   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   Tr^   r   )r   RuntimeWarningrk   r   r   warnsr	   rM   zero_derallrN   any)rO   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?   ry   Tg:0yE>r   r   rx   )r=   r?   ry   rz   )r=   r?   rz   )r   r	   rM   r
   function_calls)rO   r!   r%   r*   r,   sol0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)r{   rZ   ry   rz   rd   Fr   r   )maxiterrd   z3Failed to converge after %d iterations, value is .*match)r   r%   r*   rk   r   r!   r   rN   r
   rM   
iterationsr   r   r   RuntimeError)
rO   r?   expected_countsderivsrR   rr   vr   rW   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rd   zDerivative was zeror  )r   r   rk   r   r   r   r  )rO   rb   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   )rG   r   copyr   r   r   r   )rO   r?   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   rB   gR@)r  )rk   r   r   r   r   r   r   r   r   	TypeErrorr!   )rO   r=   r   r   r    test_maxiter_int_check  s   z TestBasic.test_maxiter_int_checkr   )NN)'__name__
__module____qualname__rY   r\   r_   rv   r[   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    ra        ztest_gh_5555.<locals>.fg    חg    cAr   z	method %srD   )rk   r   r   TOLr	   r  )ra   methodsr@   rA   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    ra     s   ztest_gh_5557.<locals>.fgRQ?r   r   r   r   r  rE   rA   )r[   rk   r   r   r	   )ra   rE   rA   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>)rG   r   rk   r   r   r	   )underflow_scenariooverflow_scenariorS   rT   rM   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 )NrB   ,   .   r   )rM   r  r   flagzo      converged: True
           flag: 'converged'
 function_calls: 46
     iterations: 44
           root: 1.0)rk   rl   r
   repr)rO   rW   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    ra     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   rS   retvalsizer   r   r    r     s   
z test_complex_halley.<locals>.f_2rB   r)   )r)   g      @r   r   )re   ry   rz   r{   r   r   r   N)r   rk   r   r	   )ra   r   r   r   coeffsr   r   r   r    test_complex_halley  s   
	
r0  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   r1  NrB   r   r   r   r   r   r    r   C  r   F)r?   rd   r   r  c                 S   r1  r4  r   r   r   r   r    r   F  r   Tg.ЗK.c                 S      | d d S r4  r   r   r   r   r    r   J  r   r]   c                 S   r5  r4  r   r   r   r   r    r   M  r   )rG   r   rH   rI   r   filterr   rk   r   r	   r   r   r  )dx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@)rG   r   log10)darcy_frictionredia	roughnessr   r    colebrook_eqn]  s
   z1test_array_newton_failures.<locals>.colebrook_eqn){Gz?g?gvÖ?g333333?r   T)r?   r  re   rZ   NrB  )	r   r   r   rk   r   rN   r   r   r  )diameterrhomuureynolds_numberrA  resultr   r?  r    test_array_newton_failuresP  s(   
"rI  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   r2  r  r   c                 S   s   d| d  d|   S rJ  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?   ry   )r?   ry   rz   r8   N)rk   r   r	   _xtol_rtol)rK  rW   rL  rM  r   r   r    !test_gh8904_zeroder_at_root_failsr  s.   
rP  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    ra     s   ztest_gh_8881.<locals>.fc                    s   t | d      S r   rQ  r   rR  r   r    fp  r-   ztest_gh_8881.<locals>.fpc                    s*   t | dd     d   d     S r4  rQ  r   rR  r   r    fpp  s   *ztest_gh_8881.<locals>.fppr  T)ry   rZ   ry   rz   rZ   N)r   rN   )ra   rT  rU  r?   rtrW   r   rR  r    test_gh_8881  s   
rX  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    ra     r  z,test_gh_9608_preserve_array_shape.<locals>.fc                 S   r   r$   r   r   r   r   r    rT    r  z-test_gh_9608_preserve_array_shape.<locals>.fpc                 S   r   r$   r   r   r   r   r    rU    r   z.test_gh_9608_preserve_array_shape.<locals>.fppdtypeTrV  Nc                 S   s   t jt | dt jdS )Nr   rZ  )rG   r   shapefloat32r   r   r   r    	fpp_array  r,  z4test_gh_9608_preserve_array_shape.<locals>.fpp_array)
rG   r   r^  r   rN   r   r   
IndexErrorrk   r   )	ra   rT  rU  r?   rW  rW   x0_arrayrH  r_  r   r   r    !test_gh_9608_preserve_array_shape  s"   


rb  z maximum_iterations,flag_expectedr   r3  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   TFrc   r   N)rk   r   r(  CONVERRr  	CONVERGED)maximum_iterationsflag_expectedrH  r   r   r    $test_gh9254_flag_if_maxiter_exceeded  s   

rh  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    ra     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_prB   Fr  zY^Derivative was zero\. Failed to converge after \d+ iterations, value is [+-]?\d*\.\d+\.$r  Ng      $@r   )	r   r   rk   r   r   r   r  r   r	   )ra   ri  rM   r   r   r    $test_gh9551_raise_error_if_disp_true  s   rj  )@r   mathr   r   r   r   	functoolsr   numpy.testingr   r   r	   r
   r   r   numpyrG   r   r   r   r   scipy.optimizer   rk   r   r   scipy._lib._utilr   r   scipy.optimize._tstutilsr   r   rK   r   rL   rH   rI   r  r[   r!   r%   r*   r,   r0   r4   r5   r6   r7   r  r   r$  r%  r0  r:  rI  rP  rX  rb  markparametrizerd  re  rh  rj  r   r   r   r    <module>   sP     

    "0"
