U
    /djz                     @   s   d dl Z d dlmZ d dl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 dlmZmZmZmZmZmZ dd Zd	d
 ZG dd dZG dd dZG dd dZG dd dZdd Zdd ZdS )    N)product)assert_allcloseassert_equalassert_)raises)
csr_matrix
csc_matrix
lil_matrix)_adjust_scheme_to_boundsapprox_derivativecheck_derivativegroup_columns_eps_for_method_compute_absolute_stepc                  C   s  ddddddgddddddgddddddgddddddgddddddgddddddgddddddgg} t jtttfD ]z}|| }t d}t ddddddg}t||}t|| ddddddg}t ddddddg}t||}t|| qtt|}t|}t|| d S )N   r                  )	npasarrayr   r   r	   arangearrayr   r   )	structureZ	transformAorderZgroups_truegroupsgroups_1groups_2 r    F/tmp/pip-unpacked-wheel-9gxwnfpp/scipy/optimize/tests/test__numdiff.pytest_group_columns   s*    	



r"   c                  C   s   t t jj} | d | d | d d}dD ]8}ttt jt j|||  ttt jt j|||  q*t t jj} | d | d | d d}dD ]R}ttt jt j|||  ttt jt j|||  ttt jt j|||  qd S )N      ?UUUUUU?2-point3-pointcs)r   finfofloat64epsr   r   Z
complex128float32)EPSrelative_stepmethodr    r    r!   test_correct_fp_eps+   s@    r0   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestAdjustSchemeToBoundsc                 C   s  t d}t dd}t |}t |}|t j  |t j t||dd||\}}t|| tt 	| t||dd||\}}t|| tt 	| t||dd||\}}t|| tt 	|  t||dd||\}}t|| tt 	|  d S )Nr   {Gz?r   1-sidedr   2-sided)
r   zerosfullZ
empty_likefillinfr
   r   r   all)selfx0hZ	inf_lowerZ	inf_upper
h_adjusted	one_sidedr    r    r!   test_no_boundsP   s\    


     
     
     
     
z'TestAdjustSchemeToBounds.test_no_boundsc                 C   s
  t dddg}t d }t d}t dddgd }t||dd||\}}t|| t||d	d||\}}t|t dddgd  t||dd
||\}}t|t | tt |  t||d	d
||\}}t|t dddgd  t|t dddg d S )N        g333333?g333333r   r   皙?r3   r   r4   FT)	r   r   onesr
   r   absr   r9   r   )r:   r;   lbubr<   r=   _r>   r    r    r!   test_with_boundl   s8    

          z(TestAdjustSchemeToBounds.test_with_boundc                 C   s  t ddg}t ddg}t ddg}t ddg}t||dd||\}}t|t ddg t||d	d||\}}t|t d
dg t||dd||\}}t|t ddg t|t ddg t||d	d||\}}t|t ddg t|t ddg d S )NgQg?r@   gQ?皙r   r3   gQr   g?r4   FTgQ?gQ)r   r   r
   r   r   )r:   rE   rF   r;   r<   r=   rG   r>   r    r    r!   test_tight_bounds   s8              z*TestAdjustSchemeToBounds.test_tight_boundsN)__name__
