
    bi5S                         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      Z G d	 d
      Z G d d      Zy)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                 `   t         j                  j                  |      }|j                  dd| | f      }t	        |d      \  }}}|j                  |||       }t        j
                  |      d d d   }t        j                  ||      }	t        j                  |	|j                        }
|dk(  rIt        j                  |       }|j                  dd| dz
        |d d t        j                  ||      }|
|fS |dk(  rt        j                  |       }|
|fS |j                  dd|       }|
|fS )N   )lowhighsizeTrue)pivotinghardjac_equal_zero)
nprandomdefault_rnguniformr	   sortmultiplydotTzeros)nmin_eigmax_eigcaserngrandQ_	eigvaluesQauxAgs               f/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/scipy/optimize/tests/test_trustregion_exact.pyrandom_entryr.      s'   
))


$C ;;2AQF;3D 'GAq! gA>I	"4R4(I ;;y!$D
tQSSA v~HHQK!!A#6#2FF1aL a4K 
!	!HHQK a4K KKBQQK/a4K    c                       e Zd Zd Zy)!TestEstimateSmallestSingularValuec                     t        j                  g dg dg dg dg      }t        |      \  }}}|d   }|dd d f   }t        |      \  }}t	        ||d       t	        t        |      t        |      d       y )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zmins	            r-    test_for_ill_condiotioned_matrixzBTestEstimateSmallestSingularValue.test_for_ill_condiotioned_matrix1   s}     HHl&$#% & q61b R5b!e9 6a8
d 	"$!<!#d)S]AFr/   N)__name__
__module____qualname__rH    r/   r-   r1   r1   /   s    Gr/   r1   c                       e Zd Zd Zd Zd Zy)TestSingularLeadingSubmatrixc                 n   t        j                  g dg dg dg      }t        d|f      \  } ||ddd      \  }}t        |||      \  }}||dz
  |dz
  fxx   |z  cc<   t	        t        |d |d |f         d	       t        j                  |t        j                  ||            }t	        |d	       y )
N)r   r3   r4   )r3   r5      )r4   rP      potrfFTloweroverwrite_acleanr   r   r   r=   r   r   r   r   r   r?   r+   choleskyckdeltavquadratic_terms           r-   +test_for_already_singular_leading_submatrixzHTestSingularLeadingSubmatrix.test_for_already_singular_leading_submatrixJ   s     HHi! "
 %Z!6	 EF1-aA6q	!A#qs(u 	"#aBQBi.!4 266!Q<0!.!4r/   c                 z   t        j                  g dg dg dg dg dg      }t        d|f      \  } ||ddd	      \  }}t        |||      \  }}||d
z
  |d
z
  fxx   |z  cc<   t	        t        |d |d |f         d       t        j                  |t        j                  ||            }t	        |d       y )N)r   r3   r4   r7   r;   )r3   rP   rP   r9   r   )r4   rP      r   r3   )r7   r9   r   r7   rP   )r;   r   r3   rP   r;   rR   FTrT   r   r   )r   asarrayr   r   r   r   r   rY   s           r-   #test_for_simetric_indefinite_matrixz@TestSingularLeadingSubmatrix.test_for_simetric_indefinite_matrixc   s     JJ'(''	) * %Z!6	 EF1-aA6q	!A#qs(u 	"#aBQBi.!4 266!Q<0!.!4r/   c                 n   t        j                  g dg dg dg      }t        d|f      \  } ||ddd      \  }}t        |||      \  }}||dz
  |dz
  fxx   |z  cc<   t	        t        |d |d |f         d	       t        j                  |t        j                  ||            }t	        |d	       y )
N)r   r4   rb   )r4      rP   )rb   rP   rQ   rR   FTrT   r   r   rX   rY   s           r-   $test_for_first_element_equal_to_zerozATestSingularLeadingSubmatrix.test_for_first_element_equal_to_zero~   s     HHj  " #
 %Z!6	 EF1-aA6q	!A#qs(u 	"#aBQBi.!4 266!Q<0!.!4r/   N)rI   rJ   rK   r`   rd   rg   rL   r/   r-   rN   rN   H   s    52565r/   rN   c                       e Zd Zd Zd Zd Zd Zd Zej                  j                  d      ej                  j                  d      d	               Zd
 Zy)TestIterativeSubproblemc                     g dg dg dg dgg dd}t        dd fd	fd
