U
    ?h'                     @   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   c/var/www/html/venv/lib/python3.8/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diagZ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   eye)r   quasi_newtonqnBr   r   r   test_hessian_initialization4   s
    z5TestHessianUpdateStrategy.test_hessian_initializationc              *      s,  t dddddddgdd	d
ddgdddddgdddddgdddddgddddd gd!d"d#d$d%gd&d'd(d)d*gd+d,d-d.d/gd0d1d2d3d4gd5d6d7d8d9gd:d;d<d=d>gd?d@dAdBdCgdDdEdFdGdHgdIdJdKdLdMgdNdOdPdQdRgdSdTdUdVdWgdXdYdZd[d\gd]d^d_d`dagdbdcdddedfgdgdhdidjdkgdldmdndodpgdqdrdsdtdugdvdwdxdydzgd{d|d}d~dgdddddgdddddgdddddgdddddgdddddgdddddgdddddgdddddgdddddgdddddgdddddgdddddgdddddgg&fddD  fddttd D } fddtt d D }t||D ]"\}}t||dkr.t q.tdddtddÍfD ]}t	|}t	|}|
td dġ |
td dš t||D ]H\}}||| ||| | }| }	ttj||	ddǍ qt| }
tt||
 t|
 dȃ qhd S )Nr+   r   74D?GYS?6zN?mȚ?`4[ÿb?@?L#i_/?V!?U';JK?ZWl?IaL:ߙ˩?e ġ?~Q?痌c${? t
	by?:Q5U?f?$+ƈ~W?=Ԡ>ˎ?)	Ʊ?]T10<@A?U~磽@?BLx!%?ӖUt矯Y.?iƢdp?Bv$?`lϷ?皃V;Б?-&q?gE?秏ef?6~Z?aK4?$ۉ?PBz
c?8ηO؏?las?6SdF?ӾcrF?Dkk?nc?2?;onƇ?:oʁ?β?qn?絛lErD]?vn??L]?hc?^ҽ0?n(?-^q'G?k%?Ϭ[r??I˒?l?(E,?Z(?; ?}[?e(?1?i&)?=L]d?Bʚm?͆zP?Jz?? ?LD&F??J`?-.?os?k?K0?Z!?61n-?HZ\?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,?gB?gE1Լ?gj1?gL?gA$?g֔  ?g(?gPf(?gW3?gk_k  ?gsQo?g  ?g`&@ ?g@ ?g?gׇP  ?g7  ?g;U  ?gP?g`P^?g?g&q?g?g~?c                    s   g | ]}  |qS r   r    .0r   probr   r   
<listcomp>l   s     zOTestHessianUpdateStrategy.test_rosenbrock_with_no_exception.<locals>.<listcomp>c                    s,   g | ]$}t  |d   t  |  qS r   r   arrayr   ix_listr   r   r   m   s   r   c                    s    g | ]} |d    |  qS r   r   r   	grad_listr   r   r   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   r   r   r   r   !test_rosenbrock_with_no_exceptionA   s    
'



z;TestHessianUpdateStrategy.test_rosenbrock_with_no_exceptionc           	         s  t dddddddgdd	d
ddgdddddgdddddgdddddgddddd gd!d"d#d$d%gd&d'd(d)d*gd+d,d-d.d/gd0d1d2d3d4gd5d6d7d8d9gd:d;d<d=d>gd?d@dAdBdCgdDdEdFdGdHgdIdJdKdLdMgdNdOdPdQdRgdSdTdUdVdWgdXdYdZd[d\gd]d^d_d`daggfdbdcD  fdddcttde D } fdfdctt de D }tdedgdh}|tdi dj tt|de D ]"}|| }|| }||| qpt| }|dk }|dk }||| t| }t	|| d S )lNr+   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                    s   g | ]}  |qS r   r   r   r   r   r   r      s     zBTestHessianUpdateStrategy.test_SR1_skip_update.<locals>.<listcomp>c                    s,   g | ]$}t  |d   t  |  qS r   r   r   r   r   r   r      s   r   c                    s    g | ]} |d    |  qS r   r   r   r   r   r   r      s   g{Gz?)r   Zmin_denominatorr   r%      )
r
   r   r#   r	   r,   r   r   copyr-   r   	r   r   r   r%   r   r   r   r1   Z	B_updatedr   r   r   test_SR1_skip_update   sP    


z.TestHessianUpdateStrategy.test_SR1_skip_updatec           	         sH  t dddddddgdd	d
ddgdddddgdddddgdddddgddddd gd!d"d#d$d%g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   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   c                    s   g | ]}  |qS r   r   r   r   r   r   r      s     zCTestHessianUpdateStrategy.test_BFGS_skip_update.<locals>.<listcomp>c                    s,   g | ]$}t  |d   t  |  qS r   r   r   r   r   r   r      s   r   c                    s    g | ]} |d    |  qS r   r   r   r   r   r   r      s   r   r   r   r%   )
r
   r   r#   r   r,   r   r   r   r-   r   r   r   r   r   test_BFGS_skip_update   s8    


z/TestHessianUpdateStrategy.test_BFGS_skip_updateN)r&   r'   r(   r2   r   r   r   r   r   r   r   r*   2   s   E,r*   )numpyr   r   r   Znumpy.linalgr   Znumpy.testingr   r   r   r   Zscipy.optimizer   r	   r
   r*   r   r   r   r   <module>   s   )