o
    g2                     @   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rSt | }
t jdd| d |
d d< t ||
}
|	|
fS |dkr`t | }
|	|
fS t jdd| }
|	|
fS )N   True)pivotinghardjac_equal_zero)	nprandomuniformr   sortmultiplydotTzeros)nmin_eigmax_eigcaserandQ_	eigvaluesQauxAg r&   i/home/ubuntu/cloudmapper/venv/lib/python3.10/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sVtsmin_svdzmin_svdsminzminr&   r&   r'    test_for_ill_condiotioned_matrix2   s   
zBTestEstimateSmallestSingularValue.test_for_ill_condiotioned_matrixN)__name__
__module____qualname__r?   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      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+   rE      potrfFTloweroverwrite_acleanr   r   r   r4   r   r   r   r   r   r6   r$   choleskyckdeltavquadratic_termr&   r&   r'   +test_for_already_singular_leading_submatrixK      
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.   r2   )r*   rE   rE   r0   r   )r+   rE      r   r*   )r.   r0   r   r.   rE   )r2   r   r*   rE   r2   rG   FTrI   r   r   )r   asarrayr   r   r   r   r   rN   r&   r&   r'   #test_for_simetric_indefinite_matrixd   s   
z@TestSingularLeadingSubmatrix.test_for_simetric_indefinite_matrixc                 C   rD   )
N)r   r+   rW   )r+      rE   )rW   rE   rF   rG   FTrI   r   r   rM   rN   r&   r&   r'   $test_for_first_element_equal_to_zero   rV   zATestSingularLeadingSubmatrix.test_for_first_element_equal_to_zeroN)r@   rA   rB   rU   rY   r[   r&   r&   r&   r'   rC   I   s    rC   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r1   r*   r+   r,   r*   r   r.   r   r+   r.   r   r.   r,   r   r.   r*   )r   r   r   r   r   r   c                 S      dS Nr   r&   xr&   r&   r'   <lambda>       z@TestIterativeSubproblem.test_for_the_easy_case.<locals>.<lambda>c                    
   t  S Nr   r4   rc   r%   r&   r'   re         
 c                    rg   rh   ri   rc   Hr&   r'   re      rk   绽|=rd   funjachessk_easyk_hard)g8<bp?ggEg v?gˍ۪߿Tr   solver   )r6   trust_radiussubprobphits_boundaryr&   rm   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 )Nr]   r^   r_   r`   )gAS@r   r   r   grvf(n r   r   c                 S   ra   rb   r&   rc   r&   r&   r'   re      rf   z@TestIterativeSubproblem.test_for_the_hard_case.<locals>.<lambda>c                    rg   rh   ri   rc   rj   r&   r'   re      rk   c                    rg   rh   ri   rc   rl   r&   r'   re      rk   rn   ro   )r   rv   r   lambda_current)r6   r9   rw   rx   ry   rz   r&   r{   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?)r   g켮wO@٢yn*?r<8ٿ&Î?)r   r   g6
@ĽCԿ8K?)r   r   r   gc?>ڿ)r   r   r   r   g-Q?)g*<sA?gE?gM x?gz?g=޿r   c                 S   ra   rb   r&   rc   r&   r&   r'   re      rf   zGTestIterativeSubproblem.test_for_interior_convergence.<locals>.<lambda>c                    rg   rh   ri   rc   rj   r&   r'   re      rk   c                    rg   rh   ri   rc   rl   r&   r'   re      rk   )rd   rp   rq   rr   皙?)g8b҄gO
L?gp4OF̿g qgo-7?Fr   )r   rv   r   r}   niterr6   rx   ry   rz   r&   r{   r'   test_for_interior_convergence   s"   


z5TestIterativeSubproblem.test_for_interior_convergencec                    |   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ѿr   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   ra   rb   r&   rc   r&   r&   r'   re      rf   zATestIterativeSubproblem.test_for_jac_equal_zero.<locals>.<lambda>c                    rg   rh   ri   rc   rj   r&   r'   re      rk   c                    rg   rh   ri   rc   rl   r&   r'   re      rk   rn   ro   r   giG7㰱?gl$WgZg-O|οgm/Tru   r   r&   r{   r'   test_for_jac_equal_zero   "   

z/TestIterativeSubproblem.test_for_jac_equal_zeroc                    r   )Nr   r   r   r   r   )r   r   r   r   gV瞯<r   c                 S   ra   rb   r&   rc   r&   r&   r'   re   	  rf   zITestIterativeSubproblem.test_for_jac_very_close_to_zero.<locals>.<lambda>c                    rg   rh   ri   rc   rj   r&   r'   re   
  rk   c                    rg   rh   ri   rc   rl   r&   r'   re     rk   rn   ro   r   r   Tru   r   r&   r{   r'   test_for_jac_very_close_to_zero   r   z7TestIterativeSubproblem.test_for_jac_very_close_to_zeroc                    s  t jd d}dD ]}g d}|D ]\}}t||||\ g d}|D ]}tddd fd	d fd
dddd}||\}	}
dt |	t  |	 t |	 }g d}|D ]h\}}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 qZq%qq
d S )Nr   rE   )easyr   r   ))ii))r   r   )r   rE   )r   r1   )r   r1   )rE   r1   )      )	皙?g333333?g333333?r/   r   g333333?gffffff
@g      @r1   r   c                 S   ra   rb   r&   rc   r&   r&   r'   re   2  rf   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>c                        S rh   r&   rc   rj   r&   r'   re   3  rf   c                    r   rh   r&   rc   rl   r&   r'   re   4  rf   rn   )rs   rt         ?))r   r*   )r   r   )g?g)\(?c                 S   ra   rb   r&   rc   r&   r&   r'   re   M  rf   c                    r   rh   r&   rc   rj   r&   r'   re   N  rf   c                    r   rh   r&   rc   rl   r&   r'   re   O  rf   T)r   r   seedr(   r   rv   r   minsqrtr
   r5   r	   r   )r6   r   r   
eig_limitsr   r   trust_radius_listrw   
subprob_acp_achits_boundary_acJ_acstop_criteriak_optk_trfrs   rt   rx   ry   rz   Jr&   r{   r'   test_for_random_entries  sX   	

$

$
z/TestIterativeSubproblem.test_for_random_entriesN)	r@   rA   rB   r|   r~   r   r   r   r   r&   r&   r&   r'   r\      s    r\   )__doc__numpyr   !scipy.optimize._trustregion_exactr   r   r   scipy.linalgr   r   r   r   r	   numpy.testingr
   r   r   r(   r)   rC   r\   r&   r&   r&   r'   <module>   s    P