
    sg7                         d dl Z d dlmZ d dlZd dlZd dlmZ d dlm	Z	m
Z
mZmZ d dlmZmZ  G d d      Z G d d	e	      Zy)
    N)deepcopy)norm)TestCaseassert_array_almost_equalassert_array_equalassert_array_less)BFGSSR1c                   *    e Zd ZdZddZd Zd Zd Zy)
RosenbrockzRosenbrock function.

    The following optimization problem:
        minimize sum(100.0*(x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0)
    c                     t         j                  j                  |      }|j                  dd|      | _        t        j
                  |      | _        y )N   )nprandomRandomStateuniformx0onesx_opt)selfnrandom_staterngs       d/var/www/html/venv/lib/python3.12/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py__init__zRosenbrock.__init__   s9    ii##L1++b!Q'WWQZ
    c                     t        j                  |      }t        j                  d|dd  |d d dz  z
  dz  z  d|d d z
  dz  z   d      }|S )Ng      Y@r   r   g       @r   )axis)r   asarraysum)r   xrs      r   funzRosenbrock.fun   sZ    JJqMFF5AabEAcrFCK/#55QsVc8IIr   c                 8   t        j                  |      }|dd }|d d }|dd  }t        j                  |      }d||dz  z
  z  d||dz  z
  z  |z  z
  dd|z
  z  z
  |dd d|d   z  |d   |d   dz  z
  z  dd|d   z
  z  z
  |d<   d|d   |d   dz  z
  z  |d<   |S )	Nr   r           pr   )r   r    
zeros_like)r   r"   xmxm_m1xm_p1ders         r   gradzRosenbrock.grad   s    JJqMqW#2!"mmABM*EBEM*R/023q2v,?Ab	!!qtQw/!q1Q4x.@A22)*B
r   c                    t        j                  |      }t        j                  d|d d z  d      t        j                  d|d d z  d      z
  }t        j                  t	        |      |j
                        }d|d   dz  z  d|d   z  z
  dz   |d<   d	|d<   d
d|dd dz  z  z   d|dd  z  z
  |dd |t        j                  |      z   }|S )Nr*   r   r   r)   )dtypei  r   r'   r(      )r   
atleast_1ddiagzeroslenr2   )r   r"   Hdiagonals       r   hesszRosenbrock.hess*   s    MM!GGD1Sb6M1%afb(AA88CF!''2QqT1WnsQqTz1A5ta"gqj00312;>2!!r   N)r'   r   )__name__
__module____qualname____doc__r   r$   r0   r:    r   r   r   r      s     

r   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestHessianUpdateStrategyc           	      :   d}t        j                  g dg dg dg dg dg      }dt        j                  |      fdt        j                  |      dz  ft        j                  d	|d	z         t        j                  |      z  t        j                  d	|d	z         t        j                  |      z  f||ff}d
D ]  }|D ]  \  }}t	        |dd      t        |d      f}|D ]  }|j                  ||       |j                         }	t        |	t        j                  |             t        |t              r|dk(  rZ|j                  t        j                  |      dz  t        j                  |      dz          |j                         }	t        |	|          y )N   )+      !   "   1   )rE   $   ,      rJ   )rF   rJ   %   r      )rG   rK   r   rC   .   )rH   rJ   rM   rN      autor'   r   r:   inv_hessgd~QJskip_update)
init_scalemin_curvatureexception_strategyrT   min_denominatorgh㈵>g?)r   arrayeyearanger	   r
   
initialize
get_matrixr   
isinstancestrupdater   )
r   ndimssymmetric_matrixinit_scalesapprox_typerT   true_matrixquasi_newtonqnBs
             r   test_hessian_initializationz5TestHessianUpdateStrategy.test_hessian_initialization8   s   88%9%9%8%7%9	%; < RVVE]#u!"YYq%!)$rvve}4YYq%!)$rvve}46/03 0 	7K+6 7'