__module____qualname__r?   rH   rJ   r    r    r    r!   r1   O   s   r1   c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdFddZdGddZdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Z d?d@ Z!dAdB Z"dCdD Z#dES )HTestApproxDerivativesDensec                 C   s
   t |S Nr   sinhr:   xr    r    r!   fun_scalar_scalar   s    z,TestApproxDerivativesDense.fun_scalar_scalarc                 C   s
   t |S rO   r   coshrR   r    r    r!   jac_scalar_scalar   s    z,TestApproxDerivativesDense.jac_scalar_scalarc                 C   s,   t |d d t |d t |d gS Nr   r   r   r   tanexprR   r    r    r!   fun_scalar_vector   s    z,TestApproxDerivativesDense.fun_scalar_vectorc                 C   s8   t d|d  t |d d t |d gddS Nr   r   rA   r   r   r   cosr[   ZreshaperR   r    r    r!   jac_scalar_vector   s    ( z,TestApproxDerivativesDense.jac_scalar_vectorc                 C   s$   t |d |d  t |d  S Nr   r   r   sinlogrR   r    r    r!   fun_vector_scalar   s    z,TestApproxDerivativesDense.fun_vector_scalarc                 C   s    t |d t |t |gS Nr   rY   rR   r    r    r!   wrong_dimensions_fun   s    z/TestApproxDerivativesDense.wrong_dimensions_func              	   C   s|   t |d t |d |d   t |d  t |d |d  |d   |d t |d |d   t |d  gS Nr   r   r   r   r`   re   rd   rR   r    r    r!   jac_vector_scalar   s    **z,TestApproxDerivativesDense.jac_vector_scalarc                 C   sH   t |d t |d  |d t |d  |d d |d d  gS Nr   r   r         ࿩r   r   rd   r`   rR   r    r    r!   fun_vector_vector   s
    z,TestApproxDerivativesDense.fun_vector_vectorc                 C   s   t t |d |d t |d  g|d  t |d  t |d gd|d d  |d d  d|d d  |d d  ggS Nr   r   r   r   rm   g      rn   rR   r    r    r!   jac_vector_vector   s
    "$6z,TestApproxDerivativesDense.jac_vector_vector      ?c                 C   s*   t t ||d  t ||d  gS rb   r   r   r[   r:   rS   c0c1r    r    r!   fun_parametrized   s    z+TestApproxDerivativesDense.fun_parametrizedrB   c              
   C   s:   t |t ||d   dgd|t ||d   ggS rb   rs   rt   r    r    r!   jac_parametrized   s    z+TestApproxDerivativesDense.jac_parametrizedc                 C   s   t |dkr|S t jS )N:0yE>r   rD   nanrR   r    r    r!   fun_with_nan   s    z'TestApproxDerivativesDense.fun_with_nanc                 C   s   t |dkrdS t jS )Nry   rr   rz   rR   r    r    r!   jac_with_nan   s    z'TestApproxDerivativesDense.jac_with_nanc                 C   s,   t |d |d  t |d |d  gS rb   )r   r   r`   rR   r    r    r!   fun_zero_jacobian   s    z,TestApproxDerivativesDense.fun_zero_jacobianc              
   C   sV   t |d |d g|d  t |d |d   |d  t |d |d   ggS ri   )r   r   rd   rR   r    r    r!   jac_zero_jacobian   s    >z,TestApproxDerivativesDense.jac_zero_jacobianc                 C   s
   t |S rO   )mathr[   rR   r    r    r!   fun_non_numpy   s    z(TestApproxDerivativesDense.fun_non_numpyc                 C   s   t | }t|S rO   )r   r   itemr   r[   )r:   rS   Zxpr    r    r!   jac_non_numpy   s    z(TestApproxDerivativesDense.jac_non_numpyc                 C   sh   d}t | j|dd}t | j|}t | j|dd}| |}t||dd t||dd t||dd d S )	Nrr   r&   r/   r(   ư>rtol&.>-q=r   rT   rW   r   r:   r;   
jac_diff_2
jac_diff_3
jac_diff_4jac_truer    r    r!   test_scalar_scalar   s    
z-TestApproxDerivativesDense.test_scalar_scalarc                 C   sp   d}t | j|ddd}t | j|dd}t | j|ddd}| |}t||dd t||d	d t||d
d d S )Nrr   r&   "\O>r/   abs_step)r   r(   r   r   r   r   r   r   r    r    r!   test_scalar_scalar_abs_step   s       
z6TestApproxDerivativesDense.test_scalar_scalar_abs_stepc                 C   sn   d}t | j|dd}t | j|}t | j|dd}| t|}t||dd t||dd t||dd d S )	Nr#   r&   r   r(   r   r   r   r   )r   r\   ra   r   
atleast_1dr   r   r    r    r!   test_scalar_vector   s    z-TestApproxDerivativesDense.test_scalar_vectorc                 C   sr   t ddg}t| j|dd}t| j|}t| j|dd}| |}t||dd t||dd t||d	d d S )
N      Y@rm   r&   r   r(   r   r   Hz>r   )r   r   r   rf   rk   r   r   r    r    r!   test_vector_scalar	  s    
z-TestApproxDerivativesDense.test_vector_scalarc                 C   s~   t ddg}t| j|ddd}t| j|dt jd}t| j|ddd}| |}t||dd	 t||d
d	 t||dd	 d S )Nr   rm   r&   r   r   )r   rel_stepr(   r   r   A:)>r   )r   r   r   rf   r8   rk   r   r   r    r    r!   test_vector_scalar_abs_step  s"       
z6TestApproxDerivativesDense.test_vector_scalar_abs_stepc                 C   sr   t ddg}t| j|dd}t| j|}t| j|dd}| |}t||dd t||dd t||d	d d S )
N      Y皙?r&   r   r(   h㈵>r   r   r   r   r   r   ro   rq   r   r   r    r    r!   test_vector_vector#  s    
z-TestApproxDerivativesDense.test_vector_vectorc                 C   s<   d}t tt| j| | t|}t tt| j||d d S )Nrr   )f0)assert_raisesRuntimeErrorr   rh   r   r   
ValueError)r:   r;   r   r    r    r!   test_wrong_dimensions/  s       z0TestApproxDerivativesDense.test_wrong_dimensionsc                 C   sZ   t ddg}t| j|ddd}t| j|dd}| |}t||dd t||dd d S )	NrI   rB   r&   g-C6?)r/   r   )r   r2   r   r   )r:   r;   r   r   r   r    r    r!   test_custom_rel_step7  s     
z/TestApproxDerivativesDense.test_custom_rel_stepc              
   C   s   t ddg}d}d}d}d}| j|||d}t ddg}| |||}t| j|d|||ft|d||fd	}	t| j||||ft|d||fd
}
t|	|dd t|
|dd d S )Nrr         r@          @)rv   gưr   r&   )r/   r   r   argskwargsbounds)r   r   r   r   r   r   r   r   )r   r   rw   rx   r   dictr   )r:   r;   ru   rv   rE   rF   r   r   r   r   r   r    r    r!   test_optionsA  s:               z'TestApproxDerivativesDense.test_optionsc                 C   s|   t d }t d}t ddg}ttt| j|||fd t ddg}t| j|d||fd}| |}t||d	d
 d S )Nr   g       r   r   r   rr   r&   r/   r   r   r   )	r   rC   r   r   r   r   ro   rq   r   )r:   rE   rF   r;   jac_diffr   r    r    r!   test_with_bounds_2_pointS  s    
   
z3TestApproxDerivativesDense.test_with_bounds_2_pointc                 C   s   t ddg}t ddg}t ddg}| |}t| j|}t||dd t| j||t jfd}t||dd t| j|t j |fd}t||dd t| j|||fd}t||dd d S )Nrr   r   r   r   r   )r   r   rq   r   ro   r   r8   )r:   rE   rF   r;   r   r   r    r    r!   test_with_bounds_3_pointa  s$    

z3TestApproxDerivativesDense.test_with_bounds_3_pointc                 C   s   t ddg}|d }|d }| |}t| j|d||fd}t||dd t| j|dd||fd}t||dd t| j|||fd	}t||dd t| j|d||fd
}t||dd d S )Ng      $@r   g&.!>r&   r   r   r   r/   r   r   r   r   r   )r   r   rq   r   ro   r   )r:   r;   rE   rF   r   r   r    r    r!   rJ   w  s@    
           z,TestApproxDerivativesDense.test_tight_boundsc                 C   s   d}d}d}|  |}t| j|dd||fd}t| j|d||fd}t||dd t||d	d d}|  |}t| j|dd||fd}t| j|d||fd}t||dd t||d	d d S )
N:0yEry   r@   r&   r   r   r   r   r   )r}   r   r|   r   )r:   rE   rF   r;   r   r   r   r    r    r!   test_bound_switches  sH    
      
      z.TestApproxDerivativesDense.test_bound_switchesc                 C   sd   d}|  |}t| j |dd}t| j |}t||dd t||dd ttt| j |ftdd d S )Nrr   r&   r   r   r   ry   r(   )r   r   r   r   	TypeErrorr   )r:   r;   r   r   r   r    r    r!   test_non_numpy  s    
z)TestApproxDerivativesDense.test_non_numpyc                    s  t jd dd fdd t jdddt jdt jdt jt d	d	g}t |d
fd}t |t jd
fd} |j	t jkst
t||dd  fdd}t||d
d}||j	t jkst
t||dd dd }dd }dd }dd }t jt jt jfD ]n}	t |	j}
t d|	}td |||d
}||||||
}t||d
|d||  t |k st
qd S )Nr   c                 S   s   | d | d |  S rb   r    )prS   r    r    r!   func  s    z0TestApproxDerivativesDense.test_fp.<locals>.funcc                    s    | || S rO   r    )r   rS   y)r   r    r!   err  s    z/TestApproxDerivativesDense.test_fp.<locals>.errr   d   dtyper   r&   )r/   r   gMbP?)atolc                    s    |  tjS rO   )astyper   r,   )r   )r   rS   r   r    r!   <lambda>      z4TestApproxDerivativesDense.test_fp.<locals>.<lambda>r   c                 S   s
   t | S rO   r   rd   rS   r    r    r!   r     r   c                 S   s
   t | S rO   )r   r`   r   r    r    r!   r     r   c                 S   s   t |  S rO   r   r   r    r    r!   r     r   c                 S   s\   | d t t||t|||   }||  t t||t|||   }|| S rg   )maxr   rD   )r<   r;   fhessr-   t0t1r    r    r!   	calc_atol  s    **z5TestApproxDerivativesDense.test_fp.<locals>.calc_atolrr   r   )r   randomseedZlinspacer*   r   r   r   r,   r   AssertionErrorr   Zfloat16r)   r+   r   rD   )r:   Zp0Zjac_fp64Zjac_fpZerr_fp32r   gr   r   r   r-   r;   r<   r   r    )r   r   rS   r   r!   test_fp  sD     	z"TestApproxDerivativesDense.test_fpc                 C   s   t ddg}t| j| j|}t|dk  t| j| j|}t|dk  t ddg}t| j| j|}t|dk t| j| j|}t|dk d S )Ng      $
   r   r   r@   r   )r   r   r   ro   rq   r   r~   r   )r:   r;   accuracyr    r    r!   test_check_derivative  s,        z0TestApproxDerivativesDense.test_check_derivativeN)rr   )rB   )$rK   rL   rM   rT   rW   r\   ra   rf   rh   rk   ro   rq   rw   rx   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   r   r   r   r   r    r    r    r!   rN      sB   


