ó
j™xTc           @   s�  d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l Z	 d  d l
 Z	 d  d l	 m Z d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ e j j d ƒ Z e rƒd  d l m Z d e f d „  ƒ  YZ n  e Z d S(   iÿÿÿÿ(   t   divisionN(   t   adopt_init_args(   t   flex(   t   matrixt   function_basec           B   s&   e  Z d  „  Z d „  Z d d „ Z RS(   c         C   s
   t  ‚ d  S(   N(   t   NotImplementedError(   t   selft   x_obs(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt   __call__   s    c         C   s)   g  |  j  | ƒ D] } t j | ƒ ^ q S(   sª    This default implementation returns the finite difference partial
    derivatives. Override this function to calculate the derivatives
    analytically if required.
    (   t   finite_differencesR   t   double(   R   R   t   g(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt   partial_derivatives   s    g-Cëâ6?c   
      C   sÍ   g  } xÀ t  t |  j ƒ ƒ D]© } t j |  j ƒ } | | c | 7<|  j | Œ  } t j | | ƒ ƒ } | | c d | 8<|  j | Œ  } t j | | ƒ ƒ } | | d | }	 | j t	 |	 ƒ ƒ q W| S(   Ni   (
   t   ranget   lent   paramsR   R
   t	   __class__R   t   colt   appendt   list(
   R   R   t   epst   gradst   iR   t   ft   qmt   qpt   dq(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR	      s    (   t   __name__t
   __module__R   R   R	   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR      s   		t   univariate_polynomialc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         G   s,   | |  _  t | ƒ |  _ |  j d |  _ d S(   sR   A polynomial of degree n:
         f(x) = a[0] + a[1] x**1 + ... * a[n] x**n.
    i   N(   R   R   t   n_termst   degree(   R   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt   __init__*   s    	c         C   sT   t  j | j ƒ  ƒ } x8 t |  j ƒ D]' } | |  j | t  j | | ƒ 7} q% W| S(   N(   R   R
   t   sizeR   R   R   t   pow(   R   R   t   y_calct   n(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR   2   s    %c         C   s=   g  } x0 t  |  j ƒ D] } | j t j | | ƒ ƒ q W| S(   N(   R   R   R   R   R"   (   R   R   R   R$   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR   8   s    (   R   R   R    R   R   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR   (   s   		t   gaussianc           B   s<   e  Z d  „  Z d „  Z d „  Z d e j f d „  ƒ  YZ RS(   c         C   s&   t  |  t ƒ  ƒ | | | f |  _ d S(   sq   Simple wrapper for the parameters associated with a gaussian
         f(x) = a * exp(-(x - b)^2 / (2 * c^2))
    N(   R   t   localsR   (   R   t   at   bt   c(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR    A   s    c         C   sC   |  j  \ } } } | t j t j | | ƒ d | d ƒ } | S(   Ni   (   R   R   t   expt   pow2(   R   R   R'   R(   R)   R#   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR   H   s    -c         C   sy   |  j  \ } } } t j t j | | ƒ d | d ƒ } | | | | | d | | t j | | ƒ | d | f S(   Ni   i   (   R   R   R*   R+   (   R   R   R'   R(   R)   t   exponential_part(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR   M   s
    )t   sigmac           B   s   e  Z d  „  Z RS(   c         C   s   t  |  j d ƒ S(   Ni   (   t   absR   (   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt   fgetU   s    (   R   R   R/   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR-   T   s   (   R   R   R    R   R   t   libtbxt   propertyR-   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR%   ?   s   			t   skew_normalc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   s&   t  |  t ƒ  ƒ | | | f |  _ d  S(   N(   R   R&   R   (   R   t   shapet   locationt   scale(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR    Z   s    c         C   s˜   |  j  \ } } } d | t j d t j ƒ t j t j | | ƒ d | d ƒ } d d t j j | | | t j d ƒ | ƒ } | | } | S(   Ni   g      à?i   (	   R   t   matht   sqrtt   piR   R*   R+   t   scitbxt   erf(   R   R   R3   R4   R5   t   normal_partt   cdf_partR#   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR   ^   s    E0
c         C   sª  |  j  \ } } } d t j d t j ƒ t j t j | | ƒ d | d ƒ } d | | } d d t j j | | | t j d ƒ | ƒ } d | d | | | } d | d t j | | ƒ | d | }	 d t j t j ƒ t j | d t j | | ƒ d | d ƒ }
 | | t j d ƒ | |
 } | t j d ƒ | |
 } | | | |
 t j d ƒ | d } | | | | | | |	 | | | f S(   Ni   i   g      à?i   i   (	   R   R6   R7   R8   R   R*   R+   R9   R:   (   R   R   R3   R4   R5   R,   R;   R<   t   d_normal_part_d_locationt   d_normal_part_d_scalet   exponential_part_with_shapet   d_cdf_d_shapet   d_cdf_d_locationt   d_cdf_d_scale(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR   g   s     A0+2(   R   R   R    R   R   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR2   X   s   			t   univariate_polynomial_fitc           B   s   e  Z d  d d „ Z RS(   i    c   	      C   sÇ   | |  _  | |  _ t | t ƒ s' t ‚ | d k s9 t ‚ | |  _ | d |  _ t j d g |  j ƒ } t	 | Œ  } t
 d | g d | d |  j d t j j d | d | ƒ ƒ } | j d j |  _ d	 S(
   sr  Fit a polynomial of degree n to points (x_obs, y_obs)
         f(x) = a[0] + a[1] x**1 + ... * a[n] x**n.

       :param x_obs: x-coordinates of the data
       :type x_obs: flex.double
       :param y_obs: y-coordinates of the data
       :type y_obs: flex.double
       :param degree: the degree of the polynomial - the largest power of x
       :type degree: int
    i    i   t	   functionsR   t   y_obst   termination_paramst   min_iterationst   max_iterationsN(   R   RE   t
   isinstancet   intt   AssertionErrorR   R   R   R
   R   t   lbfgs_minimiserR9   t   lbfgst   termination_parametersRD   R   (	   R   R   RE   R   RG   RH   R   t
   polynomialt   fit(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR    ƒ   s     					N(   R   R   t   NoneR    (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyRC   �   s   t   single_gaussian_fitc           B   s   e  Z d  „  Z RS(   c         C   s™   | |  _  | |  _ t j | ƒ } | | } | | } d } t | | t | | | ƒ g ƒ } | j d j |  _ | j d j |  _ | j d j	 |  _	 d S(   s  Fit a gaussian to points (x_obs, y_obs):
         f(x) = A exp(-(x - mu)**2 / (2 * sigma**2))

       :param x_obs: x-coordinates of the data
       :type x_obs: flex.double
       :param y_obs: y-coordinates of the data
       :type y_obs: flex.double
    i   i    N(
   R   RE   R   t	   max_indext   gaussian_fitR%   t	   gaussiansR'   R(   R)   (   R   R   RE   t   max_iR5   t   muR-   RP   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR    ¤   s    			

!(   R   R   R    (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyRR   ¢   s   RT   c           B   s&   e  Z d d  „ Z d „  Z d „  Z RS(   c         C   sm   d |  _  | |  _ | |  _ t | ƒ |  _ |  j d k s? t ‚ t d | d | d |  j ƒ } | j |  _ d S(   sq  Fit one or more gaussians to points (x_obs, y_obs):
         f(x) = sum_i(A_i exp(-(x - mu_i)**2 / (2 * sigma_i**2)))

       :param x_obs: x-coordinates of the data
       :type x_obs: flex.double
       :param y_obs: y-coordinates of the data
       :type y_obs: flex.double
       :param gaussian: a list or tuple of gaussian objects
       :type gaussian: list
    i    RD   R   RE   N(	   t   n_cyclesR   RE   R   t   n_gaussiansRK   RL   RD   RU   (   R   R   RE   t   starting_gaussiansRF   RP   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR    ¼   s    			c         C   sP   t  j |  j j ƒ  ƒ } x1 t |  j ƒ D]  } | |  j | |  j ƒ 7} q( W| S(   N(   R   R
   R   R!   R   RY   RU   (   R   R#   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt   compute_y_calcÐ   s    c         C   sÑ   d d l  m } | j |  j |  j ƒ | j |  j |  j ƒ  ƒ x� t |  j ƒ D]p } t |  j	 | d | d d !ƒ \ } } } | t
 j t
 j |  j | ƒ | d ƒ } | j |  j | ƒ qO W| j ƒ  d  S(   Niÿÿÿÿ(   t   pyploti   i   (   t
   matplotlibR\   t   plotR   RE   R[   R   RY   t   tuplet   xR   R*   R+   t   show(   R   R\   R   R5   RW   t   SR#   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR\   Ö   s    +,N(   R   R   RQ   R    R[   R\   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyRT   º   s   	t   minimiser_basec           B   sW   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d e j	 f d „  ƒ  YZ
 RS(   c         C   s7   d |  _  | |  _ | |  _ t | ƒ |  _ | |  _ d  S(   Ni    (   RX   R   RE   R   t   n_functionsRD   (   R   RD   R   RE   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR    â   s
    			c         C   s>   | |  _  |  j ƒ  } |  j | } t j t j | ƒ ƒ } | S(   N(   R`   R[   RE   R   t   sumR+   (   R   R   R#   t   delta_yR   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt   compute_functionalé   s
    	c         C   sC   t  j |  j j ƒ  ƒ } x$ |  j D] } | | |  j ƒ 7} q" W| S(   N(   R   R
   R   R!   RD   (   R   R#   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR[   ð   s    c   	      C   s¨   |  j  ƒ  } |  j | } t j t j | ƒ ƒ } t j ƒ  } x^ |  j D]S } | j |  j ƒ } x8 t	 | ƒ D]* \ } } | j
 d t j | | ƒ ƒ ql WqG W| | f S(   Niþÿÿÿ(   R[   RE   R   Re   R+   R
   RD   R   R   t	   enumerateR   (	   R   R#   Rf   R   R   t   functt   partial_dersR   t   partial(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt    compute_functional_and_gradientsö   s    &c         C   s   |  j  d 7_  d  S(   Ni   (   RX   (   R   t	   minimizer(    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt   callback_after_step  s    c         C   sƒ   d d l  m } | j |  j |  j ƒ | j |  j |  j ƒ  ƒ x3 |  j D]( } | |  j ƒ } | j |  j | ƒ qI W| j ƒ  d  S(   Niÿÿÿÿ(   R\   (   R]   R\   R^   R   RE   R[   RD   Ra   (   R   R\   R   R#   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR\     s    RD   c           B   s   e  Z d  „  Z d „  Z RS(   c         C   sy   |  j  j ƒ  } x` t |  j ƒ D]O \ } } |  j | } | j | t | j ƒ  Œ  |  j | <| t | j ƒ } q W|  j S(   N(   R`   t	   deep_copyRh   t
   _functionsR   R   R   (   R   R`   R   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR/     s    #c         C   sI   | |  _  g  } x! |  j  D] } | j | j ƒ q Wt j | ƒ |  _ d  S(   N(   Rp   t   extendR   R   R
   R`   (   R   RD   R`   R   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt   fset  s
    	(   R   R   R/   Rr   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyRD     s   	(   R   R   R    Rg   R[   Rl   Rn   R\   R0   R1   RD   (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyRc   à   s   							RL   c           B   s   e  Z d d  „ Z RS(   c         C   s>   t  t |  ƒ j | | | ƒ t j j d |  d | ƒ |  _ d  S(   Nt   target_evaluatorRF   (   t   superRL   R    R9   RM   t   runRm   (   R   RD   R   RE   RF   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR       s    N(   R   R   RQ   R    (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyRL     s   t   cma_es(   t   cma_es_interfacet   cma_es_minimiserc           B   s   e  Z d  „  Z RS(   c         C   sk   t  t |  ƒ j | | | ƒ t j |  j j ƒ  d ƒ } t j t	 |  j ƒ |  j j
 ƒ  | |  j ƒ |  _ d  S(   Ni   (   Rt   Rx   R    R   R
   R`   R!   Rw   t   cma_es_driverR   Ro   Rg   Rm   (   R   RD   R   RE   R-   (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyR    -  s    (   R   R   R    (    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyRx   +  s   (   t
   __future__R    R6   R0   t   libtbx.load_envR   t   scitbx.array_familyR   t   scitbx.lbfgsR9   t   scitbx.mathR   t   objectR   R   R%   R2   RC   RR   RT   Rc   RL   t   envt
   has_modulet   have_cma_esRv   Rw   Rx   t   generic_minimiser(    (    (    sG   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/curve_fitting.pyt   <module>   s,   )!&>