o
    Ö­j…2  ã                   @   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)Ú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&   úh/var/www/html/CropPilot/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_matrix0   s   
ýzBTestEstimateSmallestSingularValue.test_for_ill_condiotioned_matrixN)Ú__name__Ú
__module__Ú__qualname__r?   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+   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_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.   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_matrixb   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   G   s    rC   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©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)gë8<Œbp?gøgÌEø®á¿gÎþ 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   grv»f(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)gÛn‚ošþü?ç�ž¶¡½uê?ç,wnó)ôË?ç”/ËK¼Ëà¿çÿëš˜GÐ?)r   gì¼®ÛwO@çÙ¢y¾n*Ô?çr–<8±Ù¿çõ¶Û&ÃŽ¶?)r€   rƒ   gÓ6›ª
@çøòÄ½CÔ¿ç8Š¤ÄKƒÑ?)r�   r„   r†   gÀc‘‰èù?çò†«>øÚ¿)r‚   r…   r‡   rˆ   gÂ-£Qõ?)g*‹ã<sAè?g³¢¼E�?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Ò„òå¿gåO
©‘L¿?g p4OÇFÌ¿g� Ïqå¿g­oš-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ÝVaÐUì?çø˜›±`A@ç5“ýF€ï?çÔ9Ô)n@é¿ç€îcñÑ¿©r�   gµÚ{ú¥§¿ç.<íøÕ?ç~õýÏËê¿çÔ:]³èÅ?©r�   r”   g@33ôë¿ç �5Ð:²°¿ç¦ä¤IŒâö¿©r‘   r•   r˜   gÐ¹ÛõÒTú¿ç¦F¦K°Õ¿©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‰   ©g÷iG7ã°±?glµ$“•W�¿gÀü€ÍZæä¿g-ðOˆ|Î¿g¦mô‚/ë¿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_zeror1   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  ˆ|¡ }|r°t	t  
t|ƒ| ¡|d | kdƒ n	tt|ƒ|kdƒ t||| kdƒ qZq%qq
d S )Nr   rE   )Úeasyr   r   ))iìÿÿÿiñÿÿÿ)éöÿÿÿéûÿÿÿ)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   1  rf   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>c                    ó   ˆ S rh   r&   rc   rj   r&   r'   re   2  rf   c                    r§   rh   r&   rc   rl   r&   r'   re   3  rf   rn   )rs   rt   ç      à?))r¦   r*   )r¨   r‰   )gÍÌÌÌÌÌì?g)\�Âõ(ð?c                 S   ra   rb   r&   rc   r&   r&   r'   re   L  rf   c                    r§   rh   r&   rc   rj   r&   r'   re   M  rf   c                    r§   rh   r&   rc   rl   r&   r'   re   N  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    ÚpytestÚmarkÚ	fail_slowr¶   r&   r&   r&   r'   r\   —   s    
r\   )Ú__doc__r·   Ú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