5rN   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )TestApproxDerivativeSparsec                 C   s   t jd d| _ddt | j  | _ddt | j  | _t | j| _d| jd d d  | jd d d< d| jdd d  | jdd d< | 	| j| _
d S )Nr   2   rI   r   rB   gP?r   )r   r   r   nr   rE   rF   emptyr;   jacJ_truer:   r    r    r!   setup_method  s      z'TestApproxDerivativeSparse.setup_methodc                 C   sD   |dd  d |d d d  }t dd| ft d| df S )Nr   r   rA   r   r   )r   Zhstack)r:   rS   er    r    r!   fun  s     zTestApproxDerivativeSparse.func                 C   s   |j }t||f}d|d  |d< d|d d  |d< td|d D ]d}d||d   |||d f< d	|| d  d
||   |||f< d||d  d  |||d f< qFd	|d d  |d< d|d  |d< |S )Nr   r   r   r   r   r   r   r   i	   r   rA   rA   rA   r^   rA   r^   )sizer   r5   range)r:   rS   r   Jir    r    r!   r     s    $"zTestApproxDerivativeSparse.jacc                 C   sb   t j||ftd}d|d< d|d< td|d D ]}d|||d |d f< q0d|d< d|d< |S )Nr   r   r   r   r   r   r   )r   r5   intr   )r:   r   r   r   r    r    r!   r     s    z$TestApproxDerivativeSparse.structurec                 C   s  |  | j}t| j}t||}tj| t||}tdddg||gtj | j	gtj| j
gD ]\}}}}t| j| j|||f||fd}	tt|	t t|	 | jdd t| jd}
|
d d d  d	9  < t| j| j||
||fd
}	t|	 | jdd qbd S )Nr&   r'   r(   )r/   r   sparsityr   r   ry   r   rA   )r/   r   r   r   )r   r   r   r   r   r   shuffler   r8   rE   rF   r   r   r;   r   
isinstancer   r   toarrayr   Z	full_like)r:   r   r   r   r   r/   r   lur   r   r    r    r!   test_all   s0    

  
  z#TestApproxDerivativeSparse.test_allc                 C   s6   |  | j}t| j| j|d}t| | jdd d S )N)r   r   r   )r   r   r   r   r;   r   r   r   )r:   r   r   r    r    r!   test_no_precomputed_groups5  s    z5TestApproxDerivativeSparse.test_no_precomputed_groupsc                 C   sn   t j| j| jftd}t | j}dD ]B}t| j| j|d}t| j| j||f|d}t||	 ddd q&d S )Nr   r%   r   )r   r/   gV瞯<gVs<)r   r   )
