ó
v™xTc           @   s²   d  d l  m Z d  d l m Z d  d l m Z d  d l m Z m Z d  d l Z	 d  d l
 m Z d  d l	 m Z d  d l m Z d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   featherstone(   t
   test_utils(   t   e_kin_from_modelt   featherstone_system_modelN(   t   flex(   t   matrix(   t   approx_equalt
   simulationc           B   se   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z d d	 „ Z	 d d d
 „ Z RS(   c         C   s   | |  _  |  j ƒ  d  S(   N(   t   bodiest!   energies_and_accelerations_update(   t   OR	   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt   __init__   s    	c         C   s£   t  d |  j ƒ } d  g t |  j ƒ } g  |  j D] } | j ^ q2 } t | | | ƒ |  _ |  j ƒ  d  } d d d g } t j	 | | | | |  j
 | ƒ |  _ d  S(   NR	   i    (   R   R	   t   Nonet   lent   qdR   t   e_kint   e_pot_and_f_ext_updateR   t   FDabt   f_ext_bft   qdd(   R   t   modelt   qt   BR   t   taut	   grav_accn(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyR
      s    
c         C   s3  g  |  _  d |  _ g  |  _ xþ |  j D]ó } | j j | j j | j j } | j	 d k rc d  } n |  j  | j	 } | | } |  j  j | ƒ t j d | j d | j d | j d | j d | ƒ } t j d | j d | j d | j d | j d | ƒ } |  j j | ƒ |  j | 7_ q% W|  j |  j |  _ d  S(   Ni    iÿÿÿÿt   sitest   wellst   At   Jt   AJA_tree(   t   AJA_accut   e_potR   R	   R   t   Tb0R   t   Tspt   T0bt   parentR   t   appendR   t   potential_energy_bfR   R   t   potential_f_ext_bfR   t   e_tot(   R   R   t   AJAR   t   e_pot_bft   f_ext_using_bf(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyR      s"    			 	
	-	-c         C   s|   xk t  |  j |  j ƒ D]T \ } } | j j d | j d | d | ƒ | _ | j j d | j d | ƒ | _ q W|  j ƒ  d  S(   NR   R   t   delta_t(   t   zipR	   R   R   t   time_step_velocityR   t   time_step_positionR
   (   R   R,   R   R   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt   dynamics_step2   s    "'%c         C   ss  t  d |  j ƒ } d g t |  j ƒ } g  |  j D] } | j ^ q2 } g  |  j D]% } t j d g t | j ƒ ƒ ^ qQ } d d d g } t j | | | | |  j	 | ƒ } | d k	 r'| d k sÊ t
 ‚ d | }	 g  }
 xA | D]9 } |
 j t j g  | D] } t |	 | ƒ ^ qú ƒ ƒ qá W|
 } n  t j | | | | |  j	 | ƒ } g  } x | D] } | j | j ƒ qUW| S(   s   RBDA section 10.2, p. 199-201R	   i   i    s   %%.%dgN(   R   R	   R   R   R   R   t   colR   t   IDR   t   AssertionErrorR%   t   floatR   t   extendt   elems(   R   t   n_significant_digitsR   R   R   R   R   R   R   t   fmtt	   tau_trunct   vt   et   result(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt   sensitivity_test8   s$    5!
7	! c         C   s  t  d |  j ƒ } d  g t |  j ƒ } g  |  j D] } | j j ^ q2 } g  |  j D] } | j j ^ qT } d d d g } t j | | | | |  j	 | ƒ } g  } xg t
 |  j | ƒ D]S \ } }	 t | j d d  ƒ }
 |
 d  k rò | j |	 ƒ qµ | j |
 d |	 ƒ ƒ qµ W| S(   NR	   i    t   tau_as_d_pot_d_qR   (   R   R	   R   R   R   t   qd_zerot   qdd_zeroR   R2   R   R-   t   getattrR%   (   R   R   R   R   R   R   R   t   tausR<   R   R>   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt	   d_pot_d_qL   s    ""!g�íµ ÷Æ°>c         C   s  g  } xõ |  j  D]ê } g  } | j } t | j ƒ  ƒ } x¡ t | j ƒ D]� } g  } x` | | g D]Q }	 t | ƒ }
 |
 | c |	 7<| j d |
 ƒ | _ |  j ƒ  | j |  j	 ƒ qa W| j | d | d d | ƒ qG W| | _ | j t
 j | ƒ ƒ q W|  j ƒ  | S(   NR   i    i   i   (   R	   R   t   listt   get_qt   xranget   q_sizet   new_qR   R%   R    R   R1   R
   (   R   t   epsR<   R   t   gst   J_origt   q_origt   iqt   fst
   signed_epst   q_eps(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt    d_pot_d_q_via_finite_differences\   s$    	
%	
i    c         C   s”   |  j  } |  j ƒ  } |  j ƒ  } | rc x5 t | | ƒ D]$ \ } } d G| j GHd G| j GHq7 WHn  t | | ƒ sx t ‚ t |  j  | ƒ s� t ‚ d  S(   Ns   fin:s   ana:(   R   RC   RQ   R-   R6   R   R3   (   R   t   verboset   qdd_origt   anat   fint   at   f(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt   check_d_pot_d_qp   s    	c         C   s   t  d |  d | d | ƒ d  S(   Nt   simt   max_iterationst   callback_after_step(   t   refinery(   R   RZ   R[   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt   minimization|   s    N(   t   __name__t
   __module__R   R
   R   R0   R=   RC   RQ   RX   R   R]   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyR      s   						R\   c           B   s)   e  Z d d d  „ Z d „  Z d „  Z RS(   c         C   s�   | |  _  | |  _ t j ƒ  |  _ x3 | j D]( } |  j j t j | j j ƒ  ƒ ƒ q+ Wt	 j
 j d |  d t	 j
 j d | ƒ ƒ |  j  j ƒ  d  S(   Nt   target_evaluatort   termination_paramsRZ   (   RY   R[   R   t   doublet   xR	   R5   R   RE   t   scitbxt   lbfgst   runt   termination_parametersR
   (   R   RY   RZ   R[   R   (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyR   „   s    		&
c         C   sˆ   |  j  } d } xM |  j j D]? } | j j } | j j d | | | | !ƒ | _ | | 7} q W| | j ƒ  k sw t ‚ |  j j ƒ  d  S(   Ni    R   (	   Rc   RY   R	   R   RG   RH   t   sizeR3   R   (   R   Rc   t   iR   t   n(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt   unpack_x�   s    	#c         C   s\   |  j  ƒ  |  j j } t j ƒ  } x- |  j j ƒ  D] } | j t j | ƒ ƒ q2 W| | f S(   N(   Rk   RY   R    R   Rb   RC   R5   (   R   RW   t   gt   d(    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt    compute_functional_and_gradientsš   s    
N(   R^   R_   R   R   Rk   Rn   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyR\   ‚   s   	
(   t
   __future__R    t   scitbx.rigid_body.protoR   R   t   scitbx.rigid_body.proto.utilsR   R   t   scitbx.lbfgsRd   t   scitbx.array_familyR   R   t   libtbx.test_utilsR   t   objectR   R\   (    (    (    sU   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/rigid_body/proto/test_simulation.pyt   <module>   s   v