
    S_f'                     v    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      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       Qlib/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y)TestHessianUpdateStrategyc                     t               t               f}|D ]C  }|j                  dd       |j                         }t	        |t        j                  d             E y )N   r:   )r	   r
   
initialize
get_matrixr   r   eye)r   quasi_newtonqnBs       r   test_hessian_initializationz5TestHessianUpdateStrategy.test_hessian_initialization4   sI     	-BMM!V$Aq"&&),		-r   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  ?ra   g;U  ?)P?g`P^?g?g&q?g?)rb   rb   rb   rb   g~?r   r   g-C6?
init_scalemin_curvature)rd   r:   inv_hess
   )decimalg?)r   r0   ranger7   r   arrayzipdotArithmeticErrorr	   r
   r   rD   updaterE   r   linalginvr:   r   r   )r   probx_listr"   	grad_listidelta_x
delta_gradsyrG   r:   rf   rI   r8   B_trues                   r   !test_rosenbrock_with_no_exceptionz;TestHessianUpdateStrategy.test_rosenbrock_with_no_exceptionA   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   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r   g{Gz?)rd   min_denominatorr   r:      )r   r0   ri   r7   r   rj   r
   rD   rn   copyrE   r   r   rq   rr   r"   rs   rt   ru   rv   r:   rw   rx   rI   	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   rL   rM   rN   rO   rP   rQ   rR   rS   r   rg   rc   r   r:   )r   r0   ri   r7   r   rj   r	   rD   rn   r~   rE   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=   rJ   rz   r   r   r?   r   r   rA   rA   2   s    -CBJ*)X)r   rA   )numpyr   r~   r   numpy.linalgr   numpy.testingr   r   r   r   scipy.optimizer	   r
   r   rA   r?   r   r   <module>r      s6      B B && &R^) ^)r   