U
    »mœdš2  ã                   @   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r t  | ¡}
t j dd| d ¡|
d d…< t  ||
¡}
n$|dkr´t  | ¡}
n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!   úd/home/sam/Atlas/atlas_env/lib/python3.8/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  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__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   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   r/   r   r   r   r   r   ©r1   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   rA   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&   rG   é   r:   r;   r<   FTr=   r   r@   rA   r!   r!   r"   Ú$test_for_first_element_equal_to_zero   s    þzATestSingularLeadingSubmatrix.test_for_first_element_equal_to_zeroN)r6   r7   r8   rF   rH   rJ   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                    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   r/   rM   ©r    r!   r"   rO   «   rP   c                    s
   t  ˆ ¡S rQ   rR   rM   ©ÚHr!   r"   rO   ¬   rP   ç»½×Ùß|Û=©rN   ÚfunÚjacÚhessÚk_easyÚk_hardgë8<Œbp?gøgÌEø®á¿gÎþ vå?gË�ùëÛªß¿T©r   Úsolver   )r1   Útrust_radiusÚsubprobÚpÚhits_boundaryr!   ©rU   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ýéð@grv»f(n Àr   c                 S   s   dS rL   r!   rM   r!   r!   r"   rO   Å   rP   z@TestIterativeSubproblem.test_for_the_hard_case.<locals>.<lambda>c                    s
   t  ˆ ¡S rQ   rR   rM   rS   r!   r"   rO   Æ   rP   c                    s
   t  ˆ ¡S rQ   rR   rM   rT   r!   r"   rO   Ç   rP   rV   rW   )r   r^   r   Úlambda_current)r1   r4   r_   r`   ra   rb   r!   rc   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 )#NgÛn‚ošþü?g�ž¶¡½uê?g,wnó)ôË?g”/ËK¼Ëà¿gÿëš˜GÐ?gì¼®ÛwO@gÙ¢y¾n*Ô?gr–<8±Ù¿gõ¶Û&ÃŽ¶?gÓ6›ª
@gøòÄ½CÔ¿g8Š¤ÄKƒÑ?gÀc‘‰èù?gò†«>øÚ¿gÂ-£Qõ?g*‹ã<sAè?g³¢¼E�?gM x¾—©Õ?gzý‹˜ÀÊê?gôÒ=€©Þ¿r   c                 S   s   dS rL   r!   rM   r!   r!   r"   rO   Ú   rP   zGTestIterativeSubproblem.test_for_interior_convergence.<locals>.<lambda>c                    s
   t  ˆ ¡S rQ   rR   rM   rS   r!   r"   rO   Û   rP   c                    s
   t  ˆ ¡S rQ   rR   rM   rT   r!   r"   rO   Ü   rP   )rN   rX   rY   rZ   çš™™™™™ñ?g8bÒ„òå¿gåO
©‘L¿?g p4OÇFÌ¿g� Ïqå¿g­oš-7Ô?Fr   )r   r^   r   re   Zniter©r1   r`   ra   rb   r!   rc   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çÝVaÐUì?çø˜›±`A@ç5“ýF€ï?çÔ9Ô)n@é¿ç€îcñÑ¿çµÚ{ú¥§¿ç.<íøÕ?ç~õýÏËê¿çÔ:]³èÅ?ç@33ôë¿ç �5Ð:²°¿ç¦ä¤IŒâö¿çÐ¹ÛõÒTú¿ç¦F¦K°Õ¿ç¬¢&—Rùú¿r   c                 S   s   dS rL   r!   rM   r!   r!   r"   rO   ñ   rP   zATestIterativeSubproblem.test_for_jac_equal_zero.<locals>.<lambda>c                    s
   t  ˆ ¡S rQ   rR   rM   rS   r!   r"   rO   ò   rP   c                    s
   t  ˆ ¡S rQ   rR   rM   rT   r!   r"   rO   ó   rP   rV   rW   rg   ç÷iG7ã°±?çlµ$“•W�¿çÀü€ÍZæä¿ç-ðOˆ|Î¿ç¦mô‚/ë¿Tr]   rh   r!   rc   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 )Nrj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   r   gVçž¯Ò<c                 S   s   dS rL   r!   rM   r!   r!   r"   rO   	  rP   zITestIterativeSubproblem.test_for_jac_very_close_to_zero.<locals>.<lambda>c                    s
   t  ˆ ¡S rQ   rR   rM   rS   r!   r"   rO   
  rP   c                    s
   t  ˆ ¡S rQ   rR   rM   rT   r!   r"   rO     rP   rV   rW   rg   ry   rz   r{   r|   r}   Tr]   rh   r!   rc   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  ˆ|¡ }|�r„t	t  
t|ƒ| ¡|d | kd"ƒ ntt|ƒ|kd"ƒ t||| kd"ƒ qÖqhq2qd S )#Nr   r:   )Zeasyr   r   )iìÿÿÿiñÿÿÿ)éöÿÿÿéûÿÿÿ)r€   r   )r�   r:   )r€   r,   )r   r,   )r:   r,   )é   é   çš™™™™™¹?g333333Ó?g333333ã?r*   g333333ó?gffffff
@g      @r,   r   c                 S   s   dS rL   r!   rM   r!   r!   r"   rO   2  rP   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>c                    s   ˆ S rQ   r!   rM   rS   r!   r"   rO   3  rP   c                    s   ˆ S rQ   r!   rM   rT   r!   r"   rO   4  rP   rV   )r[   r\   ç      à?)r„   r%   )r…   rg   )gÍÌÌÌÌÌì?g)\�Âõ(ð?c                 S   s   dS rL   r!   rM   r!   r!   r"   rO   M  rP   c                    s   ˆ S rQ   r!   rM   rS   r!   r"   rO   N  rP   c                    s   ˆ S rQ   r!   rM   rT   r!   r"   rO   O  rP   T)r   r   Úseedr#   r   r^   r   ÚminÚsqrtr
   r0   r	   r   )r1   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\   r`   ra   rb   ÚJr!   rc   r"   Útest_for_random_entries  sf    
ù	


û$þÿ

û$
ÿÿz/TestIterativeSubproblem.test_for_random_entriesN)	r6   r7   r8   rd   rf   ri   r~   r   rŠ   r!   r!   r!   r"   rK   ™   s   rK   )Ú__doc__Únumpyr   Z!scipy.optimize._trustregion_exactr   r   r   Zscipy.linalgr   r   r   r   r	   Znumpy.testingr
   r   r   r#   r$   r9   rK   r!   r!   r!   r"   Ú<module>   s   P