ó
:™xTc           @   s  d  d l  m Z d  d l m Z d  d l m Z d  d l m Z d  d l Z	 d  d l
 Z	 d  d l Z	 d  d l Z d  d l Z d  d l Z d „  Z d d „ Z d d	 „ Z d
 d d „  ƒ  YZ d „  Z d j ƒ  Z d „  Z e d k rý e d e j d ƒ n  d S(   iÿÿÿÿ(   t   division(   t   uctbx(   t   wavelengths(   t   flexNc         C   s2   | j  | | d t ƒ} t j t j |  | ƒ ƒ S(   Nt   deg(   t	   two_thetat   TrueR   t   sumt   pow2(   t   two_thetas_obst   miller_indicest
   wavelengtht	   unit_cellt   two_thetas_calc(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyt   residual   s    g�íµ ÷Æ°>c   
   	   C   s­   t  j ƒ  } xš t d ƒ D]Œ } g  } x\ | | g D]M } t | j ƒ  ƒ }	 |	 | c | 7<| j t |  | | t j |	 ƒ ƒ ƒ q3 W| j | d | d d | ƒ q W| S(   Ni   i    i   i   (	   R   t   doublet   xranget   listt
   parameterst   appendR   R   R   (
   R	   R
   R   R   t   epst   resultt   it   rst
   signed_epst
   params_eps(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyt	   gradients   s    	%c      	   C   sâ   t  j ƒ  } xš t d ƒ D]Œ } g  } x\ | | g D]M } t | j ƒ  ƒ }	 |	 | c | 7<| j t |  | | t j |	 ƒ ƒ ƒ q3 W| j	 | d | d d | ƒ q W| j
 t  j d d ƒ ƒ | j d | d ƒ }
 |
 j ƒ  S(   Ni   i    i   i   t   relative_epsiloni
   (   R   R   R   R   R   R   R   R   R   t   extendt   reshapet   gridt   matrix_symmetric_as_packed_ut   matrix_packed_u_as_symmetric(   R	   R
   R   R   R   R   R   R   R   R   t   u(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyt   hessian    s    	%t   refineryc           B   sJ   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z RS(   c   
   	   C   st  | |  _  | |  _ | |  _ | |  _ d |  _ g  |  _ | d k  r¢ d | d d g | f |  _ t j j	 d |  d t
 j | j ƒ  ƒ ƒ } | j ƒ  | j |  _ nÎ | d k  r#d d d d d g | d \ } } }	 d
 | | | |	 f |  _ d G|  j GH|  j d | d | d | d |	 ƒ |  _ nM | d k  r`d | |  _ d G|  j GH|  j d | ƒ |  _ n t d | ƒ ‚ d  S(   Ni    i   s   %d:newton_%st   fullt   diagt   functiont   x0i   i   s   %d:lbfgs_d=%d_u=%d_l=%ds   plot_legend:R   t   diagcot   use_hessiant   lbfgs_impl_switchi   s	   %d:lbfgsbs   bad mode=%d(   i    i    i    (   i    i    i   (   i   i   i    (   i   i   i   (   i   i   i   (   R	   R
   R   t   modet   number_of_gradient_evaluationst   functionalst   plot_legendt   scitbxt
   minimizerst   newton_more_thuente_1994R   R   R   t   show_statisticst   x_start   xt   run_lbfgs_rawt
   run_lbfgsbt   AssertionError(
   t   selfR	   R
   R   R   R+   t   mR(   R)   R*   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyt   __init__3   s>    						
	c         C   s   t  j t |  j ƒ ƒ S(   N(   R   R   t   iterR4   (   R8   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyR   Y   s    c         C   s&  t  j | d  ƒ d k  r- d GHt j j ‚ n  t  j | d ƒ d k  rZ d GHt j j ‚ n  y4 t |  j |  j |  j d t	 j
 t | ƒ ƒ ƒ} WnA t k
 r¤ ‚  n. t k
 rÑ } d Gt | ƒ GHt j j ‚ n Xt |  j ƒ d k r| d	 |  j d k rd
 GHt j j ‚ n  |  j j | ƒ | S(   Ni   i   s!   FunctionalException: small lengthi2   s    FunctionalException: small angleR   s   FunctionalException:i    i   s-   FunctionalException: greater than 2 * initial(   R   t   minR/   R0   t   FunctionalExceptionR   R	   R
   R   R   R   R;   t   KeyboardInterruptt	   Exceptiont   strt   lenR-   R   (   R8   R4   R   t   e(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyt
   functional\   s(     ,c         C   s=   |  j  d 7_  t |  j |  j |  j d t j t | ƒ ƒ ƒS(   Ni   R   (   R,   R   R	   R
   R   R   R   R;   (   R8   R4   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyR   u   s    c         C   s€   t  |  j |  j |  j d t j t | ƒ ƒ ƒ} |  j d k r| | j ƒ  } t	 j
 t	 j d d ƒ d ƒ } | j d | ƒ n  | S(   NR   i   i   i    t   diagonal(   R"   R	   R
   R   R   R   R;   R+   t   matrix_diagonalR   R   R   t   matrix_diagonal_set_in_place(   R8   R4   R   t   d(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyR"   {   s    c            sk  | d k s t  ‚ d } d } t j | j ƒ  ƒ ‰ ˆ j ƒ  } t j | d ƒ } d d g }	 d }
 d } | d | d d | } t j | ƒ } ‡  ‡ f d †  } d } xºt rf| d k sÅ t  ‚ | d k r#y ˆ  j d
 ˆ ƒ } Wn t j j	 k
 r| SXˆ j ƒ  } ˆ  j
 d
 ˆ ƒ } n  | d k r˜| d k rPt j | d ƒ } qì| d k rqt j | d ƒ } qì| ƒ  } | d k rì| j ƒ  } qìnT | d k rì| d k rÅt j | d ƒ } qì| d k rà| j ƒ  } qì| ƒ  } n  t j j t j j g | d | d | d
 ˆ d | d | d | d | d |	 d |
 d | d | d | ƒ } | d k r­ Pq­ q­ Wˆ S(   Ni    i   i   i   i   gñhãˆµøä>g¼‰Ø—²Òœ<c             s8   ˆ  j  ˆ ƒ }  |  j ƒ  } | j d ƒ s0 t ‚ d | S(   Ni    i   (   R"   RE   t   all_gtR7   (   t   hRG   (   R8   R4   (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyt   diag_from_hessian™   s    id   R4   t   nR9   t   ft   gR(   R%   t   iprintR   t   xtolt   wt   iflag(   i    i   i   (   i    i   i   id   (   i    i   (   R7   R   R   R   t	   deep_copyR   RC   R/   R0   R=   R   t   lbfgst   raw_referencet   raw(   R8   R   R(   R)   R*   RK   R9   t   x_lastR%   RN   R   RO   t   size_wRP   RJ   RQ   RL   RM   t   diag0(    (   R8   R4   sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyR5   ‰   sV    	  		*! i   c   
      C   s  t  j d d d d d d g ƒ } t  j d d ƒ } t  j d d ƒ } t j j d d d d d | d	 | d
 | d d d d d | ƒ } t  j | j ƒ  ƒ } d } t  j d d ƒ }	 xV t r	| j | | |	 ƒ rö |  j	 d | ƒ } |  j
 d | ƒ }	 q´ | j ƒ  r´ Pq´ q´ W| S(   Ni   i2   i   i    RK   R9   i   t   lR!   t   nbdt   factrg    ÐcAt   pgtolgñhãˆµøä>RN   R4   (   R   R   t   intR/   t   lbfgsbt	   minimizerR   R   t   processRC   R   t   is_terminated(
   R8   R   RN   RY   R!   RZ   R_   R4   RL   RM   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyR6   ½   s,    !		(	   t   __name__t
   __module__R:   R   RC   R   R"   R5   R6   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyR#   1   s   	&					4c         C   sa   | j  | | d t ƒ} xA t | |  | ƒ D]- \ } } } d | Gd | | | | f GHq+ WHd  S(   NR   s   (%2d, %2d, %2d)s   %6.2f - %6.2f = %6.2f(   R   R   t   zip(   R	   R
   R   R   R   RI   t   ot   c(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyt   show_fitÕ   s    ""s¨    8.81   0  1  1
 12.23   0  0  2
 12.71   0  2  0
 12.97   1  1  0
 13.79   0  1  2
 14.11   0  2  1
 14.35   1  1  1
 16.68   1  0  2
 17.03   1  2  0
 17.67   0  2  2
 17.86   1  1  2
 19.47   0  1  3
 21.03   1  2  2
 22.26   1  3  0
 22.41   0  2  3
 22.56   1  1  3
 22.72   2  0  0
 23.10   1  3  1
 24.40   2  1  1
 24.60   0  0  4
 25.17   1  2  3
 25.43   0  1  4
 25.87   2  0  2
 26.11   2  2  0
 26.32   0  4  1
 26.66   2  1  2
 26.84   2  2  1
 27.15   1  0  4
 27.78   0  2  4
 27.90   1  1  4
 28.44   0  4  2
 28.72   1  4  1
 28.92   2  2  2
 29.02   1  3  3
 30.08   2  1  3
 30.49   2  3  1
 30.69   1  4  2
 31.34   0  3  4
 31.56   0  1  5
 32.12   2  2  3
c         C   sÅ  t  j ƒ  } t  j ƒ  } xs t D]k } | j ƒ  } t | ƒ d k sI t ‚ | j t | d ƒ ƒ | j g  | d D] } t	 | ƒ ^ qq ƒ q Wt
 j d ƒ j ƒ  } t j d ƒ } t | | | | ƒ g  } t |  ƒ d k sã t ‚ t |  ƒ d k ru|  d }	 |	 j d ƒ d k r+t d	 |	 d
 ƒ }
 q�|	 j d ƒ d k rct d |	 j d d ƒ d ƒ }
 q�t |	 ƒ g }
 n t d ƒ }
 d G|
 GHHx7 |
 D]/ } t | | | | d | ƒ} | j | ƒ Hq’Wt d d ƒ } | d IJ| d d j t j ƒ  t j ƒ  g ƒ IJx? t | ƒ D]1 \ } } | d | | j f IJ| d | IJqWxX | D]P } x= t | j ƒ D], \ } } | d k r‚Pn  | | I| IJqfW| d IJqPW~ | j ƒ  GHHt j j ƒ  GHd  S(   Ni   i    i   t   CUi
   iP   id   t   ,t   [t   ]t   :s   range(s   +1)i   s   modes:R+   s   tmp.xyRP   s   @with g0s   @ title "%s"s   \ns   @ s%d legend "%s"s   @ s%d symbol 1i   t   &(   i
   i
   i
   iP   id   iP   (   i    i   (   R   R   t   miller_indext   two_theta_and_index_listt   splitRA   R7   R   t   floatR]   R   t   characteristict   as_angstromR   R   Rg   t   findt   evalt   replacet   rangeR#   t   opent   joint   platformt   nodet	   enumerateR.   R-   t   libtbxt   utilst   format_cpu_times(   t   argsR	   R
   t   linet   fieldst   sR   t   unit_cell_startt   refined_accut   argt   modesR+   t   refinedt   pR   t   rR4   t   y(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyt   run  s\    .
#	
	 t   __main__R€   i   (    (   t
   __future__R    t   cctbxR   t   cctbx.eltbxR   t   cctbx.array_familyR   t   scitbx.lbfgsR/   t   scitbx.lbfgsbt   scitbx.minimizerst   libtbx.utilsR}   Rz   t   sysR   R   R"   R#   Rg   t
   splitlinesRo   RŒ   Rb   t   argv(    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/cctbx/examples/unit_cell_minimizers.pyt   <module>   s$   	¤	/	9