dd      }|j                  |      \  }}t        |g d       t        |d       y )Nr:   r3   r4   r5   r3   r   r7   r   r4   r7   r   r7   r5   r   r7   r3   )r   r   r   r   r   r   c                      yNr   rL   xs    r-   <lambda>z@TestIterativeSubproblem.test_for_the_easy_case.<locals>.<lambda>       r/   c                 .    t        j                        S Nr   r=   rr   r,   s    r-   rs   z@TestIterativeSubproblem.test_for_the_easy_case.<locals>.<lambda>       BHHQK r/   c                 .    t        j                        S rv   rw   rr   Hs    r-   rs   z@TestIterativeSubproblem.test_for_the_easy_case.<locals>.<lambda>       RXXa[ r/   绽|=rr   funjachessk_easyk_hard)g8<bp?ggEg v?gˍ۪߿Tr   solver   )r?   trust_radiussubprobphits_boundaryr|   r,   s        @@r-   test_for_the_easy_casez.TestIterativeSubproblem.test_for_the_easy_case   sr        &*5*?+@-2-24 #==6=!! &? 	@!-6r/   c                     g dg dg dg dgg dd}d}t        dd	 fd
fddd      }|j                  |      \  }}t        | |j                         y )Nrk   rl   rm   rn   )gAS@r   r   r   grvf(n r   r   c                      yrp   rL   rq   s    r-   rs   z@TestIterativeSubproblem.test_for_the_hard_case.<locals>.<lambda>   rt   r/   c                 .    t        j                        S rv   rw   rx   s    r-   rs   z@TestIterativeSubproblem.test_for_the_hard_case.<locals>.<lambda>   ry   r/   c                 .    t        j                        S rv   rw   r{   s    r-   rs   z@TestIterativeSubproblem.test_for_the_hard_case.<locals>.<lambda>   r}   r/   r~   r   )r   r   r   lambda_current)r?   rB   r   r   r   r   r|   r,   s         @@r-   test_for_the_hard_casez.TestIterativeSubproblem.test_for_the_hard_case   so      *  &*5*?+@-2-24 #==6=!1"g&<&<=r/   c                    g dg dg dg dg dgg dt        dd fd	fd
      }|j                  d      \  }}t        |g d       t        |d       t        |j                  d       t        |j                  d       y )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                      yrp   rL   rq   s    r-   rs   zGTestIterativeSubproblem.test_for_interior_convergence.<locals>.<lambda>   rt   r/   c                 .    t        j                        S rv   rw   rx   s    r-   rs   zGTestIterativeSubproblem.test_for_interior_convergence.<locals>.<lambda>   ry   r/   c                 .    t        j                        S rv   rw   r{   s    r-   rs   zGTestIterativeSubproblem.test_for_interior_convergence.<locals>.<lambda>   r}   r/   )rr   r   r   r   皙?)g8b҄gO
L?gp4OF̿g qgo-7?Fr   )r   r   r   r   niterr?   r   r   r   r|   r,   s       @@r-   test_for_interior_convergencez5TestIterativeSubproblem.test_for_interior_convergence   s    HJILJ	L J &*5*?+@B #==-=!! &? 	@!-7!'"8"8!<!'--3r/   c                     g dg dg dg dg dgg dt        dd fd	fd
dd      }|j                  d      \  }}t        |g d       t        |d       y )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                      yrp   rL   rq   s    r-   rs   zATestIterativeSubproblem.test_for_jac_equal_zero.<locals>.<lambda>   rt   r/   c                 .    t        j                        S rv   rw   rx   s    r-   rs   zATestIterativeSubproblem.test_for_jac_equal_zero.<locals>.<lambda>   ry   r/   c                 .    t        j                        S rv   rw   r{   s    r-   rs   zATestIterativeSubproblem.test_for_jac_equal_zero.<locals>.<lambda>   r}   r/   r~   r   r   giG7㰱?gl$WgZg-O|οgm/Tr   r   s       @@r-   test_for_jac_equal_zeroz/TestIterativeSubproblem.test_for_jac_equal_zero   sn    KKLLM	O  &*5*?+@-2-24 #==-=!! &3 	4 	"-6r/   c                     g dg dg dg dg dgg dt        dd fd	fd
dd      }|j                  d      \  }}t        |g d       t        |d       y )Nr   r   r   r   r   )r   r   r   r   gV瞯<r   c                      yrp   rL   rq   s    r-   rs   zITestIterativeSubproblem.test_for_jac_very_close_to_zero.<locals>.<lambda>  rt   r/   c                 .    t        j                        S rv   rw   rx   s    r-   rs   zITestIterativeSubproblem.test_for_jac_very_close_to_zero.<locals>.<lambda>	  ry   r/   c                 .    t        j                        S rv   rw   r{   s    r-   rs   zITestIterativeSubproblem.test_for_jac_very_close_to_zero.<locals>.<lambda>
  r}   r/   r~   r   r   r   Tr   r   s       @@r-   test_for_jac_very_close_to_zeroz7TestIterativeSubproblem.test_for_jac_very_close_to_zero   sn    KKLLM	O   &*5*?+@-2-24 #==-=!! &3 	4 	"-6r/   zfails in parallel)reasonr:   c                    t         j                  j                  d      }d}dD ]  }g d}|D ]  \  }}t        |||||      \  g d}|D ]~  }t	        dd fd	fd
