o
    h8                     @   s   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 dZG dd	 d	e	Zejd
eegejdddgdd ZdS )    N)deepcopy)norm)TestCaseassert_array_almost_equalassert_array_equalassert_array_less)BFGSSR1c                   @   s2   e Zd ZdZdddZdd Zdd	 Zd
d ZdS )
RosenbrockzRosenbrock function.

    The following optimization problem:
        minimize sum(100.0*(x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0)
       r   c                 C   s,   t j|}|dd|| _t || _d S )N   )nprandomRandomStateuniformx0onesx_opt)selfnrandom_staterng r   e/var/www/vscode/kcb/lib/python3.10/site-packages/scipy/optimize/tests/test_hessian_update_strategy.py__init__   s   zRosenbrock.__init__c                 C   sP   t |}t jd|dd  |d d d  d  d|d d  d  dd}|S )Ng      Y@r   r   g       @r   )axis)r   asarraysum)r   xrr   r   r   fun   s
   
:zRosenbrock.func                 C   s   t |}|dd }|d d }|dd  }t |}d||d   d||d   |  dd|   |dd< d|d  |d |d d   dd|d    |d< d|d |d d   |d< |S )	Nr   r   r        pr   )r   r   
zeros_like)r   r   xmxm_m1xm_p1derr   r   r   grad   s   


4zRosenbrock.gradc                 C   s   t |}t d|d d  dt d|d d  d }t jt||jd}d|d d  d|d   d |d< d	|d< d
d|dd d   d|dd    |dd< |t | }|S )Nr%   r   r   r$   )dtypei  r   r   r#      )r   
atleast_1ddiagzeroslenr,   )r   r   Hdiagonalr   r   r   hess*   s   
0$0zRosenbrock.hessN)r   r   )__name__
__module____qualname____doc__r   r!   r+   r4   r   r   r   r   r
      s    
r
   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestHessianUpdateStrategyc           
   	   C   s.  d}t g dg dg dg dg dg}dt |fdt |d ft d	|d	 t | t d	|d	 t | f||ff}d
D ]P}|D ]K\}}t|dddt|ddf}|D ]7}||| | }	t|	t | t	|t
ry|dkryq[|t |d t |d  | }	t|	| q[qHqDd S )N   )+      !   "   1   )r<   $   ,      rA   )r=   rA   %   r      )r>   rB   r   r:   .   )r?   rA   rD   rE      autor   r   r4   inv_hessgd~QJskip_update)
init_scalemin_curvatureexception_strategyrK   min_denominatorgh㈵>g?)r   arrayeyearanger   r	   
initialize
get_matrixr   
isinstancestrupdater   )
r   ndimssymmetric_matrixinit_scalesapprox_typerK   true_matrixquasi_newtonqnBr   r   r   test_hessian_initialization8   sH   
 z5TestHessianUpdateStrategy.test_hessian_initializationc           	      C   s$  d}t ddtftg dtjdtftg dg dg dgtjdtftg d	gtd
tftg dg dg dgtdtff}dD ]B}|D ]=\}}}t	|dt
|df}|D ]+}||| tj||d |t|t| W d    n1 sw   Y  qbqQqMd S )N   gQ	@zFfloat\(\) argument must be a string or a (real )?number, not 'complex')g	@gffffff@g333333?z3init_scale contains complex elements, must be real.)r;   r<   r=   )r<   r@   rA   )r=   rA   rC   )r;   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@r@   rA   z}If init_scale is an array, it must be symmetric (passing scipy.linalg.issymmetric) to be an approximation of a hess/inv_hess.rH   rK   )match)complex	TypeErrorr   rP   astype
complex128reescape
ValueErrorr   r	   rS   pytestraisesrW   r   rR   )	r   rX   inits_msg_errtyper[   rK   message	errortyper]   r^   r   r   r   test_initialize_catch_illegalc   sZ   

"z7TestHessianUpdateStrategy.test_initialize_catch_illegalc                    s  t d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(fd)d*D  fd+d*ttd, D } fd-d*tt d, D }t||D ]\}}t||d.krt qtd,d/d0td,d1fD ]^}t	|}t	|}|
td. d2 |
td. d3 t||D ]$\}}||| ||| | }| }	ttj||	d4d5 q	t| }
tt||
 t|
 d6 qd S )7Nr:   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~?c                       g | ]}  |qS r   r+   .0r   probr   r   
<listcomp>       zOTestHessianUpdateStrategy.test_rosenbrock_with_no_exception.<locals>.<listcomp>c                    ,   g | ]}t  |d   t  |  qS r   r   rP   r   ix_listr   r   r          $r   c                        g | ]} |d    |  qS r   r   r   	grad_listr   r   r          r   g-C6?rK   rL   rd   r4   rI   
   )decimalg?)r
   ranger1   zipr   dotArithmeticErrorr   r	   r   rS   rW   rT   r   linalginvr4   r   r   )r   delta_x
delta_gradsyr]   r4   rI   r_   r2   B_truer   r   r   r   r   !test_rosenbrock_with_no_exception   s   

	
 !"#$%'


z;TestHessianUpdateStrategy.test_rosenbrock_with_no_exceptionc           	         sf  t d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fddD  fddttd D } fddtt d D }tddd}|td d tt|d D ]}|| }|| }||| qt| }|d }|d }||| t| }t	|| d S ) Nr:   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   c                    r   r   r   r   r   r   r   r      r   zBTestHessianUpdateStrategy.test_SR1_skip_update.<locals>.<listcomp>c                    r   r   r   r   r   r   r   r      r   r   c                    r   r   r   r   r   r   r   r      r   g{Gz?rN   r   r4      )
r
   r   r1   r	   rS   rW   r   copyrT   r   	r   r   r   r4   r   r   r   r_   	B_updatedr   r   r   test_SR1_skip_update   sP   


z.TestHessianUpdateStrategy.test_SR1_skip_updatec           	         s  t ddg dg dg dg dg dg dg d	gfd
dD  fddttd D } fddtt d D }tddd}|td d tt|d D ]}|| }|| }||| q[t| }|d }|d }||| t| }t	|| d S )Nr:   rs   rt   ru   rv   rw   rx   ry   rz   c                    r   r   r   r   r   r   r   r     r   zCTestHessianUpdateStrategy.test_BFGS_skip_update.<locals>.<listcomp>c                    r   r   r   r   r   r   r   r     r   r   c                    r   r   r   r   r   r   r   r     r   r   r   r   r4   )
r
   r   r1   r   rS   rW   r   r   rT   r   r   r   r   r   test_BFGS_skip_update  s8   


z/TestHessianUpdateStrategy.test_BFGS_skip_updateN)r5   r6   r7   r`   rr   r   r   r   r   r   r   r   r9   5   s    +1E,r9   strategyr[   r4   rI   c                 C   s<   | dd}| d| tddg}t|| || d S )Nr   rd   r   )rS   r   rP   r   r   )r   r[   r2   vr   r   r   test_matmul_equals_dot&  s   
r   )rj   r   r   numpyr   rm   numpy.linalgr   numpy.testingr   r   r   r   scipy.optimizer   r	   r
   r9   markparametrizer   r   r   r   r   <module>   s    ) r