o
    i2                     @   s   d Z ddl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 )z4
Unit tests for trust-region iterative subproblem.

    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!   e/home/kim/smarthome/.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sZVtZsmin_svdZzmin_svdZsminZzminr!   r!   r"    test_for_ill_condiotioned_matrix0   s   
zBTestEstimateSmallestSingularValue.test_for_ill_condiotioned_matrixN)__name__
__module____qualname__r5   r!   r!   r!   r"   r$   .   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_submatrixI      
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_matrixb   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   G   s    r9   c                   @   sH   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zej	
d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_zeror,   c                    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   1  rW   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>c                        S rY   r!   rT   r[   r!   r"   rV   2  rW   c                    r   rY   r!   rT   r]   r!   r"   rV   3  rW   r_   )rd   re         ?))r   r%   )r   rz   )g?g)\(?c                 S   rR   rS   r!   rT   r!   r!   r"   rV   L  rW   c                    r   rY   r!   rT   r[   r!   r"   rV   M  rW   c                    r   rY   r!   rT   r]   r!   r"   rV   N  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   pytestmarkZ	fail_slowr   r!   r!   r!   r"   rM      s    
rM   )__doc__r   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