a
    Re'                     @   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randomZRandomStateuniformZx0ZonesZx_opt)selfnZrandom_staterng r   e/var/www/sunrise/env/lib/python3.9/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   )Z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   Z
zeros_like)r   r   ZxmZxm_m1Zxm_p1Z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   Z
atleast_1dZdiagzeroslenr!   )r   r   HZdiagonalr   r   r   hess'   s    
0$0zRosenbrock.hessN)r   r   )__name__
__module____qualname____doc__r   r   r    r&   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   r&   )r   r	   
initialize
get_matrixr   r   Zeye)r   quasi_newtonqnBr   r   r   test_hessian_initialization4   s
    z5TestHessianUpdateStrategy.test_hessian_initializationc              '      sH  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 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 ]"\}}t||d.krJt qJtd,d/d0td,d1fD ]}t	|}t	|}|
td. d2 |
td. d3 t||D ]H\}}||| ||| | }| }	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(?rG   gW3?)gk_k  ?gsQo?  ?g`&@ ?g@ ?)g?gׇP  ?g7  ?rH   g;U  ?)P?g`P^?g?g&q?g?)rI   rI   rI   rI   g~?c                    s   g | ]}  |qS r   r    .0r   probr   r   
<listcomp>l       zOTestHessianUpdateStrategy.test_rosenbrock_with_no_exception.<locals>.<listcomp>c                    s,   g | ]$}t  |d   t  |  qS r   r   arrayrL   ix_listr   r   rO   m   s   r   c                    s    g | ]} |d    |  qS rQ   r   rT   	grad_listr   r   rO   o   s   r   g-C6?
init_scaleZmin_curvature)r[   r&   inv_hess
   )decimalg?)r
   ranger$   zipr   dotArithmeticErrorr   r	   r   r-   updater.   r   Zlinalginvr&   r   r   )r   delta_x
delta_gradsyr/   r&   r\   r1   r%   ZB_truer   rY   rN   rW   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 ] }|| }|| }||| qt| }|d }|d }||| t| }t	|| d S ) Nr,   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   c                    s   g | ]}  |qS r   rJ   rK   rM   r   r   rO      rP   zBTestHessianUpdateStrategy.test_SR1_skip_update.<locals>.<listcomp>c                    s,   g | ]$}t  |d   t  |  qS rQ   rR   rT   rV   r   r   rO      s   r   c                    s    g | ]} |d    |  qS rQ   r   rT   rX   r   r   rO      s   g{Gz?)r[   Zmin_denominatorr   r&      )
r
   r_   r$   r	   r-   rc   r   copyr.   r   	r   re   rf   r&   rU   rg   rh   r1   Z	B_updatedr   ri   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 ] }|| }|| }||| qt| }|d }|d }||| t| }t	|| d S )Nr,   r3   r4   r5   r6   r7   r8   r9   r:   c                    s   g | ]}  |qS r   rJ   rK   rM   r   r   rO      rP   zCTestHessianUpdateStrategy.test_BFGS_skip_update.<locals>.<listcomp>c                    s,   g | ]$}t  |d   t  |  qS rQ   rR   rT   rV   r   r   rO      s   r   c                    s    g | ]} |d    |  qS rQ   r   rT   rX   r   r   rO      s   r]   rZ   r   r&   )
r
   r_   r$   r   r-   rc   r   rl   r.   r   rm   r   ri   r   test_BFGS_skip_update   s8    


z/TestHessianUpdateStrategy.test_BFGS_skip_updateN)r'   r(   r)   r2   rj   rn   ro   r   r   r   r   r+   2   s   E,r+   )numpyr   rl   r   Znumpy.linalgr   Znumpy.testingr   r   r   r   Zscipy.optimizer   r	   r
   r+   r   r   r   r   <module>   s   )