dd      }	|	j                  |      \  }
}dt        j                  |
t        j                  |
            z  t        j                  |
      z   }g d}|D ]  \  }}t        |dz
  dt        j                  |      z
        }d|z
  }t	        dd fdfd||      }|j                  |      \  }}dt        j                  |t        j                  |            z  t        j                  |      z   }|r5t        t        j                  t        |      |z
        |dz
  |z  k  d       nt        t        |      |k  d       t        |||z  k  d           y )Nr   rP   )easyr   r   ))ii))r   r   )r   rP   )r   r:   )r   r:   )rP   r:   )      )r%   )	皙?g333333?g333333?r8   r   g333333?gffffff
@g      @r:   r   c                      yrp   rL   rq   s    r-   rs   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>2  rt   r/   c                     S rv   rL   rx   s    r-   rs   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>3      q r/   c                     S rv   rL   r{   s    r-   rs   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>4  r   r/   r~   )r   r         ?))r   r3   )r   r   )g?g)\(?c                      yrp   rL   rq   s    r-   rs   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>M  rt   r/   c                     S rv   rL   rx   s    r-   rs   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>N       r/   c                     S rv   rL   r{   s    r-   rs   zATestIterativeSubproblem.test_for_random_entries.<locals>.<lambda>O  r   r/   T)r   r   r   r.   r   r   r   minsqrtr   r>   r
   r   )r?   r%   r!   r$   
eig_limitsr"   r#   trust_radius_listr   
subprob_acp_achits_boundary_acJ_acstop_criteriak_optk_trfr   r   r   r   r   Jr|   r,   s                         @@r-   test_for_random_entriesz/TestIterativeSubproblem.test_for_random_entries  s    ii##A& 6 C	<D$J %/ 8<  $Aw3G1 %O!$5 0<L!4Q5@5@5@<A<A"CJ .8-=-=l-K*D* rvvdBFF1dO<<RVVAt_LD%2M )6 <u "%U1W%&rwwu~%5"7!"5 #6a6A6A6A=C=C#E ,3==+F(=  q"&&A, 77q!D ).rvvd1gl6J/K05a/E0FGKM )aL)@$G %Q%*_d;=<%0<8<C	<r/   c                    t        j                  g dg dg dg dg dg dg dg dg dg d	g d
g dg dg dg dg dg dg dg dg      t        j                  g d      ddg}|D ]d  }t        dd fdfddd|      }d}|j                  |      \  }}| |j                  t        j
                  k  rRJ |j                  |k  rdJ  y)zRegression test for gh-12513)g`]B@nضo}crs'@9bS.Q- 8w r   8T`w^ѿ-U\v\?炾_j@R^ݸiT[ʢ]LX?篍>'@,:Y,>7*3?)r   "J@XWmх?%6@x(,@r   yֱ@ַ#@&8L0@皇lB|sɂ(h0s?	@Fyb@{P(CfR?爏c)r   r   gϠrm@G)ܿP{ۍ`t<r   8$p&