K !%
378E!G !$z48!: ; ' 7BMM%5A&q"&&-8!*c2zV7K IIbggent3RYYu5E5KLA&q+677	7r   c           
      h   d}t        d      t        j                  d      t        ft	        j
                  g d      j                  t        j                        dt        ft	        j
                  g dg dg dg      j                  t        j                        dt        ft	        j
                  g d	g      t        j                  d
      t        ft	        j
                  g dg dg dg      t        j                  d      t        ff}dD ]  }|D ]  \  }}}t        |      t        |      f}|D ]l  }|j                  ||       t        j                  ||      5  |j                  t	        j                  |      t	        j                   |             d d d        n   y # 1 sw Y   }xY w)N   gQ	@zAfloat() argument must be a string or a real number, not 'complex')g	@gffffff@g333333?z3init_scale contains complex elements, must be real.)rD   rE   rF   )rE   rI   rJ   )rF   rJ   rL   )rD   7   B   z`If init_scale is an array, it must have the dimensions of the hess/inv_hess: (3, 3). Got (1, 3).)g8@rI   rJ   z}If init_scale is an array, it must be symmetric (passing scipy.linalg.issymmetric) to be an approximation of a hess/inv_hess.rQ   rT   )match)complexreescape	TypeErrorr   rY   astype
complex128
ValueErrorr	   r
   r\   pytestraisesr`   r   r[   )	r   ra   inits_msg_errtyperd   rT   message	errortyperf   rg   s	            r   test_initialize_catch_illegalz7TestHessianUpdateStrategy.test_initialize_catch_illegalc   s   %dm ii )8 9 (	) !hh7>>r}}M.')
 !hh(6(6(8 99?9N.') !hh~6 ii#12 )* !hh(8(6(8 9 !ii )V W )*7"F 0 
	DK2C 	D.
GY !%
 ; #z : < ' DBMM%5y@ D		"''%."))E2BCD DD	D
	DD Ds    9F(	(F1c                    t        d      }g 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 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(}|D cg c]  }|j                  |       }}t        t        |      d)z
        D cg c]6  }t	        j
                  ||d)z            t	        j
                  ||         z
  8 }}t        t        |      d)z
        D cg c]  }||d)z      ||   z
   }}t        ||      D ](  \  }}	t	        j                  ||	      d*k  s t                t        d)d+,      t        d)-      fD ]  }
t        |
      }t        |
      }|j                  t        |d*         d.       |j                  t        |d*         d/       t        ||      D ]t  \  }}	|j                  ||	       |j                  ||	       |j                         }|j                         }t        t        j                   j#                  |      |d01       v |j%                  |t        |               }t'        t)        |z
        t)        |      z  d2        y c c}w c c}w c c}w )3NrC   r   g74D?gGYS?g6zN?gmȚ?g`4[ÿgb?g@?gL#i_/?gV!?gU';JK?gZWl?gIaLg:ߙ˩?ge ġ?g~Q?gc${?g tg
	by?g:gQ5U?gf?g$+ƈg~W?g=Ԡg>ˎ?g)	Ʊ?g]Tg10<@A?gU~g@?gBLx!%?gӖUtgY.?giƢdpg?gBv$?g`lϷ?gV;Б?g-&q?ggE?gef?g6~Z?gaK4?g$ۉ?gPBzg
c?g8ηO؏?glas?g6SdF?gӾcrgF?gDkk?gnc?g2?g;ongƇ?g:oʁ?gβ?gqn?glErDg]?gvn?g?gL]?ghc?g^ҽ0?gn(?g-^q'G?gk%?gϬ[r?g?I˒?gl?g(E,?gZ(?g; ?g}[?ge(?g1?gi&)?g=L]d?gBʚm?g͆zP?gJz?g?g ?gLD&F?g?gJ`?g-.?gos?gk?gK0?gZ!?g61n-?gHZ\?)gAi?g(?g?a3?g<0D?g5{?)gF?g	?għJ}?g{cTy?g*?)g##?go9//?g*Y\-?gE?g̶ȟ?)g)ߋ?gb8?gv?g%S;?gUn?)gX ?g]?g|x;g?g*#,&?gjm̂?)go̦-?g`_?gQ?g_rUu?gWI?)gqQ-b?gu%?gAڷ?g
r?g?)g$Y,8?g	I?gm?g݈81?gШx?)gV?gK_?g_?gYO0?gv?)g'ݖ?gG?g ?g, ?g_1?)gM;?got?gu?U?gFtz?gm
!?)g'?gI} ?g8X?g;t՗ ?g@sJ?)g?gf?gtV?gD?g,?)B?gE1Լ?gj1?gL?gA$?)g֔  ?g(?gPf(?r   gW3?)gk_k  ?gsQo?  ?g`&@ ?g@ ?)g?gׇP  ?g7  ?r   g;U  ?)P?g`P^?g?g&q?g?)r   r   r   r   g~?r   r   g-C6?rT   rU   rn   r:   rR   
   )decimalg?)r   r0   ranger7   r   rY   zipdotArithmeticErrorr	   r
   r   r\   r`   r]   r   linalginvr:   r   r   )r   probx_listr"   	grad_listidelta_x
delta_gradsyrf   r:   rR   rh   r8   B_trues                   r   !test_rosenbrock_with_no_exceptionz;TestHessianUpdateStrategy.test_rosenbrock_with_no_exception   s   A%LK %LJ%LK%L M%L M	%L
 M%L M%L K%L L%L L%L L%L L%L K%L K%L K%L K%L  K!%L" K#%L$ K%%L& K'%L( K)%L* K+%L, K-%L. K/%L0 K1%L2 K3%L4 K5%L6 K7%L8 K9%L: K;%L< K=%L> K?%L@ KA%LB KC%LD KE%LF KG%LH KI%LJ KK%LN ,22aTYYq\2	2!#f+a-02 88F1Q3K(&))<< 2 2  %S^A%568  !nYq\1 8
 8 , 	(DAqvva|q %''	( "QdC A.0 	BLL)D-HOOCq	NF3F1I
;GZ0 K1Aq!1%OO%''))"))--*:ArJK YYvc'l34Fd1v:.tF|;SA	B 328s   +J9;J>4Kc                    t        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 dg}|D cg c]  }|j                  |       }}t        t        |      dz
        D cg c]6  }t	        j
                  ||dz            t	        j
                  ||         z
  8 }}t        t        |      dz
        D cg c]  }||dz      ||   z
   }}t        dd      }|j                  t        |d         d       t        t        |      dz
        D ]  }||   }	||   }
|j                  |	|
         t	        j                  |j                               }|d   }	|d   }
|j                  |	|
       t	        j                  |j                               }t        ||       y c c}w c c}w c c}w )NrC   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   g{Gz?rW   r   r:      )r   r0   r   r7   r   rY   r
   r\   r`   copyr]   r   r   r   r   r"   r   r   r   r   r:   r   r   rh   	B_updateds                r   test_SR1_skip_updatez.TestHessianUpdateStrategy.test_SR1_skip_update   s   AKJKLLLLJKKKKJJJJJJJ%L( ,22aTYYq\2	2!#f+a-02 88F1Q3K(&))<< 2 2  %S^A%568  !nYq\1 8
 8a6F1I/s7|A~& 	A
