o
    &?e2                     @   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)Zpivotinghardjac_equal_zero)	nprandomuniformr   sortmultiplydotTZzeros)nmin_eigmax_eigcaseZrandQ_Z	eigvaluesZQauxAg r!   l/home/www/facesmatcher.com/pyenv/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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__r5   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&   r;      ZpotrfFTlowerZoverwrite_acleanr   r   r   r/   r   r   r   r   r   r1   r   ZcholeskyckdeltavZ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)   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   r:   )
N)r   r&   rI   )r&      r;   )rI   r;   r<   r=   FTr>   r   r   rA   rB   r!   r!   r"   $test_for_first_element_equal_to_zero   rH   zATestSingularLeadingSubmatrix.test_for_first_element_equal_to_zeroN)r6   r7   r8   rG   rJ   rL   r!   r!   r!   r"   r9   I   s    r9   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      dS Nr   r!   xr!   r!   r"   <lambda>       z@TestIterativeSubproblem.test_for_the_easy_case.<locals>.<lambda>c                    
   t  S Nr   r/   rT   r    r!   r"   rV         
 c                    rX   rY   rZ   rT   Hr!   r"   rV      r\   绽|=rU   funjachessk_easyk_hard)g8<bp?ggEg v?gˍ۪߿Tr   solver   )r1   trust_radiussubprobphits_boundaryr!   r^   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 )NrN   rO   rP   rQ   )gAS@r   r   r   grvf(n r   r   c                 S   rR   rS   r!   rT   r!   r!   r"   rV      rW   z@TestIterativeSubproblem.test_for_the_hard_case.<locals>.<lambda>c                    rX   rY   rZ   rT   r[   r!   r"   rV      r\   c                    rX   rY   rZ   rT   r]   r!   r"   rV      r\   r_   r`   )r   rg   r   lambda_current)r1   r4   rh   ri   rj   rk   r!   rl   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?)rp   g켮wO@٢yn*?r<8ٿ&Î?)rq   rt   g6
@ĽCԿ8K?)rr   ru   rw   gc?>ڿ)rs   rv   rx   ry   g-Q?)g*<sA?gE?gM x?gz?g=޿r   c                 S   rR   rS   r!   rT   r!   r!   r"   rV      rW   zGTestIterativeSubproblem.test_for_interior_convergence.<locals>.<lambda>c                    rX   rY   rZ   rT   r[   r!   r"   rV      r\   c                    rX   rY   rZ   rT   r]   r!   r"   rV      r\   )rU   ra   rb   rc   皙?)g8b҄gO
L?gp4OF̿g qgo-7?Fr   )r   rg   r   rn   Zniterr1   ri   rj   rk   r!   rl   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   rR   rS   r!   rT   r!   r!   r"   rV      rW   zATestIterativeSubproblem.test_for_jac_equal_zero.<locals>.<lambda>c                    rX   rY   rZ   rT   r[   r!   r"   rV      r\   c                    rX   rY   rZ   rT   r]   r!   r"   rV      r\   r_   r`   rz   giG7㰱?gl$WgZg-O|οgm/Trf   r{   r!   rl   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   rR   rS   r!   rT   r!   r!   r"   rV   	  rW   zITestIterativeSubproblem.test_for_jac_very_close_to_zero.<locals>.<lambda>c                    rX   rY   rZ   rT   r[   r!   r"   rV   
  r\   c                    rX   rY   rZ   rT   r]   r!   r"   rV     r\   r_   r`   rz   r   Trf   r{   r!   rl   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   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   rR   rS   r!   rT   r!   r!   r"   rV   2  rW   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>c                        S rY   r!   rT   r[   r!   r"   rV   3  rW   c                    r   rY   r!   rT   r]   r!   r"   rV   4  rW   r_   )rd   re         ?))r   r%   )r   rz   )g?g)\(?c                 S   rR   rS   r!   rT   r!   r!   r"   rV   M  rW   c                    r   rY   r!   rT   r[   r!   r"   rV   N  rW   c                    r   rY   r!   rT   r]   r!   r"   rV   O  rW   T)r   r   seedr#   r   rg   r   minsqrtr
   r0   r	   r   )r1   r   r   Z
eig_limitsr   r   Ztrust_radius_listrh   Z
subprob_acZp_acZhits_boundary_acZJ_acZstop_criteriaZk_optZk_trfrd   re   ri   rj   rk   Jr!   rl   r"   test_for_random_entries  sX   	

$

$
z/TestIterativeSubproblem.test_for_random_entriesN)	r6   r7   r8   rm   ro   r|   r   r   r   r!   r!   r!   r"   rM      s    rM   )__doc__numpyr   Z!scipy.optimize._trustregion_exactr   r   r   Zscipy.linalgr   r   r   r   r	   Znumpy.testingr
   r   r   r#   r$   r9   rM   r!   r!   r!   r"   <module>   s    P