ó
U™xTc           @   sã   d  d l  m Z d  d l m Z d  d l Z e j j d ƒ Z d  d l	 Td  d l
 m Z e ƒ  Z d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d d d d d „ Z d d d „ Z d d d e d d „ Z d S(   iÿÿÿÿ(   t   division(   t   flexNt   scitbx_lbfgs_ext(   t   *(   t   adopt_init_argst   core_parametersc           B   s#   e  Z d  d d d d d d „ Z RS(   i   i   gÍÌÌÌÌÌì?g¼‰Ø—²Òœ<g#B’¡œÇ;g@Œµx¯Dc         C   s   t  |  t ƒ  ƒ d  S(   N(   R   t   locals(   t   selft   mt   maxfevt   gtolt   xtolt   stpmint   stpmax(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyt   __init__   s    (   t   __name__t
   __module__R   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyR      s   t   termination_parametersc        	   B   s)   e  Z e d  d d  d d d d d „ Z RS(   gñhãˆµøä>i   i   i    c	   	      C   s#   t  | | ƒ } t |  t ƒ  ƒ d  S(   N(   t   maxR   R   (	   R   t   traditional_convergence_testt    traditional_convergence_test_epst#   drop_convergence_test_n_test_pointst"   drop_convergence_test_max_drop_epst+   drop_convergence_test_iteration_coefficientt   min_iterationst   max_iterationst	   max_calls(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyR      s    	N(   R   R   t   Truet   NoneR   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyR      s   t   exception_handling_parametersc           B   s,   e  Z e e e e e e d  „ Z d „  Z RS(   c         C   s   t  |  t ƒ  ƒ d  S(   N(   R   R   (   R   t)   ignore_line_search_failed_rounding_errorst-   ignore_line_search_failed_step_at_lower_boundt-   ignore_line_search_failed_step_at_upper_boundt    ignore_line_search_failed_maxfevt   ignore_line_search_failed_xtolt#   ignore_search_direction_not_descent(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyR   '   s    c         C   se  | j  d ƒ s d S| j d ƒ d k r8 |  j rad Sn)| j d ƒ d k r‘ | d  k	 r� | d  k	 r� t j | ƒ | | ƒ r� d S|  j rad SnÐ | j d ƒ d k r¶ |  j rad Sn« | j d d	 ƒ d k rß |  j rad Sn‚ | j d
 d ƒ d k r|  j	 rad SnY | j d ƒ d k ra| d  k	 rQ| d  k	 rQt j | ƒ | | ƒ rQd S|  j
 rad Sn  d S(   Ns   lbfgs errori   s)   Rounding errors prevent further progress.i    s(   The step is at the lower bound stpmin().iÿÿÿÿs(   The step is at the upper bound stpmax().s*   Number of function evaluations has reacheds
    maxfev().s-   Relative width of the interval of uncertaintys    is at most xtol().s0   The search direction is not a descent direction.(   t
   startswitht   findR   R   t   extR   R   R    R!   R"   R#   (   R   t   msgt   nt   xt   g(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyt   filter/   s:    								(   R   R   R   t   FalseR   R+   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyR   %   s   c      	   C   s¹  | d  k r t ƒ  } n  | d  k r0 t ƒ  } n  | d  k rH t ƒ  } n  |  j } | d  k	 r| d IJ| d I| j ƒ  IJ| d I| j IJ| d I| j IJ| d I| j IJ| d I| j	 IJ| d I| j
 IJ| d I| j IJ| d	 I| j IJn  t j | j ƒ  | j | j | j | j	 | j
 | j ƒ } | j ret j | j ƒ  | j ƒ } n' t j d
 | j d | j d | j ƒ } t |  d d  ƒ } t |  d d  ƒ }	 |	 d  k	 rÑ|	 d k sÑt ‚ n  d \ }
 } d \ } } yÝxÖ|	 d  k r|  j ƒ  \ } } d  } n* |  j ƒ  \ } } } |	 d k r@d  }	 n  |
 d  k rx| j sb| | ƒ n  | | j ƒ  }
 } n" |
 | k rš| | j ƒ  }
 } n  | d  k	 rç| d | | j ƒ  t j | ƒ t j | ƒ t j | ƒ f IJn  | d  k r| j | | | ƒ r/qïq/n | j | | | | ƒ r/qïn  | d  k	 rH| d IJn  | d  k	 r†| | ƒ t k r†| d  k	 r| d IJn  Pq†n  | j rÓ| j  ƒ  | j! k rü| | | ƒ rü| d  k	 rÌ| d IJn  Pqün) | | ƒ rü| d  k	 rø| d IJn  Pn  | j" d  k	 r=| j  ƒ  | j" k r=| d  k	 r9| d IJn  Pn  | j# d  k	 r~| j$ ƒ  | j# k r~| d  k	 rz| d IJn  Pn  | d  k r¦| j | | | ƒ sÂPqÂqï| j | | | | ƒ sïPqïqïWnÁ t% k
 r‰} t& | ƒ | _' | d  k	 r| d It& | ƒ IJn  | d  k	 r2| j( ƒ  | j) | ƒ n  | j* | j' | j ƒ  | | ƒ } | d k re‚  qœ| d k  r}t | _+ qœt, | _+ n Xd  | _' d  | _+ | d  k	 rµ| d IJn  | S(   Ns   lbfgs minimizer():s     x.size():s     m:s	     maxfev:s     gtol:s     xtol:s	     stpmin:s	     stpmax:s#   lbfgs traditional_convergence_test:t   n_test_pointst   max_drop_epst   iteration_coefficientt   callback_after_stept	   diag_modet   oncet   alwayssL   lbfgs minimizer.run(): f=%.6g, |g|=%.6g, x_min=%.6g, x_mean=%.6g, x_max=%.6gs   lbfgs minimizer steps1   lbfgs minimizer stop: callback_after_step is Trues2   lbfgs minimizer stop: traditional_convergence_tests+   lbfgs minimizer stop: drop_convergence_tests$   lbfgs minimizer stop: max_iterationss   lbfgs minimizer stop: max_callss   lbfgs minimizer exception:i    s   lbfgs minimizer done.(   s   onces   always(   NN(   NN(-   R   R   R   R   R)   t   sizeR   R	   R
   R   R   R   R   R&   t	   minimizerR   t   drop_convergence_testR   R   R   t   getattrt   AssertionErrort    compute_functional_and_gradientst!   compute_functional_gradients_diagt	   deep_copyt   normR   t   mint   meanR   t   runR   t   iterR   R   R   t   nfunt   RuntimeErrort   strt   errort   cleart   extendR+   t   is_unusual_errorR,   (   t   target_evaluatort   termination_paramst   core_paramst   exception_handling_paramst   logR)   R5   t   is_convergedR0   R1   t   f_mint   x_mint   fR*   t   dt   et   error_classification(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyt   run_c_plus_plusN   sâ    	

						 			: 	 	  
		c         C   sƒ  d d l  m } d d l m } d d l } | d k rD t ƒ  } n  | d k r\ t ƒ  } n  | j sk t	 ‚ | j
 d k s€ t	 ‚ |  j } | j ƒ  } | j } | j }	 | j }
 | j } | j } | j } | j | j | ƒ | j ƒ } | j | j | ƒ | j ƒ } | d | d d | } | j | j | ƒ | j ƒ } | j | j | ƒ | j ƒ } d d g } d } | j d g | j ƒ } | d	 d ƒ } xæ |  j ƒ  \ } } x$ t | ƒ D] \ } } | | | <q¸Wx$ t | ƒ D] \ } } | | | <qßW| | | | | | | | | | |
 | | ƒ x$ t | ƒ D] \ } } | | | <q1W| d d k r_Pn  | d d k  r™d
 | _ Pq™q™| S(   s   For debugging only!iÿÿÿÿ(   t   store(   t   lbfgsNi   i   i   i    RD   s   fortran lbfgs error(   t   scitbx.python_utils.miscRU   t   fortran_lbfgsRV   t   NumericR   R   R   R   R8   R	   R)   R4   R   R
   R   R   R   R   t   arrayt   aranget   Float64t   Int32R9   t	   enumerateRD   (   RH   RI   RJ   RU   RX   RY   R)   R(   R   R
   R   R   R   t   epst	   x_numerict	   g_numerict   size_wt   wt   diagt   iprintt   diagcot   iflagR5   RP   R*   t   it   xit   gi(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyt   run_fortranÉ   sT    							   	c         C   s0   | r t  |  | | ƒ St |  | | | | ƒ Sd  S(   N(   Rk   RT   (   RH   RI   RJ   RK   t   use_fortranRL   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyR?   õ   s    (   t
   __future__R    t   scitbx.array_familyR   t   boost.pythont   boostt   pythont
   import_extR&   R   t   libtbxR   t	   raw_lbfgst   rawt   objectR   R   R   R   RT   Rk   R,   R?   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/lbfgs/__init__.pyt   <module>   s(   
	
*x+