A1AKK1	
 GGDOO%&BKrNAqGGDOO-.	1i(% 328s   F>?;GGc                 R   t        d      }g dg dg dg dg dg dg d	g}|D cg c]  }|j                  |       }}t        t        |      d
z
        D cg c]6  }t	        j
                  ||d
z            t	        j
                  ||         z
  8 }}t        t        |      d
z
        D cg c]  }||d
z      ||   z
   }}t        d
d      }|j                  t        |d         d       t        t        |      d
z
        D ]  }||   }	||   }
|j                  |	|
         t	        j                  |j                               }|d   }	|d   }
|j                  |	|
       t	        j                  |j                               }t        ||       y c c}w c c}w c c}w )NrC   r~   r   r   r   r   r   r   r   r   r   r   r   r:   )r   r0   r   r7   r   rY   r	   r\   r`   r   r]   r   r   s                r   test_BFGS_skip_updatez/TestHessianUpdateStrategy.test_BFGS_skip_update  s   AKJKLLLLN ,22aTYYq\2	2!#f+a-02 88F1Q3K(&))<< 2 2  %S^A%568  !nYq\1 8
 8q3F1I/s7|A~& 	A
A1AKK1	
 GGDOO%&AJqMAqGGDOO-.	1i(% 328s   F;F1F$N)r;   r<   r=   ri   r|   r   r   r   r?   r   r   rA   rA   5   s"    #7V0DdCBJ*)X)r   rA   )rq   r   r   numpyr   rw   numpy.linalgr   numpy.testingr   r   r   r   scipy.optimizer	   r
   r   rA   r?   r   r   <module>r      s<    	    B B && &Ro) o)r   