>Jwy>b*P gc\@K@畑E1@!a"*%DS	5Vh	@k	ؒ@)r   r   r   gOhj?L ?Z"'?r   \,8Q?ZϪޡy?Mؤh?B?NR?HOAK9%?琒O$V?>fB?OZ?ϗ@dA )r   r   r   r  g3333@J_@r   r`J@"<5@|DL$d@JZRU]Ջ)T@~?@l%H@祿U"翀^sw7 [Z@ 8)&)r   r   r  r  r  g<A?r   x극B@sd^[?烙b?睶c~7%7F8Qt?Bd?7`ƭ?Vu]ܿ{jfu?BE)r   r   r  r  r  r)  r   g~@sϡ*J@WE@砇}Q4q%@?.XG? }#: @pr*@ݦg	oB@TY"_2#?/)S)r   r   r  r  r  r*  r   r5  gBw[E@<ۤbs@W#y4uֲ>Иe);M>''@Ѐz3jXD@!xtJ>ICı=฿crZ?)r   r   r  r  r  r+  r   r6  r@  gR,@珉f`bB<tk3mIE۶T@ۄ{e6r@ǫ#u!qs =磴?)r   r   r  r  r   r,  r   r7  rA  rJ  g6mkS@[z4Ud@罹l25ם<9
x>HO$d@瓊_l@瀛o{폽@)r   r   r  r  r!  r-  r   r8  rB  rK  rS  gI~w@u'|rfF>ɋ[餭 '@}@+LcEV!@)r   r   r  r  r"  r.  r   r9  rC  rL  rT  r[  gR3Z?A	#?jG@7VeeG|83緭v,?/yng)r   r   r  r  r#  r/  r   r:  rD  rM  rU  r\  rb  gGb:@G>_R@`)Y禀\ɍ^?9o2)r   r   r	  r  r$  r0  r   r;  rE  rN  rV  r]  rc  rh  g6x"m@oe%JnqvyN?~+)r   r   r
  r  r%  r1  r   r<  rF  rO  rW  r^  rd  ri  rm  gbS?RBU>@WUKܿsliq?)r   r   r  r  r&  r2  r   r=  rG  rP  rX  r_  re  rj  rn  rq  g<8bM@Q;*ʔ K6@)r   r   r  r  r'  r3  r   r>  rH  rQ  rY  r`  rf  rk  ro  rr  rt  g&Ad?aBI)r   r   r  r  r(  r4  r   r?  rI  rR  rZ  ra  rg  rl  rp  rs  ru  rv  gC	f@)gqՠgbk>g6ߓR>gI눑gXF;>g)	@AnN>g\>ghM>gV֕gH4>Sg͜>gsCa!T>g'sdg6KJg~|WRg,Nh>g		>gZ|O>g+ݱf>Nr:   r   c                      yrp   rL   rq   s    r-   rs   zNTestIterativeSubproblem.test_for_finite_number_of_iterations.<locals>.<lambda>  rt   r/   c                     S rv   rL   )rr   r   s    r-   rs   zNTestIterativeSubproblem.test_for_finite_number_of_iterations.<locals>.<lambda>  s    a r/   c                     S rv   rL   r{   s    r-   rs   zNTestIterativeSubproblem.test_for_finite_number_of_iterations.<locals>.<lambda>  s    q r/   r   g?)rr   r   r   r   r   r   maxiterr   )r   r=   r   r   r   MAXITER_DEFAULT)	r?   subproblem_maxiterrz  r   r   r   r   r|   r   s	          @@r-   $test_for_finite_number_of_iterationsz<TestIterativeSubproblem.test_for_finite_number_of_iterationsb  s   HH>
>
<
@
=
@
>
=
?
?
<
<
?
>
>
>
<
?
=u^>`
B HH 
  #BZ) 	0G) G L&}}\:A}}}(;(K(KKKK}}///#	0r/   N)rI   rJ   rK   r   r   r   r   r   pytestmarkthread_unsafe	fail_slowr   r}  rL   r/   r-   ri   ri      sb    74>24.7070 [[&9:[[2I<  ;I<X}0r/   ri   rv   )__doc__r~  numpyr   !scipy.optimize._trustregion_exactr   r   r   scipy.linalgr   r   r   r	   r
   numpy.testingr   r   r   r.   r1   rN   ri   rL   r/   r-   <module>r     s[       @ ?D D>G G2M5 M5`G0 G0r/   