
    Q3j\"                        d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZmZ d dlmZmZ d	 Zej,                  j/                  d
 e             d        Zej,                  j/                  dg d      d        Zd Zy)    N)fmin_ncg)config_context)ConvergenceWarning)move_to)yield_namespace_device_dtype_combinations)Bunch)_array_api_for_testsassert_allclose)_check_optimize_result
_newton_cgc                    t         j                  j                  |       }|j                  d      t        j                  d      }fd}fdfd}fd}t        j
                  t        j                  t        |||d	      d
         dk        sJ t        t        |||d	      d
   t        |||      d       y )N)
   r   )sizer   c                 N    j                  |       }d|j                  |      z  S N      ?)dot)xAxAs     N/DATA/.local/lib/python3.12/site-packages/sklearn/utils/tests/test_optimize.pyfuncztest_newton_cg.<locals>.func   s#    UU1XbXXb\!!    c                 X    j                   j                  j                  |             S NTr   r   r   s    r   gradztest_newton_cg.<locals>.grad   s    sswwquuQx  r   c                     |j                  j                  j                  j                  | j                                           S r   )r   r   allr   pr   s     r   hessztest_newton_cg.<locals>.hess   s-    uuQSSWWQUU1557^,--r   c                      |       fdfS )Nc                 X    j                   j                  j                  |             S r   r   r   s    r   <lambda>z3test_newton_cg.<locals>.grad_hess.<locals>.<lambda>!   s    !##''!%%("3r    )r   r   r   s    r   	grad_hessz!test_newton_cg.<locals>.grad_hess    s    Aw333r   绽|=tolr   gHz>)fx0fprimefhess_pgh㈵>atol)
nprandomRandomStatenormalonesr!   absr   r
   r   )global_random_seedrngr.   r   r$   r)   r   r   s         @@r   test_newton_cgr;      s     ))

 2
3C


!A	B"!.4
 66"&&ItT25I!LMQUUVVV9dD"$7:4BtT:r   z(array_namespace, device_name, dtype_namec                 J  	
 t        | |      \  }}|j                  t        j                  ddgddgg      j	                  |      |      	|j                  t        j
                  d      j	                  |      |      |j                  t        j                  d      j	                  |      |      }	fd}	fd
	fd
fd	}t        d
      5  t        ||
|d      }ddd       t        t        d   t        d      ddgd       y# 1 sw Y   -xY w)z/Test that newton_cg works with Array API input.      )device   c                 ,    d| z  z
  z  | z  z
  z  S r   r(   r   r   ys    r   r   z1test_newton_cg_array_api_compliance.<locals>.func8   s#    a!a%i AAI..r   c                 .    j                   | z  z
  z  S r   r   rC   s    r   r   z1test_newton_cg_array_api_compliance.<locals>.grad;   s    ssa!eai  r   c                 (    j                   |z  z  S r   rF   r"   s     r   r$   z1test_newton_cg_array_api_compliance.<locals>.hess>   s    ssa!e}r   c                 "              fdfS )Nc                      |       S r   r(   )r#   r$   r   s    r   r'   zHtest_newton_cg_array_api_compliance.<locals>.grad_hess.<locals>.<lambda>B   s    $q!*r   r(   )r   r   r$   s   `r   r)   z6test_newton_cg_array_api_compliance.<locals>.grad_hessA   s    Aw,,,r   T)array_api_dispatchr*   r+   Nr   cpu)xpr@   r   g      ?r1   )r	   asarrayr3   arrayastypearanger7   r   r   r
   r   )array_namespacedevice_name
dtype_namerL   r@   r.   r   r)   resr   r   r$   rD   s            @@@@r   #test_newton_cg_array_api_compliancerU   -   s     &o{CJB


288aWr1g./66zB6
RA