r   rC   r   r   r   r   r   r;   r   r   )r:   r   r   r/   ZJ_denseZJ_sparser    r    r!   test_equivalence:  s       
 z+TestApproxDerivativeSparse.test_equivalencec                    s`    fdd}t  j| j j jfd}t|dk  t  j| j j jfd}t|dk  d S )Nc                    s   t  | S rO   )r   r   r   r   r    r!   r   E  s    z=TestApproxDerivativeSparse.test_check_derivative.<locals>.jacr   r   )r   r   r;   rE   rF   r   )r:   r   r   r    r   r!   r   D  s    

z0TestApproxDerivativeSparse.test_check_derivativeN)rK   rL   rM   r   r   r   r   r   r   r   r   r    r    r    r!   r     s   
r   c                   @   st   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )"TestApproxDerivativeLinearOperatorc                 C   s
   t |S rO   rP   rR   r    r    r!   rT   S  s    z4TestApproxDerivativeLinearOperator.fun_scalar_scalarc                 C   s
   t |S rO   rU   rR   r    r    r!   rW   V  s    z4TestApproxDerivativeLinearOperator.jac_scalar_scalarc                 C   s,   t |d d t |d t |d gS rX   rY   rR   r    r    r!   r\   Y  s    z4TestApproxDerivativeLinearOperator.fun_scalar_vectorc                 C   s8   t d|d  t |d d t |d gddS r]   r_   rR   r    r    r!   ra   \  s    ( z4TestApproxDerivativeLinearOperator.jac_scalar_vectorc                 C   s$   t |d |d  t |d  S rb   rc   rR   r    r    r!   rf   `  s    z4TestApproxDerivativeLinearOperator.fun_vector_scalarc              	   C   s|   t |d t |d |d   t |d  t |d |d  |d   |d t |d |d   t |d  gS ri   rj   rR   r    r    r!   rk   c  s    **z4TestApproxDerivativeLinearOperator.jac_vector_scalarc                 C   sH   t |d t |d  |d t |d  |d d |d d  gS rl   rn   rR   r    r    r!   ro   j  s
    z4TestApproxDerivativeLinearOperator.fun_vector_vectorc                 C   s   t t |d |d t |d  g|d  t |d  t |d gd|d d  |d d  d|d d  |d d  ggS rp   rn   rR   r    r    r!   rq   q  s
    "$6z4TestApproxDerivativeLinearOperator.jac_vector_vectorc                 C   s   d}t | j|ddd}t | j|dd}t | j|ddd}| |}tjd tdD ]^}tjjd	dd
