o
    i'                     @   sj   d dl Zd dlm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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   l/var/www/edux/Edux_v2/venv/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                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestHessianUpdateStrategyc                 C   s>   t  t f}|D ]}|dd | }t|td qd S )N   r4   )r   r	   
initialize
get_matrixr   r   eye)r   quasi_newtonqnBr   r   r   test_hessian_initialization4   s   z5TestHessianUpdateStrategy.test_hessian_initializationc                    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(?rV   gW3?)gk_k  ?gsQo?  ?g`&@ ?g@ ?)g?gׇP  ?g7  ?rW   g;U  ?)P?g`P^?g?g&q?g?)rX   rX   rX   rX   g~?c                       g | ]}  |qS r   r+   .0r   probr   r   
<listcomp>l       zOTestHessianUpdateStrategy.test_rosenbrock_with_no_exception.<locals>.<listcomp>c                    ,   g | ]}t  |d   t  |  qS r   r   arrayr\   ix_listr   r   r_   m       $r   c                        g | ]} |d    |  qS rb   r   re   	grad_listr   r   r_   o       r   g-C6?
init_scalemin_curvature)ro   r4   inv_hess
   )decimalg?)r
   ranger1   zipr   dotArithmeticErrorr   r	   r   r;   updater<   r   linalginvr4   r   r   )r   delta_x
delta_gradsyr>   r4   rq   r@   r2   B_truer   rl   r^   rh   r   !test_rosenbrock_with_no_exceptionA   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:   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   c                    rY   r   rZ   r[   r]   r   r   r_      r`   zBTestHessianUpdateStrategy.test_SR1_skip_update.<locals>.<listcomp>c                    ra   rb   rc   re   rg   r   r   r_      ri   r   c                    rj   rb   r   re   rk   r   r   r_      rm   g{Gz?)ro   min_denominatorr   r4      )
r
   rt   r1   r	   r;   rx   r   copyr<   r   	r   r{   r|   r4   rf   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:   rB   rC   rD   rE   rF   rG   rH   rI   c                    rY   r   rZ   r[   r]   r   r   r_      r`   zCTestHessianUpdateStrategy.test_BFGS_skip_update.<locals>.<listcomp>c                    ra   rb   rc   re   rg   r   r   r_      ri   r   c                    rj   rb   r   re   rk   r   r   r_      rm   rr   rn   r   r4   )
r
   rt   r1   r   r;   rx   r   r   r<   r   r   r   r   r   test_BFGS_skip_update   s8   


z/TestHessianUpdateStrategy.test_BFGS_skip_updateN)r5   r6   r7   rA   r   r   r   r   r   r   r   r9   2   s
    E,r9   )numpyr   r   r   numpy.linalgr   numpy.testingr   r   r   r   scipy.optimizer   r	   r
   r9   r   r   r   r   <module>   s    )