ó
R™xTc           @   sN   d  d l  m Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d „  Z d S(	   iÿÿÿÿ(   t   divisionc         C   s2   | j  | ƒ } | d k s! t ‚ | j  |  ƒ | S(   s1   Nocedal & Wright (1999) Eq. 8.20; same as Eq. 9.6i    (   t   dott   AssertionError(   t   skt   ykt   yty(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/bfgs.pyt
   h0_scaling   s    c         C   s   | j  | ƒ } | d k s! t ‚ d | } | | j | ƒ } | j d ƒ | j |  ƒ j | ƒ } | | | j | ƒ 7} | S(   sP   Nocedal & Wright (1999) Eq. 9.2
     Pre-condition: hk must be positive definitei    i   (   R   R   t   matrix_outer_productt   matrix_diagonal_add_in_placet   matrix_transpose_multiplyt   matrix_multiply(   t   hkR   R   t   ytst   rhot   vt   hl(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/bfgs.pyt   h_update	   s    
c         C   s•   | j  | ƒ } | d k s! t ‚ |  j | j | ƒ ƒ j |  ƒ } | j  |  j | ƒ ƒ } | d k sl t ‚ | j | ƒ } |  | | | | } | S(   sQ   Nocedal & Wright (1999) Eq. 8.19
     Pre-condition: bk must be positive definitei    (   R   R   R
   R   (   t   bkR   R   R   t   bsstbt   stbst   yytt   bl(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/bfgs.pyt   b_update   s    !t   memory_elementc           B   s)   e  Z d  d d g Z d „  Z d „  Z RS(   t   st   yR   c         C   sJ   | |  _  | |  _ | j | ƒ } | d k r= d | |  _ n	 d  |  _ d  S(   Ni    i   (   R   R   R   R   t   None(   t   OR   R   R   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/bfgs.pyt   __init__%   s    		c         C   s   |  j  |  j |  j f S(   N(   R   R   R   (   R   (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/bfgs.pyt   get.   s    (   t   __name__t
   __module__t	   __slots__R   R   (    (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/bfgs.pyR   !   s   		c         C   s(  | j  ƒ  } t |  ƒ } d g | } x` t | d d d ƒ D]H } |  | j ƒ  \ } } }	 |	 | j | ƒ | | <}
 | |
 | } q< W| j ƒ  r¦ | j | ƒ } n% | j ƒ  r¿ | | } n t	 d ƒ ‚ xV t | ƒ D]H } |  | j ƒ  \ } } }	 |	 | j | ƒ } | | | | | } qØ W| S(   sW   Nocedal & Wright (1999) Algorithm 9.1
     Pre-condition: hk0 must be positive definitei   iÿÿÿÿs   Improper hk0N(
   t	   deep_copyt   lenR   t   xrangeR   R   t   is_square_matrixR
   t   is_trivial_1dt
   ValueError(   t   memoryt   hk0t   gkt   qt   mt   alphat   iR   R   R   t   at   rt   beta(    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/bfgs.pyt   hg_two_loop_recursion1   s"    N(   t
   __future__R    R   R   R   t   objectR   R1   (    (    (    s<   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/omz/bfgs.pyt   <module>   s
   			