a
    Re2                     @   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"   _/var/www/sunrise/env/lib/python3.9/site-packages/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 g dg dg dg dg}t|\}}}|d }|dd d f }t|\}}t||dd tt|t|dd d S )N)r            )r   g?<      )r   r   皙?	   )r   r   r   
   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 g dg dg d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 )
N)r   r&   r'   )r&   r(      )r'   r;      ZpotrfFTlowerZoverwrite_acleanr   r   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 g dg dg dg dg d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 )N)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=   FTr>   r   r   )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 g dg dg d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 )
N)r   r'   rH   )r'      r;   )rH   r;   r<   r=   FTr>   r   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                    sz   g dg dg dg dg g dd}t ddd	 fd
d	 fdd	ddd}||\}}t|g d t|d d S )Nr-   r&   r'   r(   r&   r   r*   r   r'   r*   r   r*   r(   r   r*   r&   )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   rR   r!   r"   r#   rT      rU   c                    s
   t  S rV   rW   rR   Hr"   r#   rT      rU   绽|=rS   funjachessk_easyk_hard)g8<bp?ggEg v?gˍ۪߿Tr   solver   )r2   trust_radiussubprobphits_boundaryr"   rZ   r!   r#   test_for_the_easy_case   s"    

z.TestIterativeSubproblem.test_for_the_easy_casec                    st   g dg dg dg dg g dd}d}t dd	d
 fdd
 fdd
ddd}||\}}t| |j d S )NrM   rN   rO   rP   )gAS@r   r   r   grvf(n r   r   c                 S   s   dS rQ   r"   rR   r"   r"   r#   rT      rU   z@TestIterativeSubproblem.test_for_the_hard_case.<locals>.<lambda>c                    s
   t  S rV   rW   rR   rX   r"   r#   rT      rU   c                    s
   t  S rV   rW   rR   rY   r"   r#   rT      rU   r[   r\   )r   rc   r   lambda_current)r2   r5   rd   re   rf   rg   r"   rh   r#   test_for_the_hard_case   s"    

z.TestIterativeSubproblem.test_for_the_hard_casec                    s   g dg dg dg dg dg g dt ddd	 fd
d	 fdd	d}|d\}}t|g d t|d t|jd t|jd d S )N)gno?獞u?,wn)?/K뚘G?)rl   g켮wO@٢yn*?r<8ٿ&Î?)rm   rp   g6
@ĽCԿ8K?)rn   rq   rs   gc?>ڿ)ro   rr   rt   ru   g-Q?)g*<sA?gE?gM x?gz?g=޿r   c                 S   s   dS rQ   r"   rR   r"   r"   r#   rT      rU   zGTestIterativeSubproblem.test_for_interior_convergence.<locals>.<lambda>c                    s
   t  S rV   rW   rR   rX   r"   r#   rT      rU   c                    s
   t  S rV   rW   rR   rY   r"   r#   rT      rU   )rS   r]   r^   r_   皙?)g8b҄gO
L?gp4OF̿g qgo-7?Fr   )r   rc   r   rj   Zniterr2   re   rf   rg   r"   rh   r#   test_for_interior_convergence   s"    


z5TestIterativeSubproblem.test_for_interior_convergencec                    s|   g dg dg dg dg dg g dt ddd	 fd
d	 fdd	ddd}|d\}}t|g d t|d d S )NgVaU?`A@5F?9)n@cѿrz   g{.<?~:]?r{   r   g@33 5:Ir|   r   r   gйTFKտr}   r   r   r   g&R)r   r   r   r   r   r   c                 S   s   dS rQ   r"   rR   r"   r"   r#   rT      rU   zATestIterativeSubproblem.test_for_jac_equal_zero.<locals>.<lambda>c                    s
   t  S rV   rW   rR   rX   r"   r#   rT      rU   c                    s
   t  S rV   rW   rR   rY   r"   r#   rT      rU   r[   r\   rv   giG7㰱?gl$WgZg-O|οgm/Trb   rw   r"   rh   r#   test_for_jac_equal_zero   s"    

z/TestIterativeSubproblem.test_for_jac_equal_zeroc                    s|   g dg dg dg dg dg g dt ddd	 fd
d	 fdd	ddd}|d\}}t|g d t|d d S )Nry   r~   r   r   r   )r   r   r   r   gV瞯<r   c                 S   s   dS rQ   r"   rR   r"   r"   r#   rT   	  rU   zITestIterativeSubproblem.test_for_jac_very_close_to_zero.<locals>.<lambda>c                    s
   t  S rV   rW   rR   rX   r"   r#   rT   
  rU   c                    s
   t  S rV   rW   rR   rY   r"   r#   rT     rU   r[   r\   rv   r   Trb   rw   r"   rh   r#   test_for_jac_very_close_to_zero   s"    

z7TestIterativeSubproblem.test_for_jac_very_close_to_zeroc                    s  t jd d}dD ]|}g d}|D ]h\}}t||||\ g d}|D ]>}tddd fd	d fd
dddd}||\}	}
dt |	t  |	 t |	 }g d}|D ]\}}t|d dt | }d| }tddd fdd fdd||d}||\}}dt |t  | t | }|rht	t 
t|| |d | kd ntt||kd t||| kd qqNq&qd S )Nr   r;   )Zeasyr   r   ))ii))r   r   )r   r;   )r   r-   )r   r-   )r;   r-   )      )	皙?g333333?g333333?r+   r   g333333?gffffff
@g      @r-   r   c                 S   s   dS rQ   r"   rR   r"   r"   r#   rT   2  rU   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>c                    s    S rV   r"   rR   rX   r"   r#   rT   3  rU   c                    s    S rV   r"   rR   rY   r"   r#   rT   4  rU   r[   )r`   ra         ?))r   r&   )r   rv   )g?g)\(?c                 S   s   dS rQ   r"   rR   r"   r"   r#   rT   M  rU   c                    s    S rV   r"   rR   rX   r"   r#   rT   N  rU   c                    s    S rV   r"   rR   rY   r"   r#   rT   O  rU   T)r   r   seedr$   r   rc   r   minsqrtr
   r1   r	   r   )r2   r   r   Z
eig_limitsr   r   Ztrust_radius_listrd   Z
subprob_acZp_acZhits_boundary_acZJ_acZstop_criteriaZk_optZk_trfr`   ra   re   rf   rg   Jr"   rh   r#   test_for_random_entries  sP    
	


$

$
z/TestIterativeSubproblem.test_for_random_entriesN)	r7   r8   r9   ri   rk   rx   r   r   r   r"   r"   r"   r#   rL      s   rL   )__doc__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