299Q<&&z26
BA	BGGAJ%%j1&	AB/!- 
4	0D$> 
1 A2e,	 
1	0s   DD"verbose)r   r?   rA   c           
      v   t        j                  d      t        j                  ddgt              t	        fdfdfdt        j
                  j                  d         |       | j                         }|dk(  r|j                  d	k(  sJ g d
}|D ]  }||j                  v rJ  |dk\  rg d}|D ]  }||j                  v rJ  |dk\  rt        j                  ddgddgg      dz  t        j                  ddg      t        j                  t        t        f      5  t	        fdfdfdt        j                  ddg      |       ddd       | j                         }g d}|D ]  }||j                  v rJ  t        j                  ddgddgg      t        j                  ddg      t        j                  t              5  t	        fdfdfd|d       ddd       | j                         }dg}|D ]  }||j                  v rJ  t        j                  d      t        j                  ddg      t        j                  t        t        f      5  t	        fdfdfdt        j                  ddg      |d       ddd       | j                         }d g}|D ]  }||j                  v rJ  t        j                  g d!      t        j                  g d"      t        j                  t              5  t	        fd#fd$fd%t        j                        |dd&       ddd       | j                         }d'g}|D ]  }||j                  v rJ  yy# 1 sw Y   -xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   [xY w)(z0Test the std output of verbose newton_cg solver.rA   r?   )dtypec                     | z  z
  fdfS )Nc                     | z  S r   r(   zr   s    r   r'   z<test_newton_cg_verbosity.<locals>.<lambda>.<locals>.<lambda>U   s	    !a%r   r(   r   r   bs    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>U   s    QUQY8r   c                 &    d| z  z  | z  | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>V   s    sQw{QQ.r   c                     | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>W   s    q1uqyr   r   )r)   r   r   r.   rV    )zNewton-CG iter = 1zCheck Convergencezmax |gradient|zSolver did converge at loss = )z(Inner CG solver iteration 1 stopped withzsum(|residuals|) <= tolzLine Searchztry line search wolfe1z!wolfe1 line search was successfulg      ?   gꌠ9Y>)F       @c                     | z  z
  fdfS )Nc                     | z  S r   r(   r[   s    r   r'   z<test_newton_cg_verbosity.<locals>.<lambda>.<locals>.<lambda>}   	    !a%r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>}       QUQY$@r   c                 &    d| z  z  | z  | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>~       sQw{QQ6r   c                     | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>       q1uqyr          N)z%wolfe1 line search was not successfulz-check loss |improvement| <= eps * |loss_old|:z,check sum(|gradient|) < sum(|gradient_old|):z#last resort: try line search wolfe2g      @c                     | z  z
  fdfS )Nc                     | z  S r   r(   r[   s    r   r'   z<test_newton_cg_verbosity.<locals>.<lambda>.<locals>.<lambda>   rf   r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>   rg   r   c                 &    d| z  z  | z  | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>   ri   r   c                     | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>   rk   r   )r)   r   r   r.   rV   maxiterztiny_|p| = eps * ||p||^2c                     | z  z
  fdfS )Nc                      | z  S r   r(   r[   s    r   r'   z<test_newton_cg_verbosity.<locals>.<lambda>.<locals>.<lambda>   s    1"q&r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>   s    QUQY0@$Ar   c                 &    d| z  z  | z  | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>   ri   r   c                     | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>   rk   r   r=   z9Inner CG solver iteration 0 fell back to steepest descent)gMbP?r?   g     @@)rl   r?   rc   c                     | z  z
  fdfS )Nc                     | z  S r   r(   r[   s    r   r'   z<test_newton_cg_verbosity.<locals>.<lambda>.<locals>.<lambda>   rf   r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>   rg   r   c                 &    d| z  z  | z  | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>   ri   r   c                     | z  z
  S r   r(   r]   s    r   r'   z*test_newton_cg_verbosity.<locals>.<lambda>   rk   r   )r)   r   r   r.   rV   rq   maxinnerz*Inner CG solver stopped reaching maxiter=1)r3   eyerN   floatr   zerosshape
readouterroutpytestwarnsRuntimeWarningUserWarningr   diag	ones_like)capsysrV   capturedmsgmr   r^   s        @@r   test_newton_cg_verbosityr   N   sX    	q	A
!Qu%A8. 88AGGAJ   "H!|||r!!!
 A$$$  !|
 A$$$  !| HHsAhA'(4/HHc3Z  \\>;78@6(88T1I& 9 $$&
 A$$$ 
 HHsAhI/0HHdAY\\,-@6( . $$&&
 A$$$  FF1IHHdAY\\>;78A6(88S#J' 9 $$&G
 A$$$  GGN#HH^$\\,-@6(<<? . $$&8
 A$$$ g  98, .-* 98& .-s0   ,2N	N73N##2N/	NN #N,/N8c                  Z   t               } d| _        d| _        d| _        t	        j
                         5  t	        j                  d       t        d|        d d d        d| _        d| _        t        j                  t              5 }t        d|        d d d        t              dk(  sJ |d   j                  j                  d   }d|v sJ | j                  |v sJ d|vsJ d	|v sJ t        j                  t              5 }t        d| d
       d d d        t        |      dk(  sJ |d   j                  j                  d   }d|v sJ | j                  |v sJ d|v sJ d	|v sJ d| _        d| _        d| _        t        j                  t              5 }t        d| d
       d d d        t        |      dk(  sJ |d   j                  j                  d   }d|v sJ | j                  |v sJ d|vsJ d	|v sJ y # 1 sw Y   xY w# 1 sw Y   wxY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr?   r   OKerrorlbfgsz+STOP: TOTAL NO. OF ITERATIONS REACHED LIMITz-lbfgs failed to converge after 1 iteration(s)z!Increase the number of iterationszscale the data)max_iterrA   ABNORMALr   z-lbfgs failed to converge after 2 iteration(s))r   nitstatusmessagewarningscatch_warningssimplefilterr   r   r   r   lenargs)resultrecordwarn_msgs      r   test_check_optimizer      s3   WF FJFMFN		 	 	"g&w/ 
# FMBFN	(	)Vw/ 
* v;!ay  %%a(H:hFFF>>X%%%.h>>>x''' 
(	)Vw; 
* v;!ay  %%a(H:hFFF>>X%%%.(:::x''' FJFMFN	(	)Vw< 
* v;!ay  %%a(H:hFFF>>X%%%.h>>>x'''W 
#	" 
*	) 
*	) 
*	)s/   "G:HHH!:HHH!H*)r   numpyr3   r   scipy.optimizer   sklearnr   sklearn.exceptionsr   sklearn.utils._array_apir   r   sklearn.utils._bunchr   sklearn.utils._testingr	   r
   sklearn.utils.optimizer   r   r;   markparametrizerU   r   r   r(   r   r   <module>r      s       # " 1 W & H E< .-/	: I.y% /y%x4(r   