U
    /d2                     @   s   d Z ddlZddlmZmZmZ ddlmZm	Z	m
Z
mZmZ ddlmZmZmZ dd ZG dd	 d	ZG d
d dZG dd dZdS )zs
Unit tests for trust-region iterative subproblem.

To run it in its simplest form::
  nosetests test_optimize.py

    N) estimate_smallest_singular_valuesingular_leading_submatrixIterativeSubproblem)svdget_lapack_funcsdetqrnorm)assert_array_equalassert_equalassert_array_almost_equalc                 C   s   t jdd| | f}t|dd\}}}t j||| }t |d d d }t ||}t ||j}	|dkrt | }
t jdd| d |
d d< t ||
}
n$|dkrt | }
nt jdd| }
|	|
fS )N   True)Zpivotinghardjac_equal_zero)	nprandomuniformr   sortmultiplydotTzeros)nmin_eigmax_eigcaseZrandQ_Z	eigvaluesZQauxAg r"   O/tmp/pip-unpacked-wheel-9gxwnfpp/scipy/optimize/tests/test_trustregion_exact.pyrandom_entry   s    
r$   c                   @   s   e Zd Zdd ZdS )!TestEstimateSmallestSingularValuec           	   	   C   s   t ddddgddddgddd	d
gddddgg}t|\}}}|d }|dd d f }t|\}}t||dd tt|t|dd d S )Nr            r   g?<      皙?	   
   r      )decimal)r   arrayr   r   r   abs)	selfCUsZVtZsmin_svdZzmin_svdZsminZzminr"   r"   r#    test_for_ill_condiotioned_matrix2   s    


zBTestEstimateSmallestSingularValue.test_for_ill_condiotioned_matrixN)__name__
__module____qualname__r6   r"   r"   r"   r#   r%   0   s   r%   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestSingularLeadingSubmatrixc                 C   s   t dddgdddgdddgg}td|f\}||ddd	d
\}}t|||\}}||d |d f  |7  < tt|d |d |f d t |t ||}t|d d S )Nr   r&   r'   r(         ZpotrfFTlowerZoverwrite_acleanr   r   r0   r   r   r   r   r   r2   r    ZcholeskyckdeltavZquadratic_termr"   r"   r#   +test_for_already_singular_leading_submatrixK   s    zHTestSingularLeadingSubmatrix.test_for_already_singular_leading_submatrixc                 C   s   t dddddgdddddgddd	ddgdddddgdddddgg}td
|f\}||dddd\}}t|||\}}||d |d f  |7  < tt|d |d |f d t |t ||}t|d d S )Nr   r&   r'   r*   r.   r;   r,   r      r=   FTr>   )r   Zasarrayr   r   r   r   r   rB   r"   r"   r#   #test_for_simetric_indefinite_matrixd   s    z@TestSingularLeadingSubmatrix.test_for_simetric_indefinite_matrixc                 C   s   t dddgdddgdddgg}td|f\}||ddd	d
\}}t|||\}}||d |d f  |7  < tt|d |d |f d t |t ||}t|d d S )Nr   r'   rH      r;   r<   r=   FTr>   r   rA   rB   r"   r"   r#   $test_for_first_element_equal_to_zero   s    zATestSingularLeadingSubmatrix.test_for_first_element_equal_to_zeroN)r7   r8   r9   rG   rI   rK   r"   r"   r"   r#   r:   I   s   r:   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S )TestIterativeSubproblemc                    s   ddddgddddgddddgddddgg ddddgd}t ddd	 fd
d	 fdd	ddd}||\}}t|ddddg t|d d S )Nr-   r&   r'   r(   r   r*   r   c                 S   s   dS Nr   r"   xr"   r"   r#   <lambda>       z@TestIterativeSubproblem.test_for_the_easy_case.<locals>.<lambda>c                    s
   t  S Nr   r0   rN   r!   r"   r#   rP      rQ   c                    s
   t  S rR   rS   rN   Hr"   r#   rP      rQ   绽|=rO   funjachessk_easyk_hardg8<bp?ggEg v?gˍ۪߿Tr   solver   )r2   trust_radiussubprobphits_boundaryr"   rV   r!   r#   test_for_the_easy_case   s(    





 z.TestIterativeSubproblem.test_for_the_easy_casec                    s   ddddgddddgddddgddddgg ddddgd}d}t d	d
d fdd fddddd}||\}}t| |j d S )Nr-   r&   r'   r(   r   r*   gAS@grvf(n r   c                 S   s   dS rM   r"   rN   r"   r"   r#   rP      rQ   z@TestIterativeSubproblem.test_for_the_hard_case.<locals>.<lambda>c                    s
   t  S rR   rS   rN   rT   r"   r#   rP      rQ   c                    s
   t  S rR   rS   rN   rU   r"   r#   rP      rQ   rW   rX   )r   r_   r   lambda_current)r2   r5   r`   ra   rb   rc   r"   rd   r#   test_for_the_hard_case   s"    