d}t|	||| dd t|	||| dd t|	||| dd qVd S )Nrr   r&   Tr/   as_linear_operatorr   r(   r   r   r   r   r   r   h㈵>)
r   rT   rW   r   r   r   r   uniformr   dotr:   r;   r   r   r   r   r   r   r    r    r!   r   x  s2    
z5TestApproxDerivativeLinearOperator.test_scalar_scalarc                 C   s   d}t | j|ddd}t | j|dd}t | j|ddd}| t|}tjd tdD ]d}tjjd	dd
d}t	|
||
|dd t	|
||
|dd t	|
||
|dd q\d S )Nr#   r&   Tr   r   r(   r   r   r   r   r   r   r   r   )r   r\   ra   r   r   r   r   r   r   r   r   r   r    r    r!   r     s2    z5TestApproxDerivativeLinearOperator.test_scalar_vectorc                 C   s   t ddg}t| j|ddd}t| j|dd}t| j|ddd}| |}t jd td	D ]x}t jjd
d	|j	d}t
||t ||dd t
||t ||dd t
||t ||dd q`d S )Nr   rm   r&   Tr   r   r(   r   r   r   r   r   r   r   r   )r   r   r   rf   rk   r   r   r   r   shaper   r   r   r   r    r    r!   r     s2    
z5TestApproxDerivativeLinearOperator.test_vector_scalarc                 C   s   t ddg}t| j|ddd}t| j|dd}t| j|ddd}| |}t jd td	D ]f}t jjd
d	|j	d}t
||||dd t
||||dd t
||||dd q`d S )Nr   r   r&   Tr   r   r(   r   r   r   r   r   r   r   r   )r   r   r   ro   rq   r   r   r   r   r   r   r   r   r    r    r!   r     s&    
z5TestApproxDerivativeLinearOperator.test_vector_vectorc                 C   s.   t ddg}ttt| j|ddt jfd d S )Nr   r   r&   r   r   )r   r   r   r   r   ro   r8   )r:   r;   r    r    r!   test_exception  s      z1TestApproxDerivativeLinearOperator.test_exceptionN)rK   rL   rM   rT   rW   r\   ra   rf   rk   ro   rq   r   r   r   r   r   r    r    r    r!   r   Q  s   r   c                  C   s  dd } t | ddgddd}t|ddg t | ddgdd	d}t|ddg t | ddgdddgd}t|ddg t | ddgddd	gd}t|ddg t | ddgdd	dgd}t|ddg t | ddgddtj dfd
}t|ddg t | ddgdd	dtjfd
}t|ddg d S )Nc                 S   s&   t | d d  t | d d  S rb   )r   rD   r   r    r    r!   r     s    z"test_absolute_step_sign.<locals>.frA   r&   ry   r   r   rr   r   )r/   r   r   )r   r   r   r8   )r   Zgradr    r    r!   test_absolute_step_sign  sT    	            
    r   c            
      C   st  dddg} t ddddg}t t jj}|d |d	 |d d
}t d}| D ]}|| }t ||d |d |t |d  g}td |||}t|| | dkt	d d }	td | ||}t||	|  qPt ddddg}t |d |d  |d |d d |d t |d  g}t|||d}t|| | dkt	d d }	t|| |d}t||	|  d S )Nr&   r'   r(   r   r   r   g     j@r#   r$   r%   rr   r   r   rB   r   r   )
r   r   r)   r*   r+   rD   r   r   r   float)
methodsr;   r-   r.   r   r/   r   Zcorrect_stepr   Zsign_x0r    r    r!   test__compute_absolute_step  s>    




r  )r   	itertoolsr   Znumpyr   Znumpy.testingr   r   r   Zpytestr   r   Zscipy.sparser   r   r	   Zscipy.optimize._numdiffr
   r   r   r   r   r   r"   r0   r1   rN   r   r   r   r  r    r    r    r!   <module>   s     $J  _[5