z.TestIterativeSubproblem.test_for_the_hard_casec              	      s   dddddgddddd	gddd
ddgdddddgdd	dddgg dddddgt ddd fdd fddd}|d\}}t|ddddd g t|d! t|jd t|jd" d S )#Ngno?gu?g,wn)?g/Kg뚘G?g켮wO@g٢yn*?gr<8ٿg&Î?g6
@gĽCԿg8K?gc?g>ڿg-Q?g*<sA?gE?gM x?gz?g=޿r   c                 S   s   dS rM   r"   rN   r"   r"   r#   rP      rQ   zGTestIterativeSubproblem.test_for_interior_convergence.<locals>.<lambda>c                    s
   t  S rR   rS   rN   rT   r"   r#   rP      rQ   c                    s
   t  S rR   rS   rN   rU   r"   r#   rP      rQ   )rO   rY   rZ   r[   皙?g8b҄gO
L?gp4OF̿g qgo-7?Fr   )r   r_   r   rf   Zniterr2   ra   rb   rc   r"   rd   r#   test_for_interior_convergence   s(    


 
z5TestIterativeSubproblem.test_for_interior_convergencec              	      s   dddddgddddd	gddd
ddgdddddgdd	dddgg dddddgt ddd fdd fddddd}|d\}}t|dddddg t|d d S )NVaU?`A@5F?9)n@cѿ{.<?~:]?@33 5:IйTFKտ笢&Rr   c                 S   s   dS rM   r"   rN   r"   r"   r#   rP      rQ   zATestIterativeSubproblem.test_for_jac_equal_zero.<locals>.<lambda>c                    s
   t  S rR   rS   rN   rT   r"   r#   rP      rQ   c                    s
   t  S rR   rS   rN   rU   r"   r#   rP      rQ   rW   rX   rh   iG7㰱?l$WZ-O|οm/Tr^   ri   r"   rd   r#   test_for_jac_equal_zero   s*    

 z/TestIterativeSubproblem.test_for_jac_equal_zeroc              	      s   dddddgddddd	gddd
ddgdddddgdd	dddgg dddddgt ddd fdd fddddd}|d\}}t|dddddg t|d d S )Nrk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   r   gV瞯<c                 S   s   dS rM   r"   rN   r"   r"   r#   rP   	  rQ   zITestIterativeSubproblem.test_for_jac_very_close_to_zero.<locals>.<lambda>c                    s
   t  S rR   rS   rN   rT   r"   r#   rP   
  rQ   c                    s
   t  S rR   rS   rN   rU   r"   r#   rP     rQ   rW   rX   rh   rz   r{   r|   r}   r~   Tr^   ri   r"   rd   r#   test_for_jac_very_close_to_zero   s*    

 z7TestIterativeSubproblem.test_for_jac_very_close_to_zeroc                    s  t jd d}dD ]}dddddd	d
dg}|D ]x\}}t||||\ dddddddddg	}|D ]@}tddd fdd fddddd}||\}	}
dt |	t  |	 t |	 }dddg}|D ]\}}t|d dt | }d| }tddd fd d fd!d||d}||\}}dt |t  | t | }|rt	t 
t|| |d | kd" ntt||kd" t||| kd" qqhq2qd S )#Nr   r;   )Zeasyr   r   )ii))r   r   )r   r;   )r   r-   )r   r-   )r;   r-   )      皙?g333333?g333333?r+   g333333?gffffff
@g      @r-   r   c                 S   s   dS rM   r"   rN   r"   r"   r#   rP   2  rQ   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>c                    s    S rR   r"   rN   rT   r"   r#   rP   3  rQ   c                    s    S rR   r"   rN   rU   r"   r#   rP   4  rQ   rW   )r\   r]         ?)r   r&   )r   rh   )g?g)\(?c                 S   s   dS rM   r"   rN   r"   r"   r#   rP   M  rQ   c                    s    S rR   r"   rN   rT   r"   r#   rP   N  rQ   c                    s    S rR   r"   rN   rU   r"   r#   rP   O  rQ   T)r   r   seedr$   r   r_   r   minsqrtr
   r1   r	   r   )r2   r   r   Z
eig_limitsr   r   Ztrust_radius_listr`   Z
subprob_acZp_acZhits_boundary_acZJ_acZstop_criteriaZk_optZk_trfr\   r]   ra   rb   rc   Jr"   rd   r#   test_for_random_entries  sf    
	


$

$
z/TestIterativeSubproblem.test_for_random_entriesN)	r7   r8   r9   re   rg   rj   r   r   r   r"   r"   r"   r#   rL      s   rL   )__doc__Znumpyr   Z!scipy.optimize._trustregion_exactr   r   r   Zscipy.linalgr   r   r   r   r	   Znumpy.testingr
   r   r   r$   r%   r:   rL   r"   r"   r"   r#   <module>   s   P